From b917bf1acbc3920bfa4b1a5df1e697f6849f151d Mon Sep 17 00:00:00 2001 From: Jason <1432334894@qq.com> Date: Thu, 28 Jul 2022 19:32:51 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=E7=94=B5=E5=95=86=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E5=90=8E=E5=8F=B0=E9=9D=99=E6=80=81=E6=A8=A1=E6=9D=BF=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E7=BB=84=E4=BB=B6/=E6=A0=B7=E5=BC=8F=E5=B0=81?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- control/tpl.php | 16 + index.php | 2 +- view/css/common.css | 0 view/css/layui.css | 1 + view/font/iconfont.eot | Bin 0 -> 46684 bytes view/font/iconfont.svg | 554 ++++++++++++++++++++++++ view/font/iconfont.ttf | Bin 0 -> 46508 bytes view/font/iconfont.woff | Bin 0 -> 30628 bytes view/font/iconfont.woff2 | Bin 0 -> 25964 bytes view/images/admin_logo.png | Bin 0 -> 4260 bytes view/images/header_user_logo.png | Bin 0 -> 1344 bytes view/images/pdd_icon.png | Bin 0 -> 460361 bytes view/js/css/layui.css | 1 + view/js/css/modules/code.css | 1 + view/js/css/modules/laydate/default/laydate.css | 1 + view/js/css/modules/layer/default/icon-ext.png | Bin 0 -> 5911 bytes view/js/css/modules/layer/default/icon.png | Bin 0 -> 11493 bytes view/js/css/modules/layer/default/layer.css | 1 + view/js/css/modules/layer/default/loading-0.gif | Bin 0 -> 5793 bytes view/js/css/modules/layer/default/loading-1.gif | Bin 0 -> 701 bytes view/js/css/modules/layer/default/loading-2.gif | Bin 0 -> 1787 bytes view/js/layui.js | 1 + view/templates/include/admin_header.html | 44 ++ view/templates/include/admin_leftmenu.html | 25 ++ view/templates/tpl/home.html | 95 ++++ 25 files changed, 741 insertions(+), 1 deletion(-) create mode 100644 control/tpl.php create mode 100644 view/css/common.css create mode 100644 view/css/layui.css create mode 100644 view/font/iconfont.eot create mode 100644 view/font/iconfont.svg create mode 100644 view/font/iconfont.ttf create mode 100644 view/font/iconfont.woff create mode 100644 view/font/iconfont.woff2 create mode 100644 view/images/admin_logo.png create mode 100644 view/images/header_user_logo.png create mode 100644 view/images/pdd_icon.png create mode 100644 view/js/css/layui.css create mode 100644 view/js/css/modules/code.css create mode 100644 view/js/css/modules/laydate/default/laydate.css create mode 100644 view/js/css/modules/layer/default/icon-ext.png create mode 100644 view/js/css/modules/layer/default/icon.png create mode 100644 view/js/css/modules/layer/default/layer.css create mode 100644 view/js/css/modules/layer/default/loading-0.gif create mode 100644 view/js/css/modules/layer/default/loading-1.gif create mode 100644 view/js/css/modules/layer/default/loading-2.gif create mode 100644 view/js/layui.js create mode 100644 view/templates/include/admin_header.html create mode 100644 view/templates/include/admin_leftmenu.html create mode 100644 view/templates/tpl/home.html diff --git a/control/tpl.php b/control/tpl.php new file mode 100644 index 0000000..e6d7ee9 --- /dev/null +++ b/control/tpl.php @@ -0,0 +1,16 @@ +<?php +/** + * + */ + +include_once(dirname(dirname(__FILE__))."/library/publicBase.php"); + +class tpl extends publicBase { + + /** + * 首页 + * @return void + */ + public function home() { + } +} diff --git a/index.php b/index.php index 62c44c5..d945bce 100644 --- a/index.php +++ b/index.php @@ -50,7 +50,7 @@ class run extends publicBase { } private function aftercheckpara() { - $no_login_list = array('callback'); + $no_login_list = array('callback', 'tpl'); $is_need_login = in_array($this->control_name, $no_login_list) ? false : true; if (!$is_need_login) return true; diff --git a/view/css/common.css b/view/css/common.css new file mode 100644 index 0000000..e69de29 diff --git a/view/css/layui.css b/view/css/layui.css new file mode 100644 index 0000000..24faef3 --- /dev/null +++ b/view/css/layui.css @@ -0,0 +1 @@ +blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{display:inline-block;border:none;vertical-align:middle}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h1,h2,h3{font-weight:400}h4,h5,h6{font-size:100%;font-weight:400}button,input,select,textarea{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:1.6;color:#333;color:rgba(0,0,0,.85);font:14px Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif}hr{height:0;line-height:0;margin:10px 0;padding:0;border:none!important;border-bottom:1px solid #eee!important;clear:both;overflow:hidden;background:0 0}a{color:#333;text-decoration:none}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.layui-edge{position:relative;display:inline-block;vertical-align:middle;width:0;height:0;border-width:6px;border-style:dashed;border-color:transparent;overflow:hidden}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-disabled,.layui-icon,.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-show-v{visibility:visible!important}.layui-hide-v{visibility:hidden!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=256);src:url(../font/iconfont.eot?v=256#iefix) format('embedded-opentype'),url(../font/iconfont.woff2?v=256) format('woff2'),url(../font/iconfont.woff?v=256) format('woff'),url(../font/iconfont.ttf?v=256) format('truetype'),url(../font/iconfont.svg?v=256#layui-icon) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-search:before{content:"\e615"}.layui-icon-share:before{content:"\e641"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-engine:before{content:"\e628"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-star:before{content:"\e600"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-chat:before{content:"\e606"}.layui-icon-release:before{content:"\e609"}.layui-icon-list:before{content:"\e60a"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-ok-circle:before{content:"\1005"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-table:before{content:"\e62d"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-ie:before{content:"\e7bb"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-edit:before{content:"\e642"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-down:before{content:"\e61a"}.layui-icon-file:before{content:"\e621"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-read:before{content:"\e705"}.layui-icon-404:before{content:"\e61c"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-help:before{content:"\e607"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-windows:before{content:"\e67f"}.layui-icon-water:before{content:"\e636"}.layui-icon-username:before{content:"\e66f"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-about:before{content:"\e60b"}.layui-icon-location:before{content:"\e715"}.layui-icon-up:before{content:"\e619"}.layui-icon-pause:before{content:"\e651"}.layui-icon-date:before{content:"\e637"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-delete:before{content:"\e640"}.layui-icon-play:before{content:"\e652"}.layui-icon-top:before{content:"\e604"}.layui-icon-firefox:before{content:"\e686"}.layui-icon-friends:before{content:"\e612"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-ok:before{content:"\e605"}.layui-icon-layer:before{content:"\e638"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-group:before{content:"\e613"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-link:before{content:"\e64c"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-log:before{content:"\e60e"}.layui-icon-key:before{content:"\e683"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-return:before{content:"\e65c"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-form:before{content:"\e63c"}.layui-icon-cart:before{content:"\e657"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-heart-fill:before{content:"\e68f"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-ios:before{content:"\e680"}.layui-icon-at:before{content:"\e687"}.layui-icon-fire:before{content:"\e756"}.layui-icon-set:before{content:"\e716"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-tips:before{content:"\e702"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-bluetooth:before{content:"\e689"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-addition:before{content:"\e624"}.layui-icon-home:before{content:"\e68e"}.layui-icon-time:before{content:"\e68d"}.layui-icon-user:before{content:"\e770"}.layui-icon-notice:before{content:"\e667"}.layui-icon-chrome:before{content:"\e68a"}.layui-icon-edge:before{content:"\e68b"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-voice:before{content:"\e688"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-heart:before{content:"\e68c"}.layui-icon-logout:before{content:"\e682"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-template:before{content:"\e663"}.layui-icon-transfer:before{content:"\e691"}.layui-icon-auz:before{content:"\e672"}.layui-icon-console:before{content:"\e665"}.layui-icon-app:before{content:"\e653"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-next:before{content:"\e65b"}.layui-icon-component:before{content:"\e857"}.layui-icon-android:before{content:"\e684"}.layui-icon-more:before{content:"\e65f"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-camera:before{content:"\e660"}.layui-icon-note:before{content:"\e66e"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-screen-restore:before{content:"\e758"}.layui-icon-password:before{content:"\e673"}.layui-icon-senior:before{content:"\e674"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-service:before{content:"\e626"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-print:before{content:"\e66d"}.layui-icon-cols:before{content:"\e610"}.layui-icon-wifi:before{content:"\e7e0"}.layui-icon-export:before{content:"\e67d"}.layui-icon-rss:before{content:"\e808"}.layui-icon-slider:before{content:"\e714"}.layui-icon-email:before{content:"\e618"}.layui-icon-subtraction:before{content:"\e67e"}.layui-icon-mike:before{content:"\e6dc"}.layui-icon-light:before{content:"\e748"}.layui-icon-gift:before{content:"\e627"}.layui-icon-mute:before{content:"\e685"}.layui-icon-reduce-circle:before{content:"\e616"}.layui-icon-music:before{content:"\e690"}.layui-main{position:relative;width:1160px;margin:0 auto}.layui-header{position:relative;z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{position:relative;width:220px;height:100%;overflow-x:hidden}.layui-body{position:relative;left:200px;right:0;top:0;bottom:0;z-index:900;width:auto;box-sizing:border-box}.layui-layout-body{overflow-x:hidden}.layui-layout-admin .layui-header{position:fixed;top:0;left:0;right:0;background-color:#23262e}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{position:absolute;top:60px;padding-bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;z-index:990;height:44px;line-height:44px;padding:0 15px;box-shadow:-1px 0 4px rgb(0 0 0 / 12%);background-color:#fafafa}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#009688;font-size:16px;box-shadow:0 1px 2px 0 rgb(0 0 0 / 15%)}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:"";display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:767.98px){.layui-container{padding:0 15px}.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:720px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:960px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1150px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space2{margin:-1px}.layui-col-space2>*{padding:1px}.layui-col-space4{margin:-2px}.layui-col-space4>*{padding:2px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space6{margin:-3px}.layui-col-space6>*{padding:3px}.layui-col-space8{margin:-4px}.layui-col-space8>*{padding:4px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space14{margin:-7px}.layui-col-space14>*{padding:7px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space16{margin:-8px}.layui-col-space16>*{padding:8px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space24{margin:-12px}.layui-col-space24>*{padding:12px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space26{margin:-13px}.layui-col-space26>*{padding:13px}.layui-col-space28{margin:-14px}.layui-col-space28>*{padding:14px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:1.6;border-left:5px solid #5fb878;border-radius:0 2px 2px 0;background-color:#fafafa}.layui-quote-nm{border-style:solid;border-width:1px;border-left-width:5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border-width:0;border-top-width:1px}.layui-field-box{padding:15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#eee}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#5fb878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#5f5f5f}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#fafafa;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:1.6;color:#5f5f5f}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-card:last-child{margin-bottom:0}.layui-card-header{position:relative;height:42px;line-height:42px;padding:0 15px;border-bottom:1px solid #f6f6f6;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-card-body{position:relative;padding:10px 15px;line-height:24px}.layui-card-body[pad15]{padding:15px}.layui-card-body[pad20]{padding:20px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel{position:relative;border-width:1px;border-style:solid;border-radius:2px;box-shadow:1px 1px 4px rgb(0 0 0 / 8%);background-color:#fff;color:#5f5f5f}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #eee;background-color:#fff}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999}.layui-bg-red{background-color:#ff5722!important;color:#fff!important}.layui-bg-orange{background-color:#ffb800!important;color:#fff!important}.layui-bg-green{background-color:#009688!important;color:#fff!important}.layui-bg-cyan{background-color:#2f4056!important;color:#fff!important}.layui-bg-blue{background-color:#1e9fff!important;color:#fff!important}.layui-bg-black{background-color:#393d49!important;color:#fff!important}.layui-bg-gray{background-color:#fafafa!important;color:#5f5f5f!important}.layui-badge-rim,.layui-border,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-layedit,.layui-layedit-tool,.layui-panel,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#eee}.layui-border{border-width:1px;border-style:solid;color:#5f5f5f!important}.layui-border-red{border-width:1px;border-style:solid;border-color:#ff5722!important;color:#ff5722!important}.layui-border-orange{border-width:1px;border-style:solid;border-color:#ffb800!important;color:#ffb800!important}.layui-border-green{border-width:1px;border-style:solid;border-color:#009688!important;color:#009688!important}.layui-border-cyan{border-width:1px;border-style:solid;border-color:#2f4056!important;color:#2f4056!important}.layui-border-blue{border-width:1px;border-style:solid;border-color:#1e9fff!important;color:#1e9fff!important}.layui-border-black{border-width:1px;border-style:solid;border-color:#393d49!important;color:#393d49!important}.layui-timeline-item:before{background-color:#eee}.layui-text{line-height:1.6;font-size:14px;color:#5f5f5f}.layui-text h1,.layui-text h2,.layui-text h3,.layui-text h4,.layui-text h5,.layui-text h6{font-weight:500;color:#333}.layui-text h1{font-size:32px}.layui-text h2{font-size:24px}.layui-text h3{font-size:18px}.layui-text h4{font-size:16px}.layui-text h5{font-size:14px}.layui-text h6{font-size:13px}.layui-text a:not(.layui-btn){color:#01aaed}.layui-text a:not(.layui-btn):hover{text-decoration:underline}.layui-text ol,.layui-text ul{padding:5px 0 5px 15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text ol li{margin-top:5px;list-style-type:decimal}.layui-text em,.layui-word-aux{color:#999!important;padding-left:5px!important;padding-right:5px!important}.layui-text p{margin:15px 0}.layui-text p:first-child{margin-top:0}.layui-text p:last-child{margin-bottom:0}.layui-text blockquote:not(.layui-elem-quote){padding:5px 15px;border-left:5px solid #eee}.layui-text pre:not(.layui-code){padding:15px;font-family:Lucida Console,Consolas,Courier New;background-color:#fafafa}.layui-font-12{font-size:12px!important}.layui-font-14{font-size:14px!important}.layui-font-16{font-size:16px!important}.layui-font-18{font-size:18px!important}.layui-font-20{font-size:20px!important}.layui-font-red{color:#ff5722!important}.layui-font-orange{color:#ffb800!important}.layui-font-green{color:#009688!important}.layui-font-cyan{color:#2f4056!important}.layui-font-blue{color:#01aaed!important}.layui-font-black{color:#000!important}.layui-font-gray{color:#c2c2c2!important}.layui-btn{display:inline-block;vertical-align:middle;height:38px;line-height:38px;border:1px solid transparent;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border-radius:2px;cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{font-size:0}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{padding:0 2px;vertical-align:middle\0;vertical-align:bottom}.layui-btn-primary{border-color:#d2d2d2;background:0 0;color:#5f5f5f}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1e9fff}.layui-btn-warm{background-color:#ffb800}.layui-btn-danger{background-color:#ff5722}.layui-btn-checked{background-color:#5fb878}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border-color:#eee!important;background-color:#fbfbfb!important;color:#d2d2d2!important;cursor:not-allowed!important;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:12px!important}.layui-btn-group{display:inline-block;vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#d2d2d2;color:#009688}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #d2d2d2}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;color:rgba(0,0,0,.85);border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#eee!important}.layui-input:focus,.layui-textarea:focus{border-color:#d2d2d2!important}.layui-textarea{position:relative;min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{position:relative;float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block,.layui-input-inline{position:relative}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{position:relative;float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#ff5722!important}.layui-form-select{position:relative}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #eee;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:1px 1px 4px rgb(0 0 0 / 8%);box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#f6f6f6;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#5fb878;color:#fff}.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.layui-form-selected .layui-edge{margin-top:-3px\0}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;display:inline-block;vertical-align:middle;height:30px;line-height:30px;margin-right:10px;padding-right:30px;background-color:#fff;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox *{display:inline-block;vertical-align:middle}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5fb878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5fb878}.layui-form-checked i,.layui-form-checked:hover i{color:#5fb878}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:28px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#5f5f5f}.layui-form-checkbox[lay-skin=primary] i{right:auto;left:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:#5fb878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5fb878!important;background-color:#5fb878;color:#fff}.layui-checkbox-disabled[lay-skin=primary] span{background:0 0!important;color:#c2c2c2!important}.layui-form-checked.layui-checkbox-disabled[lay-skin=primary] i{background:#eee!important;border-color:#eee!important}.layui-checkbox-disabled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-switch{position:relative;display:inline-block;vertical-align:middle;height:22px;line-height:22px;min-width:35px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch em{position:relative;top:0;width:25px;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5fb878;background-color:#5fb878}.layui-form-onswitch i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch em{margin-left:5px;margin-right:21px;color:#fff!important}.layui-checkbox-disabled{border-color:#eee!important}.layui-checkbox-disabled span{background-color:#eee!important}.layui-checkbox-disabled i{border-color:#eee!important}.layui-checkbox-disabled em{color:#d2d2d2!important}.layui-checkbox-disabled:hover i{color:#fff!important}[lay-radio]{display:none}.layui-form-radio{display:inline-block;vertical-align:middle;line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio *{display:inline-block;vertical-align:middle;font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio:hover *,.layui-form-radioed,.layui-form-radioed>i{color:#5fb878}.layui-radio-disabled>i{color:#eee!important}.layui-radio-disabled *{color:#c2c2c2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#fafafa;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0;border-right-width:1px}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto!important;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-layedit{border-width:1px;border-style:solid;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom-width:1px;border-bottom-style:solid;font-size:0}.layedit-tool-fixed{position:fixed;top:0;border-top:1px solid #eee}.layui-layedit-tool .layedit-tool-mid,.layui-layedit-tool .layui-icon{display:inline-block;vertical-align:middle;text-align:center;font-size:14px}.layui-layedit-tool .layui-icon{position:relative;width:32px;height:30px;line-height:30px;margin:3px 5px;border-radius:2px;color:#777;cursor:pointer;border-radius:2px}.layui-layedit-tool .layui-icon:hover{color:#393d49}.layui-layedit-tool .layui-icon:active{color:#000}.layui-layedit-tool .layedit-tool-active{background-color:#eee;color:#000}.layui-layedit-tool .layui-disabled,.layui-layedit-tool .layui-disabled:hover{color:#d2d2d2;cursor:not-allowed}.layui-layedit-tool .layedit-tool-mid{width:1px;height:18px;margin:0 10px;background-color:#d2d2d2}.layedit-tool-html{width:50px!important;font-size:30px!important}.layedit-tool-b,.layedit-tool-code,.layedit-tool-help{font-size:16px!important}.layedit-tool-d,.layedit-tool-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-layedit-iframe iframe{display:block;width:100%}#LAY_layedit_code{overflow:hidden}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #eee}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-laypage a:hover{color:#009688}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage a{text-decoration:none}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{display:inline-block;width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#009688!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{display:inline-block;vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;margin:10px 0;background-color:#fff;color:#5f5f5f}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:400}.layui-table tbody tr:hover,.layui-table thead tr,.layui-table-click,.layui-table-header,.layui-table-hover,.layui-table-mend,.layui-table-patch,.layui-table-tool,.layui-table-total,.layui-table-total tr{background-color:#fafafa}.layui-table[lay-even] tr:nth-child(even){background-color:#f2f2f2}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#eee}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0;border-bottom-width:1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0;border-right-width:1px}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding-top:15px;padding-right:30px;padding-bottom:15px;padding-left:30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:50px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{padding-top:5px;padding-right:10px;padding-bottom:5px;padding-left:10px;font-size:12px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:30px;line-height:20px;padding-top:5px;padding-right:5px}.layui-table[lay-data]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view{margin:10px 0}.layui-table-view .layui-table{position:relative;width:auto;margin:0;border:0;border-collapse:separate}.layui-table-view .layui-table[lay-skin=line]{border-width:0;border-right-width:1px}.layui-table-view .layui-table[lay-skin=row]{border-width:0;border-bottom-width:1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:0;border-top:none;border-left:none}.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td{cursor:default}.layui-table-view .layui-table td[data-edit=text]{cursor:text}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;width:100%;height:100%;text-align:center;z-index:110}.layui-table-init .layui-icon{position:absolute;left:50%;top:50%;margin:-15px 0 0 -15px;font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0;border-bottom-width:1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-column{position:relative;width:100%;min-height:41px;padding:8px 16px;border-width:0;border-bottom-width:1px}.layui-table-column .layui-btn-container{margin-bottom:-8px}.layui-table-column .layui-btn-container .layui-btn{margin-right:8px;margin-bottom:8px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;padding:5px 0;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-tool-panel li{padding:0 10px;line-height:30px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%}.layui-table-tool-panel li:hover{background-color:#f6f6f6}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{padding-left:28px}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0;border-left-width:1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#5f5f5f}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#5f5f5f}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:38px;line-height:28px;padding:6px 15px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-table-link{color:#01aaed}.layui-table-cell .layui-btn{vertical-align:inherit}.layui-table-cell[align=center]{-webkit-box-pack:center}.layui-table-cell[align=right]{-webkit-box-pack:end}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{text-align:center;-webkit-box-pack:center}.layui-table-body{position:relative;overflow:auto;margin-right:-1px;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:30px 15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:-1px;border-width:0;border-left-width:1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px}.layui-table-tool{position:relative;z-index:890;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0;border-bottom-width:1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-total{margin-bottom:-1px;border-width:0;border-top-width:1px;overflow:hidden}.layui-table-page{z-index:880;border-width:0;border-top-width:1px;margin-bottom:-1px;white-space:nowrap;overflow:hidden}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-11px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-pagebar{float:right;line-height:23px}.layui-table-pagebar .layui-btn-sm{margin-top:-1px}.layui-table-pagebar .layui-btn-xs{margin-top:2px}.layui-table-view select[lay-ignore]{display:inline-block}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;z-index:900;min-width:100%;min-height:100%;padding:5px 14px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15);background-color:#fff}.layui-table-edit:focus{border-color:#5fb878!important}input.layui-input.layui-table-edit{height:100%}select.layui-table-edit{padding:0 0 0 10px;border-color:#d2d2d2}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0;box-sizing:content-box}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:26px;height:100%;padding:5px 0;border-width:0;border-left-width:1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px}.layui-table-grid-down:hover{background-color:#fbfbfb}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-49px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#5f5f5f}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#5f5f5f;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-list{margin:10px 0}.layui-upload-choose{max-width:200px;padding:0 10px;color:#999;font-size:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-upload-drag{position:relative;display:inline-block;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#009688}.layui-upload-drag[lay-over]{border-color:#009688}.layui-upload-form{display:inline-block}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;display:inline-block;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-btn-container .layui-upload-choose{padding-left:0}.layui-menu{position:relative;margin:5px 0;background-color:#fff;box-sizing:border-box}.layui-menu *{box-sizing:border-box}.layui-menu li,.layui-menu-body-title a{padding:5px 15px}.layui-menu li{position:relative;margin:1px 0;width:calc(100% + 1px);line-height:26px;color:rgba(0,0,0,.8);font-size:14px;white-space:nowrap;cursor:pointer;transition:all .3s}.layui-menu li:hover{background-color:#f6f6f6}.layui-menu-item-parent:hover>.layui-menu-body-panel{display:block;animation-name:layui-fadein;animation-duration:.3s;animation-fill-mode:both;animation-delay:.2s}.layui-menu-item-group .layui-menu-body-title,.layui-menu-item-parent .layui-menu-body-title{padding-right:25px}.layui-menu .layui-menu-item-divider:hover,.layui-menu .layui-menu-item-group:hover,.layui-menu .layui-menu-item-none:hover{background:0 0;cursor:default}.layui-menu .layui-menu-item-group>ul{margin:5px 0 -5px}.layui-menu .layui-menu-item-group>.layui-menu-body-title{color:rgba(0,0,0,.35);user-select:none}.layui-menu .layui-menu-item-none{color:rgba(0,0,0,.35);cursor:default}.layui-menu .layui-menu-item-none{text-align:center}.layui-menu .layui-menu-item-divider{margin:5px 0;padding:0;height:0;line-height:0;border-bottom:1px solid #eee;overflow:hidden}.layui-menu .layui-menu-item-down:hover,.layui-menu .layui-menu-item-up:hover{cursor:pointer}.layui-menu .layui-menu-item-up>.layui-menu-body-title{color:rgba(0,0,0,.8)}.layui-menu .layui-menu-item-up>ul{visibility:hidden;height:0;overflow:hidden}.layui-menu .layui-menu-item-down:hover>.layui-menu-body-title>.layui-icon,.layui-menu .layui-menu-item-up>.layui-menu-body-title:hover>.layui-icon{color:#000}.layui-menu .layui-menu-item-down>ul{visibility:visible;height:auto}.layui-menu .layui-menu-item-checked,.layui-menu .layui-menu-item-checked2{background-color:#f6f6f6!important;color:#5fb878}.layui-menu .layui-menu-item-checked a,.layui-menu .layui-menu-item-checked2 a{color:#5fb878}.layui-menu .layui-menu-item-checked:after{position:absolute;right:0;top:0;bottom:0;border-right:3px solid #5fb878;content:""}.layui-menu-body-title{position:relative;overflow:hidden;text-overflow:ellipsis}.layui-menu-body-title a{display:block;margin:-5px -15px;color:rgba(0,0,0,.8)}.layui-menu-body-title a:hover{transition:all .3s}.layui-menu-body-title>.layui-icon{position:absolute;right:0;top:0;font-size:14px}.layui-menu-body-title>.layui-icon:hover{transition:all .3s}.layui-menu-body-title>.layui-icon-right{right:-1px}.layui-menu-body-panel{display:none;position:absolute;top:-7px;left:100%;z-index:1000;margin-left:13px;padding:5px 0}.layui-menu-body-panel:before{content:"";position:absolute;width:20px;left:-16px;top:0;bottom:0}.layui-menu-body-panel-left{left:auto;right:100%;margin:0 13px 0}.layui-menu-body-panel-left:before{left:auto;right:-16px}.layui-menu-lg li{line-height:32px}.layui-menu-lg .layui-menu-body-title a:hover,.layui-menu-lg li:hover{background:0 0;color:#5fb878}.layui-menu-lg li .layui-menu-body-panel{margin-left:14px}.layui-menu-lg li .layui-menu-body-panel-left{margin:0 15px 0}.layui-dropdown{position:absolute;left:-999999px;top:-999999px;z-index:77777777;margin:5px 0;min-width:100px}.layui-dropdown:before{content:"";position:absolute;width:100%;height:6px;left:0;top:-6px}.layui-nav{position:relative;padding:0 20px;background-color:#393d49;color:#fff;border-radius:2px;font-size:0;box-sizing:border-box}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar{content:"";position:absolute;left:0;top:0;width:0;height:5px;background-color:#5fb878;transition:all .2s;-webkit-transition:all .2s;pointer-events:none}.layui-nav-bar{z-index:1000}.layui-nav[lay-bar=disabled] .layui-nav-bar{display:none}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{position:absolute;top:0;right:3px;left:auto!important;margin-top:0;font-size:12px;cursor:pointer;transition:all .2s;-webkit-transition:all .2s}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{transform:rotate(180deg)}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #eee;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap}.layui-nav .layui-nav-child a{color:#5f5f5f;color:rgba(0,0,0,.8)}.layui-nav .layui-nav-child a:hover{background-color:#f6f6f6;color:rgba(0,0,0,.8)}.layui-nav-child dd{margin:1px 0;position:relative}.layui-nav-child dd.layui-this{background-color:#f6f6f6;color:#000}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-child-r{left:auto;right:0}.layui-nav-child-c{text-align:center}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:40px}.layui-nav-tree .layui-nav-item a{position:relative;height:40px;line-height:40px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item>a{padding-top:5px;padding-bottom:5px}.layui-nav-tree .layui-nav-more{right:15px}.layui-nav-tree .layui-nav-item>a .layui-nav-more{padding:5px 0}.layui-nav-tree .layui-nav-bar{width:5px;height:0}.layui-side .layui-nav-tree .layui-nav-bar{width:2px}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-bar{background-color:#009688}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child dd{margin:0}.layui-nav-tree .layui-nav-child a{color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-itemed>.layui-nav-child{display:block;background-color:rgba(0,0,0,.3)!important}.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-breadcrumb{visibility:hidden;font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#5fb878!important}.layui-breadcrumb a cite{color:#5f5f5f;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom-width:1px;border-bottom-style:solid;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{position:relative;line-height:40px;min-width:65px;padding:0 15px;text-align:center;cursor:pointer}.layui-tab-title li a{display:block;padding:0 15px;margin:0 -15px}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:"";width:100%;height:41px;border-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#eee;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\0;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:15px 0}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#ff5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #5fb878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#fafafa}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#5fb878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#5fb878;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#ff5722}.layui-timeline-item:before{content:"";position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:first-child:before{display:block}.layui-timeline-item:last-child:before{display:none}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px;line-height:22px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#ff5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#5f5f5f}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-5px 6px 0}.layui-nav .layui-badge{margin-top:-10px}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\0;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:none 0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\0;opacity:1;left:20px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#eee;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{left:0}.layui-carousel>[carousel-item]>.layui-carousel-prev{left:-100%}.layui-carousel>[carousel-item]>.layui-carousel-next{left:100%}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{left:0}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{left:-100%}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{left:100%}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{top:100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{top:100%}.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9f9f9f;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#5f5f5f;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #d9d9d9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #eee;border-left-width:6px;background-color:#fafafa;color:#333;font-family:Courier New;font-size:12px}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#eee}.layui-transfer-box{position:relative;display:inline-block;vertical-align:middle;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 10px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:10px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;margin-top:-8px;color:#5f5f5f}.layui-transfer-active{margin:0 15px;display:inline-block;vertical-align:middle}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#5fb878;border-color:#5fb878;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#fbfbfb;border-color:#eee;color:#d2d2d2}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;padding:0 10px}.layui-transfer-data li:hover{background-color:#f6f6f6;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 10px;text-align:center;color:#999}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:10px 5px 10px 0;font-size:0}.layui-rate li i.layui-icon{font-size:20px;color:#ffb800}.layui-rate li i.layui-icon{margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:26px;height:26px;border:1px solid #eee;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:34px;height:34px;line-height:32px}.layui-colorpicker.layui-colorpicker-sm{width:24px;height:24px;line-height:22px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:20px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#fff;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;left:-999999px;top:-999999px;z-index:77777777;width:280px;margin:5px 0;padding:7px;background:#fff;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #fff;border-radius:50%;position:absolute;top:-3px;right:-3px;cursor:pointer}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;box-sizing:border-box;background:#fff;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;box-sizing:border-box;background:#fff;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;margin-right:10px;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:150px;height:30px;color:#5f5f5f}.layui-slider{height:4px;background:#eee;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#fff;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#fff;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:77777777;white-space:nowrap;display:none;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#fff;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:"";position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #eee;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-14px}.layui-slider-input-btn{position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #eee}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #eee}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none}.layui-slider-input-btn i:hover{color:#009688}.layui-slider-vertical{width:4px;margin-left:33px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:"";position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:20px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{display:inline-block;vertical-align:middle;cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:"";position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{display:inline-block;vertical-align:middle;position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:12px;line-height:12px;width:12px;text-align:center;border:1px solid #c0c4cc}.layui-tree-iconClick .layui-icon{font-size:18px}.layui-tree-icon .layui-icon{font-size:12px;color:#5f5f5f}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:"";position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-spread>.layui-tree-entry .layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#5f5f5f}.layui-tree-btnGroup{visibility:hidden;display:inline-block;vertical-align:middle;position:relative}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{position:relative;display:inline-block;vertical-align:middle;height:20px;line-height:20px;padding:0 3px;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.layui-anim{-webkit-animation-duration:.3s;-webkit-animation-fill-mode:both;animation-duration:.3s;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .2s;-webkit-transition:all .2s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,15px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,15px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@keyframes layui-down{0%{opacity:.3;transform:translate3d(0,-100%,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-down{animation-name:layui-down}@keyframes layui-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-downbit{animation-name:layui-downbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@keyframes layui-scalesmall{0%{opacity:.3;transform:scale(1.5)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall{animation-name:layui-scalesmall}@keyframes layui-scalesmall-spring{0%{opacity:.3;transform:scale(1.5)}80%{opacity:.8;transform:scale(.9)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall-spring{animation-name:layui-scalesmall-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout} \ No newline at end of file diff --git a/view/font/iconfont.eot b/view/font/iconfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..622d7ec82e4afb89ab919a9cc9b25fb6dfe9cf75 GIT binary patch literal 46684 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	NqtXTTr(IH0bTL$Q#&Rt<ct2PGwNr_Ne<NQ>$( zDfSNyjw#X=jj75wTr0{|6PN)?HHoW>jP>iiJl)gq-i_hj-mH{;E|E+op2J0NZ}`Ud z8hQfeF6kthD!$mS0{Wf77AensuWN>(z3yYU)FQz<^}w&9euc^>Npv|iK#&<#y&6>w zMW^ZWWeMcqLPglQ$-eLLC;4QoBVqR~e10u`j<RPXY1%tP`!R-oRQJ8QEZ4vHcwLg} zkKg<gN&3mn?$N$&`3(=;u-rND$#VVi{TcT@F28m2EpN&4TesZ&79Cl6&5=i5^N2VA zcevAzJHhXLuw%8s;N_4Fh?fBhd9wuGt}2$p?_B;LMq5B5{4`fAozGvp@uoK<wqs<| zRp0ODFYQn`Q-;pI;5H`x=79%(Qx7dadqp@IoV#vbkY2arHA#AH$CsbY_Kowua^;O5 zBwAveHT1Rq_#5|rEXyC;PdBx-X1wuS9%`tA)BASw-(q}(98!cJ4Z;YnZN)6P3Vc>9 zh#i7G_m}!BRmzo8L6u`**wt{Q$ls9_BS`Hj_U3s$3|W+xOq+Y{d1*=m(Ez1XmFO!Y zjM?v*G^cu^Y3U-y`6Na)`rcC|HRg?~D|;8v%k5CM__FTz>#LW<^pMPg_48!9q<1Mx z#Msk1<VnY`3O^2e8{-#*Rj>(o(gF)#H?&&lu`~-2%7ploMay^_Er%5~TP&HCYBt&@ z_eJwKXVt$t%j^sGsXmiZ)5m6rbLzWKP_6#3M$x{rU$57z)wOh*{n*;SI@9;q+aX{5 zTwf^Uqd&R1zD=i8XIpjpM5#Ki;h5^U#$&534PS6%yeIgpkc&If!h9F_rU5-8AD|rL z9D&?}HP9#|pbV=5AHx|gG%x<pw~zBFUUlty&FArG7vE#}{l+sMKijyDsf;t-1D>Ux zu|Sa@GXeoR@f?*(ioJuq=~K8?-%I^5KicD=->SE(I-`^c(CCh%WG0@uYjHP!7W$x& zr(rFS{~2jo5IJfwY5Agsn{)YmZu7!L4<5E~a~^-27aq3a=C>s2t(%?Wf4;xqn_xSW z^SLbx4|{OYf-NHZmIWd^F8K`UCpWp6bkk4j=e{TM9wPWE8umE5AKn1ixuA4G>QjYI z+Jj50%Cp=mg|lHWQo%?2gv4)wlVSw>KzG4v`QvXMD@~kIZV3jYW8Pf9EX*?DWt*dR zF0!fly6_JFL$i3$=$%HV^%_BG=EH#<;p>`N<5jvcPoZsQqkh$OQ|ycB$y2u3C)0}; zRZq^G96Qfr`T7~__gS9vVo0buz6Z2(BZG|x^UGjU*C7dnU;}D^cAbMQ8skX|rGl9? zX}K@O^5rljfIJ|I<yQbqqJ2@ZB(vcCw1<BC0(&BR&+dB&f1Tg`?sw^nIMmN^F6h!* zxAoL-Vax0-+qbuE-%giq$KM?;{1_)^js2GWjQfN|nSu|OC`}H~i|kVd=mPf2pna-+ z>L5Mzukr!0tCW2(V4p%S8nAbb$%k6@UB*A-i{LpZf+ma?UJ}SRRu=eP0+wOfW_wj$ z&4Mn0dV*3oJV%%aKq0_{!Ilex3ppu*Wr>tu=)Gyywq48T>c11qnR!k5oOpeYKQ8}B z3Pm(dPp1Qm$B$n;a9Oe~i66Ux;s!~V(PV2X)tY=J*-Yu~Y!?WNAJW2Mp^%pyuWM>Z z-}{5Mfq^9h18q^{OQoWpyA#Vw@PH8saUi4CkL4JtA}J{%KEwjO7(x#~^72TlkSfx! z@{}|c4+>xhLe7cFV=j7QV5zX42$qU}qO+>_C(IEjBN5qt=gl{5h;B6d<`Fkc_b^|? zGxW^`PuqV+lKk}3RF?C3Sq_DjVyV8cF`q9tH`8x4G&h&?dHXv}OO9XC6iFzO5)R8? zXrYD~N6csl87h^-VWcML$eT0^E!us_Kt+w1OzrO9U$t!i`RS?WRJDj9YZJe+7$T~u zn2w%bYDlFTf@!ZF))bw4g8pbc9`y%39IQI5d(;2h;{_SR8RBZC6QYJYOjtVZz+v^I z|35xn_HUd4%Xl$5s>ZcIAZl6BKmeC2#?YH_{GIzQ=0C;y^1-&72Hv#8KQcquj<Nis zW|da6VDY9}ih@O1S!xPZ0YnXCtE~2wqE!e1RVwai70D_s^u|&`rReFTlW2dXuLP`v zB3uN`!w9CJUgNe@?ypv$TNK$V=@!*K)wK7dOVo<9DZMmDzeT6^R?Kbdwgp$t$gZ4W zUm-VLOD){l`@E+mErn9sVPO7H$bXq`hBUr*8kajKQau>d>4Zu0$fbN?OUk}IXrG`$ zK4CwPcUg6-cM7FD=&GKnw0>W3>$<JIE3-53v)_`h0Ur~$`-mEE+~lPs9`b3v5T(w^ zreVgy^my4bJ<~m@8)LwjNv)Rg<2$#>ApSzH`ZIru{TB4*5P_dSt1hVS7W${Cj&V{L zlpI7=V;F}6H^>781QH4s6S#p8cP-=xHae>fJfc!6@~8ZRxdm+tht8bXwV-8Qb0Anu zOl)Xt^W=^iY(2C!9zS?~suCMKZQ?=4hx4-w$$@04Wx?!qX4kpp__FLIQ|qsOITB$| zXZeDFpUPn23(A=me*%*2l(6B=^e)JRJ>K}-&b~H}Vi_?d=$8Z0kP-+_E159Ga78oQ zPd#?_+R0yDo1fi%{L@E%P0z*_9@^c#X`|Q36G=pv@fUe7Jea~lI~8NlS1I=wOXv$m zz>&<*Jyn6-wo(=IUxg6iV3II#RMBgQj4D>v5Y)YjxQ9gc_QyPvOv$CveH%^lnmwiN z4b!LGw`o%MHEWh{xa94wPZCF*d_*Efm38yxtyAtx&{$#p@bvY2|C9-|HmsU5>m+I< z5|d8qIe1G;!P`sucfUEbB0Kz;{Vy{+wC*m-Z~S6swc0tZmu{LX%#?HK%7!Bb2NpM^ z<h@U1w;nqCw3a3~0fg-9(qAEiL-v(HX7>}|Fz78Pu|s>qeWu_VWfSrxv>Di#lo%sp ziJhRR&%ksc+n+u2jQttNsWN$OC>dJoS3M)bLEuqGM4mBa`14~jKZC;d3wBPddiu8C zxKr2fG$0Z=JmOx+M3W&~jsy0B)q`LP+OI|(VQr8)f-so3kkLxq<sNQF1U|b{fJN8C zZrm2lMCi6aG#c1OBblgkb<=KpADT;dKS7Bs?;}s#_MRlYciXq$mF0K8O|Kb~I~a)s zof_y3vb}Hj6Z?>#k|%akD(}4mnGX~cyiJVlGyD-g$<c3w438#Y?$Ml1`Z?`JMJsbk z)GP^p23+lhGKl`seUD)nKYQ%aKTFb|AKmqlEPu3X*GH1{QG5#xSb?pcSkQC3W@)#3 zf-yc({_N4w?4Rx3DSdR0lXKTSAJMbFK&N{H0k8eY@yO`8Uem5eNryI~kvrMzj%7Fn z4m<@u<zt0^j$&Lv<zg_yRfNqQy0xj6hv*<R^I)VPe|ao~ShSi&m!NC+S1<>C<vug7 z3c(rO5#|;rk0rDzF$)K>R{M}Oi>#ydq-m56zm{xnPQKO%L85v2;w99pwYF;BeO|4t zP4oW3-dX6TZHZ88?6t+Qoz2~pcB?cVYHJI{=|^}(y9+i!a$7vKBud-bqOT=Fix-E$ zjcIe^{+e6&LDKr@HPlK_z2>Eqc(q@kXlrXIv1*mQxRrJ{)5V2udkLzgI};&$2~wD- z7-#2YOP17cZ(WSXYzf|vIo6$tK8=eAFB1_m2}He2f%kPeIZF7Dsj!B?&K*%pJ*s1d zv4p5zs%Eeja<B>D8KjrdJRE7AtRM6e3Ma4)=bn<P<a=Ce3XB+|sgPcy1yPYmavq9D zX)vmW$b?9CO*RtAX4SA?z4Vf%OX$?|v*%AW+d5j!OS6|o$G1i=$zGDnb;k#%40gri z@z!ixcKWJZYqrO11W9WQ_GAz3@h6M^o<r+fIw@O`U19(JuEIUJRnv37P5vs}GCs<- z;RQ!$qXW^YS=Ap_U%n{&b$io=*$a<0@po1Bswiz8AH}(OWi!3lipRSKrw&?e**4UH zxAmHh)%lGk-qY(ZHu`!GvsZU@eXu;c+<xcR$=`{_+*`aWGSEW9B5nmXy*fYN!J#JL ze?NQ-vq7g0NQ4T(xE;VNXIzD_3nQ^0SkT$<v=f{fWLF$3!pfo)frU_1gjh&xFWA2U z8v9>(p86HV{>}5Q(ZD&{kJ3z620uE@5~s|UX<Jjatu5QsM#JFzT>+4U)_&R&kC}eU z3WLH0o`0SOKm|X2{(1XTeiiH#`|GoBcI#*wt<%1{a}uSKR)_<e$p#Y<y_Au;G=YX# zx<NJJqy`PaVF7y?>q}_Y(7s?!1Br-$@k73^TAXg3Y_^)cK?vSk>ET=J&(7b%q^*;K z!CoZWi?+~3TkV5hgacm4+JEM&*&m>tcOVjJ1!^m*a$ZoL{iu$$2P#y;kikvBU`&7* zWA>MXE!8o*=Y@HyDg<r_0YgGWwE9Hmzmv}9>K?m(sjBPh#VTw-?3X_(c_c5Vl5g&# zvLbO^w|{)<sq_c5vnY9CdRH5=*#=dW47J!vPovWYB}s#^Na>p}p%1dPPaT{_*>5HF zXS!<tPE@;>vX|?p-jm}zAXCYhe7!_vgS~FZw)dlt&MHkbysDR}@CK{Q3wx9?u{8Z; zxHlCaPp#gxI>miniDyrq?hLVWc#NG1S|}nZ;f3wBdc-Izxl&KDzuJfE9$drsQSHGq z%FpyQdA(ly3tn*=Zy30>zu=tc<!l4entb;0;^h3i^s>?X4qteapT);PHx-r=LNWfZ ziF8s7b)_#W+#p!7lc=DW`wb^%2}F~hQA*XXN|j0}`npelQ2jvn+3O++N)r(_9_Q<> zV~2Otf1iS)SxT`dQYA@yP(7G>^%s$&z9HPu5T<Xxbtjmrz^g0xZg$(KS5RP9ui&gQ zlt;H2LOhNrg{+z7pzC2*YwR!f{mq4NB9{4OdtVR5<00OPWBoFAME%y6Z@pFAG+Wm3 zW;~vc$2Wv5t2rL0->(zix-K4K4~r7@8KHP9J>I^I9#0Pu**^c<a@%c~8zF=4<iF=f z0}lciu>xERlow>Kni;BE{CD=1U;CPUB{dJFWm;bN!IHOb>7{?n(7E<^(!aE?fB0c~ z)J*#F55gC}?&85y{4qWS5q=3+9pTO%>r+-u4EugIT?)fMPzGm<!YUA@_V@P6^4{;c z$NN8(<xlT-kD=z*U&n9KfrrS#kCQ&V|AAl2@~<Db|5K@c!jDCsAG`1W9)FZibZA;$ z#D0Jf9eCwf$pGFqAR?qnV4Doghfn~)%MlSO{j~13<1t|dee8}8Wch<TcK%F~er7M0 znzg8>(P&cQ65X(Eo1oE`s`!QdkQ4TP?=fLMee8RC_uec0Z08*xNRlW>{}|CjlebPZ zLy__c51xO%Cj|bXMm?9Jw1`jK_pU@(9pg0<Q8-tS?-9hkz$*xOKNc;U#cIV;;Ycaw zAlh3Hxxm#;738*B=_^B06UJ1m<;e^Qy_TRYm8ywe;g@$FP$zE{3cUE2261tpI%QE~ z#fl-A0RmD~==6V8T@)zum-;Nc0RKv6{}4QwV_Jne&?u;8pkS6f+GeK>?pqwof@lYr zgQ&rAc~(c?dPw)Qh+mPYVX$CC&sQGlZt_@Rs`(|(RIk}Pvtxc!IIhA09O2Ncnr~=} zL%E2-&BMZGa`6QF9$Jbru7?t{j_sYFiuhC}ha(_t$!PPDn~rHs<g~EKyoNB(vWEs2 zC(RH%X2mEJlz7{X%^}7jEim#X!kPJ<bVje~^)N~HduZ5Fv)vC@^LiAebt<X8=+thA zREC$CVJ(+vJ!aF9&Cy0h_Jkv#vc5=aUhlE95+R+lXvulmzfmjd3wW4f&yqlwBf&r@ z*%%HP&;u2P(eL^sEf{F;PdCCgA=^_@fe7c^h+19+ilUjM-<5sYP%>@Xb`FhZ5)|=v z+88%Oy5v|c{JBs%+nDet4KvI+?9OisI}>H;WGL&C?O91vyvb`t4b&S6r0C<aHyvzD z_qPXvn&h)*iDod<2!$JyAuwEyR?_b(%oFfME&7t3lT^;brjhg~8uOWOvmeU8s!K-L zY)H~}*aIXMLNlGWf|ks~T7HPX%$I=D3wh!ocy*Q|a&sf1(auBE)RjcU*MEmRLY^e= zW0n7bdcbM(6sBuBkxrwB(8KAmbOTt_7Wzec3B8TpO}|Tb)92{R^ey@U{SEyylbM%A z;SU<edf7B~2wTC9V<)k**mm|+b{V^l-OP5ehuPEYCH5+NhtJ|C@pJiY{0_d0KhIwP zURA}?v%m>dEc>EbDwbhJRZ6%J7*$oFH&;uFrDT9ly|}{lWFgmBl~Of8OYlx8R@H)f zT`A|04cFl8rK-S9HK!skav*n1Em_VLUIROaBal|A!hx3&KKZ<o;lk=sg43!flATo4 zAs&mD6k#y8)IMZYEgay!LUnjap%2ap1;zk)8Y1~(zFev1(e{$KhzUv&g=jIE=E_R6 zTB-I|amH02IuNatt7^U+LlTfarvkH)v7|&Jd2m3KMt{^?v??5JP)$nFO0{n?8md~+ z$|S1ft5GzkTCOTlL3}L7zl%#GsNzuo{x*aqz&VM>s49w~#Au*=H3~wNFQOhXo_P*h zf#E@mggp$os$v*LPZh+2lu$si$`y<<#ujZr|Ih@?7|P<@=bpqc7fWK2EMW~&Fn%Jb ztaQOJg4yYU0}fS`EsTj6w!UgFYA9mZsTdbD3Zsk+IgBgrQ3dSncv3DEksEW3hM*mI zh<2bAc!P7`AZH31Q|u|`<p_op;#y7xLsvoUAhlxfpp>bV{#?W=LHj5w>JWS#ouJW` zn1yRWXOXWgoafLlD%I$Lv}z@$VC`XeoUy4?AxZytvdi5)PFxrUFAp~12$E<4x`GPx zu&4;q-j{<VS;&<69Hg!Q?H3du4N@Vj!o-G~XaqJC3?jN2tBL~zSI5UB97}?LmkOfc zeK74~%?+_)3F;AQ0%J$NAo@ojv|8D!DkQF$8tpD(B-N}MEvhtY!d_k~W6@Mf<*b-# zH3wV)24Nsveq2VtNU2)R<*RUSL102&yfP0%pjj|uP&N9@SiXn0%d|lbMq?$`72@5d zMomdEhEftU+Cp-~yQocuGqVVQqsw3+YQUSS8O+bwILOH&JDy6EL4xINs_@N4I}jPd zt8{8J^HXocY*%=*%p}lTc*a816ZcAuMikz?2!cIW6ZJQPBQ;4fZm8O%_)$re(+FqH zOb!Kmnq^w#1%+}WlSW(eOis!rF6DTf!j%QB=yVBjC`LHa&Ds$JB1u%M1|+&P=nESc z`*a$ndXBYHsYOleJfOA8k|*FV(e@_h*Uccb$7ZRSwL|y^^zo=K?opefJq!sGB;MQv z)(Ly4+{}wugH+3<c{4RlxKKrMP(j#fu9>nNrxw@+YhpYFi5RG@GhP1Wf>eNqW`>RK zZod?n+M%iNYBGlWs!W4Sl%l<I2L_jq^9E#A4PqoyiljAqxY{TuR72&G>7knNv`e0( z25V@P2E3BrfS*&2O9eky6eW?+X;6x?s1(jh%ojj71p>IFbjV-S2RNr?N#d%?)QE>l z0ZB^XSp(<e7<hLcBg%CHULVBGC|*U%uwSSK<6g`UhV~Nfg??iM?`0{bafM4P#oHtg z=92PW!&ma}GI}}lmwey1(wUA-#)1>2EtQG|B9RR2PytC+6kdYM5i12=8tGAJm!0Xf z6+^akDh9<g12b2UE2_*(P7Wt8y^u3cIzg3ZX*iyUP#C^=2-37AQJw@AK~tihbYmp0 zD5}=TDOhVF9;Ww0)Yd`HksW?w7)^tctV<YkMPk2JXaeF)Mhn-snHH1)P1oX7=bevs zN|H?Dn&F{lTn{FgeKp;U1zA%Nrj!kO>*vuxmOW4(2~w;oJ;2tX5p+3=Dq7Ot7z%Tb z3jaxcgrXL>S0Af4Kzv}q5F(Csc2OXL7%ZyLb|&k-!dy>GYHsty42c)LEFi@(--&C~ zxKI8G)~1Tp<Cj#%qyUq2OPVQ3fuNMpbSyz|xh6TtXg)|;7AvR30&P&?X^&?!++ob4 zmI5>Z4fR@<pbTAZ9muAPj!E1Tuq4=#5^5n4R8l$|!>~R#27?$g%g1LZ-Uiv{^#>bu zy-{t#n=@Uy98-LqzKCjA>=21ZVQSwb1&!=vnv#qH{Kz@YM_EjYt)(WX7XkqpmWb@p zus9HtCAD+KfOEqG{D?6_8pdF8>i1DdJ9C*AF*aI&#d={4FO-?Y<e*Oq%il7XqA8{( z$+8jk=&A<+W<X?LlcGV_=2BjPjHUZjjt;1P#qh*|*B;FyCmCGS#@Uh|u5mR`N}7wy zh^%c(gjW?#^dNrAqr?$JLM5pop-E~q8wW{}(<~E0Bw2Z(s#-8(Gz0>%V2noLw-2Bh zG48`c1u`mX0F(#>jWM-97By(!bT49Yd1wDdU=Cza8ss|GrpfMQP{I8PU$g1qEdlMS z0QH2JhqY-MNFHoE4Rm!{Go*Bk&Ge!>K@b^8!6pqiU}-=Mj3|v3=AO!`W>6mRn*JR1 zr)1sm(y-S@Jsx@vY}QO^M9Tt=3T8y|t)|IwN&FD{-cUm5a|2yKL&<PB8KNOc20G<5 zh3m3MmUL<Qe<SY;oO)AAUZqK9<t#RFkr=&bgBfAU#HMU3D20m1IS%QT^{%7woJEte zv>L=I3lEJJ7S;^Ef>rF(ATHa#=Ukx!ETn^bC1I70f*LUf6KXLvnU)iQAdH{D8iX(y zdcLWXD@;v+1j=lphuR}_oD%d(9%Kl5#;dX~I2iW%xMmtyfNEL-N3!3fDVeiYW}k(f z?g*p+Q$e>q_B)I=!@?!oFTjkj-;VqX*pY=bV*vZ?=3)QO$zl&j0lHHuU+pjEg)O5D z?j1D|vJGQ#BnGw%*$r|?0d`{HQ5!XYOr}}rj^Vsn?d^}6Rt%zwD_=l2bfpm)bwNDn z=@hXVf~7m5C9pB`EUE*C7on>|yvjea!oxJ1sGl0o(n;Y4N*ltHvI+LJM1~HBExPxz z;bHb#K&g)?0bN!YPR9>V0!ymDk?ZJ~*3pqQEh}qT^n#i5qM=l%v5;#`4X)8-YIs<u z2h$aZ*FTHQZH_br!d*F@Z!c6kFQ%`C!KLuVVuCh=?DlX%PGo7sVugrIU$+T_5E@We zE2srloKpV<{RLQ*-Rc#gcx_YL+o!gj8q3D;8w?*@NTsQXIIhM1K97#Tk)USSzll$i zs9zUcp0y8^g&EqhkG#hT&tO;51n3XYs*6HO>cg%9p;C*84Iws(AEYG=J8bsCGlu~a z-b)cyC3Nm0yLa5G3CkvRv|UAcyg0ECh|_>!gr!3pf(Tua_01m8dp$iaHO??$5BXV3 zh4(M4us&AHBxp<e_yw`{aSfqRQ;V4i1pRD6p<zmid%#hoKwisOsaUh$8pxec|5f*r zUf#V}#9NEFhHY5(TOE6dh}0N|9*l9~@G-VtYLy{(sd8U9Z$+U;RLhLLX~R=Po8Ekb zHepe|`^IzjpKz}}_bdXYWcyF`4}P<I_it#R`3ud%xZqnA<axu50eAyt_Lh<P+0o3; zK5PGpKCr%H!NDDCU#90w?>Klt$NE;scDfre;ld)TqMgD91xb&JP?G)U`|X`{vAvTI z+k^BOz-;@GE*hho><4J0{fK?WWIBgFXrD?CL7#;^Wdyq32yD7(%-Iy|3S0$zfqV|# zq^D}dqA`fTYPDN<0Dvv<!$43!@VEz3tec@988FeV!K%N+N7F^lY8Vyus2nqY;PH_i zlc;}zZzU{FlRAfnhO}{$TB!c%LEyP(MIvWV8lfwuZ`g2xN24<<<(bsn%V?Hga?**H z@Z6J4O-)Z?nedULR*kT9jt+Gt6aNys7WT(v*AV^I#*N`<uDv}M4Zpxv&2DdbEuVh{ z+_Zi6D)vkI#FK%9Ibji_^9GtT_H_s~n{mn&oL_Ou%t`c+YBgxz$0|c>&g1;NHA5B0 zM*1VZoev<MwIp^G2n!h$030E^V=(&QjjF~3`S`pqjrRAT>pen$v3k;QVvS~J{G?0S zVDGvu;5tApu$n7Q_xVq{g!4;JoWGW_we#nRBZ7Vg`;BbOXo2A9<{RLboigpDLgyoA znbD}p&;GWb^UF>?<uZFZTX*om>zH%2x6lP&DI2kzcif3XTx4|Zd?QY5i-BGwo%qJF zt6I=5#2%v~!r>EBK^TR<B8Sk({ShjozS7xr{)AoD1fO#n^nYV2EsQVV$4B-@nv6PD zZFz8^bcOHjWOn~KDe@JZ_4^27qs2ZD3oRLTN7P*wpC3UkmRlcavrroq1nUiPXhTI6 zbPIZBRJfUhErGG!aGLJh?H+gjhb;fc&Yi-PxYKWi)UfVP6e5t*d<m86v93hQ$frt? zbTr&zWcaiL<#zAedl!oAFV5BkWALu2x)}{YSbW-4jGo0QM3tHef7WPBZqEm!)N2%V zgmyS<<N`hd97@0|jL0F`ah!slK>@@fz*=#mfe?ZW9o{u3ie-adgB;>9y5vW=$Nt<% z7n)<I@Moa>XihiYh&~N(S0EIfxUpp(b)u6cI<IBp#Aqmxm-J9%;z^}kGk^M$OP`XO zbET6eMqoV+Dj&c|eb$QQXES#8@=6z?dO}*Eb>@+b9XWI6QP`5?37gUy%L+ykv#yza z{;Hk-AxZzSbJYd2uAP~Pm^sNCj?cVu#?bnf%b$~^=PqwqKWWBQGZNvTN>%!+Ld(j{ zjBQ@Iax<q1IUK^KFks!R)r_s4l}YKQ#{=gi#W)fE5IaunP9Kc~M+adaaD&4kNRH_7 zh;E-C2aJGhuhqf{oi*Ac;!H1*q4L>lv84g~Oq?~ee?42kO5rUSLz&0A-8sfjcoCdn zKw(c8<7r|*fsMkeAXfOhiUOMbCT)Vx?cFzDuwhN7ffrtIeP`gei9{$W9I^4bd%|5J z@i!3!Z^6;_!kEJKWpK>WVW(io-tC^p-aFqqz?eMByMUE_=!N(q$23^A=OVi0F!*i> zyj>zFa1>nkm<7=SJu31@KARIZ2I0g$05K<O5NUY<PEhOLx#l<Dn%kXwBYT_X^J#p( z?)6H_-us|X$+u<Sz>`~*dh_<}d$(_YfBSYj_qSK<KL?yYuU;S0;lK9k>`C2QZ-I66 zNtup!{-`{1r1)Dn<~WKg|H;3@o3IYjj?W1qnb@1B3NNM*o6KUN58;C`3(g#bsbs|j zW-)dAl5B^)<BM0flqntVWG8hDQ(6yy{XBXS+)Q<arrG87Z=_4?Pap~Z+O(clTIx4< zBF}Iq{h)K(`cnFgPpnLRoCu>vyl%RLW$3KQjqFKq(MH6aR5A94;Y$Rkik;{M=fzk# zLI}i4p~5+7WgRc16RL&ALEJ+#{j?w+APB3JRiXu~FcFU>R+xy-Dv8(y$6^K~cjQjj z#VO{n@2~FLoZySUJZJx5PmCs$QQ&+sX_r)$KCP-N>m$)5RQV`#&-G(eHlji|Rq2kq zMQ(9;o+@`keHMp6T2VndaQG}Edpxo@obRULDoz_C^oA&mHjPpH$Vel7ol5qRuvl<< zgOI%wVaThHR>O&Q5h9GRY$3@f!bVtl`^2f8K_f(J%_G~t5-*^pIR5?XF}Ul)n0JZq zER2<~N<HQnOjdis1<-rd6pp4U;w;ORVtxP{I3P3uX|oWTvOwB*-gwdeEs)mt;)~P= zLF>0K{?xt$Mgu4z$hA~h4kSJz@{KLGH#@e3sDbWz2KiO{bYWFcp23krBy@a~z|(g2 zpN`BW)=JUcA=?2X1h2v*B#;zH2*n^OGy^gJmM~oQid9jBnNMg8Z8VAt!OYqyZ?|8y zU#0DT_`@Incww;f_+>4T$ii?UpTizIBQR?Ud=`nWVjTRY=gK?pWGm`Fx#%ML+xoLx zw*~@cytB`;daPu`7dRXqj+o`!{<ToAIsPDUD+BGtcdQ`CGQL`Tp+ZLZm++8RVNJDg za>6MwoZveQhHWJ+!pdm{stR}z2d@Ht3?U74Qm`Rmu0$9sXVMMzp{(9=_@JszQR82p znwcvFS_9KPil6)Xo3sVGH`QsS8@i(iS{8;IZ#<A&J+t-L6^kbY<5DTnGZ6F~ddL;G zG1|TIoE;-~e0}bd58qz79*TVD6xMKhUP6RA?~F*kMrA`W-rfYOPM`sbau&WKU6om- zOU)zjW<t7u(=pL#cgyN$hTA{<&a7{4U4yO44u9GA9AdMUgL)E(hQLb4Yldz@>~!{h zI@(xl|K7bU#9L>_pL-IKgo?wO`{B|M+!woODBA(IlY(^w)Ps4(FlCi1CQB$$Zz)%p z*)-&3bnhlgeUq{?oAV`aR0&H#89S9Y?0H@mYU^rRUk#-UAG70Kao?n%0sXcm2=kSy z`LmeH2nJC%0>LJ4L-wGyY_{#7Y=gHc7%=qKfNTc52SZN|9Av>Ecl4HEFwzu~Jt-$n zdpF{_h9S#28WyN0W(kuk=%_0&fH0|9llM=&cG;sMcI(k=K5RL?`IZwde1!8yE}V8+ z$9L)1;oO^wCwR^u{N|c7nDp?4UwfE$w?9a~KFY6mGx2>V#Cl-U3`K~??vDDq_GcZ4 z)_{`QVH28Yw;xiGL+E|Lksa(c2S-R4B%8xyzlsmH*W>I%_G*0*y94&K%aKj!S+DWk z*vBMfKoJK!jCUO9#OI~JFnj_cL<x)7S-KFpE5*Wo2~`Dkc4bwSk<suL$1{HS9$DUV z_g&&x#7ei;ZeJVYeyF>RXI*(#BRq_U(nK+VAEmSRU-88vM#gol*Acq*;azuqD9hqV zdzj*xIBV7<Rh9kf?8S>`ss7i)C=Sv%dK&H5H~BC5DyLsf;3!9-v+jIge!#-UO5L5T z47YGKoMzDoP_fL1kkBcW%4r_$>+fVG@O{4oF_&4<P7b$@xaebwJDrb0v;5PeKeT@d zx)=W8OEe6+_sjoC=7Yg}vd}OtVZ?JW+CDj}hm-l7Kb8)8I*rDjLLuLkf{{AknQUy1 zsH~g$v*lu8iiB0*RQTv;{A$_$<cIq!{vi$7hZwn1q_M3LFVIu1>1ZhvqCZ7kWofuQ zUd%MaO!;j&mdTm%?$#!?w<5*!&1tQvw~+FF!W)WR@#dlKG-4cF+rR_(LgEa3iRC$r zOqaJjS+XW8@IFmuT}D8&;Kj>G)r_QO0s$#I8D<ITKw30lMl&3VUB0o!^n8HJJskMt z3q_OBN_=5V_Xy)QRBljkihVB<>`@e!KHcj#V__>6i-m(hzh48b_ux|lpz=EMC?1n~ zjI3tFEhFmHgAh4IVGkCcPgm*QuLS)DN@yq{aoJELN!3FBrfg%>N?36#Vg<dhHp9;D z4}*+)Rj^Qx9`Hx3j5RT_ERHZCI6_od%AH235(j(5OATKj630f}L_8Yu#Z$=?A_IcD zPb+#4HUj=}*l{Fz46hY2b&19r;^B}PG+_uaWY{lNkKqr7Bk}aG;!QRMVGn8u22JY_ z&b_jP&99BY@VHP*0(8XZ!9F{~&&y`iYRJw|eVKenmubojg%gKs0l!c4ND9WsvaERH zxL7z0)2nKDgOP@8x+!jjLpppa{>5H1*beKcgsKv;kO7N&sv#N<n~|W`XUOomXkHf& zKnpJ5S!WMc`{@1<6XG32RfttWs48cH?{Jh^@O2_c6OlXA4>z?FY{5I(5Qs0(Uf=*i z-m9fYtQ_l3)E|sDHO1Ma`co)FTeI)KA4~PJ?)s1D6H|}t%&$H7lzwmU<hc`8w4|49 zJf=ertSKiB3LSlPXg-@^(SO}Vv)xTJK|AyHZ3vr7&=k8NVgG{8-m+zpe$eStX0Na} z)8P|Ooa33ee!}pAldrqZDJ;HKhW<RxUU6uf&^X#4xd@3JQlg3P7661^Ayhg@eL^Ax z9~GaKaCUErt$X;Fp$LmqMZ{$Zl=Shv=kYCjZ{(BqJ_R#>p@-6*0&^lrOL4>prsK>) zfs9pu#iHTZukAlrun=3fSzo<1cIzUxwSEH|!v5I(Wl*%|BIIU&DQlk>0|)#))nfJ^ z^0A$<e?`Gj9J~N~cg`kF!agUY1F=Ka0*^$9yx@g`6ILx}2dSTiou?vD1{-HZ+z;Yv z;Aw$8MwRXrrTO!}bi@UvQp?dT_k|<y*vwou1Aekn@xJ`3t7pugf8T-^7VgiouKD3& zapu{j;=&geTyVsfP^4JAFVflF85ureMsCIND{}W0OLXQiirhDU{+LX6BI``YPW38i zYbVKL{96$>D0cM`5x$(ycEhF^V9)@-wyRFWvP#47VT<mR)GSsI!hypUhzGUuy!LOB zF4sQ{s;Rk)47yvv7dkkw=}J!^q}tbB^=AWN8ajV_m3_<N+^pUDkH0!_3GJIb_lzf5 z0AyBCjLws{n)Tl+3XIl}bZ%Cn0grtNy@kTj5&qNr@ArJC(_WRNk9OYrZI|Zl2Co|i zpBr|#b<Pihe;}}E)C_>-B4)ymSPNK@hj@RnAk;l9p}rp2mW0TNWyB{A-*Ep8Bhw0b zPdp|onI`GYn{IqllHR<rd~Bx?htH&Z+R!p&m}YMbS}YcPHwc~nA-HHB9iBFA<c4Ka zH&+bVANO{BVZbei9iz!cMTy1LrYxPd?Z)riP>GrL2T~wRW4YLGP4O8ZhhLBIem>&F zsijEPu^^$zSlAeFEc3A+LMS;=dLl{<!29^Fk@I(QzVmz>?H4zEmGiG|*zgU`zp<fd zc(`dd{@8qx;qL7tcT3XUBY)ywU%&n`&M#Vb+@-v}$3Bb><Ij<Kp5RYl9P`d7<_nm4 zSP!_I!=PnANz>Q_jU|j3=U4^^tMlu2Z37R61JVY&ru!9HePcRP17XjnzxITJDx3ZW z{IkFGc!gI;*ERbWF|Qd?p0s}o-vgDexkmQFPo95LaqQYKxPk`k#wiKAu!xlu7>^(J zc?(G&0qMd92(?d$BiNP!Y6sT=s2tyMF$)^j6`OvvL+mKnQQP#zNRnTK>-ycpr57#x z{$<PP+}Oi(ck7(g;K>qf1xXkTq~piWn~y7y;i*5eAEN4$2a6_v7GW>$Zt&9}Ft{CF zjyZ^*JxhE`43X|a<aHv}iil)TA?u6Sc~=QR+yw-vG$@p4U>>duaqTWGP}&r34`j>> zE#Y%j<@XZ`cMJU}v2br-jz@$8bcj*n;NG|-L%H0CSSsZlHDM{Lq?}`zdvz~*74k{k ze!>@!qP}y)sIbAmT%Z38Yzm=9<l&Mu^4H}hduw4vYW(=6I--=9778tEOH1{Juzq-I z20h3Z)|M8FrL`?fwFX=cUO6~0aJbH4kn?-wa}33wfb;ttFPqFm#y0U@9N=Gif=7}8 z7HSOdX2B%*TP*2&;&VBs{B;F4C6j|!4IZwC8}y}kU7@g4k0kV^$s}!oy=rM`T?t7V zo*q7aJX*2TF*T_BZ0vC<@$(>4>#(#R0b9dy;!AV|;0d;<_JJ{gUMbjCC@2>KeZ@2g zUBqFA|L{@-RDm`_E-pb>&T|~$+CiXBvBX7LXV0O~5Y&<dF@6X^WT=qevvkuO^Gl)m zulM!UlZ`ulEZY(QbugrW8VL0UWItl~aB22^?$QU`@T-B~IR8%1LpMRSNFq}A&@_GP zCU2v@mHs$=md=a@v$G&&y9zv5R@xe$>3eXhed0l~4^bT0jsJ}O$k5RCE3TkFx1KXw zl01lX-6x0o0{CFZKf2WXve_T-^WeV~p84AEWErn)l$-3gFVdLtb^EyZ#YR%6zYp=I z&H^AjyP-gzYx`s&U4956vh7FlZlJ6{AoenQLue}+qXoLtUd;a8zQ(@V@muZUKjI4< z+5K}i2@sl5GKbAlWOPT7*dzpz`?F_me_xW`zuh_V1%I`RXz$JYA0dNlw{+h@KuN{E zYEThO3+M)30cQI-^<d0P>29{+(1jZ~->~q|4Uhd7EubTZZeUF0LSDM<ziy7}`x*5M zSfHz2ut3g4n-EAOf{}#Hf{OzTjUu5iCS73sXqLR}<a9F$!`=P@{N2670>}7n9A6Sw zb#dkAWK8<r--smUWJEN!lfilX(rB7Up@Jj|T1edUh<mD!CXe2Z-i`XS{<dFZ+g}>f zmw)D({-b{R>rT_zUmEWA_aCL#d)=%~v0=9#qYeMNr@bR?9<g*CU)|sKYwUcDZRgnj zj!hpsM`N!)H(z_lwv)d!cE-j&8SSk5cudd!!Hn7D@AX*p&B0AaP7)qX5o0GLX~C0# z8>|5zF)*%q8Q$g?HdcPZhsA~T$~7YSzE4KWV^7KVxB(vwR`9402)Pj7@d5|L&XKI( zdwfS-qh(Jhq1ji$prg^_v_!~b|A76`7Yx!HXjzMg@d#gIifQ)cS~!lc)tC*C0KoY7 z{g~gw7veiF?zcIz*sTt0ALuIdcX(>lY&eQ-Do!L}F%KPHTtlO$`RC}-Us%7eI&EO# z;p5lL>ey+&eBbHEB|6I;9gW-8-MYG=rLQ#SY`(x8zjDIRaShhS`I9yt1T!l8*-Kn0 zFY1@MeeK7xI=-uAe8L?kNn`Iha!|MMG2-RU&QHfFi9v%#1-S*PmP1$gWOniKbI)jM zP922rf2o6WDLdiN-P;iI!nQpDYT-GFzJ201;SGf?Yx&f;X|0-y)ZLWXkU{)sFJ5}K zv+kbcd-xFcm8BtlcY}8wiBWdnE%=j|tB4wlqQej@-0e<imwN%>(7iyA3`PsKM@KNn zyo$YfU{(8FV&dx|Lrh4((4crt`gqrh8z&76wy&*R@w^l@vbp-JR#Q_~Q`0-{iJmUb znan%8K9=MkY?-7b^@&@4phzFDYFS&g{1B(D>e`k}h4purzj)af`+NFXh5r7l4@-2g z;$>ExUwvA4M_c>2<=tzk2xx0d;qxA!KgXqqF8uP%kwXmQkjO1xy6_>}o9n{YuX=k; zN$bir96nTDRcdLY?JcEM<so=%Ms>xH@vQ~%jWh+{eV&4Esh%so84GP~JT3PW+)V)@ z%o!}ZuNSP?6d|l4%2b5oVkO}pTnR!EGZ8j{Op|H2Q0}0)yo_glZXp^4|DYVmVv&h@ z;HXEmFLp^GR1{I8Sams7_;n!?h<|xnwn|a{(B3;(x6c;}S{kem+f~1eI5FrjDuN_o zG?BMMx7T9cnAc}ZiMFJ$Py`Y|#287pQ~Z||^jJ-;f2JbbtPsUBxNMq&O#!+$;x`j& z4m+xbJYjz@X(h0FsqE=W>AEi@Po~_Pi#G%!_S4sViyb~R7-6zEl#51tmnkxhB)#_0 z_!y!GF=oqp5p81XD$F&(Vk4uEMOvET3hwNdZMl*6ux2GK-`Qi?Q<Ub$BqGHSwd7YC zx_sU?*kyud27`JHj9qz#&!Dv#-tNYb!tLQ}4hfwlXoM@nKY?#GNtmY`<gOlUCq;y8 z9vZFH2S*deQmkYIK#S03R)Y2Sn055(b?fT4Qe`SE)NhJ!>`-+o#2B%ijv=7pXAZPy zmZnmNH+}m(Y}oyF)8VO9``l3p!PTF(@e83p1z_(K+Eb^XQCR%K0FuQ^5i%ra-D}W3 z5rBkvUu;dyLJV|cj@VD^S#yqI>==Y@%sqzEW9l}2urf!k4@+~{sdV0Wd)D}Qls#D= zVo%!FMbqilbefMKdwrE#jP00n%s4uuQkk*$rvq~tn>*0a#tQXDDsr}pPdbc_&wBQM z&`xLX88BDu`E(qnh+z=Ah1G*JFwasCnw@1;7#&<g1&*JMnk=q$&uq<vcqS8PYuww< zkX78{4)1b#8O4}HVNDVH`Bw^>B8z>eZlq8U>o-5ZP3X(8feN#4P%LYNx<Y#vi#{eM z3Y&motsh_@C8K0#fMaC$UrUUvd-$94=YR9zA3iku^2=vGyl&a`+onz1cKvs*A3pco z;p>+@uzdN-4V0JoSzEVYc)gjd`-zQ4I#qmgBcE>=LE)D~9kZ{s*IhGvK7Y(9j#?&v zg&y;j$<yi&DvK2SSRk*iQSsxg9N`=JN*+IaQo}u?&yq99FEa%)W*FLA5jq=QVLJX> zGjBOw+;U!qPT5zs`l>2crsX_;^4QK!{0^JbIp;}wRM(u&&hd!BnR9pN-E_xV`*&xa zNxg+VdkPOcVE^vbS6_dfdiU(He^(H%a~xQF8&Bg~ErZZFP7_})hBIi?$p{^xO>hvQ z{^1)r!ev#JRmVjI`vW4h28DP!38X$RtUuUPCF~H6pVAuLB#w}DRTwm?__zzcO@WCL zQT`%O9o7r6Z+jAm8hCFPW#_&~b=9YePa&z=PLGc8wNqZit}blPd{Oi4e{csLcvU<I zgjKo^S-nVj5tK!J;bg?R>FWKcp}yo4)r&6}iEB}*M|)8X2h<lCdErzK48RW{Zb%eG zbmsG-=o2q&QvXh}UB6RBDC(vcL@S=B*o`gf(>xlx=Px%8jL9O#RIJ?}0iU~pF(L*l z3Q4|KU^G7XHu?_(hG78$o3i-wf^ZXqKxZq6(l@i<ZlfqpC(sM+O%8bMKVo-DWllx0 zU*|EqPej&GvnOW15bL3j)!Sh@?Dx<MJ&<HndVhL(dU=KoXIopddq3up8KFW$F4s`? zG<J42){kI6jzy=nwoZ%2#QeiA_I=&}if7{cLwW2mA_q7!j85+Nc>Xp8bO=kLFqva> z2PPCwdUxK%!U^L^Z`Bc~@>!l$>51u<mWeGbX^&w94TIh{dW)~InTBD175=Y)P9M<~ z8O~c8(Cd+Ye2H?hkls3;<p@FGtSWBmuWe_KbuXr(u8A$nyr?VaUH<u7I-Uljz7DSF zb;Q3)dSHh~^Tz`9o3Tj5_r$*Z#wZ<o9pqm4m-;X>7;um-5DnPSKwEKvTi7k~*cA^1 z5GGCWebTY?n2`zd8Jj=BJ<dIvv7_fYM>_GopttG`{=hljmqnC(dzSm1Gkq6PWdrjV z6G!_cwtCL&HI%NIJ!dsIQq{nZwq@&kvTYP+mdLg__M8#O^rtv9SJ*a%ZF#Bqw%`75 z9|$9|a3f>SNwHckR)AC3ClXVH5gjoS4wyI>#J4B}YNnj8Qiv;jmtsFIV`sI9PIW^^ z9F-22PF*RX97Jj5VezdpaY%m42ktKUzU39Clj(bQW-PFwpy|Ke7rHRy+leotZFUR! z_>-c1$hUX1IOD*64)Ef`X^*(yPs8aA$%{&zLs#ZonVlJWTITzk{if;PJm$FfU{M1? z*F$?z1+F$ZIYK_*9(c#TKk&!7CjLhd(L+!sOdLKCB0lg!gtG9)tc{t>##twviID75 zO87!}iJsCx&*Yvd<?<Bi8%Mrrzl6v+Kka?<$Zxo7MI!7mU`Niu;{670mu7+J$@>YN zppL@KMSEao;fP-CfpG?(yrO<Bp}(PNZ|I4T_S91vd-n|ukxIA<C$u*-`(&>r|3K1x z&dFdKk<%%Fr%yelCw}yX7E0*IjWVc$wn&Dz{t7bV%sRc6W1AR3pGP1$h}G<@<2>5n z3gAizlAu`J?hzMoWcR@G1G)|#D$GVbysR9hcb}A;v_6wr+B@x}-0*~%O^5V$P90yJ z+TB09sgR}m>H79$T535o)sU6i7dFyWt5>n%BJ1R=g|TUao9&+-+p~aT8x6;AZuj`b zGF^Ep-I86@$y&4NMICG$L@HQT{-4Ia1ip>(%-ioA8fkQnPD_?$N!H=}l5Hi9?I^Kx z5E62ei;y_BY%8%XBin>z12`N3TCTuyUnxgh3bX_Ww1q-|Z@1r4+NG4;!a_@EX}7=f z`+y$XZoARs`#&>s5}>=kjg^^q-g)PpnRlM|d7t~y<dYfLUL!7iY35<^CW#i=jY{x$ zq6eRwgLuMvR0F`1fbaxX4V<J;iX{c2%Jf_WHxhrNcJ4|JJ{W?azPNI!%>=Iwkw-us zcW>W=ZwtcP4?gs^z+8$W?qbz7qGYoGB}IA?{DzB!i4A<q`pWnUF4YiAB38;g?won) z6^yM&&pU_D=phnVIh_4PuNfW)u*dZ>@$CooZj(!c{tE7b)!#89)-2Yps$iJ$m+shk zh0xNlm1DKB@eKcBQLTYR9k*kdW?iSj>*f5t_;!zBG$@KXJpMEapFWMp4VKA=cLIq{ zV+1$6xj!vBCr)bQdk3xpj?(II89p>&U|f;zr6DB^Igmq=I-)87DP)4EcB37R!Br7s zfI4bPmjfoSF4H~fbTjM3eZfFrtH(6s_eWra&pUf$liyq8wL+T-TYs}uZZ{dsf+%=W zN~E)`rYdG5cOiIm$dK|X@Tg^ml-1>QIIC>cZii=Ef6Lf8wg&&o1tx>ZDW{hDYApQ& zb@R`2+2L^;RP2h=QAcW4d0rI+y#`-byrJ1)l|vFD9GmP-A;k;oUoyMGwt&}E&KY^T zEfzE<4DcwHnrv+6nnUeo<AQ)-u=(ni)tuYxG4LW>knE0mSFOCP&0{yW*hP1wH`Tvp zfzMNAvyl4^XY{vM&5zfP&9h-yu9z2I_rUs*YhYZ0c%VVpFG`{x&NvQl<;?bTZ(bQn zmAkzjmr_%g=#KWUDmPbnQyVUCP6wegj@WBD53RZEfNXHU=E+~*U)>Y6D<-c5XP@rd zHZQw9Wpr6NWABr??C&7({N-hbH6Pw)kY>;zGy|_=3Bs49sMt;Ta+tQQ2%D6^G|<ef z!IMxWJ}EWCH-u#hR%R4BL4uRFAL$&cK=FdHrdmyIPmtnkK}|=AYzNIjb+`|;qx*rf zryEcaG`$CaAte#egW7w28U&&1mZ;vNJJkx**P&T{mmUW`ui7IgTiyDD!6nt5pnj-Z zRFO-l2C*&L+d+HQ(&~ZcP_s0mCy_uCm2OB+QN`N5@N@(UKaCt{#sgaMAWe+D$y}AZ zQ{t--N`Irh#-6cp=5F%cfd!((kGKLH7jO^5#@~v{ZiElaC`rdg7^m?SP`o?&O7~Vz zNb5k9xs8tGnGRsT_P0B5dR(?MJqSVfn+{9RQO+w&*bL)1Mer-kYPBcq8)0J5!@A+# zWicSq6#QlwH|(qwMFWE7b#q*gVWTbK&@SbK^8xV+A8=T$wj{0;N*9WiXI*GMeVy|B z?i+dj#@+gM<0Q{d>LIr;=PF$K>vFg=vt%4eWdjcntqOA8!NUc$7gq3YAvh#$n0sS9 zxISdVZVZ{$2b{z)WM}ok2f<taH+|UU?$ce+sDFrfx<O?G?kafe5rtkFLC?{KJXq+p zD`>>#UK=B3!-&~73VaW`={CW<LBAX(!1|C$yy?Hc+V6<l=dLwJ`5SiczJb@a>_u*J z<A#e6k$l6($<mtn0`M+Ra(1H2L3ktd1IQqvf|?l!Cpv`Og%Bsz@JCOsW_N6MkNsU? z*t?A_KHq)xA4cwNh*r9{w5}G)dJRss|MKzatJq^+skc}1s>_ew-;qiV?_|$8!4uFu z!9?%pGPDDg?TRp7oGHfH_!jnS^;V4*zm@+4v>r*@W6)vuXlnxK3z~h9K@euvB|7bx zLuaPJX^VWYxx|r^fgxt3*T;W9e%+P}{^^1(*Cvw5#I;)Sx_DA`>gGJplTpv}P0XJR z1d{%hpv8!i0y)O@ZN4snf7flMi}fNdF8%_|pZ}{s+rMy=Za-b9jt~*{2ioX(?8m@k zqQ=8UK(FetH?VTh8WsmvPSUJ6R+C6aby9-I9$y`gfLMueMF|3*inWH#qEN+LLNgZW z_{sT*P{H3a_=CHC{KH0g=6?U=gwQDP--iQc)e6HVNeHbltp7T5MT=>^QD_$$`P={b zZU}^4XI!>}*}+0<V}0sVZUygvMX!spnE^-YQWG-8D2W1KL0l?vWmR=`y>)d}pWShj ztg*ilKg2F971ZN%CHkJHUg3AbcBvX(LBQUP9E8g81eEm21gY&skBA)w6M&g8K4QEx z!He)M_j6#2MShj~BM6!t>J5&{_sr!A2i=-llzFF3HvP;l!H|AR;Ra#Rq0OwH-F?)U zFugA+iu(R{jGVjN^lu|Sfy!TcTK$z`68RHyf=wRr!t|@57-eyIz+Fe<K(yD(h~GfA z24n?^K_{@%C4f|h1v9AH4zhpmBzd9FOUsAO6P#%Y$stT`d*{duYLVtAj82KQH54Yg zmd#(-*~gh}5Q|%y!|Bex%+h6D^IFqj@lxhkc~fh5_c`Y^G`O4{RrZF8#_9RZ8x!HQ zHy!{Mg7<4&saaGFjSmNlN{9L6_X(_69Z)(5<Y?Stk|Zx@a&m5yqxfq<=0&5qDhW4C z(ZrqsdSQV`g%6~c4H2j)3e~BXpfl)3*#wQM3p_y>^0hkfQ1hS}U#ximuA*FPq-P`f zKNyD7CBE8?O01#8tGlXo=s-%FQgu73VcLDV{!EJ`>d+UQ2bPt1(;qEi$*v@Rbqkfs zNTouC`ww?kHNg+Mifw4Ndi`FD1sf|{7j;#-@Oz}(>apUNra)y1_a8dPd@DjKp&x|8 zMktb?0tuA*y6#MUgVsDi-R!VY2QKE3sRQfpWLb8bNWo0J(f9EE$+rfvoT?E+81aMg zEc_J*)t6?~-h*t>EWbE&@?<8%3mFYwjv&&<PLyEi0mq1r)9Wo!;5r84o;?24Zw2v> z&prKnb4LEro%g;W2>*CHcVhNb*%9;apZ@kAMB%qj-SH2C@W#D&{zwl)hv&Hbw4Q1O zdOlmRd6s=Qq+gmfLOnoCqeOs+DKk&WqQWz`r%zJ~s`v$$q<?!&{UfZlEw8=CEU*Rt zqyN=ctuSA^?Kb%R`lZJoll<k9bo*_jWqjooZR@IVQj;(EES;=9tDD!*ExU3l)Kza< z{BWrL^izw$>bJa!3aY%C?r}8=7<L+WAfZ`J-T+9$IulVqA9qB!a7I1Cc4pX4^$1_4 z9?_4=xKn>U^;0C{*a3Krf)0#;ElA=DFNsvBfJMm#YzkqU!AofqI{A6Uqn%L>QpGqo z&n2@~U*&iI_(vqaP|FpMo4v>0b9-x8l~ZI#)$s&kGO}CL)s+Fx^W1Y_l5SDr7M4}- zu|OgS86@!7i_qmbFjHurlmW~&32QG0t5Ym6B@t|hL(nZP<Ph`|K3If6pa5wRNguef z(^6DTnEKs$H{5?ie!+sgzEfXtl*0hQaSH3r8&*Zz@I7-<Q<A-2-dAi+pKec=J;}lr zhr^=&$Y~4!CBSnNLyBj;7jU#4y7ErVA4Z$3Nq{DpLv5>xG(Z~yNok6=vldNwD`Gjt zkA&!$<2stgF)k#}GCHN9Lx>CpJA3%AT(a*gd~e5rTR4lvuYsWPwql>@&I53+7Q2=( z{`%38>v^`M3wDv>{=1};|H{j?jcj=jva^U%3iL{<K{kp*)0`QR8z$NLb^H4FJtXj7 z*|+RKUB`(VC5uJ6`4{TfulPYN%t9?(<dS8h*AwB=e=%%vL?d7O`qk{=@CEJtlR-|j zBcsWM^V&E0;i7KjBM;;tSTpXS_+vCCM}YHo0(NveEHV>@<SIp29j}DKX-*l80hq)% z;1Q5`_z5n<-E-x&cd!h5)XQz{@88O0Sm(M<Ry@Jao}A^Y7A=xrdR9Hb!nZumagX0Z zrDu;9>(CCZYdbq@GZ_tjUP7*fMZmWez_bKEfM5D1u3l|y@eGs;pj9K}YeDUkn4Z@> zBsHR@6+}IK8J7Wuus6+r^U$7WdhamhS1-Mgu?v^h^!d05<JK;OQ1r(&O{`q`p3M%! zZgo-b_RtHl8vb9tdS{YbK6!{^TUM!mId8a%+rA8!Mi4rD{-SNB;Kuf7S0(JFz{_t| zKj4;hvL&6DFMa%v6-=VZN;vZC{A2t=tmB#nQ{afbh<T9;pc6pugEYk(OA{g#66pvQ z@l6d7vA^|%9P2ojwO(U`6YT==)|Cdi<H?s0rL}%}LOnTU=2jRu?!E;(jIw%HMa?;N zH+@*yzMfzIvdN}?dS3em^LNT4QusBe@#lDi(=xwVl*kLJ7TF2bA(P%Lo(Qyr=Kh?< z;*C%*aD>Lt0#pIsK#qW2Y%$L8eLV}O60JzOQ>vE?S^;WA4Z>kn(%Hlzc1;sv#&m`_ zNizoWwSeUV)@h}4+NoBYWB1r96+<wjNL7gLV1NL`z(=-D@W#uwZpjPA%Pg*qjrF1U zn!1Kq^mC4(>c@pAh0eAm2g6q0h$tTE4NgQ2lZ@dM$33<e;Z3|2lS7bYUsDvp9vm(s ze@Jk7WTZT5TO2hzMT@y*`%)JR8{~?B#S{$qp$#+}AT*Wto40f=SR~0?7IZECZf(qJ zU$QbPTl%@3pYu39`CB%yxiQ<;*A}$a1(34G%gQV2O%f6aC6^vxd(3bK<v7{p;6z)Z z$!DTS6!m6Va+xFjX_&%WyiQ)OT(uM5hvwKzd^cd+3rde5TzBKuGWcjJ5)388Rq<9r z(qs!qfmQLnfKEux(k@ah$q(5-Q}ENqmX=0}eAf}Is0cE-WsBstN$VTx>KfKdHn+5; zrK$Ldvn>{Di*Z*`Mbp$3Q%%&SW69#17cU9UY@w^ykB$CfbZk9!xMk*|Kc1(ceGF=c zGFr#+(0}1OF(Y$$T09hS*ThbM8YLXi0fjNidJ;hHfCB)$CMQAz9|(2;%^X}&D`JO8 z9Str+w<rSul3$ZV)@3>{YW_^{0lDXZxypRN&P?X0Z5~5R#d)@<8HyKmab_Tmuxi`8 zEIrlBzPq|1C2q`mTI6JG@3}UG_t=-Ov?2aP<+d&;pj~2pu;*}R17bqDZ9?aIpNmsG z8y3I@RY4q_7Y9wIK?@`~RzYr5{|k{DolI<$1*_TaQGeF7IoH(C!VeV6+b#8hbDPYm zP|qVPGTjpA4Ju5WA4*@^5OX;hj6hR8_OP+0I=2MD>R{t%fJMaOifGW_3L>V3_RUES zPd2U#%Q6_nv*uS4;qef)isWNp7C{<8a)Uu6jj<u2kERck4@24MC3!`w*N|-eBBk=n zaxdS=_~?3Jwb$!iEv%37tdaMYryQIO(R+NH<59c)Q3vM}gbo|$NPU4q5sO!Hsj5&l zdU5#u4qRLvs!DO^uC{b9VeL`w{>75C_<k<h&X#mrR)Yn=YXFvy^Y`-^=vd1{s1?)6 z4!9vFu}>#qjjr$0No1J8v2Jefp(tuFnug&$Oa`?*MQZcln0>HtNn_!u+8+PL@Wvg= zy+@zAN7;d5pttU5p<(I5B~4TJ)pq;$gm-Uu+<o7DcRMabvAn1DUYyJzh{5DD!}lr| zwx(MHJ+;Hb=my0d%6-E>EHo}1+=Z@xxb+^#j^1=npr>x@*18`5!gTM2%01hTUDU9o z1n0-OlaSSe@r#3!)Ym+HYtW?4&;)2|fFv-ufpV5`WrON5g*%j8p0B9LFV7z06!n<; z1NhoISzBKpYjeWqe$6<tO`5oIL1qhI&K}~qcCWXc;}2zDR$u0x<wjP0Q~eMTT7utP zHNuID4U%M7tj)WUtlOe#^mPYaUB}`}=(gNMZ2&vt2{lPAjsPDxqUQoN3bVHREakGv zy89p}yz|gQNZ@mDx78$<TMpd8>EdYa4nE_wsXK{wWk+nzs3`l(#l{!*qcJYo|3af! z?w7^(_iohvpKg4QzB}QtmqC+eFlw4jR9xzS?hzC<0_3oW{-~)45qP}!OX>n{>c=)W zQxC$4cA3osisBz2oqlTXUhbUYNw@t+e3#pP@*i#P-*J2FP`r@+;v8IwS|n62a8DT0 zfCj{n=mYn;2HywJB>7yh0;fC%o|KCKr~@uOfH@vTa)m&32gU8K);54kDXt)=kVL?! z;6IN;Pg3!9(1!bYcg*4L?(W`+?Nu?yn$SI49b1h?+N?Di=}aip9a8U)Ioi}+?Eb|L zH`>!Bh@RYk{P<N@J+VG6cQMOaW(af{JnD^cQ<rD`vhpr}ko&|xzr3=eveMuge0Sfz z-$A9GFm+icPyX&AXP05h)FrZJxyw-e#b)mBH(%VYZfyV4w_~gsq9siqi~&E6At$>D z-H%xF-p1F~TwL(Ii6{dS0pcKQ3L>IC6!2KrkmDPiRn`<*|HE}Gb6g8gUQyb)tg{rd z$Yq(ex>#Apj*vqZY+b9)6xq~&e+gfP@I1v?y-N=J;(*>Ammwx6tb`Q&)QrC8GXG<1 z9gp(g0UmWjTLn1@LiA%{Brz{UBf5<^f-uLcAtY410s<Mv(h8_7gFw?niHocsdHt-` zy9K)fp>Wb_#i9BMds`jzs$&(P4YP4yj17m4<^>-0*L?#;H!I-pX|3S{q5<;XsMdq} zSN6({H=6wF>hHa0FueUTJ8E&N=`TIwi#@lW-FPM9Q1howo%#@dvH{rhYnHER-FDtd zi#Q}CsZLtiow`m0OCj*RrkR4`m{wRax}#M-jij8N?XCzN5kJzNs1m$BS!mlhqqq}I zo45E)azn$@clGjexd)Q35ZCqRyISx1b61Gteu-qo-;^YOB+>?5(zi_So}9KQiiN)( zY*Wr^lDy_ynfC&#)o%+!s4FQ;)#skIBJ7-H^Hb~ZJZdr>y>s0&tkz`uCdZJVIN~?R z-;{l74^#Y3ryrp|V4pzr?%Vt(WFT^Z=B3!mODS9T91hUq2_(o_Q;F-819@BPiq6w` zf{>ctX6`zAQ~2uBb?iy?S`nU+>=L-Xrqs9LfWP7`$tk@h;fI}}_|6v^gw$)aOZJf} ztzCTwUK=S%RIddq&+z{ev-${2s_#7VmcekQEA{_S6a6|_{VFwJ+dfx?cP8BTe=#4^ zb9PKF1knbC22L8@+0Cr=^T!~QzGhEW+SL2lkUf;J*YND?IJV<BYpYD!YShaR!T;+h zqDsAon%1x@zEDB90AqgYhw#l^46Nt`POJt#Xa{sH#+a{z{mnorzUx(#37(?t05_x{ zW&*1Q4+)q=YK(1lFB40~Xf!Q4(1K_+;FDg2;?bHWQ4j5?i<mzYsnUbXAnZerhBVYi zR484A1O0MJ$Ao$$l_E@p2JkgIYfa)!o{-<=;STd%#Z_P9Jg)YpwyvRu4utUfIzON7 zjJAbrcCMzfA$*u~yS#o^@`6-l-_732M4)cjd2QR1bxpC|;f6}5o2v@7MGtfK^5)u_ z9rOF9!VN)Bed4^XT)ijicQ0R4+v^E7guS6i!W~Ek*`dSCVXsK~>KfE9l{`^NbbTvw zZq@gsmT!G9)l=_|Hg9DsW8P$cQ{S$KFJ@MAJX80oEVBbG^LLrbZP9vTuy5$AFbdk( zD;gUjmCkdR`v8;W+IcN6BbwO7b(ss@;bdCwJLeSyPfl%$h;m1*;+GrGOH^-ag_8J{ zqEfk{!6-k%u5Rp4T7u4|U2HepY+v}Rpn1raVCyaZ7+<f+PofmdgaVU7N<)@3Rglm` zK3h@ETKQ+xAzPx-#<r@DP(Fhs+p8W@hwO=<jcq|yB~`IY*yU&zOxW2LwvEmu)$6`c zp~3b6{%goXpg@bzh<S_%2^uc-i3pKEvRqz_D{-r)=u<)n%d2Rl2btL#_}kQ-5GwC* zKsv*|qA2W$(yv~j9%PrZ%Zgb^vV6>3K{xx@VzdXWAAfAE;BNTXWcoyQsnu>7rH>H` z?`Jr8_g(hfyYDWsR7lsVzXvt#wlV8<QiWfVuDw=s2iNWU_*?n;n%z+dT+|x)DV>qb zYjQv0l0*Vr2%R*Yh6vFY!X!`(1<m~#)!0*9Q+Rx9mXeyDyo!S213`mvag`dkcLI{H zF<C55i{-ztbHVPY3$f2wI2DO<7smqi(Y6RX52h{=RtM*hYkQWn;wS8!9@sV@lw)nj zfsR^4Z|1n)L|Y>)+8X7?n8j(eAQl~>^EoZMS)}|=K-2y|l}BXt%0TQ2I=DjL#{KNl zf3KQY(x0z77b0%XaIVjHE(8J+uRc(^D9Xb0?SPzS*$Hh-0<iugUs!UOfC<3o3MU|M zS=ZV5=g;g|nB+D1VIlp@UdQvZh^{&dYHtxTr|d%vlk3ZF!-${7$1pckUOw0n!Q(n9 zrJMPM5**gNRi<RM!7dp@j~xm0>>SRU78*#>S0%N1su)}mAuc2Nnig|kD`|DK)}0Q+ z5Bjwfm7^3aN`2458?7F*Y-y5&HIRgRdAXvhqPpH!?ofD#Vy&nQRn^FDugwPuw!5M- z>U0b2Dc)Zd@+^@W?QYp*c6dXTRW3h|%DPyk+Xj8I&20CEf)N)B@ap@r-7Z6=by;bz z4%mIZN=11XyAT8rpASn_{4193wmR4Vz{j(8O-+4Qs%d^ToU0M(5dYv1V0FdJq4_8a zaQ_Q=6XJ5SYe6#5hkT|u&r4QkMPNbNyC7cWfSrL>ql5yiyLvqw4G~Wdp5>+eca%z} z6VIY;HM!X@`JeI)Sd*$@#nV|<M(|8_T`;EwQ4a9c_AM~9)z;*eR+w(ZvC5v^#^uBO zzKUe3Cl6TQ8?Nv-t6?imXDd5_>XZ4;oE1N<WQwJm+IOS*``GD?QS~Vu&<U%e{_qY4 zR6?@hPx#k){>(G#&!j&QJqLMF^gxdf3s2BH5)}F&ST5_&PZR;Q;gQVhTPL4E6i@`Q z<yS(id-Ch-6-~O^t5x!wKXX?6fae{Sc@}yL+Nr%~AAO)5=r!RR)n8!>={BuTai74~ zqrHqQjlgZdKvg$TM3fy})1~1Ho$e-!Wioe5Q<iU-6}7_d04px3>`wDz`pQV_C}d_} zN%-k!LPl@-56a7>%3}c-0(0*Ls$nu{Fq?`olE?mY4W`Tw5IM8?M+k;^Xy;`dciGMz zwB50aEVWmyr0qAhaMvwxmIs{kS#>}y*SZL>-vp|Q?;0%#wfGxIn%5w?F(+OKy_Sc+ zY{!nvcx|gra@mzDvz)eNha2&Q^l$WK<e!)UH5Ui31r4$Zl01Z^fT9&5KTvMu0j;GA zL8x@dWU(lq)=ehvB%UHCO`paX_cHh%82ES9xHaNZk474JH;ftByMew6Ht5f&_adW{ z8aE-dvfaYgSWWC*W3e@ns2QzIBx*-<-X5RB<cv4PohA@R@8U`~-w;ucx*}FJ?)S67 zioQ<uUNFt?B9!bJe0ZcNKzBa2wbVmR;yJI^(NORA*Ef{p6vx4@*5g}}K{Du*(_g2P z@&e*$j%M+JT_R$exL2^my{}!O^S(#_>}8G$H|Kim4xKyBeXHY6Qh7783mIP(+auX& z-Ev<Pe*UD@jXdUeyu|B_HyhppcAP=6N#o36F1*5jliz^n(Y5rrCCOAJfEo4(h)-fM zgxkg{1eqCp=1V472_6rs*%ScQ5D^IHc|&Y-%i0^77st1TzsEH>Y!Uu@yE#L7W##a9 zxmHLZ`R|3JOQUOUY+9CHSv|Ti+F!Y`zO#CFk5=Hr0sqPsxqn}i+Q-{H;M4X$#G(#c zIe%n7Z!7mk*`+OtedUVjzo_3!%||kzuID$k&gWgO1<#k>;{@VGMqzKzLbC)iJb-u# zLy2ip0)EWqG>PQ#yd7Y2Xy{SYW&*$eQ!Xq*bA0{NwS(zvjtRoCYpy-U$Eu!2-e?5g z<b|*r%U;d%S7)^?A7<8&-OHY?it)#;)!U~BYoET}>4r<H^HaaMXrF6~D>R(*V~lf? zwkG;C?Y#o>)CU?BLB^p*^P~_S0=^I_vaeRExn*t4S*?Ej(aDdQvrRqzk@|5PYf_K2 zasR2l$#%A}@3YKDT8lQ-%$y&wOq=>KFSV&h)Xp}xlfJD1-}YtxQqbtmGP3zxQnt11 z?=Uv_z*y%n5QN7t02qk~hJq9;5ex>Ph`~NlF=$*KylfDmoyZn#wD6t5-h&t+phYh! zXqc!Q*zTgAIJHan^6>USYCg0oS?i%K1o50yRR?_t`8*>SEUROl;=zhIWAO^^@<0On z;^6?0qvGdk^}YHh8=|GbhB#9X?TX7*RZ9~b3VE;(xL$n}q8v;2)_hOX=2Z*51{b`0 zgv6!i?mAqKNw}#l?5j4dBXQC?Q?;+EUfsiDLH1}6cT7~Mn~+2GH@KJjIAVze*aq0^ zsE@mBYvq_XTwfpd#^kj&*C|$8<*hcYr}bmK9Q9V!K8qMOhWUf%)RZ?ZOqdV@MK)#5 zVcZmy)g`*;CGHZ8cS9Mp_3<P!4Um2aB4sezUQ8t#Hj*!gz_VZ=$xsr!H;D~+AZiMv zM(Rf_FP+>QKYYiy-y}Z}T*_y%BU?Gc?Vs`i*9mF2o!y#TyK89owl$l+TxDw*^_Z`G zi=L1+f4MSugVDHWnQcXjVXMscu3bO+ZM&1*XfUqbY+v1M95otW8a&?{ltcZtp!#cQ zF70$FHoC0q#|R=5h90sN@Uj5!umoK6YOFh306T+#9Z*@CmkP|~eA=AHhfgNTTpA)s zCh&&U(5sesIzY*3vx4|(djuFBkj?<Q1Mzg7>vTyEde*Rh&%T)sZr7gbOwe2F?5^Mu z*6b&8l{0j1!*w(D+gqB}Esp7OL+Q>;yfYT-jH|za%!W!a=9{Z}1y$)7er-EhdTnRt z+B6@g0BQaEF9fU4?Po5t$s$hFyu%{J$KXbR5WhFqHzdy;nx`Y$^2{?8)MM;Pq{~A` zo%+$2^_}{$PPSsM5ifq2e}#JrG8Rql5ceg?>Li(#Xu$;*ir}k5(gV{JNLy0$#c{fs zBP&JN6e0HqhE3_^d^81JsKZDi)`G%sHyGTAjm~#<4T=E;a)#osm4FfA9Ha=BkGpOa z9avvEla!G;hdsC~aNn(!5IBa~!$@?#!ZIQnEcP02@rPYcbagSCq@Xcd<B7<ip=~y! zWWyv1!2UPz0(I%O?CtBCMJl&)zT#CDf&_h2Wml!Zcekofcxx4>hbx27<yHNC@zSsG zdA#p(P$p$80+4{72mwlvnWIFR;2k5HotF#wgh<~~ovwyX1xtlQt4G8@Xh+lN=@bj< z$xV&luKufJ;y^Yy#9Lj*Wn@D~O!k0{3pj1A06*N-Ma+y-HhlW2x5jQUh$EI2sp7B0 z?J(-BuvOY_zAvyWXm@bxvuL@#Z?6UE7X;%A0r=_#@WO}_YO``CIpV>3Z80j6XzX&i zm3p`OL<?;BLg`Ajsj9<{Bm=Kj@a49+w>Yc4Gs8E23-Xpa(y59Nut24VU>tZY*sXFP zGmvFTiznmr0@;0Px4-eGBNnpp^$*)j<_h<(hE1V(SQ`1zRbeq%AE_1WmG#EaQ4{Zt zx=!3>i^a;hx;GR=8G56JFOS8n_ndG?$_bCt8vQcvn}Mvwg^@-sF44y$7Z+SBlM7)- zf_z*rsjq+e%j)azcOVgwr{lyMHBbLOH~PDyarWD05+5~xsJ?L5U95li%tz0LPn?Jz z`w0CS5U1f=`05)`_CN<nvBaTFfuR+URvh+HSTAAuMKqTO6qg|hIZiL~IK?|Dr5~8_ z&)0mR0;WT11G}pU643`Z*gLDk^&L#T0J02)y@jv>euUPCnFs7TWS3DgseYJv{f%1r zZ&iv&{e0A|U`;i;Ee`Ie-O3#m9J1S}Ud{NQB0aPuy!oaeA#e0g`P;P`SUkV+h9J3J z!cXr&h2WlR;ue02`K!(0S?~o1wfMH@;2T5pLaQQ)N%7(|aWOfeaxUY^c1$DH5IP2S z0J=62LMi+~{s!A%E`i7v;3>7S;<#(nA2_(i>J6*cFREA+T(Wlkrbq+Wu!Q>SgEsSu zotw5paHBBK?%|VhIE#WoxM0iq=TM#cQ**##e9+7SVap+Av4+c;b=JrlF+HnWMPt}M z-@`dOB1i|(7QN+`-=8YuUo|eSh#6sYrhfQ@`e*6=pI`m=oW;f4D&k!dQ}0p#-God6 zk69z-oaM%%1>QLn%Zg})=P{pkTe9=Zc9xBm9RMtli)|89)lKp@qMh)=LIoz7NL8F8 z^L$vHAZ`x^3Ma{!i5h~d?&XMRz_cJa2f_^!F@RRS6aWhCDRvCj4lS&W7uZ2G=r;Lq ztpl@YWBgihr!U@g^NT`j56AU)R$j8&U{3WWlf5Z(*A{=3&CM~ly@kL3lD!Y`tu~-; zk1Z2QH<Ys;H4ion-1mnK$xeY!CmXm!T)L*dz9!A7zw=l;5*)Vd0l}`mA&5?o<X>7t zY+L$5_8URG=|ur|6$R_6lq-FnymHtP3Yi-hHkqp`t;;%`w%^;`0&d7Zuvc)||6q4} z>N-QN)GBoYZs_nSFSjOLH7Pb;)AoIqs$nBY`2cA+D6X(!p$R!+j8)YfTC!Gs%rECJ zfh@xgh$Bl`(y5d&;y6h!62XX;JZ3$RTDNx+nT9NdpsUDS52Iw@vHa@JP;M`;6o1|T zmVSN%7uEK~r?{xyRlM89wHAMFcX7im^+c5ZrM_V_nT)i7l%}ix<m>fa412!4zN-(; z>czd>bvD<@>rfmSvAO!)E?3g!;=aR7b`yS@to>hLThfSUCfnXkC223HZa@MIOyJx? z9xk9DK_8Z0q=P6#yiGjONx>Kp^%k>4^RPu=e6ZA*D|l_{0C6e+L6F-*?5?*Jt0^HQ z@*pKs)dtidH>4OrRmAJ&S2pwMxVpbO#pcCQ05<rZx5wF`cspxOcJO?<_*IhH9kN$2 zwF##69*4RgA+5a*b_ly05xcmVr4s6Xw4dkD0E+tx+7@RMvWy%qCe!vh+SbYJE5-km zWlDo`!M=DK%%EcX@LzpCp61$dF>cz<btKu6c-tiaMMc?H{D}i>-(z;4*Wp*n+2TYS z+AQXv&hEE^h*cVRWST?%Yz9d)=h@36#~U<`dJHzg^>cCWU66lPK;Ks8f(pV%YKT(I zNm?n9B^u_B`hJ$ps<Ro*e;vgPW#27kGMVEU)akq9dUXcLC}v^vTc+Xyx@hh{@PICJ zc$Iq%D^0RQ0h0X?J_#Hbh@!!_^J1w7Rr|lHJ7bZ`{iJTs{yoT86cY`R4Hs^R7{r(` z+4t2KzS@V9XqbP~gE!5mQvQNpociDbt=+oUK74&0wNraf6L;=dU0qx>)Qdu8BoY+G zdc!U0g$vULs%h!$Y!Og%_}umDR%kVS=d9?b8g;Esv*8_SJ$;|Q5_%KThn1Bk5WESA zO82CbKy|RqBz%Vr5o#pyNw#-rekv5KITfK~4kTFNXDdAKcq;ypuWq~c@yEZhWUaUb zv4wXb>EUW)+{0bqbn@L^l+-?m@!0~Kd|0-z6YgNpy<S{;kc~g`$R6SK-6Db#FUJ3O z+(9qAbMEU#oZ^t#Iwo7;jwBQBh{dU%dkizr4tYExf5f@6IJ{nc)ugM#6g$h>w_Z|j zSAX{rn{W7+jmU?2`1r|<tYvu%e#o)Ic1!0Q)bD?U{FobsmlwpS8tgLJ71KQqL)N6j zT@V}$MV{*ibywzsdnJR7t+sFTp3SACQ?Aceq^P0R_;d9lI{DQMdqwSi?m5<A1v_`O z&F!{b-Dh>Xt%qpCrPW@XKlrv*Pc2x(4EH#qy#2@G#p<8>`nb(#5369>u;Op$da%0L zPx|_bAHm3BmDZKZhW`2%FQ!-0-s^sh9qFuLM)Y~?3OaO7YDQSdCy8-dlAvY43P!P* zq0nAjoJ|6^q>`Mz$GYPv&QeZuZr0&u8`MwKPi2o)lvzkJGD%`pvS{^ij{&mOElENS zN%plwd-0UR<8eR*hYLF&e;o1SJq8jqz)Dk_cAziuz#Z&i&8``uyt&XrgxR&bMX_ZU zctRfhw0DDD#wy?niZP8Shgg<rEvEGvFagg<Z9&En>JXn5^HncvMMBIa<{b^WvMn<l zH?u|Crn$8}y;yzM_V%ph*v}ZuRGI76k&#=$yQAoRXc`iv>4)5`3|Ab{FT{>b=ocNq zRp_C`=2R?$Bqtn1z&V>Zb(i%);>I7e-c^8AW!b40G@6!tmt){JdqI0{F3Tb-<mIO| zhImAqCZo|`D#S{_rgO-jIf#?SQ`b$A5b&&nIK^}%3ItfI4FZHS2XUR-){T9|vk$nk ztDofgC$HAGIash>pVPOxF^f&#u?@0cj!|^9n5p>EnKD;nGQ}ubTTJ#B|5c`)iz>Jm zowgK>0X8T9aHhQc^sTObvgh=za@TXm&a^rC$(geGO!t(SY3^3bO!OcK%odZ2FP|xY z^qFVYbSMCxJ=|}hty+ZG+1oJcV~7S{h8PYAtI`CKA1@Ipi%}=06=ZKU=v|7j=TpG_ zW1b*}FGBJ|?t{i4M<m$aw~;K3gc-2@=)}CyNM&EOW@V?PtH+Ao;Q~jCy@<#U5Hs;X z^d9sW>KZD#x*8n@Q>dYGK}Dp=;t7&DaCxw*+z~{=m!}*Nuye@2Q>PeAr^<@XW93b5 zhm#4u=rtZJWQyW$^3{2-2_xHHmtFqzUrpBZJKvVQ>?be1&pg~_S#FD413c%BCcUyL z8c<vu@AAZ3p^gCt4b+;{51r8po2?@1WI@U5i=?XSR;3I!ZrddJ5W(rTJ{V}@i7vPL zgXMmU^-iO_jk6flJDFGgC#aiPTK%mRyqQKv{{nU)A*{Zl78f=~7HNn?0UI+unvByZ zXb$OdiZ%*Q6$$QVq8^<^V<|O2P3n-0)V&0+FuOExzkKG~$E0I<Nm3s_Vs$8%BWwfw zX>2x0eF_}j{NZ8llugboGzUF$reF31&3*lHrCaV>2wi64*wJUCXVjO37r<GtS&IT1 z*Q6B7kfe-Ts($NX?rzo2mZ~4fnG9XIP`|QIc2~;%)T54TUPN5VMOb}E9uNLk1CMr4 z1e9PHGgXV@2c`%gwj^(bn*S^;#+7Z`u;$Web#?U8H5;BiQ{46_g_e6%+iolVC#9<8 z5b)Qws5*LJ?fU1|uRTE5oGyYd5I=bI8x(-%8;^dVZbyVH{0Madf1dglUkiK)Y6<=c z1iOGo;@y%&PisOI*c!u0IKeGkvF$;RXtyl-r$v6)=`3{^ZOHV-`-2WEZ+(r=6t9V$ zw>HpX>#tp1wR#!5s-mYkvNmW$l9A?QjdJf5bVJDbeolAQ{$Y?xWd`i#DU~^_*;S=7 zkNQNZETG&{DwB^{SE+13{gP5y20yU6RHjHO`>~oKG7#=lS9U|G%wT`?T&WC8yRsjY z$~@}dDU}73|6i#rmO*k_DjUk&%vUPQW#_Z{QrTRVU<c*CLUv#}I~3lvFPt09PYmZL zrsc7LeKWa6I$W0>nHd`>oT)fdIzL;O%H=1*txYXwDwky^vW2<+rY;_7o1PvH4;S*| z;ic#}J2sXNPZsjKvxC!3qtnxqUCqsOL#l5Y%#UMG`miu$!DvilJ5&}f+XdBc7-qnO zPy$bs4QtzJv>QX4eF*=O18XvOb{(!6K^>hd{LL1B>#Fl{RRL%*r}Z5M&^O_e{jHYE z&~id+{rTscLKvD6kR8+b8^-evqsKggUW6eer01r$8N**5HIv%8-KZHveG?4j>8eS9 zMl=5A-f*scllJE01bU!nwSSsZQmK6Q?kF6};O2@X4hG2Akbo1p<;-x6wSwca!$3k| zSl*c%k|TstX5|PN9YCtTpcX8riiKh65rr%=hB%T5#CNV?wGiDS78q*;_HSk_umx#j zDb|i`&7BBKJde#sxR(XU+)T=ah48{y#1^wY*3Xu(rED2njzIJ)*tu*aTgA>}tC8t% zEnCOdvkhz`J0F>zH^VMuE8E5{VB6V+YzN!P2G}k($cB&udYFx{QI=!7k-C12jk5`s zXOrwA*u_n;Y2=5#nC*pq$v(E9{T(}iY|)p&;A55@gbmY`$Q*q&JH)PG*Rt!_m)Mut z_3Q@le>bt4*<p4IvP%CwyN%t>?qGMayV%|A9(FIgkKNB6fS2S~5HRl{_Aq+{v5&uo z?9-33Z?MPM<Ln9cO=O~ek{xAFmC1$d<k-H(;oR7maVk5l6-?vVi5abAn92?m21muI z(Sbr12h)vH<A&_SNNyr44vyugva+_-+FAzD2n_}c+3bWcH9b&}2XlqNv25c|ep<lE zX{nGM%MMIsg|Xb!w5T;V<@Yq|t<0Enx$(y7(d>9uoF3RUmK6)Rk<n>kEIT}H9@M(d zjZcncjl%<j*~Y=bK3OYFjpxSjXfuV2v-^Z;+?&f~tuvEj`GKKQ&+@>~T+u$1-#c;E zDf4uey2Si$Y!zmvb7MBW&zZtxAvcvB60$?NX=!RQJFq8P5a?n7BbAl#tofPgDHCCa z#?gVXVf&eTU@#`K=E*|#;?n&EAfzF_y`|lVx5&>-Wygfk?AWAvFh7L%(1u9bo0~xI zQ{rB9STLeZVParBYeH8;+Te-<yKqC}SblI|8aRrZnG`1n&`cP@1rB}a^p~dRGYny% zr?bK&PVm$DNohD&$PVW(k%kMo?8FeBJ3Cy+PK`FExcnXwjj{#%nZeXvz%Y~_1D+H| z@Whig{RVS`XPL|mPR|swT0?xyi9OO#ZeTn=F~pDMNBBM2eX=$%Q~9ynkcsf&R3o0q zFf&1I&3Xj@0}wJ@$PG-407eQ1eI&%fz)&u485qlrOf(K=fl3Qz{Xl~TSuYbznCLs^ zCPo@t4TUToXTqX)JT+a&PmCD!(J<n{@JusV@#5T2HZP6hQvi%@gTT;}qxlK_9Yp$i zt(LQfV3(|SHaa~%X4XNvad>8IOc>4=#sz{#faEw<2JPzzfY&J*eFOe!CY3Ix56tKC zQ{2Ebz^0Jpac4>IcjnBS4++z`$tkHcrq=O12KM4?VLCTBFlO2{Hj|ys=ch-7;jw`c zsr1UFPI9NeV=G@6-(|#G<On*1(foK8y<$U<WSGdKv#eoo6w6i?AU%>bV@z@rjeE1X zU3u~1JkFX+Q)Z|zFaj{6vlm@tnwrS(#f|r5MeXGbH~}y;5R5hMGHR0t@MoMZ3`|T7 zXAAtm%zg=rEIxdeADEmJXckC&v%98pfX0dJCDSG>ijx@jiD_wIVyKYM4GHwZmbvF4 zG+~(<EdWj$wGVEdLLZpQ^u-POkPCR9EO3bi!iM4O_`q0JppC8cp#a*`=+rnlFg3L| zUl;=7n#kn~VhOiUe}>7z04BJJ(3JiO31a2BH)?E^@CoSqNf^M3F+Qf#5F-LLOaP(f z$EJk6x#654d&y+JFwGaHrVLX6_-sMMBjo@#GrKS_gW4Av&tVJ!)4*pVx#4MHd}cap WEo6sg2$g9lKpdZ$$_>);_x}MD5#CJz literal 0 HcmV?d00001 diff --git a/view/font/iconfont.svg b/view/font/iconfont.svg new file mode 100644 index 0000000..999ca1f --- /dev/null +++ b/view/font/iconfont.svg @@ -0,0 +1,554 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<!-- +2013-9-30: Created. +--> +<svg> +<metadata> +Created by iconfont +</metadata> +<defs> + +<font id="layui-icon" horiz-adv-x="1024" > + <font-face + font-family="layui-icon" + font-weight="500" + font-stretch="normal" + units-per-em="1024" + ascent="896" + descent="-128" + /> + <missing-glyph /> + + <glyph glyph-name="reply-fill" unicode="" d="M507.904 835.5840000000001q93.184 1.024 175.104-33.792t143.872-94.72 97.792-141.312 36.864-174.592q1.024-88.064-30.208-165.888t-87.04-137.728-131.072-98.816-162.304-48.128q-22.528-3.072-48.128-5.12t-56.832-3.072-69.632 0-86.528 6.144q-106.496 10.24-158.208 26.624t-41.472 18.432q54.272 9.216 93.184 29.696 20.48 11.264 16.896 32.256t-19.968 39.424q-52.224 57.344-84.48 133.632t-34.304 164.352q-1.024 93.184 33.792 175.104t95.232 143.36 142.336 97.28 175.104 36.864zM707.584 385.024q0-26.624 18.432-45.568t45.056-18.944 45.568 18.944 18.944 45.568-18.944 45.056-45.568 18.432-45.056-18.432-18.432-45.056zM450.56 385.024q0-26.624 19.456-46.08t46.08-19.456q27.648 0 46.592 19.456t18.944 46.08q0 27.648-18.944 46.592t-46.592 18.944q-26.624 0-46.08-18.944t-19.456-46.592zM196.608 386.048q0-26.624 18.944-46.08t45.568-19.456q27.648 0 46.592 19.456t18.944 46.08-18.944 45.568-46.592 18.944q-26.624 0-45.568-18.944t-18.944-45.568z" horiz-adv-x="1024" /> + + + <glyph glyph-name="set-fill" unicode="" d="M916.9398 445.2101l-69.9664 10.7833c-18.6619 2.863-38.1388 17.826-43.3424 33.2487-5.1618 15.3809-15.0883 65.4524-3.9288 80.6661l41.9004 57.135c11.1595 15.2346 9.3832 38.5985-3.9706 51.9314l-30.6364 30.6573c-13.3538 13.3538-36.7177 15.151-51.9314 3.9497l-57.135-41.8795c-15.2346-11.1804-39.4344-14.3987-53.7704-7.168-14.3569 7.2307-57.3022 35.7773-60.1652 54.4183l-10.7833 69.9664C570.3471 807.6016 552.542 822.8571 533.6712 822.8571h-43.34236734693877c-18.8709 0-36.6759-15.2555-39.5389-33.9174l-10.7833-69.9664c-2.863-18.6619-17.826-38.1388-33.2487-43.3424-15.4018-5.1827-65.4524-15.1092-80.687-3.9288L268.9567 713.5817c-15.2346 11.1804-38.6194 9.3832-51.9523-3.9497l-30.6364-30.6573c-13.3747-13.3538-15.151-36.7177-3.9706-51.9314l41.9004-57.135c11.1595-15.2346 14.3778-39.4136 7.168-53.7704-7.2307-14.3569-35.7773-57.2813-54.4183-60.1443l-69.9664-10.7833C88.3984 442.3471 73.1429 424.542 73.1429 405.6712v-43.34236734693877c0-18.8709 15.2555-36.6759 33.9174-39.5389l69.9664-10.7833c18.6619-2.863 38.1388-17.8469 43.3424-33.2487 5.1618-15.4018 15.0883-65.4733 3.9288-80.687l-41.9004-57.135c-11.1595-15.2346-9.3832-38.6194 3.9706-51.9314l30.6364-30.6573c13.3538-13.3538 36.7177-15.151 51.9523-3.9706l57.135 41.9213c15.2346 11.1386 39.4136 14.3778 53.7704 7.168 14.3569-7.2307 57.2813-35.7773 60.1443-54.4183l10.7833-69.9664c2.863-18.6619 20.6472-33.9174 39.5389-33.9174h43.34236734693877c18.8709 0 36.6759 15.2555 39.5389 33.9174l10.7833 69.9664c2.863 18.6619 17.826 38.1388 33.2487 43.3215 15.4018 5.1827 65.4524 15.0883 80.6661 3.9288l57.1559-41.9213c15.2346-11.1595 38.5985-9.3623 51.9314 3.9706l30.6364 30.6573c13.3747 13.3329 15.151 36.7177 3.9706 51.9314l-41.9004 57.135c-11.1595 15.2346-14.3778 39.4136-7.168 53.7496 7.2307 14.3778 35.7773 57.3231 54.4183 60.1861l69.9664 10.7833c18.6619 2.863 33.9174 20.6472 33.9174 39.5389v43.34236734693877C950.8571 424.542 935.6016 442.3471 916.9398 445.2101zM512 210.4633c-95.838 0-173.5367 77.6986-173.5367 173.5367s77.6986 173.5367 173.5367 173.5367 173.5367-77.6986 173.5367-173.5367S607.838 210.4633 512 210.4633zM512 384m-104.7824 0a5.014 5.014 0 1 1 209.5647 0 5.014 5.014 0 1 1-209.5647 0Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="menu-fill" unicode="" d="M511.999488 834.254727c-248.678712 0-450.273176-201.585181-450.273176-450.254727s201.594464-450.254727 450.273176-450.254727 450.273176 201.585181 450.273176 450.254727S760.6782 834.254727 511.999488 834.254727zM266.371377 589.705012l491.256222 0 0-33.772174L266.371377 555.932838 266.371377 589.705012zM757.627599 178.29396499999996L266.371377 178.29396499999996l0 33.773198 491.256222 0L757.627599 178.29396499999996zM140.487278 367.11340099999995l0 33.771151 743.024421 0 0-33.771151L140.487278 367.11340099999995z" horiz-adv-x="1024" /> + + + <glyph glyph-name="search" unicode="" d="M439.323351 120.52219c-49.280352 0-97.09834 9.656941-142.126681 28.699646-43.480015 18.388812-82.522793 44.706201-116.043584 78.225619s-59.841305 72.560596-78.230871 116.03883C83.878729 388.513804 74.222416 436.330856 74.222416 485.609189c0 49.284473 9.656313 97.104595 28.699798 142.133138 18.388542 43.479257 44.71008 82.520435 78.231894 116.03883 33.518745 33.515325 72.562546 59.832713 116.043584 78.219479 45.027318 19.039635 92.846329 28.694529 142.125658 28.694529 49.280352 0 97.099364-9.653871 142.126681-28.694529 43.481039-18.385742 82.525863-44.704155 116.044608-78.220502 33.520791-33.518395 59.842328-72.559573 78.230871-116.03883 19.042462-45.028543 28.699798-92.848665 28.699798-142.133138 0-49.278333-9.657336-97.095385-28.701845-142.122905-18.388542-43.47721-44.708033-82.520435-78.228824-116.03883s-72.563569-59.838853-116.043584-78.226642C536.422715 130.177084 488.603703 120.52219 439.323351 120.52219zM439.323351 797.483242c-171.975699 0-311.887855-139.906423-311.887855-311.875077S267.347652 173.734112 439.323351 173.734112s311.887855 139.907447 311.887855 311.874053S611.299051 797.483242 439.323351 797.483242zM890.678206-48.734702c-22.121716 0-42.90387 8.562003-58.541653 24.115234L674.672953 128.025071l37.039062 38.20616 157.888289-153.058978c5.606924-5.606695 13.091693-8.692986 21.077901-8.692986 7.983139 0 15.464837 3.087315 21.070738 8.69094 5.616135 5.622044 8.715856 13.126972 8.715856 21.123087 0 7.980765-3.091535 15.46318-8.702552 21.067828l-0.301888 0.306992L758.714395 213.230662l38.207726 37.035498 152.611906-157.427472c15.571265-15.638165 24.144876-36.422538 24.144876-58.549487 0-22.195511-8.625801-43.054585-24.287121-58.735729C933.723298-40.112324 912.876674-48.734702 890.678206-48.734702zM281.015489 327.245392c-42.340005 42.320874-65.652899 98.584296-65.643689 158.421102 0.008187 59.818387 23.319034 116.074645 65.637549 158.4078l37.634651-37.619806c-66.60666-66.629513-66.60973-175.00071-0.007163-241.577011L281.015489 327.245392z" horiz-adv-x="1024" /> + + + <glyph glyph-name="share" unicode="" d="M769.714 306.453c-51.754 0-97.702-24.851-126.571-63.269L394.479 367.94100000000003c3.93 13.798 6.034 28.364 6.034 43.424 0 16.496-2.527 32.399-7.211 47.35l247.724 124.288c28.71-40.052 75.647-66.151 128.687-66.151 87.388 0 158.229 70.84 158.229 158.229 0 87.388-70.841 158.229-158.229 158.229-87.389 0-158.229-70.841-158.229-158.229 0-6.046 0.352-12.009 1.011-17.88L351.22 526.116c-28.371 26.943-66.723 43.479-108.938 43.479-87.388 0-158.229-70.84-158.229-158.229s70.84-158.229 158.229-158.229c43.752 0 83.354 17.758 111.997 46.459l258.676-129.779c-0.964-7.062-1.474-14.266-1.474-21.592 0-87.389 70.84-158.229 158.229-158.229s158.229 70.84 158.229 158.229C927.938 235.61199999999997 857.103 306.453 769.714 306.453L769.714 306.453z" horiz-adv-x="1024" /> + + + <glyph glyph-name="set-sm" unicode="" d="M946.367 405.895c0.02 21.85-13.04 38.49-31.74 41.57-18.69 3.07-79.05 13.01-85.99 14.14-6.95 1.15-14.09 8.07-15.4 11.45-1.32 3.37-8.94 22.2-11.87 29.46-2.95 7.27-1.92 16.58 4.39 25.52 6.3 8.93 39.9 55.87 48.38 67.72 8.49 11.87 8.65 34.61-4.84 48.39-13.48 13.78-47.75 47.09-56.73 55.86-8.99 8.76-31.08 8.64-42.67 0.43-11.58-8.2-71.69-51.01-71.69-51.01s-9.97-6.89-20.67-2.64c-10.7 4.24-33.43 14.07-33.43 14.07s-7.19 5.43-9.68 19.79c-2.5 14.37-11.11 65.28-14.07 82.7-2.97 17.42-20.67 29.62-37.83 29.46-17.16-0.14-57.91 0-74.33 0s-32.26-15.68-34.75-29.46c-2.49-13.79-11.56-69.16-14.07-84.45-2.52-15.3-11.44-18.48-11.44-18.48s-19.56-8.06-29.91-12.31c-10.34-4.26-15.39-2.64-30.35 7.48-14.95 10.11-44.74 31.03-63.04 43.83-18.3 12.81-38.12 7.92-49.26-3.52s-36.06-35.77-51.02-50.43c-14.95-14.66-12.61-37.54 0.58-55.71 13.2-18.18 32.34-45.43 41.35-58.21 9.01-12.78 10.84-19.5 8.36-26.82-2.49-7.34-6.64-16.58-11.43-27.72-4.81-11.13-9.69-13.64-27.86-17.01-17.36-3.21-58.42-9.92-77.4-13.31-18.99-3.37-30.66-21.43-30.66-41.81l0-64.66c0-24.34 13.2-37.24 38.42-41.93 25.22-4.69 62.66-10.66 74.77-12.61 12.1-1.95 17.67-6.6 21.41-15.54 3.73-8.94 5.13-10.12 9.37-22.57 4.26-12.47 6.46-15.55-4.98-31.67-11.44-16.13-34.31-48.11-46.03-64.51-11.74-16.4-6.45-37.83 4.98-49.85 11.44-12.03 35.47-35.64 48.97-48.97 13.49-13.33 35.19-16.28 53.36-3.52 18.19 12.75 54.98 38.99 65.69 46.62 10.7 7.63 21.91 5.28 27.85 2.94 5.94-2.35 11.25-4.6 22-9.1 10.73-4.48 13.85-11.2 16.41-23.45 2.57-12.24 10.19-56.85 13.93-78.59 3.75-21.72 18.91-33.43 40.62-33.72 21.7-0.29 33.27-0.12 61.57 0 28.29 0.13 41.86 12.61 45.45 31.38 3.59 18.76 12.45 72.94 14.22 83.72 1.78 10.76 5.94 14.73 13.63 18.47 7.7 3.74 14.32 6.47 26.84 11.88 12.51 5.4 18.91 0.66 27.7-5.72 8.8-6.39 47.51-33.78 63.78-45.31 16.28-11.53 36.73-10.33 51.9 4.4 15.18 14.73 31.62 30.99 49.27 48.38 17.64 17.4 12.16 39.59 4.4 51.46-7.77 11.88-44.49 62.95-49.71 70.23-5.21 7.28-4.4 18.62-1.75 24.63 2.64 6.01 8.44 18.24 11.72 25.22 3.29 6.97 9.6 11.22 18.18 12.9 8.58 1.69 62.72 11 83.75 14.61 21.03 3.64 31.11 19.92 31.26 39.92C946.427 359.93499999999995 946.347 388.525 946.367 405.895zM908.587 338.615c0.21-5.76-4.66-10.65-8.82-11.38-4.17-0.73-63.26-11.38-81.48-14.29-18.21-2.92-33.23-15.07-38.72-28.06-3.98-9.44-5.47-13.51-10.59-26.96-5.12-13.44-4.64-32.19 2.56-42.26 7.2-10.08 46.82-64.9 50.38-70.45s4.27-11.95-1.28-17.5-40.99-41.2-47.39-47.39c-6.41-6.19-11.83-4.8-18.79 0-6.95 4.8-39.61 26.39-64.44 44.36-16.96 12.28-32.82 12.43-48.7 6.02-15.87-6.42 1.28 0.28-22.2-8.97-23.48-9.25-30.23-27.62-33.73-48.24-3.5-20.63-10.67-62.98-11.95-70.45-1.28-7.47-5.55-11.1-13.66-11.1l-64.9 0c-8.11 0-11.74 2.99-14.52 11.95-2.77 8.97-10.03 54.87-12.8 74.29-2.78 19.43-13.82 36.12-24.77 40.56-10.94 4.45-4.98 2.14-27.32 11.1-22.34 8.97-39.63 4.5-51.23-3.84-11.61-8.34-58.64-42.69-65.33-46.96-6.68-4.28-14.65-3.28-18.35 0.42-3.7 3.7-40.56 40.56-46.54 46.54-5.98 5.98-5.36 12.92 0 20.49 5.36 7.58 28.39 40.76 40.99 57.95 12.59 17.2 17.93 34.74 9.82 53.49-8.12 18.74-4.42 10.24-12.39 28.6-7.96 18.36-24.28 24.46-38.42 26.9-14.14 2.43-68.88 11.53-76.85 13.23-7.97 1.71-11.95 7.26-11.95 14.09l0 66.18c0 9.53 7.67 12.44 12.38 13.23 4.7 0.8 54.22 9.18 73 12.39 18.79 3.2 36.36 11.32 43.55 29.03 7.19 17.7 4.27 11.1 11.1 27.32 6.83 16.23 3.8 33.94-7.68 49.96-11.49 16.01-38.85 54-44.4 61.9-5.55 7.9-5.77 12.6 0.85 19.21 6.62 6.62 42.05 42.48 46.96 46.97 4.91 4.48 12.07 5.4 18.36 0.85 6.3-4.55 49.31-35.65 64.04-46.11 14.73-10.46 32.35-12.56 49.1-5.55 16.75 7.02 10.25 4.48 26.9 11.1s24.84 19.09 28.18 39.71c3.33 20.61 11.95 74.14 12.81 77.7 0.85 3.55 5.55 10.46 11.74 10.46s65.82-0.07 69.8 0c3.99 0.07 10.3-3.29 11.32-9.18 1.02-5.9 13.02-74.29 14.94-86.25 1.92-11.95 15.58-28.57 25.54-32.73 9.96-4.16 21.35-8.75 31.31-13.09 9.97-4.34 30.13-1.91 36.15 2.28 6.03 4.18 70.52 48.81 75.43 52.37 4.91 3.56 11.52 3.27 17.64-2.85s43.34-43.19 47.54-47.53c4.19-4.34 4.66-8.66 1.14-13.66-3.53-5.01-36.72-51.8-47.54-67.46-10.81-15.65-11.73-33.73-5.41-48.96 6.33-15.22 3.99-9.39 9.11-21.91 5.13-12.53 16.28-29.03 33.59-31.88 17.31-2.85 76.92-12.74 84.82-13.95 7.9-1.21 11.1-7.18 11.1-13.37S908.377 344.385 908.587 338.615zM526.833 573.1949999999999c-110.45 0-200-89.54-200-200s89.55-200 200-200c110.46 0 200 89.54 200 200S637.293 573.1949999999999 526.833 573.1949999999999zM526.833 208.19500000000005c-91.12 0-165 73.87-165 165s73.88 165 165 165c91.13 0 165-73.87 165-165S617.963 208.19500000000005 526.833 208.19500000000005z" horiz-adv-x="1024" /> + + + <glyph glyph-name="engine" unicode="" d="M422.214332 360.70413299999996L186.183684 360.70413299999996l0 46.568461 236.030648 0c10.379577 40.075407 46.47537 69.794509 89.785668 69.794509 51.432433 0 93.067103-41.657943 93.067103-93.067103C605.067103 332.56756700000005 563.40916 290.909624 512 290.909624 468.689703 290.909624 432.593909 320.65199900000005 422.214332 360.70413299999996L422.214332 360.70413299999996zM512 779.634098c-218.529658 0-395.634098-177.10444-395.634098-395.634098 0-218.529658 177.10444-395.634098 395.634098-395.634098 154.76275 0 288.417257 89.064217 353.440885 218.55293l101.398692-59.112389-23.063141-39.959044-62.161099 35.909613c-33.745261-51.595341-77.42792-96.115813-129.093079-129.744711l35.653614-61.765464-40.308133-23.295867-35.653614 61.765464c-53.620057-27.345298-113.360805-44.404109-176.894987-47.73209L535.319139-127.99706800000001l-46.568461 0 0 70.981412c-63.534182 3.327981-123.27493 20.386792-176.894987 47.73209l-35.653614-61.765464-40.308133 23.295867 35.653614 61.765464c-51.665159 33.628898-95.347818 78.149371-129.093079 129.744711l-62.161099-35.909613-23.295867 40.308133 62.114553 35.863067c-27.415116 53.550239-44.799743 113.104807-48.127724 176.685534L0.002932 360.70413299999996l0 46.568461 70.958139 0c3.327981 63.580727 20.712609 123.135295 48.127724 176.685534l-62.114553 35.863067 23.295867 40.308133 62.161099-35.909613c33.745261 51.595341 77.42792 96.115813 129.093079 129.744711l-35.653614 61.765464 40.308133 23.295867 35.653614-61.765464c53.620057 27.345298 113.360805 44.404109 176.894987 47.73209L488.727406 895.997068l46.568461 0 0-70.981412c63.534182-3.327981 123.27493-20.386792 176.894987-47.73209l35.653614 61.765464 40.308133-23.295867-35.653614-61.765464c51.665159-33.628898 95.347818-78.149371 129.093079-129.744711l62.161099 35.909613 23.063141-39.959044-101.398692-59.112389C800.417257 690.569881 666.76275 779.634098 512 779.634098L512 779.634098z" horiz-adv-x="1024" /> + + + <glyph glyph-name="close" unicode="ဆ" d="M783.483 701.249L512 429.775 240.517 701.249c-10.082 10.083-26.429 10.083-36.51 0-10.083-10.082-10.083-26.429 0-36.509l271.481-271.475L204.008 121.78800000000001c-10.083-10.081-10.083-26.428 0-36.508 10.082-10.082 26.429-10.082 36.51 0L512 356.755l271.483-271.475c10.082-10.082 26.429-10.082 36.513 0 10.081 10.083 10.081 26.428 0 36.508L548.51 393.265l271.485 271.474c10.081 10.083 10.081 26.429 0 36.509C809.912 711.33 793.564 711.33 783.483 701.249z" horiz-adv-x="1024" /> + + + <glyph glyph-name="close-fill" unicode="ဇ" d="M512 822.022125c-217.47508 0-394.423141-176.949085-394.423141-394.423141 0-217.474057 176.948061-394.422118 394.423141-394.422118 217.473033 0 394.422118 176.948061 394.422118 394.422118C906.422118 645.07304 729.473033 822.022125 512 822.022125zM702.228529 270.92978200000005c8.030907-8.030907 8.030907-21.052478 0-29.083385s-21.052478-8.030907-29.083385 0L512 402.992563 350.853833 241.84741899999995c-8.030907-8.030907-21.052478-8.030907-29.083385 0s-8.030907 21.052478 0 29.083385l161.146167 161.146167L321.771471 593.222115c-8.030907 8.030907-8.030907 21.052478 0 29.083385s21.052478 8.030907 29.083385 0l161.146167-161.146167L673.145144 622.305501c8.030907 8.030907 21.052478 8.030907 29.083385 0s8.030907-21.052478 0-29.083385L541.082362 432.075949 702.228529 270.92978200000005z" horiz-adv-x="1024" /> + + + <glyph glyph-name="chart-screen" unicode="" d="M963.930903 179.21903299999997l0 34.824133-37.354769-2.675946L926.576133 694.8538169999999 691.413206 694.8538169999999l0 70.462818L330.260819 765.316635l0-70.462818L95.690386 694.8538169999999l0-480.809627-35.621289 0 0-34.824133 432.583253 0 0-141.228535-90.313935 0 0-35.307134 216.753649 0 0 35.307134-90.313935 0L528.778128 179.21903299999997 963.930903 179.21903299999997zM366.212636 730.008478L655.216819 730.008478l0-35.307134L366.212636 694.7013440000001 366.212636 730.008478zM364.817869 332.73133600000006L222.224244 406.252817l14.295588 27.736715 123.238812-63.523779 173.928285 159.755494 127.5807-92.634794 93.13826 122.414027 12.420891-9.449209 12.420891-9.449209L667.639756 394.365068l-131.636063 95.621824L364.817869 332.73133600000006z" horiz-adv-x="1024" /> + + + <glyph glyph-name="star" unicode="" d="M749.624889-84.152889c-15.672889 0-31.246222 3.882667-45.084444 11.306667l-192.526222 103.637333L319.544889-72.817778c-31.203556-16.64-70.314667-14.392889-99.043556 5.304889-29.511111 20.337778-44.743111 55.921778-38.840889 90.695111l37.703111 225.251556L56.661333 410.908444c-25.002667 24.888889-33.464889 60.984889-22.058667 94.193778 11.349333 32.910222 40.064 56.576 74.965333 61.752889l221.326222 32.896 96.128 199.580444c15.488 32.085333 48.853333 52.807111 84.992 52.807111 36.167111 0 69.518222-20.736 84.963556-52.807111l96.156444-199.580444 221.297778-32.910222c34.872889-5.162667 63.616-28.8 74.979556-61.696 11.392-33.28 2.944-69.361778-22.030222-94.250667L804.622222 248.433778l37.745778-225.28c5.845333-34.773333-9.386667-70.357333-38.812444-90.638222C787.569778-78.392889 768.938667-84.152889 749.624889-84.152889zM512.014222 91.548444c4.636444 0 9.272889-1.137778 13.482667-3.384889l205.937778-110.862222c12.373333-6.641778 28.316444-5.802667 39.936 2.133333 11.392 7.836444 17.123556 21.006222 14.890667 34.304L746.097778 253.496889c-1.507556 9.088 1.450667 18.332444 7.964444 24.832l173.141333 172.842667c9.457778 9.429333 12.686222 23.025778 8.405333 35.484444-4.380444 12.672-15.701333 21.873778-29.525333 23.921778L669.866667 545.706667c-9.315556 1.379556-17.365333 7.296-21.447111 15.786667L545.720889 774.641778c-6.030222 12.529778-19.256889 20.608-33.706667 20.608s-27.690667-8.092444-33.763556-20.622222L375.608889 561.493333c-4.081778-8.490667-12.131556-14.407111-21.447111-15.786667L117.930667 510.577778c-13.624889-2.033778-25.201778-11.434667-29.539556-23.992889-4.266667-12.416-1.024-25.984 8.433778-35.399111L269.937778 278.328889c6.513778-6.499556 9.472-15.744 7.964444-24.832l-40.135111-239.744c-2.247111-13.312 3.484444-26.439111 14.976-34.360889 11.434667-7.836444 27.349333-8.775111 39.950222-2.062222l205.852444 110.833778C502.741333 90.410667 507.377778 91.548444 512.014222 91.548444zM200.32 439.210667c-6.840889 0-12.885333 4.963556-14.023111 11.946667-1.251556 7.751111 4.010667 15.061333 11.761778 16.312889l9.443556 1.536c7.793778 1.336889 15.061333-4.010667 16.312889-11.761778 1.251556-7.751111-4.010667-15.061333-11.761778-16.312889l-9.443556-1.536C201.856 439.267556 201.073778 439.210667 200.32 439.210667zM252.544 447.687111c-6.684444 0-12.643556 4.721778-13.937778 11.534222-1.493333 7.708444 3.555556 15.175111 11.264 16.654222l153.927111 29.696 58.055111 133.148444c3.157333 7.182222 11.548444 10.496 18.716444 7.352889 7.210667-3.143111 10.510222-11.52 7.367111-18.716444l-61.056-140.017778c-1.877333-4.295111-5.745778-7.395556-10.353778-8.277333l-161.28-31.118222C254.336 447.758222 253.44 447.687111 252.544 447.687111z" horiz-adv-x="1024" /> + + + <glyph glyph-name="circle-dot" unicode="" d="M513.133312 830.6731560000001c-247.538793 0-448.208115-200.669322-448.208115-448.207092 0-247.538793 200.670346-448.208115 448.208115-448.208115 247.538793 0 448.208115 200.670346 448.208115 448.208115C961.341427 630.004857 760.673128 830.6731560000001 513.133312 830.6731560000001zM513.132288-6.649187999999981c-214.901465 0-389.113205 174.212764-389.113205 389.114229 0 214.902488 174.21174 389.115252 389.113205 389.115252 214.903511 0 389.115252-174.212764 389.115252-389.115252C902.24754 167.563576 728.0358-6.649187999999981 513.132288-6.649187999999981zM513.133312 382.46504100000004m-344.602456 0a336.754 336.754 0 1 1 689.204911 0 336.754 336.754 0 1 1-689.204911 0Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="chat" unicode="" d="M132.682393 414.567179c0 208.287837 166.471452 377.143593 379.317095 377.143593s385.380184-168.855756 385.380184-377.143593c0-177.196725-122.197086-325.812507-290.49821-366.259708l-116.291586-51.04763 0 41.126676C290.570353 52.175568999999996 132.682393 215.31206599999996 132.682393 414.567179zM83.799056 414.567179c0-211.946157 160.764474-387.135154 369.469819-415.152255-3.2623-20.458961-10.036587-65.024969-7.286963-65.024969 2.384303 0 114.89068 47.294143 189.700503 78.865185 176.193885 51.91437 304.518528 211.946157 304.518528 401.312038 0 231.432976-191.70823 419.042865-428.200432 419.042865S83.799056 646.0001560000001 83.799056 414.567179zM340.71952 276.63573699999995c22.935362-41.481763 89.831958-75.102489 170.391738-75.102489 79.650061 0 148.489916 32.909527 172.168198 73.681116-12.701277 5.979178-19.068288 8.02886-28.131711 12.21009-19.894096-31.257911-75.425853-59.661821-142.729725-59.661821-66.969251 0-122.836653 28.40391-143.598512 61.083194L340.71952 276.63573699999995z" horiz-adv-x="1024" /> + + + <glyph glyph-name="release" unicode="" d="M990.78144 828.5388800000001c-3.35872 1.59744-7.04512 2.37568-11.01824 2.37568-14.45888 0-27.60704-10.81344-27.40224-10.81344-8.8064-4.42368-880.59904-443.22816-911.44192-459.44832-17.408-9.13408-27.36128-24.73984-25.92768-40.71424 1.10592-13.14816 9.78944-23.51104 23.10144-27.77088 26.17344-8.27392 290.24256-91.58656 290.24256-91.58656l4.83328-1.47456 16.67072 50.05312-254.32064 79.54432 780.73856 406.28224c-82.82112-93.88032-420.53632-476.32384-436.10112-493.93664-20.11136-22.48704-29.4912-45.09696-29.40928-70.98368l0.28672-153.27232-0.08192 0c0 0 0.08192-53.49376 0.08192-53.6576l0-1.96608 0 0c1.18784-13.5168 12.73856-24.24832 26.54208-24.24832s25.51808 10.73152 26.74688 24.24832l0 0c0 0 0.53248 191.03744 0 205.08672-0.49152 12.4928 5.07904 26.54208 10.69056 33.05472 5.65248 6.38976 390.63552 442.61376 465.75616 527.81056-21.38112-106.41408-126.68928-629.76-128.24576-637.41952-0.8192-4.05504-2.58048-4.05504-3.35872-4.05504-0.6144 0-1.31072 0.12288-2.048 0.36864-7.45472 2.37568-268.82048 81.55136-279.92064 84.91008l-4.7104 1.4336-17.16224-50.50368 5.07904-1.59744c2.58048-0.77824 258.90816-79.09376 284.38528-86.46656 5.07904-1.47456 10.24-2.2528 15.44192-2.2528 26.99264 0 49.5616 19.37408 54.8864 46.98112 2.08896 10.93632 27.0336 134.67648 55.9104 277.99552 39.77216 197.14048 84.7872 420.61824 85.93408 427.6224l0.6144 3.31776C1009.70496 798.96576 1013.26848 817.9712 990.78144 828.5388800000001z" horiz-adv-x="1024" /> + + + <glyph glyph-name="list" unicode="" d="M618.04471 733.97072l-397.175835 0c-16.927531 0-30.699186-13.771655-30.699186-30.699186l0-638.543068c0-16.927531 13.771655-30.699186 30.699186-30.699186l582.261227 0c16.927531 0 30.699186 13.771655 30.699186 30.699186l-0.726547 476.760404L618.04471 733.97072zM803.771715 541.488871 619.537713 541.488871 619.537713 705.552483 803.771715 541.488871zM813.363164 64.728466c0-5.64251-4.590552-10.233062-10.233062-10.233062l-582.261227 0c-5.64251 0-10.233062 4.590552-10.233062 10.233062l0 638.543068c0 5.64251 4.590552 10.233062 10.233062 10.233062l378.202715 0 0-192.481849 214.291574 0L813.363164 64.728466zM298.129516 482.495268l55.258535 0 0-55.258535-55.258535 0 0 55.258535ZM399.777591 468.168981l323.364759 0 0-26.605961-323.364759 0 0 26.605961ZM298.129516 342.044446l55.258535 0 0-55.258535-55.258535 0 0 55.258535ZM399.777591 327.718159l323.364759 0 0-26.605961-323.364759 0 0 26.605961ZM298.129516 199.804884l55.258535 0 0-55.258535-55.258535 0 0 55.258535ZM399.777591 185.478598l323.364759 0 0-26.605961-323.364759 0 0 26.605961ZM881.315812 53.053566" horiz-adv-x="1024" /> + + + <glyph glyph-name="chart" unicode="" d="M953.440991 315.668729L784.061302 315.668729 681.06451 437.392024c-0.312108 0.373507-0.635473 0.737804-0.969071 1.094938-0.013303 0.014326-0.026606 0.027629-0.039909 0.041956-0.276293 0.293689-0.559748 0.582261-0.851391 0.86367-0.053212 0.051165-0.107447 0.099261-0.160659 0.150426-0.249687 0.237407-0.50142 0.470721-0.76134 0.697895-0.089028 0.078795-0.181125 0.153496-0.272199 0.230244-0.225127 0.191358-0.451278 0.381693-0.683569 0.565888-0.124843 0.099261-0.251733 0.192382-0.3776 0.288572-0.200568 0.153496-0.402159 0.306992-0.607844 0.454348-0.159636 0.11461-0.322341 0.224104-0.485047 0.334621-0.177032 0.12075-0.354064 0.242524-0.535189 0.35918-0.195451 0.12689-0.394996 0.246617-0.593518 0.367367-0.152473 0.092098-0.302899 0.186242-0.457418 0.275269-0.237407 0.137123-0.477884 0.268106-0.718361 0.397043-0.121773 0.065492-0.2415 0.132006-0.364297 0.195451-0.283456 0.146333-0.571005 0.285502-0.859577 0.420579-0.085958 0.040932-0.170892 0.082888-0.257873 0.122797-0.337691 0.154519-0.679475 0.298805-1.022283 0.437975-0.044002 0.017396-0.086981 0.036839-0.130983 0.055259-1.604544 0.638543-3.2623 1.113357-4.948709 1.416256-0.343831 0.062422-0.687662 0.112564-1.031493 0.160659-0.055259 0.008186-0.110517 0.01842-0.165776 0.025583-1.633197 0.216941-3.25923 0.26913-4.861728 0.173962-0.013303-0.001023-0.026606-0.001023-0.040932-0.002047-0.363274-0.022513-0.724501-0.054235-1.085728-0.091074-0.060375-0.00614-0.119727-0.011256-0.180102-0.017396-0.310062-0.034792-0.618077-0.077771-0.926092-0.122797-0.116657-0.017396-0.232291-0.032746-0.348947-0.051165-0.24764-0.040932-0.494257-0.086981-0.740874-0.135076-0.178055-0.033769-0.355087-0.067538-0.532119-0.105401-0.183172-0.039909-0.36532-0.083911-0.547469-0.127913-0.237407-0.056282-0.474814-0.113587-0.710175-0.176009-0.12075-0.032746-0.240477-0.068562-0.360204-0.102331-0.292666-0.082888-0.584308-0.168846-0.874927-0.26299-0.063445-0.020466-0.125867-0.042979-0.188288-0.063445-0.338714-0.112564-0.675382-0.230244-1.010003-0.357134-0.019443-0.007163-0.038886-0.01535-0.058328-0.022513-1.493004-0.571005-2.948145-1.284249-4.340865-2.149966-0.067538-0.041956-0.13303-0.088004-0.200568-0.12996-0.273223-0.172939-0.545422-0.346901-0.813528-0.531096-1.416256-0.971118-2.734274-2.089591-3.936659-3.333932-0.025583-0.026606-0.049119-0.053212-0.074701-0.079818-0.26299-0.275269-0.521886-0.555655-0.773619-0.843204-0.058328-0.066515-0.112564-0.134053-0.169869-0.200568-0.211824-0.246617-0.420579-0.496304-0.62217-0.751107-0.083911-0.106424-0.164752-0.214894-0.246617-0.322341-0.167822-0.218988-0.334621-0.437975-0.49528-0.663102-0.102331-0.14224-0.199545-0.287549-0.298805-0.431835-0.13303-0.194428-0.26606-0.387833-0.393973-0.586354-0.115634-0.179079-0.225127-0.360204-0.335644-0.541329-0.103354-0.168846-0.207731-0.336668-0.306992-0.508583-0.12689-0.220011-0.24764-0.443092-0.36839-0.666172-0.074701-0.138146-0.151449-0.275269-0.223081-0.416486-0.137123-0.265036-0.265036-0.533143-0.39295-0.802272-0.050142-0.105401-0.101307-0.209778-0.150426-0.316202-0.144286-0.317225-0.279363-0.63752-0.410346-0.958838-0.026606-0.064468-0.055259-0.127913-0.080841-0.193405-0.150426-0.378623-0.291642-0.760317-0.423649-1.14508-0.005117-0.016373-0.011256-0.031722-0.017396-0.048095-0.157589-0.463558-0.303922-0.930185-0.434905-1.400906l-97.897657-342.642824L435.093423 811.832042c-0.071631 0.569982-0.165776 1.13587-0.275269 1.696642-0.008186 0.040932-0.017396 0.081864-0.025583 0.12382-0.071631 0.356111-0.148379 0.709151-0.234337 1.061169-0.031722 0.128937-0.065492 0.255827-0.099261 0.38374-0.066515 0.254803-0.135076 0.508583-0.208754 0.760317-0.060375 0.206708-0.124843 0.411369-0.190335 0.615007-0.053212 0.166799-0.107447 0.332575-0.164752 0.49835-0.092098 0.26913-0.190335 0.535189-0.290619 0.800225-0.037862 0.098237-0.074701 0.196475-0.113587 0.293689-0.12382 0.313132-0.25378 0.623193-0.38988 0.930185-0.022513 0.050142-0.044002 0.100284-0.066515 0.150426-0.152473 0.338714-0.311085 0.672312-0.477884 1.00284-0.01228 0.024559-0.024559 0.049119-0.037862 0.074701-0.173962 0.343831-0.356111 0.682545-0.545422 1.017166-0.011256 0.019443-0.022513 0.039909-0.033769 0.059352-0.188288 0.330528-0.382717 0.654916-0.584308 0.975211-0.021489 0.034792-0.044002 0.068562-0.065492 0.103354-0.190335 0.298805-0.385786 0.592494-0.587378 0.88209-0.045025 0.065492-0.091074 0.12996-0.137123 0.194428-0.180102 0.252757-0.363274 0.502443-0.551562 0.74906-0.079818 0.105401-0.162706 0.208754-0.24457 0.312108-0.157589 0.199545-0.317225 0.396019-0.480954 0.590448-0.124843 0.149403-0.252757 0.295735-0.381693 0.442068-0.125867 0.14224-0.251733 0.284479-0.38067 0.424672-0.174985 0.191358-0.355087 0.378623-0.536212 0.563842-0.088004 0.090051-0.176009 0.180102-0.26606 0.26913-0.224104 0.222057-0.452301 0.440022-0.684592 0.653893-0.054235 0.050142-0.10847 0.100284-0.163729 0.150426-0.265036 0.240477-0.535189 0.474814-0.810459 0.704035-0.028653 0.023536-0.056282 0.047072-0.084934 0.070608-0.294712 0.243547-0.595564 0.479931-0.902556 0.711198-0.01535 0.011256-0.029676 0.022513-0.045025 0.033769-0.311085 0.232291-0.627287 0.458441-0.949628 0.677429-0.019443 0.013303-0.037862 0.025583-0.057305 0.038886-0.309038 0.208754-0.623193 0.411369-0.942465 0.606821-0.045025 0.027629-0.090051 0.054235-0.134053 0.081864-0.288572 0.174985-0.581238 0.343831-0.877997 0.50756-0.090051 0.050142-0.181125 0.098237-0.272199 0.147356-0.25071 0.134053-0.502443 0.265036-0.759293 0.391926-0.156566 0.077771-0.314155 0.151449-0.472767 0.226151-0.194428 0.091074-0.38988 0.182149-0.587378 0.268106-0.239454 0.105401-0.481977 0.204661-0.724501 0.302899-0.12382 0.049119-0.246617 0.100284-0.37146 0.148379-0.334621 0.128937-0.673335 0.249687-1.014096 0.36532-0.042979 0.014326-0.085958 0.029676-0.128937 0.044002-1.6158 0.536212-3.296069 0.915859-5.02034 1.119497-0.01535 0.002047-0.029676 0.004093-0.044002 0.00614-0.309038 0.035816-0.620124 0.062422-0.931209 0.086981-0.132006 0.010233-0.265036 0.025583-0.397043 0.033769-0.174985 0.011256-0.349971 0.01535-0.525979 0.022513-0.270153 0.01228-0.539282 0.024559-0.808412 0.027629-0.054235 0.001023-0.10847-0.001023-0.162706-0.001023-1.696642 0.010233-3.371794-0.149403-5.006014-0.466628-0.065492-0.01228-0.12996-0.027629-0.195451-0.039909-0.331551-0.067538-0.662079-0.13917-0.989537-0.218988-0.148379-0.035816-0.295735-0.075725-0.443092-0.11461-0.234337-0.061398-0.468674-0.124843-0.700965-0.192382-0.224104-0.065492-0.445138-0.135076-0.666172-0.206708-0.149403-0.048095-0.297782-0.096191-0.446162-0.147356-0.286526-0.098237-0.568958-0.201591-0.850367-0.309038-0.079818-0.030699-0.160659-0.061398-0.240477-0.093121-0.330528-0.12996-0.655939-0.267083-0.979304-0.410346-0.033769-0.01535-0.067538-0.029676-0.101307-0.045025-0.355087-0.159636-0.705058-0.325411-1.050935-0.500397-0.008186-0.004093-0.016373-0.008186-0.023536-0.01228-0.360204-0.182149-0.714268-0.372483-1.064238-0.569982-0.004093-0.002047-0.008186-0.005117-0.013303-0.007163-0.344854-0.196475-0.684592-0.399089-1.019213-0.610914-0.020466-0.013303-0.040932-0.025583-0.060375-0.038886-0.313132-0.199545-0.621147-0.404206-0.925069-0.61603-0.050142-0.034792-0.099261-0.070608-0.149403-0.105401-0.268106-0.190335-0.532119-0.38374-0.791016-0.583285-0.091074-0.069585-0.181125-0.141216-0.271176-0.212848-0.212848-0.167822-0.422625-0.337691-0.629333-0.512676-0.137123-0.11461-0.271176-0.232291-0.406253-0.349971-0.154519-0.1361-0.308015-0.272199-0.459464-0.412392-0.179079-0.164752-0.354064-0.332575-0.528026-0.502443-0.102331-0.100284-0.204661-0.199545-0.304945-0.301875-0.211824-0.212848-0.418532-0.430812-0.623193-0.651846-0.059352-0.064468-0.119727-0.128937-0.179079-0.194428-0.231267-0.254803-0.456395-0.515746-0.678452-0.780783-0.031722-0.037862-0.063445-0.075725-0.095167-0.11461-0.23536-0.285502-0.465604-0.577145-0.688685-0.874927-0.01842-0.024559-0.036839-0.048095-0.055259-0.072655-0.226151-0.301875-0.445138-0.60989-0.657986-0.923022-0.019443-0.028653-0.038886-0.057305-0.058328-0.084934-0.202615-0.300852-0.400113-0.606821-0.590448-0.916882-0.032746-0.053212-0.064468-0.105401-0.096191-0.158612-0.169869-0.282433-0.335644-0.567935-0.49528-0.857531-0.053212-0.097214-0.105401-0.194428-0.158612-0.292666-0.130983-0.24457-0.258896-0.490164-0.381693-0.73985-0.080841-0.162706-0.157589-0.326435-0.234337-0.491187-0.088004-0.189312-0.177032-0.378623-0.260943-0.571005-0.107447-0.245593-0.209778-0.493234-0.310062-0.741897-0.047072-0.11768-0.095167-0.234337-0.141216-0.354064-0.130983-0.340761-0.25378-0.684592-0.370437-1.030469-0.013303-0.037862-0.026606-0.075725-0.038886-0.113587-0.180102-0.543376-0.345877-1.092891-0.48914-1.650593L244.22942 305.59939599999996 67.355037 305.59939599999996c-14.128789 0-25.582655-11.453866-25.582655-25.582655s11.453866-25.582655 25.582655-25.582655l191.314257 0c0.867764 0 1.725294 0.044002 2.570545 0.128937 0.828878-0.080841 1.656733-0.1361 2.478448-0.1361 11.218506 0 21.512966 7.439436 24.644283 18.779715l113.358791 410.43686 103.412254-723.884758c0.00921-0.072655 0.021489-0.145309 0.030699-0.217964l0.046049-0.320295c0.002047-0.011256 0.005117-0.021489 0.00614-0.032746 0.109494-0.7552 0.25071-1.502213 0.425695-2.238994 0.01535-0.064468 0.031722-0.12689 0.047072-0.191358 0.166799-0.679475 0.358157-1.350764 0.579191-2.01182 0.041956-0.124843 0.088004-0.24764 0.130983-0.37146 0.210801-0.600681 0.437975-1.194198 0.692778-1.77646 0.068562-0.156566 0.144286-0.309038 0.215918-0.464581 0.223081-0.484024 0.460488-0.961908 0.713244-1.431605 0.106424-0.196475 0.213871-0.390903 0.325411-0.584308 0.265036-0.462534 0.545422-0.914836 0.838088-1.359974 0.088004-0.13303 0.170892-0.268106 0.260943-0.399089 0.354064-0.51677 0.732687-1.016143 1.12359-1.506307 0.078795-0.099261 0.156566-0.198521 0.237407-0.296759 0.420579-0.511653 0.864694-1.004887 1.325182-1.482771 0.051165-0.052189 0.101307-0.105401 0.152473-0.157589 0.494257-0.50449 1.010003-0.989537 1.548262-1.454118 0.00921-0.007163 0.017396-0.014326 0.026606-0.022513 1.636267-1.408069 3.466961-2.620687 5.466502-3.592828 0.075725-0.036839 0.151449-0.074701 0.228197-0.11154 0.576121-0.273223 1.165546-0.525979 1.768273-0.75827 0.158612-0.061398 0.319272-0.118704 0.478907-0.177032 0.558725-0.202615 1.124614-0.393973 1.704828-0.559748 0.005117-0.001023 0.010233-0.002047 0.01535-0.004093 0.278339-0.079818 0.562818-0.13917 0.844228-0.209778 0.394996-0.098237 0.789992-0.194428 1.184989-0.274246 0.283456-0.056282 0.568958-0.103354 0.854461-0.149403 0.445138-0.073678 0.889253-0.134053 1.333368-0.183172 0.229221-0.024559 0.456395-0.052189 0.686638-0.071631 0.710175-0.059352 1.418302-0.099261 2.122337-0.099261 0.337691 0 0.671289 0.027629 1.007957 0.040932 0.276293 0.011256 0.550539 0.013303 0.828878 0.033769 0.401136 0.029676 0.799202 0.079818 1.196245 0.127913 0.191358 0.022513 0.38067 0.033769 0.572028 0.061398 0.069585 0.010233 0.1361 0.024559 0.205685 0.034792 0.232291 0.034792 0.462534 0.075725 0.692778 0.116657 0.463558 0.082888 0.921999 0.176009 1.3743 0.283456 0.109494 0.025583 0.218988 0.047072 0.327458 0.074701 0.582261 0.145309 1.152243 0.316202 1.716084 0.499373 0.098237 0.031722 0.196475 0.063445 0.293689 0.097214 1.90335 0.644683 3.694135 1.50119 5.351891 2.540869 0.014326 0.00921 0.028653 0.01842 0.042979 0.027629 1.089821 0.686638 2.121314 1.452071 3.087315 2.287089 0.083911 0.071631 0.167822 0.143263 0.25071 0.215918 0.424672 0.3776 0.837064 0.76748 1.235131 1.170662 0.12382 0.124843 0.243547 0.254803 0.36532 0.382717 0.317225 0.334621 0.626263 0.677429 0.925069 1.028423 0.155543 0.183172 0.308015 0.36839 0.458441 0.556679 0.26606 0.331551 0.523933 0.670266 0.773619 1.01512 0.130983 0.180102 0.261966 0.35918 0.387833 0.543376 0.294712 0.429789 0.575098 0.86981 0.843204 1.316995 0.099261 0.165776 0.195451 0.334621 0.290619 0.503467 0.283456 0.499373 0.555655 1.004887 0.806365 1.52268 0.031722 0.065492 0.060375 0.13303 0.091074 0.199545 0.276293 0.584308 0.530073 1.178849 0.762363 1.784646 0.00614 0.017396 0.014326 0.034792 0.020466 0.051165 0.251733 0.661056 0.472767 1.336438 0.669242 2.020006 0.002047 0.008186 0.00614 0.016373 0.008186 0.024559l0.061398 0.215918c0.029676 0.106424 0.062422 0.210801 0.090051 0.317225l117.579929 411.527704 79.800487-94.308923c0.070608-0.083911 0.146333-0.161682 0.217964-0.243547 0.190335-0.220011 0.38374-0.436952 0.581238-0.649799 0.134053-0.144286 0.26913-0.285502 0.405229-0.425695 0.164752-0.168846 0.331551-0.335644 0.50142-0.500397 0.164752-0.159636 0.329505-0.319272 0.496304-0.473791 0.138146-0.12689 0.279363-0.25071 0.419556-0.37453 0.198521-0.174985 0.397043-0.350994 0.599657-0.518816 0.081864-0.067538 0.166799-0.132006 0.249687-0.198521 0.817622-0.661056 1.667989-1.264806 2.545986-1.811252 0.098237-0.061398 0.195451-0.125867 0.294712-0.185218 0.228197-0.138146 0.459464-0.267083 0.691755-0.398066 0.157589-0.089028 0.315178-0.178055 0.474814-0.264013 0.200568-0.107447 0.403183-0.208754 0.606821-0.311085 0.202615-0.101307 0.406253-0.201591 0.611937-0.297782 0.173962-0.080841 0.348947-0.159636 0.523933-0.237407 0.245593-0.10847 0.494257-0.212848 0.743944-0.313132 0.144286-0.058328 0.289596-0.115634 0.434905-0.171915 0.291642-0.11154 0.586354-0.216941 0.883113-0.317225 0.11154-0.037862 0.223081-0.076748 0.334621-0.113587 0.337691-0.109494 0.677429-0.210801 1.02126-0.305969 0.078795-0.021489 0.157589-0.046049 0.236384-0.066515 0.376577-0.101307 0.757247-0.193405 1.140986-0.277316 0.050142-0.011256 0.100284-0.023536 0.150426-0.034792 0.405229-0.085958 0.813528-0.162706 1.225921-0.229221 0.031722-0.005117 0.063445-0.01228 0.096191-0.017396 0.412392-0.065492 0.828878-0.12075 1.24741-0.165776 0.032746-0.004093 0.064468-0.00921 0.097214-0.01228 0.382717-0.039909 0.768503-0.068562 1.155313-0.092098 0.068562-0.004093 0.1361-0.01228 0.204661-0.01535 0.25992-0.013303 0.521886-0.01535 0.782829-0.020466 0.188288-0.004093 0.376577-0.01535 0.564865-0.01535 0.008186 0 0.01535 0.001023 0.023536 0.001023l181.208085 0c14.129812 0 25.582655 11.453866 25.582655 25.582655S967.56978 315.668729 953.440991 315.668729z" horiz-adv-x="1024" /> + + + <glyph glyph-name="ok-circle" unicode="စ" d="M516.152065-63.152063c-60.696384 0-119.594819 11.894911-175.056991 35.353183-53.55473 22.651906-101.646028 55.073316-142.936433 96.364745-41.291428 41.291428-73.712839 89.381703-96.363721 142.936433-23.458271 55.462173-35.353183 114.359584-35.353183 175.055968s11.894911 119.594819 35.353183 175.056991c22.651906 53.55473 55.073316 101.646028 96.363721 142.936433 41.290405 41.291428 89.381703 73.712839 142.936433 96.363721 55.462173 23.458271 114.359584 35.353183 175.056991 35.353183s119.594819-11.894911 175.056991-35.353183c53.55473-22.651906 101.645005-55.073316 142.936433-96.363721 41.291428-41.290405 73.711815-89.38068 96.363721-142.936433 23.459295-55.462173 35.353183-114.359584 35.353183-175.056991 0-60.696384-11.893888-119.593795-35.353183-175.055968-22.651906-53.55473-55.072293-101.645005-96.363721-142.936433s-89.381703-73.712839-142.936433-96.364745C635.747907-51.25715200000002 576.849472-63.152063 516.152065-63.152063zM516.152065 774.870222c-214.115566 0-388.311956-174.196391-388.311956-388.311956s174.196391-388.311956 388.311956-388.311956 388.311956 174.196391 388.311956 388.311956S730.268654 774.870222 516.152065 774.870222zM434.74908 132.830517L209.49278 358.08784 289.087583 437.68162 434.74908 292.020122 743.218594 600.488613 822.812373 520.89381Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="layim-theme" unicode="" d="M958.830745 538.643056L740.659817 692.753993l-100.539834 0-3.977591-9.332553c-0.37146-0.871857-38.021965-86.8613-124.772748-88.667435-35.691897 0.76441-67.206658 15.500019-93.680613 43.828204-20.658506 22.106484-30.374798 44.584428-30.456662 44.776809l-3.955078 9.393951-100.587929 0L64.518433 538.643056 169.320337 379.756349l89.956801 65.019853-19.016099-368.05254 268.86654 0 4.093225 0 269.866311 0-19.016099 368.051517 89.956801-65.018829L958.830745 538.643056zM730.105437 507.20402l20.655436-399.781172-237.540068 0-4.093225 0L272.587282 107.42284700000005l20.656459 399.781172-115.938546-83.797521-36.3243 55.070246 159.440315 111.641683-19.276019 30.638811L121.066333 508.667348l-14.548344 22.056342 185.921433 131.330094 71.077825 0c5.332449-10.04375 15.433504-26.779923 30.951943-43.580564 32.047904-34.69622 72.256674-53.486168 116.345822-54.411237l0-0.031722c0.203638 0.00307 0.406253 0.01228 0.60989 0.016373 0.203638-0.00307 0.406253-0.013303 0.60989-0.016373l0 0.031722c44.073798 0.925069 84.359316 19.703761 116.566856 54.379515 15.623839 16.821107 25.814945 33.579793 31.188326 43.612287l71.120804 0 185.921433-131.330094-14.548344-22.056342L742.203986 620.7551920000001l-19.276019-30.638811 159.440315-111.641683-36.3243-55.070246L730.105437 507.20402z" horiz-adv-x="1024" /> + + + <glyph glyph-name="table" unicode="" d="M304.738028 343.684806M729.544153 511.153982M595.52788 637.723655M143.806755 686.614156l0-601.704045L881.172549 84.91011100000003l0 601.704045L143.806755 686.614156zM420.318416 299.80441299999995l0 128.936581 184.341448 0 0-128.936581L420.318416 299.80441299999995zM604.659865 256.825552l0-128.936581L420.318416 127.88897099999997l0 128.936581L604.659865 256.825552zM604.659865 600.656435l0-128.936581L420.318416 471.719854l0 128.936581L604.659865 600.656435zM374.232798 600.656435l0-128.936581L189.89135 471.719854l0 128.936581L374.232798 600.656435zM189.89135 428.740994L374.232798 428.740994l0-128.936581L189.89135 299.80441299999995 189.89135 428.740994zM650.745483 428.740994l184.341448 0 0-128.936581L650.745483 299.80441299999995 650.745483 428.740994zM650.745483 471.719854l0 128.936581 184.341448 0 0-128.936581L650.745483 471.719854zM189.89135 256.825552L374.232798 256.825552l0-128.936581L189.89135 127.88897099999997 189.89135 256.825552zM650.745483 127.88897099999997l0 128.936581 184.341448 0 0-128.936581L650.745483 127.88897099999997z" horiz-adv-x="1024" /> + + + <glyph glyph-name="right" unicode="" d="M283.648 721.9189759999999L340.873216 780.926976 740.352 383.99795200000005 340.876288-12.925952000000052 283.648 46.07795199999998 619.52 383.99795200000005Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="left" unicode="" d="M740.352 721.9189759999999L683.126784 780.926976 283.648 383.99795200000005 683.123712-12.925952000000052 740.352 46.07795199999998 404.48 383.99795200000005Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="cart-simple" unicode="" d="M235.097303 196.866982C247.384597 160.417152 286.382106 132.37606800000003 324.772759 132.37606800000003L861.658537 132.37606800000003 880.429732 132.37606800000003 885.649214 150.54185399999994 1009.08775 580.154957C1021.388907 622.967661 993.187631 660.786325 949.051586 660.786325L424.585365 660.786325C410.791718 660.786325 399.609756 649.5207379999999 399.609756 635.623932 399.609756 621.727125 410.791718 610.461538 424.585365 610.461538L949.051586 610.461538C959.924 610.461538 964.161052 604.779539 961.106394 594.148171L837.667859 164.53506800000002 861.658537 182.70085500000005 324.772759 182.70085500000005C307.742153 182.70085500000005 287.789837 197.04752900000005 282.395194 213.05054900000005L73.600164 832.433664C69.16437 845.592294 54.980454 852.636656 41.919502 848.167687 28.858551 843.698719 21.86648 829.408727 26.302275 816.250097L235.097303 196.866982ZM399.609756-6.017094000000043C399.609756 49.57012899999995 354.881911 94.63247799999999 299.707317 94.63247799999999 244.532723 94.63247799999999 199.804878 49.57012899999995 199.804878-6.017094000000043 199.804878-61.604318000000035 244.532723-106.66666699999996 299.707317-106.66666699999996 354.881911-106.66666699999996 399.609756-61.604318000000035 399.609756-6.017094000000043ZM249.756098-6.017094000000043C249.756098 21.77651800000001 272.120021 44.30769299999997 299.707317 44.30769299999997 327.294613 44.30769299999997 349.658537 21.77651800000001 349.658537-6.017094000000043 349.658537-33.810704999999984 327.294613-56.34187899999995 299.707317-56.34187899999995 272.120021-56.34187899999995 249.756098-33.810704999999984 249.756098-6.017094000000043ZM924.097562-6.017094000000043C924.097562 49.57012899999995 879.369715 94.63247799999999 824.195121 94.63247799999999 769.020529 94.63247799999999 724.292683 49.57012899999995 724.292683-6.017094000000043 724.292683-61.604318000000035 769.020529-106.66666699999996 824.195121-106.66666699999996 879.369715-106.66666699999996 924.097562-61.604318000000035 924.097562-6.017094000000043ZM774.243902-6.017094000000043C774.243902 21.77651800000001 796.607825 44.30769299999997 824.195121 44.30769299999997 851.782419 44.30769299999997 874.146342 21.77651800000001 874.146342-6.017094000000043 874.146342-33.810704999999984 851.782419-56.34187899999995 824.195121-56.34187899999995 796.607825-56.34187899999995 774.243902-33.810704999999984 774.243902-6.017094000000043Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="face-cry" unicode="" d="M1024 384C1024 666.769792 794.769792 896 512 896 229.230208 896 0 666.769792 0 384 0 101.23020799999995 229.230208-128 512-128 629.410831-128 740.826187-88.33104600000001 830.768465-16.686661999999956 841.557579-8.092490999999995 843.33693 7.620766000000003 834.742758 18.409879000000046 826.148587 29.198990999999978 810.43533 30.978341999999998 799.646219 22.384173000000033 718.470035-42.277495000000044 618.001779-78.04878099999996 512-78.04878099999996 256.817504-78.04878099999996 49.951219 128.81750399999999 49.951219 384 49.951219 639.182496 256.817504 846.048781 512 846.048781 767.182496 846.048781 974.048781 639.182496 974.048781 384 974.048781 296.507166 949.714859 212.66323599999998 904.470807 140.039307 897.177109 128.33175700000004 900.755245 112.92820300000005 912.462793 105.63450699999999 924.170342 98.34080900000004 939.573897 101.91894200000002 946.867595 113.62649199999998 997.013826 194.11920399999997 1024 287.101621 1024 384ZM337.170731 396.487806C371.654852 396.487806 399.609756 424.442709 399.609756 458.926829 399.609756 493.41095 371.654852 521.365854 337.170731 521.365854 302.686611 521.365854 274.731708 493.41095 274.731708 458.926829 274.731708 424.442709 302.686611 396.487806 337.170731 396.487806ZM711.804879 396.487806C746.288998 396.487806 774.243902 424.442709 774.243902 458.926829 774.243902 493.41095 746.288998 521.365854 711.804879 521.365854 677.320757 521.365854 649.365854 493.41095 649.365854 458.926829 649.365854 424.442709 677.320757 396.487806 711.804879 396.487806ZM352.788105 191.21547499999997C396.165222 225.91716899999994 453.151987 246.639629 524.487806 246.639629 595.823622 246.639629 652.810387 225.91716899999994 696.187505 191.21547499999997 722.700531 170.00505399999997 738.882517 148.42907300000002 746.631548 132.931012 752.800254 120.59359800000004 747.799529 105.59142399999996 735.462114 99.42271600000004 723.124702 93.25401 708.122526 98.25473499999998 701.953818 110.59214899999995 701.03616 112.42746499999998 698.492224 116.61747600000001 694.165854 122.38597100000004 686.602473 132.47047699999996 676.927317 142.654852 664.983226 152.21012499999995 630.311565 179.947456 584.273939 196.68840999999998 524.487806 196.68840999999998 464.70167 196.68840999999998 418.664045 179.947456 383.992384 152.21012499999995 372.048292 142.654852 362.373137 132.47047699999996 354.809756 122.38597100000004 350.483386 116.61747600000001 347.93945 112.42746499999998 347.021792 110.59214899999995 340.853084 98.25473499999998 325.850908 93.25401 313.513495 99.42271600000004 301.176081 105.59142399999996 296.175356 120.59359800000004 302.344062 132.931012 310.093092 148.42907300000002 326.275078 170.00505399999997 352.788105 191.21547499999997Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="face-smile" unicode="" d="M1024 384C1024 666.769792 794.769792 896 512 896 229.230208 896 0 666.769792 0 384 0 101.23020799999995 229.230208-128 512-128 629.410831-128 740.826187-88.33104600000001 830.768465-16.686661999999956 841.557579-8.092490999999995 843.33693 7.620766000000003 834.742758 18.409879000000046 826.148587 29.198990999999978 810.43533 30.978341999999998 799.646219 22.384173000000033 718.470035-42.277495000000044 618.001779-78.04878099999996 512-78.04878099999996 256.817504-78.04878099999996 49.951219 128.81750399999999 49.951219 384 49.951219 639.182496 256.817504 846.048781 512 846.048781 767.182496 846.048781 974.048781 639.182496 974.048781 384 974.048781 296.507166 949.714859 212.66323599999998 904.470807 140.039307 897.177109 128.33175700000004 900.755245 112.92820300000005 912.462793 105.63450699999999 924.170342 98.34080900000004 939.573897 101.91894200000002 946.867595 113.62649199999998 997.013826 194.11920399999997 1024 287.101621 1024 384ZM337.170731 396.487806C371.654852 396.487806 399.609756 424.442709 399.609756 458.926829 399.609756 493.41095 371.654852 521.365854 337.170731 521.365854 302.686611 521.365854 274.731708 493.41095 274.731708 458.926829 274.731708 424.442709 302.686611 396.487806 337.170731 396.487806ZM711.804879 396.487806C746.288998 396.487806 774.243902 424.442709 774.243902 458.926829 774.243902 493.41095 746.288998 521.365854 711.804879 521.365854 677.320757 521.365854 649.365854 493.41095 649.365854 458.926829 649.365854 424.442709 677.320757 396.487806 711.804879 396.487806ZM352.788105 127.22903299999996C396.165222 92.52733899999998 453.151987 71.80487900000003 524.487806 71.80487900000003 595.823622 71.80487900000003 652.810387 92.52733899999998 696.187505 127.22903299999996 722.700531 148.43945399999996 738.882517 170.01543500000002 746.631548 185.51349500000003 752.800254 197.850908 747.799529 212.85308399999997 735.462114 219.021792 723.124702 225.19049800000005 708.122526 220.18977299999995 701.953818 207.85235799999998 701.03616 206.01704299999994 698.492224 201.82703100000003 694.165854 196.058537 686.602473 185.97402899999997 676.927317 175.78965500000004 664.983226 166.23438299999998 630.311565 138.49705200000005 584.273939 121.75609799999995 524.487806 121.75609799999995 464.70167 121.75609799999995 418.664045 138.49705200000005 383.992384 166.23438299999998 372.048292 175.78965500000004 362.373137 185.97402899999997 354.809756 196.058537 350.483386 201.82703100000003 347.93945 206.01704299999994 347.021792 207.85235799999998 340.853084 220.18977299999995 325.850908 225.19049800000005 313.513495 219.021792 301.176081 212.85308399999997 296.175356 197.850908 302.344062 185.51349500000003 310.093092 170.01543500000002 326.275078 148.43945399999996 352.788105 127.22903299999996Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="survey" unicode="" d="M722.355804 849.454545C761.006291 849.454545 792.380951 818.166023 792.380951 779.627344L792.380951 437.500928 799.081094 453.813218 401.874746 51.22138 418.539682 58.181818 138.070006 58.181818C99.387643 58.181818 68.063492 89.328555 68.063492 127.771428L68.063492 872.727273 44.698413 849.454545 722.355804 849.454545ZM21.333333 896 21.333333 872.727273 21.333333 127.771428C21.333333 63.604277 73.59726 11.636363 138.070006 11.636363L418.539682 11.636363 428.337293 11.636363 435.204619 18.596802 832.410967 421.18864 839.11111 427.979625 839.11111 437.500928 839.11111 779.627344C839.11111 843.859757 786.827324 896 722.355804 896L44.698413 896 21.333333 896ZM775.859347 307.365395 759.337741 290.90909 775.859347 274.452787 869.319663 181.361879 885.841269 164.905574 902.362876 181.361879 972.458114 251.18006 988.979721 267.636363 972.458114 284.092668 878.997796 377.183575 862.47619 393.639878 845.954583 377.183575 775.859347 307.365395ZM845.954583 344.27097 939.414901 251.18006 939.414901 284.092668 869.319663 214.274485 902.362876 214.274485 808.902558 307.365395 808.902558 274.452787 878.997796 344.27097 845.954583 344.27097ZM518.843473 51.365395 513.841133 46.382827 512.453734 39.473248 489.088655-76.890387 482.215251-111.121568 516.58227-104.275332 633.407665-81.002605 640.344663-79.620689 645.347004-74.638121 902.362876 181.361879 918.884482 197.818182 902.362876 214.274485 808.902558 307.365395 792.380951 323.821698 775.859347 307.365395 518.843473 51.365395ZM775.859347 274.452787 869.319663 181.361879 869.319663 214.274485 612.303791-41.725515 624.243127-35.361033 507.41773-58.633758 534.911345-86.018703 558.276425 30.344934 551.886686 18.452787 808.902558 274.452787 775.859347 274.452787ZM426.576706 298.269073C444.201086 298.269073 458.488469 284.053815 458.488469 266.500753L458.488469 258.086116C458.488469 240.540958 444.323959 226.317797 426.576706 226.317797L426.576706 226.317797C408.952326 226.317797 394.664943 240.533054 394.664943 258.086116L394.664943 266.500753C394.664943 284.045911 408.829453 298.269073 426.576706 298.269073L426.576706 298.269073ZM278.349205 552.435127C278.349205 552.435127 280.851125 530.485568 305.477133 530.485568 330.103138 530.485568 331.559155 552.435127 331.559155 552.435127 329.927383 623.508937 362.988497 657.25782 430.67155 653.905282 475.722639 648.839223 499.06407 623.508937 500.624896 577.839917 497.503245 557.501184 480.405116 531.202385 449.969026 499.092521 409.671358 458.489557 389.522524 422.133143 389.522524 390.023279L389.522524 357.093903C389.522524 357.093903 392.614705 337.454532 414.885933 337.454532 437.157161 337.454532 440.249342 357.093903 440.249342 357.093903L440.249342 379.965664C440.249342 406.785969 459.546816 439.044836 498.21271 476.369762 538.652271 513.471183 558.730159 547.369069 558.730159 577.839917 555.395669 662.323878 511.195938 706.353877 425.776235 709.780917 327.515198 711.419936 278.349205 658.971339 278.349205 552.435127Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="tree" unicode="" d="M962.691679 258.53447400000005c-8.721639 54.163597-34.298154 97.584526-73.089645 133.8638-44.721551 41.825594-99.282191 65.724911-156.512636 84.432994-26.935466 8.80555-54.079686 16.971533-81.129762 25.427112 41.188074 7.485485 81.495082 10.991332 121.872698 12.269441 39.906895 1.26276 79.885422 0.276293 120.633475 0.276293-30.644951 44.233434-74.588789 71.110571-127.260405 84.384899-53.004191 13.357216-103.742782 9.715269-152.261822-32.081673 18.715247 66.336848 12.464893 120.18936-38.810934 160.830989-32.450063 25.719778-77.127611 31.000038-111.319341 14.916734 58.583257-31.127951 82.051761-84.265172 94.304829-145.102772-44.638663 69.056795-110.067838 96.432283-187.710173 86.487793-56.123228-7.187703-110.723777-26.270317-166.003801-40.048111 15.677051-14.358009 31.136138-24.116257 47.932686-27.839045 51.427276-11.399631 103.405091-20.301372 155.098427-30.524201 37.036521-7.323802 75.163887-12.144598 104.448864-40.879036-78.096682 23.458271-155.928329 30.034037-235.541551 9.092076C186.718589 530.20385 104.838743 479.821369 81.996502 429.437865c46.955428 23.955598 95.807043 18.776645 144.606469 17.139356 37.737486-1.266853 76.089979-3.461845 113.238041 1.594311 52.683896 7.170307 104.513332 20.624736 159.209048 31.909757-91.88164-62.077847-186.516997-122.342396-159.194722-259.889075 58.852386 100.205213 163.392324 150.107763 229.951229 238.105956-16.239869-91.498924 6.980995-169.376619 66.432015-237.83785 41.815361-48.152696 89.979314-92.010577 110.706381-156.013263 12.758582 141.877311-25.823132 270.789333-97.911984 396.334677C755.996107 391.809873 858.199837 325.909977 962.691679 258.53447400000005zM513.476631 320.10169099999996c-27.767414-14.065344-39.008432-35.954887-42.252313-64.998363-6.078439-54.437843-15.162328-108.532879-21.799492-162.916487-3.90903-32.026414-5.519714-64.333214-8.16496-96.53052 30.078039 0 55.507198 0 79.961146 0 9.912767 78.200036 19.732413 154.247037 28.913517 230.369761 0.883113 7.322779-0.756223 15.746636-3.705392 22.591531C536.246217 272.25086999999996 524.967336 295.41135899999995 513.476631 320.10169099999996z" horiz-adv-x="1024" /> + + + <glyph glyph-name="ie" unicode="" d="M734.208 267.1616l236.05248 0c1.82272 16.36352 2.53952 33.09568 2.53952 50.19648 0 80.22016-21.52448 155.46368-59.12576 220.2624 38.87104 103.30112 37.49888 190.99648-14.56128 243.38432-49.50016 49.27488-182.29248 41.28768-332.41088-25.1904-11.10016 0.83968-22.3232 1.26976-33.62816 1.26976-206.04928 0-378.92096-141.80352-426.7008-332.84096 64.63488 82.75968 132.62848 142.7456 223.47776 186.44992-8.25344-7.74144-56.46336-55.64416-64.55296-63.75424-239.55456-239.47264-315.0848-552.30464-233.79968-633.61024 61.78816-61.76768 173.75232-51.34336 302.36672 11.65312 59.8016-30.45376 127.50848-47.63648 199.20896-47.63648 193.1264 0 356.80256 124.3136 416.09216 297.45152l-237.8752 0c-32.72704-60.37504-96.74752-101.4784-170.20928-101.4784s-137.48224 41.10336-170.20928 101.4784c-14.5408 27.27936-22.91712 58.55232-22.91712 91.648l0 0.7168 386.2528 0zM348.30336 383.20128c5.44768 97.11616 86.20032 174.592 184.77056 174.592s179.3024-77.47584 184.77056-174.592l-369.54112 0zM896.96256 732.20096c33.52576-33.87392 32.68608-96.21504 4.01408-174.01856-49.13152 74.91584-120.5248 133.9392-204.8 167.64928 90.112 38.64576 163.40992 43.76576 200.78592 6.38976zM93.4912-71.24992c-42.78272 42.8032-29.88032 132.608 25.23136 240.82432 34.304-96.27648 101.15072-177.09056 187.33056-229.15072-95.4368-43.3152-173.52704-50.66752-212.56192-11.6736z" horiz-adv-x="1024" /> + + + <glyph glyph-name="upload-circle" unicode="" d="M512-128c282.768 0 512 229.216 512 512C1024 666.768 794.768 896 512 896 229.216 896 0 666.768 0 384 0 101.21600000000001 229.216-128 512-128zM512 848c256.272 0 464-207.744 464-464 0-256.272-207.728-464-464-464S48 127.72799999999995 48 384C48 640.256 255.728 848 512 848zM377.728 534.544L480 534.544l0-478c0-17.664 14.336-32 32-32s32 14.336 32 32L544 534.544l102.272 0c17.616 0 23.424 11.568 12.944 25.68l-128.128 172.624c-10.496 14.128-27.664 14.128-38.16 0L364.8 560.24C354.32 546.1120000000001 360.128 534.544 377.728 534.544z" horiz-adv-x="1024" /> + + + <glyph glyph-name="add-circle" unicode="" d="M675.04 412.736l-127.04 0 0 127.264c0 20.064-16.288 36.32-36.32 36.32-20.064 0-36.32-16.192-36.32-36.32l0-127.232-127.072 0c-20.064 0-36.352-16.32-36.352-36.352 0-20.064 16.224-36.352 36.352-36.352l127.072 0 0-127.232c0-20 16.256-36.384 36.32-36.384 20.032 0 36.32 16.256 36.32 36.384l0 127.136 127.04 0c19.968 0 36.352 16.256 36.352 36.384C711.36 396.448 695.136 412.736 675.04 412.736L675.04 412.736zM511.328 830.56c-250.24 0-453.952-203.616-453.952-453.952 0-250.336 203.712-453.952 453.952-453.952 250.336 0 453.984 203.584 453.984 453.952C965.312 626.944 761.696 830.56 511.328 830.56L511.328 830.56zM511.328-20.576000000000022c-219.04 0-397.184 178.176-397.184 397.152 0 219.104 178.144 397.216 397.184 397.216s397.216-178.112 397.216-397.216C908.576 157.63199999999995 730.368-20.576000000000022 511.328-20.576000000000022L511.328-20.576000000000022zM511.328-20.576000000000022" horiz-adv-x="1024" /> + + + <glyph glyph-name="download-circle" unicode="" d="M510.771521 828.211081c-244.998947 0-443.597097-198.60429-443.597097-443.590957s198.59815-443.591981 443.597097-443.591981c244.986667 0 443.583794 198.60429 443.583794 443.591981S755.758188 828.211081 510.771521 828.211081zM510.771521-30.044013999999947c-229.010811 0-414.664138 185.65435-414.664138 414.664138 0 229.010811 185.653327 414.657998 414.664138 414.657998 228.996484 0 414.652881-185.647187 414.652881-414.657998C925.424402 155.60931300000004 739.768005-30.044013999999947 510.771521-30.044013999999947zM662.749888 352.39518799999996L537.719266 245.82501100000002l0 324.388065c0 14.887059-12.06478 26.953885-26.947745 26.953885-14.894222 0-26.961048-12.066827-26.961048-26.953885l0-325.410348L357.936647 352.39518799999996c-10.56359 10.599406-27.693736 10.599406-38.267559 0-10.56359-10.596336-10.56359-27.777647 0-38.375006l170.181961-161.220868c5.629207-5.652743 13.111622-8.060583 20.49887-7.680936 7.373944-0.379647 14.859429 2.02717 20.488637 7.680936l170.181961 161.220868c10.562567 10.597359 10.562567 27.77867 0 38.375006C690.443623 362.99561700000004 673.313477 362.99561700000004 662.749888 352.39518799999996z" horiz-adv-x="1024" /> + + + <glyph glyph-name="templeate-1" unicode="" d="M320 384L106.666667 384c-35.349333 0-64-28.650667-64-64l0-213.333333c0-35.349333 28.650667-64 64-64l213.333333 0c35.349333 0 64 28.650667 64 64L384 320C384 355.349333 355.349333 384 320 384zM256 341.33333300000004l0-256L170.666667 85.33333300000004 170.666667 341.33333300000004 256 341.33333300000004zM85.333333 106.66666699999996L85.333333 320c0 11.754667 9.578667 21.333333 21.333333 21.333333l42.666667 0 0-256L106.666667 85.33333300000004C94.912 85.33333300000004 85.333333 94.91200000000003 85.333333 106.66666699999996zM341.333333 106.66666699999996c0-11.754667-9.578667-21.333333-21.333333-21.333333l-42.666667 0L277.333333 341.33333300000004l42.666667 0c11.754667 0 21.333333-9.578667 21.333333-21.333333L341.333333 106.66666699999996zM576 554.666667L234.666667 554.666667c-47.061333 0-85.333333-38.272-85.333333-85.333333l0-42.666667 42.666667 0 0 42.666667c0 23.530667 19.136 42.666667 42.666667 42.666667l42.666667 0 0-96 21.333333 0L298.666667 512l213.333333 0 0-426.666667-85.333333 0-21.333333-42.666667 170.666667 0c47.061333 0 85.333333 38.272 85.333333 85.333333L661.333333 469.333333C661.333333 516.394667 623.061333 554.666667 576 554.666667zM618.666667 128c0-23.530667-19.136-42.666667-42.666667-42.666667l-42.666667 0L533.333333 512l42.666667 0c23.530667 0 42.666667-19.136 42.666667-42.666667L618.666667 128zM853.333333 42.66666699999996c47.061333 0 85.333333 38.272 85.333333 85.333333L938.666667 640c0 47.061333-38.272 85.333333-85.333333 85.333333L341.333333 725.333333c-47.061333 0-85.333333-38.272-85.333333-85.333333l0-42.666667 42.666667 0 0 42.666667c0 23.530667 19.136 42.666667 42.666667 42.666667l85.333333 0 0-85.333333 21.333333 0 0 85.333333 298.666667 0 0-597.333333-42.666667 0-21.333333-42.666667L853.333333 42.66666699999996zM896 128c0-23.530667-19.136-42.666667-42.666667-42.666667l-85.333333 0L768 682.666667l85.333333 0c23.530667 0 42.666667-19.136 42.666667-42.666667L896 128z" horiz-adv-x="1024" /> + + + <glyph glyph-name="util" unicode="" d="M282.127566 639.0826059999999c-13.120832-13.221116-30.625508-20.50808-49.278333-20.50808-18.618033 0-36.157501 7.286963-49.311079 20.50808l-32.885991 33.019021 98.623181 99.027387 32.885991-33.019021c13.186324-13.221116 20.473287-30.829146 20.473287-49.548486C302.599829 669.8769589999999 295.347658 652.26893 282.127566 639.0826059999999L282.127566 639.0826059999999zM249.308089 705.0899489999999l-0.032746 0-32.884968-32.987299c4.418636-4.417613 10.252505-6.845918 16.458857-6.845918 6.206352 0 12.041244 2.428306 16.426111 6.813173 4.418636 4.452405 6.845918 10.288321 6.845918 16.493649C256.121262 694.802652 253.693979 700.671313 249.308089 705.0899489999999L249.308089 705.0899489999999zM396.703067 496.343671L249.578242 638.778684l32.278147 33.626865 147.157571-142.468782L396.703067 496.343671 396.703067 496.343671zM751.45979 133.92852400000004L618.131179 274.071332l32.884968 32.985252 133.330658-140.141784L751.45979 133.92852400000004 751.45979 133.92852400000004zM850.184279 67.95597399999997c-22.700001-22.766516-52.481282-34.168194-82.264609-34.168194-29.714765 0-59.395762 11.333116-81.994456 34.033118L538.194592 222.398462l32.884968 33.021068L718.811206 100.806149c27.117614-27.183106 71.269183-27.116591 98.488105 0.169869 27.186176 27.287483 27.117614 71.773673-0.135076 99.196233l-147.426701 154.273642 32.851199 33.021068 147.461493-154.308435C895.447159 187.557956 895.514697 113.421468 850.184279 67.95597399999997L850.184279 67.95597399999997zM801.716404 468.380806c-30.726815-30.860868-71.605851-47.861054-115.082038-47.861054-43.442418 0-84.321454 16.999163-115.082038 47.861054-30.760584 30.861892-47.692209 71.877027-47.692209 115.521037s16.931624 84.691891 47.692209 115.554806l42.497906 42.666752 32.885991-32.986275-42.497906-42.667775c-21.99085-22.090111-34.099632-51.367925-34.065863-82.566484 0-31.163767 12.108782-60.441581 34.065863-82.499969 21.956058-22.058388 51.16531-34.20094 82.196047-34.20094 31.064506 0 60.239989 12.142551 82.196047 34.20094l42.49893 42.665729 32.884968-33.019021L801.716404 468.380806 801.716404 468.380806zM844.214311 511.049604l-49.311079 49.51267-16.45988-16.493649c-17.538445-17.638729-40.879036-27.352975-65.73719-27.352975l-0.032746 0c-24.824385 0-48.198745 9.713222-65.73719 27.352975-17.539468 17.607006-27.252691 41.082674-27.252691 66.007343 0 24.925692 9.679453 48.400337 27.252691 66.040089l16.458857 16.495696-49.344848 49.51267 32.885991 33.021068 82.196047-82.533738-49.311079-49.482995c-8.769734-8.835226-13.626345-20.571525-13.626345-33.051767 0-12.446473 4.856611-24.183795 13.626345-32.987299 8.768711-8.835226 20.439518-13.69286 32.884968-13.69286 12.411681 0 24.082488 4.857635 32.852222 13.69286l49.344848 49.514717 82.196047-82.534761L844.214311 511.049604 844.214311 511.049604zM233.591129 129.139451l0 46.681182 46.512337 0 0-46.681182L233.591129 129.139451 233.591129 129.139451zM538.160823 356.538555l-92.247984 91.572602 32.717146 33.18889 92.214215-91.539856L538.160823 356.538555 538.160823 356.538555zM304.2187 101.04355599999997l173.634596 239.842507 37.641295-27.454282L338.318332 69.23715300000003c-21.923312-22.057365-51.132564-34.20094-82.19707-34.20094-31.028691 0-60.237943 12.143575-82.196047 34.168194-21.958104 22.057365-34.065863 51.335179-34.065863 82.533738 0 31.198559 12.107759 60.476373 34.065863 82.533738l2.765997 2.360767L417.243893 412.054963l27.353998-37.742603L205.596542 200.00340600000004c-12.411681-13.053294-19.224854-30.119995-19.224854-48.26526 0-18.71934 7.252171-36.291554 20.438495-49.513694C232.747925 76.15265599999998 277.775444 75.71263499999998 304.2187 101.04355599999997L304.2187 101.04355599999997z" horiz-adv-x="1024" /> + + + <glyph glyph-name="face-surprised" unicode="" d="M485.656116-128C221.592397-128 6.762016 86.81718000000001 6.762016 350.87649799999997s214.830381 478.867697 478.8941 478.867697c264.041716 0 478.854495-214.812779 478.854495-478.867697S749.697832-128 485.656116-128zM485.656116 798.834741c-247.024795 0-447.975846-200.959852-447.975846-447.962644 0-247.002792 200.951051-447.962644 447.975846-447.962644 247.002792 0 447.953843 200.959852 447.953843 447.962644C933.609959 597.8748889999999 732.658908 798.834741 485.656116 798.834741zM352.033458 447.380528c0-30.469398-24.682677-55.147675-55.143274-55.147675-30.451796 0-55.143274 24.678276-55.143274 55.147675 0 30.460597 24.691478 55.138874 55.143274 55.138874C327.350781 502.519402 352.033458 477.845526 352.033458 447.380528zM674.417647 502.519402c-30.460597 0-55.156476-24.678276-55.156476-55.138874 0-30.469398 24.695879-55.147675 55.156476-55.147675 30.451796 0 55.143274 24.678276 55.143274 55.147675C729.560922 477.845526 704.869444 502.519402 674.417647 502.519402zM562.005634 165.30976499999997c0-59.733046-34.192262-108.165484-76.349518-108.165484-42.166057 0-76.36272 48.432438-76.36272 108.165484 0 59.724245 34.196663 108.152282 76.36272 108.152282C527.813371 273.45764699999995 562.005634 225.03400999999997 562.005634 165.30976499999997zM835.631745 793.712503c0 0 12.871605 56.819883 41.959231 85.925112 29.083226 29.096427 69.915916 15.124685 78.492585-8.801097 9.461179-26.385689-2.033053-50.069442-29.092027-56.164202C899.404495 808.463141 874.880237 826.192952 835.631745 793.712503zM916.698651 757.570797c0 0 35.767659 20.576965 64.877288 19.393218 29.136032-1.174946 41.431165-29.144833 33.109728-45.110024-9.192746-17.588993-27.054573-22.966463-43.217788-11.797871C954.979023 731.44034 952.453108 752.721393 916.698651 757.570797z" horiz-adv-x="1024" /> + + + <glyph glyph-name="edit" unicode="" d="M769.089 516.251l-125.896 125.89 62.974 62.947c20.866 20.838 54.652 20.838 75.517 0l50.353-50.351c20.865-20.865 20.865-54.703 0-75.567L769.089 516.251zM403.349 150.52700000000004L277.453 276.418 619.706 615.982 745.601 490.09ZM176.314 47.283000000000015L252.912 251.87699999999995 377.753 127.01199999999994Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="speaker" unicode="" d="M587.182306 754.7203c-6.003737 2.705622-13.043061 1.642406-17.984606-2.721994l-259.223926-229.293243-148.246369 0c-9.253758 0-16.752546-7.498788-16.752546-16.756639l0-267.886213c0-9.249665 7.498788-16.756639 16.752546-16.756639l144.050814 0c9.253758 0 16.752546 7.506974 16.752546 16.756639L322.530764 490.391099c1.774413 0.704035 3.433192 1.719154 4.892427 3.010567l236.127905 208.861912 0-653.332912-160.751171 137.64287c-2.12643 1.824555-90.300632 78.69941-93.927229 76.162634-4.427846-3.097548-15.768125-17.59882-18.419512-22.512736-0.953721-1.768273-2.196015-1.334391 15.413038-16.379039 25.674753-21.936615 73.780377-61.548798 75.144444-62.717414l10.007935-8.570189 178.388876-152.761196c3.093455-2.653433 6.978948-4.028757 10.900258-4.028757 2.369977 0 4.756327 0.503467 7.003508 1.534959 5.939269 2.738367 9.749038 8.677637 9.749038 15.217586L597.060281 739.446431C597.060281 746.034477 593.190137 752.013655 587.182306 754.7203L587.182306 754.7203zM290.453185 254.814756l-115.040083 0L175.413102 489.195877l115.03906 0 0-234.381122L290.453185 254.814756zM747.742119 375.98444300000006c0-51.55212-34.83232-96.658434-84.702124-109.693308-1.415232-0.375553-2.846838-0.551562-4.245697-0.551562-7.438413 0-14.234189 4.992711-16.200984 12.523221-2.338255 8.949836 3.021823 18.104333 11.967566 20.442588 35.136242 9.18929 59.672054 40.96397 59.672054 77.279061 0 36.307927-24.535813 68.090794-59.672054 77.271898-8.945743 2.346441-14.305821 11.492752-11.967566 20.450774 2.342348 8.953929 11.499915 14.305821 20.446681 11.967566C712.909799 472.643899 747.742119 427.530422 747.742119 375.98444300000006L747.742119 375.98444300000006zM864.950588 375.793084c0-88.87619-48.554856-170.44495-126.718053-212.883505-2.537799-1.375324-5.276167-2.02717-7.982812-2.02717-5.939269 0-11.69946 3.166109-14.733563 8.762571-4.417613 8.134261-1.39886 18.303878 6.727215 22.720468 67.350944 36.566824 109.198028 106.851587 109.198028 183.427636 0 76.844156-42.055838 147.272181-109.741403 183.78784-8.154727 4.396123-11.192923 14.557554-6.795776 22.700001 4.38896 8.142447 14.558577 11.184737 22.701025 6.795776C816.151162 546.697499 864.950588 464.976266 864.950588 375.793084L864.950588 375.793084z" horiz-adv-x="1024" /> + + + <glyph glyph-name="down" unicode="" d="M888.306 619.94c15.615 15.617 40.93 15.617 56.545 0v0c15.617-15.615 15.617-40.93 0-56.545l-405.733-405.734c-15.615-15.617-40.928-15.617-56.545 0v0c-15.615 15.615-15.615 40.93 0 56.545l405.733 405.734zM538.619 214.20600000000002c15.617-15.615 15.617-40.93 0-56.545v0c-15.615-15.617-40.928-15.617-56.545 0l-405.734 405.734c-15.615 15.615-15.615 40.93 0 56.545v0c15.617 15.617 40.93 15.617 56.547 0l405.732-405.734zM538.619 214.20600000000002z" horiz-adv-x="1024" /> + + + <glyph glyph-name="file" unicode="" d="M887.443911 598.6304l0-44.578133 0-45.511111 0-477.866667c0-37.705956-30.560711-68.266667-68.266667-68.266667l-614.4 0c-37.705956 0-68.266667 30.560711-68.266667 68.266667l0 705.422222c0 37.6832 30.560711 68.266667 68.266667 68.266667l386.844444 0 45.511111 0 38.024533 0c7.805156 2.594133 16.566044 1.2288 22.778311-5.006222l183.136711-183.159467C885.919289 611.373511 887.876267 604.9564439999999 887.443911 598.6304zM659.888356 531.296711c-12.583822 0-22.755556 10.171733-22.755556 22.755556l0 204.8-45.511111 0-364.088889 0c-25.122133 0-45.511111-20.388978-45.511111-45.511111l0-659.911111c0-25.122133 20.388978-45.511111 45.511111-45.511111l568.888889 0c25.122133 0 45.511111 20.388978 45.511111 45.511111l0 455.111111 0 22.755556L659.888356 531.296711zM682.643911 750.273422l0-173.4656 159.288889 0 0 14.176711L682.643911 750.273422z" horiz-adv-x="1024" /> + + + <glyph glyph-name="layouts" unicode="" d="M917.213-103.239h-810.426c-23.151 0-41.918 18.766-41.918 41.917l0 698.644c0 23.148 18.767 41.917 41.918 41.917h810.426c23.149 0 41.918-18.769 41.918-41.917v-698.643c0-23.151-18.769-41.918-41.918-41.918zM316.38-61.321h600.833v363.294h-600.833v-363.294zM106.787-61.321h167.674v363.294h-167.674v-363.294zM148.705 637.322c-23.151 0-41.918-18.769-41.918-41.92s18.767-41.92 41.918-41.92 41.92 18.768 41.92 41.92-18.769 41.92-41.92 41.92zM274.461 637.322c-23.151 0-41.918-18.769-41.918-41.92s18.767-41.92 41.918-41.92c23.151 0 41.92 18.768 41.92 41.92s-18.77 41.92-41.92 41.92zM400.216 637.322c-23.15 0-41.918-18.769-41.918-41.92s18.769-41.92 41.918-41.92c23.152 0 41.92 18.768 41.92 41.92s-18.768 41.92-41.92 41.92zM875.293 511.566h-768.506v-167.675h810.426l0 167.675h-41.921z" horiz-adv-x="1024" /> + + + <glyph glyph-name="rate-half" unicode="" d="M1012.064 504l-359.552 31.008-140.512 331.04-140.512-331.552-359.552-30.496 273.024-236.544-82.016-351.552 309.056 186.528 309.056-186.528-81.504 351.552 272.544 236.544zM512 195.96799999999996l0 465.056 85.504-202.016 219.04-19.008-166.016-144.032 50.016-214.016-188.512 114.016z" horiz-adv-x="1024" /> + + + <glyph glyph-name="add-circle-fine" unicode="" d="M509.989715-60.972421000000054c-246.734474 0-446.75195 200.023616-446.75195 446.75809 0 246.732427 200.017476 446.75195 446.75195 446.75195 246.733451 0 446.757067-200.019523 446.757067-446.75195C956.746782 139.051195 756.723166-60.972421000000054 509.989715-60.972421000000054L509.989715-60.972421000000054zM509.989715 812.433746c-235.633648 0-426.650123-191.014428-426.650123-426.648077 0-235.639788 191.016475-426.654216 426.650123-426.654216 235.638765 0 426.654216 191.014428 426.654216 426.654216C936.643931 621.419318 745.62848 812.433746 509.989715 812.433746L509.989715 812.433746zM527.863804 153.46957999999995l-35.741016 0L492.122789 367.909533 277.678742 367.909533 277.678742 403.653619l214.443024 0L492.121765 618.0956189999999l35.741016 0L527.862781 403.653619l214.442 0 0-35.744086L527.863804 367.909533 527.863804 153.46957999999995 527.863804 153.46957999999995zM527.863804 153.46957999999995" horiz-adv-x="1024" /> + + + <glyph glyph-name="prev-circle" unicode="" d="M508.638018 827.97307c-246.403458 0-446.845649-200.463469-446.845649-446.845649 0-246.382179 200.442191-446.845649 446.845649-446.845649 246.382179 0 446.845649 200.463469 446.845649 446.845649C955.483667 627.5096 755.041476 827.97307 508.638018 827.97307zM508.638018-23.16149900000005c-222.933422 0-404.28892 181.355498-404.28892 404.28892 0 222.933422 181.355498 404.28892 404.28892 404.28892 222.912144 0 404.28892-181.355498 404.28892-404.28892C912.926939 158.19399899999996 731.57144-23.16149900000005 508.638018-23.16149900000005zM252.87208 485.1999c8.639016 26.129831-32.470784 37.215859-41.067243 11.32009-27.810822-83.730363-22.321004-168.545923 14.086277-248.573851 11.362646-24.938243 48.025268-3.298146 36.747735 21.491148C230.976644 339.081373 228.806251 412.853462 252.87208 485.1999zM599.262572 247.73335499999996l-127.627629 133.394065 127.47868 133.223838c9.043305 9.064583 9.022026 23.789211-0.021278 32.832516-8.809243 8.830521-24.087108 8.766686-32.832516 0l-148.310199-148.310199c-4.617405-4.638683-6.979303-11.064749-6.553736-17.746156-0.404289-6.702685 1.936331-13.107472 6.575015-17.788712l148.310199-148.28892c4.383343-4.383343 10.213615-6.787798 16.405619-6.787798 6.170726 0 12.000997 2.404455 16.405619 6.787798C608.156928 224.114371 608.156928 238.83899899999994 599.262572 247.73335499999996z" horiz-adv-x="1024" /> + + + <glyph glyph-name="read" unicode="" d="M335.282306 712.495464C399.587328 713.451107 442.778899 696.882717 470.183494 669.3706540000001 479.127332 660.39174 485.691302 650.857363 490.241971 641.442689 492.795622 636.159553 494.049041 632.438701 494.358795 631.0740940000001L493.723712 636.7409230000001 493.723706 196.90019600000005C493.723706 199.018106 495.816045 203.920655 503.591595 207.36436700000002 511.039185 210.66283299999998 515.68422 209.16527399999995 517.176538 207.906613L500.671543 188.33763 521.297207 203.50146800000005C514.140179 213.23636899999997 499.631258 225.71450900000002 476.134074 237.35914000000002 439.577969 255.475456 390.86048 266.10507900000005 328.491925 266.10508200000004 265.860796 266.10508200000004 219.424582 255.71817999999996 186.827162 237.741581 164.977332 225.69198700000004 152.538132 212.28117299999997 147.220271 201.30886999999996L170.257196 190.14374199999997 151.035786 207.05224299999998C152.884078 209.15336100000002 158.307299 211.80336599999998 167.849005 208.050434 177.092077 204.41496099999995 179.2 199.20011699999998 179.2 196.66445199999998L179.2 497.049743 179.2 636.7409230000001 175.817447 624.023021C177.078908 626.226721 180.088681 630.807811 184.828724 636.965629 192.95423 647.521524 202.792594 658.127492 214.297641 668.007961 247.526453 696.544681 287.381649 713.209056 334.514421 712.495571L335.282306 712.495464ZM335.289387 763.689705C274.661039 764.607483 223.081402 743.04085 180.940156 706.850184 156.32698 685.712527 139.975514 664.470237 131.382553 649.4588249999999L128 643.549699 128 636.7409230000001 128 497.049743 128 196.66445199999998C128 159.26104999999995 164.542545 144.88818300000003 189.478606 173.23524099999997L191.776657 175.84764199999995 193.294121 178.978613C194.07832 180.59664399999997 199.156367 186.07133399999998 211.552092 192.907243 236.030601 206.40648099999999 274.024879 214.905082 328.491925 214.905082 383.221547 214.905079 424.163878 205.97190999999998 453.399258 191.483569 469.376966 183.56540600000005 477.614626 176.48075300000005 480.045882 173.17379000000005L481.844905 170.72677999999996 484.166551 168.768644C511.279708 145.90070000000003 544.923706 160.801293 544.923706 196.90019600000005L544.923712 636.740922 544.288627 642.407751C540.427211 659.419023 529.175531 682.697124 506.45814 705.503602 468.987716 743.1209699999999 412.352271 764.846461 334.521502 763.689812L335.289387 763.689705ZM0 506.026694L0 27.856867999999963C0-8.875636999999983 34.793167-23.40043300000002 61.4635 1.2485080000000153L63.46242 3.315859000000046C65.301149 5.444836000000009 69.655573 9.862312999999972 76.498228 15.820363000000043 88.306297 26.101906999999983 102.566352 36.46294 119.251411 46.17438500000003 167.295691 74.13829099999998 224.90855 90.95018200000004 292.337329 90.95018200000004 358.378978 90.95018000000005 409.459345 71.66956600000003 448.125308 39.64774 461.506042 28.56627400000002 472.380655 16.734758000000056 480.912593 4.997000999999955 485.832384-1.7713730000000396 488.762874-6.741985999999997 489.872527-9.02252199999998 496.058545-21.73590200000001 511.379537-27.027375000000006 524.092917-20.84135500000002 536.806298-14.655337000000031 542.097771 0.6656550000000152 535.91175 13.379036000000042 527.471002 30.726293000000055 509.777717 55.06771800000001 480.782336 79.08069999999998 433.134118 118.54132300000003 370.586889 142.15017999999998 292.337329 142.15018199999997 215.474895 142.15018499999996 149.074727 122.77408400000002 93.495781 90.424668 59.761154 70.78961500000003 36.872315 50.859801999999945 24.713677 36.78188399999999L44.088049 20.048869999999965 26.712598 38.84923500000002C28.162783 40.189508000000046 32.877261 41.946117999999956 40.792576 38.64178100000004 49.035365 35.200736000000006 51.2 30.12989200000004 51.2 27.856867999999963L51.2 506.026694C51.2 520.165184 39.73849 531.626694 25.6 531.626694 11.46151 531.626694 0 520.165184 0 506.026694L0 506.026694ZM696.80221 763.689812C618.971441 764.846461 562.335996 743.1209699999999 524.86557 705.503602 502.148181 682.697124 490.896501 659.419023 487.035083 642.407751L486.4 636.740922 486.400004 196.90019600000005C486.400006 160.801293 520.044004 145.90070000000003 547.157161 168.768644L549.478807 170.72677999999996 551.27783 173.17379000000005C553.709086 176.48075300000005 561.946746 183.56540600000005 577.924452 191.483569 607.159834 205.97190999999998 648.102165 214.905079 702.831787 214.905082 757.298833 214.905082 795.293111 206.40648099999999 819.77162 192.907243 832.167345 186.07133399999998 837.245391 180.59664399999997 838.029591 178.978613L839.547055 175.84764199999995 841.845105 173.23524099999997C866.781167 144.88818300000003 903.323712 159.26104999999995 903.323712 196.66445199999998L903.323712 497.049743 903.323712 636.7409230000001 903.323712 643.549699 899.941158 649.4588249999999C891.348196 664.470237 874.996732 685.712527 850.383556 706.850184 808.24231 743.04085 756.662673 764.607483 696.034325 763.689705L696.80221 763.689812ZM696.809291 712.495571C743.942063 713.209056 783.797257 696.544681 817.026071 668.007961 828.531119 658.127492 838.369481 647.521524 846.494989 636.965629 851.235031 630.807811 854.244804 626.226721 855.506263 624.023021L852.123712 636.7409230000001 852.123712 497.049743 852.123712 196.66445199999998C852.123712 199.20011699999998 854.231635 204.41496099999995 863.474707 208.050434 873.016412 211.80336599999998 878.439633 209.15336100000002 880.287925 207.05224299999998L861.066515 190.14374199999997 884.103441 201.30886999999996C878.785579 212.28117299999997 866.346381 225.69198700000004 844.49655 237.741581 811.89913 255.71817999999996 765.462916 266.10508200000004 702.831785 266.10508200000004 640.463232 266.10507900000005 591.745741 255.475456 555.189638 237.35914000000002 531.692454 225.71450900000002 517.183533 213.23636899999997 510.026502 203.50146800000005L530.652166 188.33763 514.147172 207.906613C515.63949 209.16527399999995 520.284527 210.66283299999998 527.732117 207.36436700000002 535.507665 203.920655 537.600004 199.018106 537.600004 196.90019600000005L537.6 636.7409230000001 536.964917 631.0740940000001C537.274671 632.438701 538.52809 636.159553 541.081741 641.442689 545.63241 650.857363 552.196378 660.39174 561.140218 669.3706540000001 588.544813 696.882717 631.736384 713.451107 696.041406 712.495464L696.809291 712.495571ZM972.799998 506.026694L972.799998 27.856867999999963C972.799998 30.12989200000004 974.964631 35.200736000000006 983.207422 38.64178100000004 991.122737 41.946117999999956 995.837214 40.189508000000046 997.287401 38.84923500000002L979.911949 20.048869999999965 999.286321 36.78188399999999C987.127682 50.859801999999945 964.238844 70.78961500000003 930.504218 90.424668 874.925269 122.77408400000002 808.525103 142.15018499999996 731.662669 142.15018199999997 653.132708 142.15017999999998 590.55104 117.26282200000003 543.127755 75.73800100000005 514.370099 50.55719499999998 496.945662 25.10259599999995 488.705389 7.022771000000034 482.841769-5.842485000000011 488.517717-21.02524200000005 501.382974-26.888862000000017 514.248233-32.752481999999986 529.430987-27.07653300000004 535.294607-14.211275 536.420563-11.740835999999945 539.350332-6.450639000000024 544.25735 0.7178109999999833 552.731727 13.097653000000037 563.54464 25.561581000000047 576.856734 37.21792900000003 615.190044 70.78337499999998 665.901421 90.95018000000005 731.662669 90.95018200000004 799.091447 90.95018200000004 856.704307 74.13829099999998 904.748587 46.17438500000003 921.433645 36.46294 935.6937 26.101906999999983 947.501771 15.820363000000043 954.344425 9.862312999999972 958.698848 5.444836000000009 960.537577 3.315859000000046L962.536497 1.2485080000000153C989.206831-23.40043300000002 1023.999998-8.875636999999983 1023.999998 27.856867999999963L1023.999998 506.026694C1023.999998 520.165184 1012.538487 531.626694 998.399998 531.626694 984.261508 531.626694 972.799998 520.165184 972.799998 506.026694L972.799998 506.026694Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="404" unicode="" d="M300.197309 299.705317l4.427931 1.803972c1.147982-2.787956 10.167841-7.543882 26.89558-14.267777l5.411915-12.955798c10.659833-24.927611 23.123639-62.483024 37.555413-112.66624 14.431775 5.575913 34.439462 0.983985 60.351057-13.611787l1.803972-4.427931L389.575913 107.828315l18.203716-42.639334c2.459962-5.575913-12.463805-15.579757-44.7713-29.847534-11.151826 7.215887-19.84369 9.675849-26.403587 7.05189l-0.983985 2.131967c-10.823831 25.419603-16.235746 42.311339-16.399744 50.675208l-4.427931-1.803972 6.3959-14.923767-11.151826-4.263933c-41.655349-16.235746-71.830878-18.695708-90.690583-7.871877l-4.427931-1.803972-1.803972 4.263933c-7.05189 16.727739 3.607944 77.406791 32.307495 182.037156 11.479821 4.427931 19.1877 14.923767 22.959641 31.323511C281.337604 290.685458 291.83344 296.425368 300.197309 299.705317L300.197309 299.705317zM216.230621 80.276746c28.371557 19.515695 40.999359 32.799488 38.047406 39.68738-0.983985 2.131967-0.65599 5.575913 0.65599 10.167841l-0.983985 2.131967c-25.5836-21.483664-38.047406-32.963485-37.391416-34.439462C215.246637 88.804612 215.082639 83.064702 216.230621 80.276746L216.230621 80.276746zM216.722614 72.896861l0.983985-2.131967c11.643818 1.147982 21.155669 3.279949 28.699552 6.231903 0.819987 0.327995 7.379885 5.411915 19.84369 15.251762l-0.983985 2.131967c-7.543882-2.951954-12.7918-0.983985-15.743754 6.067905C226.398463 85.032671 215.574632 75.848815 216.722614 72.896861L216.722614 72.896861zM225.90647 143.743754l11.151826 4.263933c-1.147982-2.623959-6.3959-8.691864-15.579757-18.53171-2.295964-10.823831-2.787956-17.547726-1.639974-20.335682 27.715567 20.663677 40.34337 33.783472 37.883408 39.523382l0.819987 10.331839-3.443946-3.935939-9.019859-3.443946-0.983985 2.131967c11.151826 4.263933 17.875721 16.891736 20.49968 37.719411l-0.983985 2.131967C239.35426 172.443306 227.21845 160.307495 227.874439 157.027546L225.90647 143.743754 225.90647 143.743754zM231.646381 173.42729l0.983985-2.131967 2.131967 0.819987c28.371557 23.123639 40.179372 40.179372 35.423447 51.331198 1.475977 0.65599 1.967969 1.639974 1.475977 2.951954l-2.295964-0.819987c-28.863549-21.647662-40.999359-38.047406-36.407431-49.035234C231.482383 175.723254 230.990391 174.73927 231.646381 173.42729L231.646381 173.42729zM240.994234 211.966688l0.983985-2.131967c13.775785 10.331839 35.915439 29.847534 66.418962 58.21909l2.131967 0.819987-6.3959 14.923767 0.491992 5.083921-2.295964-0.819987c-36.571429-32.963485-55.431134-51.82319-56.579116-56.743113L240.994234 211.966688 240.994234 211.966688zM311.67713 107.336323l-35.751441-13.939782c-1.475977-0.491992-6.887892-4.263933-16.235746-11.315823l0.819987-1.967969 12.299808 2.131967 20.007687 7.871877c11.643818 4.591928 32.143498 19.84369 61.171044 46.08328l-6.3959 14.923767-2.131967-0.819987c-24.107623-16.891736-34.439462-29.191544-31.159513-36.899423C315.449071 110.616272 314.629084 108.484305 311.67713 107.336323L311.67713 107.336323zM267.889814 264.773863l0.819987-1.967969c17.875721 16.891736 27.387572 25.419603 28.207559 25.747598l-0.983985 2.131967-8.855862-3.443946C274.941704 282.485586 268.545804 274.941704 267.889814 264.773863L267.889814 264.773863zM275.597694 222.954516c16.071749-37.883408 20.007687-67.894939 11.971813-90.034593l-3.443946-28.863549 26.89558 10.495836c-7.543882 30.011531-18.367713 65.598975-32.471493 106.926329l-0.983985 2.131967L275.597694 222.954516 275.597694 222.954516zM279.369635 231.810378l6.3959-14.923767c13.44779 15.087764 24.435618 24.271621 32.63549 27.55157l-3.607944 8.527867-2.459962 11.643818-2.131967-0.819987C289.045484 247.06214 278.713645 236.566304 279.369635 231.810378L279.369635 231.810378zM292.817425 194.58296c23.943626 17.219731 33.619475 30.995516 29.191544 41.491352l-2.787956 6.3959-2.295964-0.819987c-21.483664-18.859705-30.667521-31.651505-27.879564-38.3754L292.817425 194.58296 292.817425 194.58296zM294.457399 190.483024l2.787956-6.3959 2.295964-11.807816 2.295964 0.819987-0.491992-5.083921 6.3959-14.923767 32.471493 27.387572-6.3959 15.087764c-9.347854-10.331839-16.235746-16.399744-20.827675-18.203716l-2.295964-0.983985c-0.65599 1.639974 6.067905 10.167841 20.335682 25.419603l-3.115951 13.611787-0.983985 2.131967L294.457399 190.483024 294.457399 190.483024zM307.413197 148.171685l2.787956-6.3959 2.295964-11.643818c23.943626 17.219731 35.259449 27.387572 33.94747 30.503523l-5.411915 12.955798C329.224856 165.719411 318.07303 157.191544 307.413197 148.171685L307.413197 148.171685zM355.792441 131.935939c-23.779628-17.711723-34.111467-30.011531-30.995516-37.227418l1.475977-9.347854c25.255605 18.039718 36.899423 29.355541 34.931454 33.783472 24.435618 21.155669 38.703395 32.471493 42.803331 33.94747l-0.819987 1.967969c-1.803972 2.787956-6.723895 4.099936-14.595772 4.427931l-30.831518-31.9795L355.792441 131.935939 355.792441 131.935939zM327.912876 81.26073l4.591928-10.659833-0.491992-5.083921 2.295964 0.819987c23.451634 14.595772 34.275464 23.615631 32.63549 27.55157l-5.411915 12.955798L327.912876 81.26073 327.912876 81.26073zM333.816784 61.253043l5.411915-12.7918c25.747598 13.283792 37.719411 22.139654 35.915439 26.403587l-4.591928 10.659833C348.412556 70.272902 336.112748 62.237028 333.816784 61.253043L333.816784 61.253043zM357.596413 139.971813l1.803972-4.099936c4.919923 1.967969 8.527867 9.839846 10.823831 23.943626l-2.295964-0.819987C364.648302 147.679693 361.204356 141.44779 357.596413 139.971813L357.596413 139.971813zM731.674568 256.081999l3.935939-0.163997c-0.163997-2.459962 4.755926-9.019859 14.759769-19.515695l-0.65599-11.315823c-1.147982-21.975657-5.411915-53.955157-12.955798-95.774504 12.627803-0.65599 25.911595-10.659833 39.68738-30.175529l-0.163997-3.935939-47.887252-10.823831-1.967969-37.719411c-0.327995-4.919923-14.923767-7.379885-43.951313-7.379885-5.575913 9.019859-11.151826 13.775785-16.891736 13.939782l0.163997 1.967969c1.147982 22.467649 3.279949 36.735426 6.231903 42.967329l-3.935939 0.163997-0.65599-13.119795-9.839846 0.491992c-36.571429 1.803972-60.023062 9.839846-70.026906 24.271621l-3.935939 0.163997 0.163997 3.771941c0.819987 14.759769 30.667521 56.087124 89.706598 124.14606 10.167841-0.491992 19.515695 4.755926 28.371557 15.579757C714.290839 255.754004 724.294683 256.573991 731.674568 256.081999L731.674568 256.081999zM587.848815 115.86419l-0.163997-1.967969c9.019859-2.951954 16.891736-4.591928 23.615631-4.919923 0.65599 0 7.379885 1.475977 20.171685 4.755926l0.163997 1.967969c-6.723895 0.327995-9.839846 3.607944-9.511851 9.675849C599.328635 121.6041 588.012812 118.324151 587.848815 115.86419L587.848815 115.86419zM590.144779 121.440102c28.043562 5.083921 42.147341 10.659833 42.475336 16.727739 0.163997 1.803972 1.475977 4.263933 4.099936 7.215887l0.163997 1.967969c-26.731582-7.379885-40.015375-11.807816-40.179372-13.119795C592.440743 128.163997 590.308776 123.900064 590.144779 121.440102L590.144779 121.440102zM620.15631 165.227418l9.839846-0.491992c-1.803972-1.475977-7.871877-4.427931-18.367713-8.527867-5.575913-7.215887-8.527867-12.13581-8.527867-14.595772 28.043562 6.067905 42.147341 11.643818 42.311339 16.727739l4.263933 7.379885-3.935939-1.803972-8.035874 0.327995 0.163997 1.967969c9.839846-0.491992 19.351698 6.559898 28.863549 21.155669l0.163997 1.967969c-26.23959-7.379885-39.68738-12.463805-40.34337-14.923767L620.15631 165.227418 620.15631 165.227418zM670.667521 109.960282l-31.487508 1.475977c-1.31198 0-6.559898-0.983985-16.071749-2.951954l-0.163997-1.803972 9.839846-2.459962 17.711723-0.819987c10.331839-0.491992 30.995516 4.099936 61.991031 13.939782l0.65599 13.119795-1.803972 0.163997c-23.943626-4.591928-36.079436-10.167841-36.407431-16.891736C674.603459 110.944266 673.29148 109.796284 670.667521 109.960282L670.667521 109.960282zM635.244074 185.399103l-0.163997-1.967969 1.803972-0.163997c29.355541 7.70788 44.279308 16.563741 44.7713 26.23959 1.31198 0 2.131967 0.491992 2.131967 1.639974l-1.967969 0.163997c-29.191544-6.3959-44.115311-14.595772-44.607303-24.271621C635.900064 187.039078 635.244074 186.547085 635.244074 185.399103L635.244074 185.399103zM685.755285 207.37476c-1.803972-33.29148-9.675849-56.907111-23.615631-70.682896l-12.955798-20.171685 23.779628-1.147982c5.247918 24.763613 10.167841 54.611147 14.595772 89.870596l0.163997 1.967969L685.755285 207.37476 685.755285 207.37476zM656.071749 210.818706l-0.163997-1.967969c13.939782 3.115951 37.391416 10.167841 70.354901 21.155669l1.803972-0.163997 0.65599 13.119795 2.295964 3.607944-1.967969 0.163997c-39.03139-12.299808-59.859065-20.007687-62.483024-23.287636L656.071749 210.818706 656.071749 210.818706zM670.339526 68.46893l-0.65599-11.315823c23.943626 1.31198 35.915439 3.935939 36.079436 7.70788l0.491992 9.347854C684.443306 70.272902 672.471493 68.304933 670.339526 68.46893L670.339526 68.46893zM673.29148 85.196669l-0.491992-9.347854-2.295964-3.607944 1.967969-0.163997c22.631646 2.951954 33.94747 6.231903 34.111467 9.511851l0.65599 11.315823L673.29148 85.196669 673.29148 85.196669zM712.158873 113.568225c-23.943626-5.247918-36.079436-10.987828-36.407431-17.219731l-2.295964-7.379885c25.255605 5.083921 37.883408 9.511851 38.211403 13.44779 25.747598 7.543882 40.34337 11.151826 43.951313 10.987828l0.163997 1.803972c-0.327995 2.623959-3.443946 5.247918-9.347854 8.035874l-34.439462-13.44779L712.158873 113.568225 712.158873 113.568225zM682.147341 141.611787l-0.327995-5.73991-2.459962-9.347854c23.943626 4.755926 36.079436 8.691864 36.079436 11.479821l0.65599 11.315823C704.778988 147.351698 693.463165 144.727739 682.147341 141.611787L682.147341 141.611787zM688.051249 177.199231l-0.327995-5.73991-2.623959-9.511851 1.967969-0.163997-2.295964-3.607944-0.65599-13.119795 33.94747 9.511851 0.65599 13.283792c-10.659833-4.591928-18.039718-6.723895-21.975657-6.559898l-1.967969 0.163997c0 1.475977 8.199872 5.411915 24.271621 12.13581l2.623959 11.151826 0.163997 1.967969L688.051249 177.199231 688.051249 177.199231zM688.215247 180.807175c23.943626 4.755926 36.243434 11.807816 36.735426 20.991672l0.327995 5.73991-1.967969 0.163997c-22.631646-6.887892-34.275464-13.283792-34.603459-19.1877L688.215247 180.807175 688.215247 180.807175zM691.82319 212.786675l-0.65599-13.119795c15.415759 6.723895 26.89558 10.003844 34.111467 9.511851l0.327995 7.543882 2.459962 9.511851-1.803972 0.163997C704.450993 220.986547 692.971172 216.558616 691.82319 212.786675L691.82319 212.786675zM695.103139 240.994234l-0.163997-1.803972c19.351698 6.559898 29.355541 9.839846 30.339526 9.839846l0.163997 1.967969-7.871877 0.327995C706.746957 251.818065 699.367072 248.374119 695.103139 240.994234L695.103139 240.994234zM716.422806 118.980141l-0.163997-3.607944c4.427931-0.163997 10.003844 4.427931 16.727739 14.10378l-1.967969 0.163997C724.45868 122.26009 719.538757 118.816143 716.422806 118.980141L716.422806 118.980141zM479.118514 382.196028c53.627162 10.167841 89.870596 1.967969 109.222293-24.599616 9.675849-18.695708 15.579757-33.455477 17.875721-44.279308 11.807816-56.743113-5.903908-103.154388-53.299167-138.741832-12.463805-5.083921-22.631646-8.363869-30.339526-10.003844-31.651505-6.067905-63.631006 5.083921-95.938501 33.455477-9.347854 16.399744-15.251762 31.159513-18.039718 44.279308-13.283792 63.795003 1.967969 108.238309 45.919283 133.165919L479.118514 382.196028 479.118514 382.196028zM410.075593 265.429853c6.231903 5.247918 11.479821 8.199872 15.579757 9.019859-9.675849-9.347854-14.431775-15.087764-13.939782-17.219731-0.327995-5.411915-0.163997-10.167841 0.819987-14.267777l2.131967 0.327995c24.271621 15.743754 35.915439 25.5836 35.095452 29.519539l-2.131967 10.003844c-4.099936-3.607944-8.035874-5.73991-11.643818-6.559898l-0.819987 4.099936c10.823831 2.131967 15.251762 11.971813 13.44779 29.519539l-1.967969-0.327995c-22.467649-16.399744-34.603459-27.715567-36.407431-33.94747C409.255605 273.30173 409.255605 269.857783 410.075593 265.429853L410.075593 265.429853zM410.23959 286.257527c33.127482 21.647662 47.887252 40.34337 44.607303 56.251121-29.683536-23.615631-44.443306-36.079436-44.279308-37.555413C409.747598 295.769379 409.5836 289.537476 410.23959 286.257527L410.23959 286.257527zM412.699552 315.777066l0.491992-2.131967c27.059577 20.663677 44.607303 37.227418 52.643177 49.527226 10.331839 1.967969 17.055734 7.379885 20.49968 16.235746l-2.131967-0.491992C447.303011 372.028187 423.523382 350.872518 412.699552 315.777066L412.699552 315.777066zM414.339526 234.926329c2.459962-4.919923 4.263933-9.347854 5.083921-13.44779 18.859705 14.759769 30.339526 22.467649 34.111467 23.123639l-3.771941 18.039718C444.18706 261.493914 432.379244 252.310058 414.339526 234.926329L414.339526 234.926329zM421.883408 220.002562c2.131967-9.839846 5.247918-14.759769 9.675849-14.759769l27.879564 21.975657c-0.327995 1.147982-2.131967 6.231903-5.411915 15.415759C437.299167 228.530429 426.639334 220.986547 421.883408 220.002562L421.883408 220.002562zM432.707239 199.174888c5.083921-5.903908 8.527867-8.691864 10.495836-8.363869l3.935939 0.819987c10.987828 10.495836 19.1877 16.235746 24.599616 17.219731-0.819987 3.935939-3.935939 8.855862-9.511851 14.759769C442.21909 209.014734 432.379244 200.814862 432.707239 199.174888L432.707239 199.174888zM448.450993 185.563101l0.491992-2.131967c2.459962 0.491992 6.3959-0.819987 11.807816-3.771941 18.859705 10.003844 28.207559 16.727739 28.207559 19.84369-6.067905 1.639974-9.511851 4.427931-10.331839 8.363869C466.818706 202.946829 456.814862 195.566944 448.450993 185.563101L448.450993 185.563101zM469.442665 179.331198l0.491992-2.131967 14.923767 0.65599 12.627803 2.459962c2.459962 0.491992 8.199872 3.771941 17.547726 9.839846l-0.491992 2.131967c-6.887892-1.31198-13.611787 0.163997-20.49968 4.263933L469.442665 179.331198 469.442665 179.331198zM476.494555 249.030109l4.591928-21.811659c2.951954-14.431775 12.463805-25.091608 28.535554-31.9795l4.099936 0.819987c24.599616 34.275464 32.143498 73.798847 22.795644 118.570147l-2.459962 11.971813-6.231903 19.515695-6.067905-1.147982c-3.935939-0.819987-14.267777 0-30.831518 2.295964C473.870596 316.597053 469.278668 283.961563 476.494555 249.030109L476.494555 249.030109zM476.494555 363.172325l0.327995-1.967969c10.823831-2.131967 17.547726-3.115951 20.007687-2.623959 13.939782 10.167841 21.647662 17.875721 23.287636 23.287636l-21.319667-1.967969C496.174247 379.408072 488.630365 373.832159 476.494555 363.172325L476.494555 363.172325zM508.966047 363.172325l3.771941 2.787956c1.147982 0.163997 6.231903-2.951954 15.087764-9.675849 10.331839 13.119795 18.203716 20.171685 23.779628 21.155669-0.65599 2.951954-8.199872 4.263933-22.467649 4.099936C515.361947 370.716208 508.638053 364.648302 508.966047 363.172325L508.966047 363.172325zM511.590006 185.235106l0.491992-2.131967 4.099936 0.819987c19.84369 3.771941 35.751441 17.219731 47.723254 40.34337C554.557335 214.754644 537.173607 201.634849 511.590006 185.235106L511.590006 185.235106zM521.921845 197.534914c38.211403 24.271621 56.087124 42.311339 53.79116 53.79116 1.967969 4.919923 2.623959 8.527867 2.295964 10.823831-35.095452-26.567585-51.495195-44.935298-49.363229-54.939142C526.349776 206.71877 524.217809 203.602819 521.921845 197.534914L521.921845 197.534914zM528.64574 352.348495l7.543882-15.251762 2.131967 0.491992c4.263933 5.73991 13.283792 14.431775 27.059577 25.911595l-0.491992 2.131967c-5.411915 5.247918-8.363869 8.855862-8.855862 10.823831l-4.099936-0.819987L528.64574 352.348495 528.64574 352.348495zM536.845612 333.324792l4.263933-9.675849-0.491992-8.363869 4.099936 0.819987c19.515695 17.711723 29.027546 27.059577 28.863549 28.371557l-0.491992 2.131967c-1.967969 9.347854-4.263933 13.611787-7.05189 13.119795C548.817425 342.508648 539.141576 333.652787 536.845612 333.324792L536.845612 333.324792zM539.797566 236.402306c27.715567 19.84369 40.999359 32.63549 39.68738 38.703395 1.31198 7.215887 1.803972 12.13581 1.147982 14.759769l-1.967969-0.327995-35.095452-29.519539C540.78155 245.586163 539.469571 237.714286 539.797566 236.402306L539.797566 236.402306zM542.257527 307.413197l2.459962-11.971813 10.003844 3.935939c-7.05189-7.871877-10.331839-12.627803-10.003844-14.267777-0.65599-10.495836-0.819987-16.727739-0.327995-18.695708 18.695708 13.611787 30.831518 24.927611 36.243434 33.94747l-2.459962 11.971813c-7.05189-7.05189-12.7918-10.987828-16.727739-11.807816 8.035874 11.315823 13.939782 17.383728 17.711723 18.039718l-4.099936 19.84369C554.557335 320.532992 543.733504 310.201153 542.257527 307.413197L542.257527 307.413197zM307.249199 569.153107c-9.675849 0-17.711723-6.887892-19.84369-16.071749-4.263933-12.463805 1.639974-28.863549 29.519539-35.751441 1.31198 35.587444 0 49.527226 0 49.527226C313.809097 568.33312 310.693145 569.153107 307.249199 569.153107L307.249199 569.153107zM709.862908 537.173607c0-1.147982 0-2.131967-0.163997-3.115951 2.131967 3.279949 3.279949 7.215887 3.279949 11.479821 0 11.643818-9.183857 21.155669-20.49968 21.155669-3.443946 0-6.723895-0.819987-9.511851-2.459962C697.891095 563.905189 709.862908 551.933376 709.862908 537.173607L709.862908 537.173607zM531.761691 520.281871c0.65599 15.743754-32.963485 49.199231-32.963485 49.199231 0-18.203716 9.347854-42.803331 12.463805-48.707239-8.035874-11.643818-13.283792-32.307495-13.283792-32.307495S531.105701 504.374119 531.761691 520.281871L531.761691 520.281871zM488.794363 507.326073c2.459962 0 4.427931 1.967969 4.427931 4.427931 0 2.459962-1.967969 4.427931-4.427931 4.427931-2.459962 0-4.427931-1.967969-4.427931-4.427931C484.366432 509.294042 486.334401 507.326073 488.794363 507.326073L488.794363 507.326073zM445.335042 629.668161c-0.819987 8.855862-2.131967 16.235746-2.131967 16.235746s-53.627162 7.05189-63.959001-30.503523C395.151826 632.94811 427.623318 631.144138 445.335042 629.668161L445.335042 629.668161zM620.648302 614.908392c-9.675849 37.719411-63.303011 31.651505-63.303011 31.651505s-1.475977-7.379885-2.459962-16.235746C572.597053 631.636131 605.232543 632.784113 620.648302 614.908392L620.648302 614.908392zM419.587444 518.313901c29.847534 0 53.955157 21.975657 53.955157 49.035234 0 27.059577-24.271621 49.035234-53.955157 49.035234-29.847534 0-53.955157-21.975657-53.955157-49.035234C365.632287 540.289558 389.903908 518.313901 419.587444 518.313901L419.587444 518.313901zM419.587444 613.76041c28.371557 0 51.331198-20.827675 51.331198-46.411275 0-25.5836-22.959641-46.411275-51.331198-46.411275-28.207559 0-51.331198 20.827675-51.331198 46.411275C368.256246 592.932735 391.379885 613.76041 419.587444 613.76041L419.587444 613.76041zM419.587444 534.38565c20.007687 0 36.243434 14.759769 36.243434 32.799488 0 18.203716-16.235746 32.799488-36.243434 32.799488s-36.243434-14.759769-36.243434-32.799488C383.34401 549.14542 399.579757 534.38565 419.587444 534.38565L419.587444 534.38565zM435.331198 552.261371c1.967969 2.131967 4.919923 2.623959 6.559898 1.147982 1.639974-1.475977 1.475977-4.263933-0.491992-6.3959-1.967969-2.131967-4.919923-2.623959-6.559898-1.147982C433.035234 547.341448 433.199231 550.129404 435.331198 552.261371L435.331198 552.261371zM395.971813 585.880846c5.411915 5.73991 13.283792 7.05189 17.875721 3.115951 4.591928-3.935939 3.935939-11.807816-1.475977-17.547726-5.411915-5.73991-13.283792-7.05189-17.875721-3.115951C389.903908 572.433056 390.559898 580.304933 395.971813 585.880846L395.971813 585.880846zM584.240871 518.313901c29.847534 0 53.955157 21.975657 53.955157 49.035234 0 27.059577-24.271621 49.035234-53.955157 49.035234-29.847534 0-53.955157-21.975657-53.955157-49.035234C530.121717 540.289558 554.393338 518.313901 584.240871 518.313901L584.240871 518.313901zM584.240871 613.76041c28.371557 0 51.331198-20.827675 51.331198-46.411275 0-25.5836-22.959641-46.411275-51.331198-46.411275-28.207559 0-51.331198 20.827675-51.331198 46.411275C532.909673 592.932735 555.869315 613.76041 584.240871 613.76041L584.240871 613.76041zM584.240871 534.38565c20.007687 0 36.243434 14.759769 36.243434 32.799488 0 18.203716-16.235746 32.799488-36.243434 32.799488-20.007687 0-36.243434-14.759769-36.243434-32.799488C547.997438 549.14542 564.233184 534.38565 584.240871 534.38565L584.240871 534.38565zM599.820628 552.261371c1.967969 2.131967 4.919923 2.623959 6.559898 1.147982 1.639974-1.475977 1.475977-4.263933-0.491992-6.3959-1.967969-2.131967-4.919923-2.623959-6.559898-1.147982C597.688661 547.341448 597.852659 550.129404 599.820628 552.261371L599.820628 552.261371zM560.62524 585.880846c5.411915 5.73991 13.283792 7.05189 17.875721 3.115951 4.591928-3.935939 3.935939-11.807816-1.475977-17.547726-5.411915-5.73991-13.283792-7.05189-17.875721-3.115951C554.557335 572.433056 555.213325 580.304933 560.62524 585.880846L560.62524 585.880846zM957.171044 381.540038C957.171044 381.540038 957.171044 381.540038 957.171044 381.540038c-0.65599 0.983985-1.31198 1.803972-1.967969 2.951954-0.327995 0.327995-0.491992 0.65599-0.819987 0.983985-0.327995 0.327995-1.967969 0.65599-2.295964 0.983985-11.315823 14.759769-29.355541 40.34337-62.975016 46.247277l0 34.931454c0 4.263933-0.819987 8.691864-5.083921 8.691864L685.919283 476.330557c-0.163997 10.331839-0.327995 18.203716-0.65599 27.879564 24.435618 1.803972 43.295324 19.351698 43.295324 41.491352 0 22.467649-19.84369 40.671365-45.263293 41.819347-1.967969 78.226778-5.903908 143.98975-7.70788 150.549648l-0.491992 0.983985c-1.967969 2.295964-9.511851 5.247918-21.155669 8.363869 0.327995 13.939782-3.279949 29.355541-11.643818 46.08328 3.443946-21.647662-22.795644-36.079436-26.567585-38.047406-0.163997 0-0.327995 0-0.491992 0 0.163997 4.427931 0 57.727098-88.230621 97.90647-1.475977-44.115311-14.10378-70.682896-31.9795-86.754644L494.534273 766.606022l-5.411915-0.327995 0-0.163997 0 0 0 0 0.327995 0 0.327995-0.163997c-0.819987-0.163997-0.983985-0.491992-1.147982-1.147982-10.331839-8.035874-28.043562-18.203716-64.450993-18.203716-13.283792 0-28.207559 1.31198-44.607303 3.935939-4.099936 0.819987-7.70788 1.147982-11.151826 1.147982-5.575913 0-10.003844-0.983985-16.071749-2.295964l-0.327995 0-0.327995-0.163997c-17.547726-4.099936-27.55157-7.70788-30.011531-10.659833l-0.491992-0.983985c-0.491992-2.131967-2.295964-8.363869-5.73991-150.549648-25.255605-0.983985-45.263293-19.351698-45.263293-41.983344 0-22.139654 18.859705-39.523382 43.459321-41.163357-0.163997-9.675849-0.327995-17.547726-0.65599-27.879564L132.099936 476.002562c-4.427931 0-10.495836-4.591928-10.495836-8.691864l0-97.414478c-11.807816-0.65599-19.679693-2.295964-26.731582-4.755926-29.027546-10.495836-35.751441-35.915439-35.587444-60.023062 0-1.475977 0.491992-2.787956 0.983985-3.771941-6.723895-11.643818-6.231903-25.5836-5.083921-35.587444 0.983985-8.035874 2.623959-12.13581 4.427931-13.939782-4.263933-8.855862-0.983985-18.859705 1.967969-26.731582 3.771941-10.167841 12.13581-11.971813 22.139654-10.003844-4.755926-9.019859-2.459962-17.219731 11.643818-28.699552 4.427931-3.607944 14.267777 7.05189 26.075593 16.071749l0-267.151826c0-4.263933 6.067905-6.067905 10.331839-6.067905l751.928251 0c4.427931 0 5.083921 1.803972 5.083921 6.067905L888.784113 248.374119c16.727739 0.983985 29.355541 7.70788 38.539398 19.84369 4.591928 6.231903 7.871877 11.807816 8.691864 16.891736C977.670724 313.153107 982.262652 344.640615 957.171044 381.540038L957.171044 381.540038zM316.433056 508.638053c-22.959641 0.491992-40.835362 16.727739-40.835362 36.735426 0 20.335682 18.859705 36.899423 41.983344 36.899423l0 2.623959 0.163997-0.65599c0-0.819987 0-1.475977 0-2.295964 0.491992 0.163997 0.983985 0.163997 1.475977 0.327995l1.803972 0 0 0.491992c5.247918 1.31198 12.7918 2.951954 19.351698 3.771941 10.003844 35.095452 34.111467 64.122998 34.111467 64.122998s-9.839846 28.863549-13.939782 67.238949c51.167201-85.11467 229.268418-81.178732 280.107623-10.823831-4.591928-32.799488-12.627803-56.415119-12.627803-56.415119s24.107623-28.863549 34.111467-64.122998c6.559898-0.819987 13.939782-1.147982 19.023703-2.295964 0 0.491992 0 2.623959 0 2.623959l0.491992 0c23.123639 0 41.983344-18.695708 41.983344-39.03139 0-9.347854-3.935939-18.695708-10.495836-25.419603-10.167841-6.723895-25.091608-10.331839-40.835362-10.331839 0-6.723895 0.983985-19.351698 1.803972-35.423447L318.401025 476.658552c0.163997 10.331839 0.491992 19.84369 0.65599 30.175529l0 2.131967L316.433056 508.638053 316.433056 508.638053zM126.524023 462.554773c0 4.099936 6.3959 9.183857 10.823831 9.183857l741.432415 0c4.263933 0 5.575913-4.919923 5.575913-9.183857l0-29.027546c0 0.491992-6.723895 1.475977-10.823831 1.147982-22.795644-2.295964-44.443306-3.607944-60.679052-9.183857L176.215247 425.491352l-1.31198-2.787956 0-60.18706c-10.823831 5.903908-25.5836 8.363869-48.215247 7.871877L126.68802 462.554773 126.524023 462.554773zM821.381166-13.693786 180.807175-13.693786 180.807175 282.649584c10.823831 4.263933 15.579757 10.987828 15.087764 21.975657-0.491992 8.363869-4.263933 13.611787-15.087764 16.727739l0 7.379885c5.903908 1.967969 3.935939 4.263933 5.247918 6.723895 5.411915 10.495836 5.575913 18.203716-5.247918 23.779628l0 55.759129 615.318386 0c-2.787956-5.575913-4.755926-7.871877-5.575913-12.299808-1.475977-8.035874-1.639974-18.367713-1.147982-28.207559L697.891095 315.449071c0 0-28.371557-15.251762-16.727739-32.799488 11.643818-17.383728 32.307495-11.479821 50.511211-0.327995 12.13581 7.379885 39.68738 23.287636 63.959001 40.179372 0.163997-0.163997 0.327995-0.163997 0.491992-0.327995-1.803972-1.31198-2.951954-2.295964-2.951954-2.295964-11.151826-7.543882-6.887892-36.899423 15.415759-41.327354 3.115951-0.65599 9.675849 0 9.675849 1.147982l0-293.391416L821.381166-13.693786 821.381166-13.693786zM177.855221 271.169763c0 3.443946-2.131967 6.231903-4.755926 8.035874 1.639974 0.491992 3.771941 0.983985 4.755926 1.475977L177.855221 271.169763 177.855221 271.169763zM177.855221 322.828956c-0.983985 0.163997-1.639974 0.327995-2.459962 0.491992 0.819987 0.491992 1.475977 0.983985 2.459962 1.475977L177.855221 322.828956 177.855221 322.828956zM878.780269-65.516976 137.347854-65.516976c-4.263933 0-10.823831 2.131967-10.823831 6.3959L126.524023 206.882767c5.903908 1.147982 4.919923 2.295964 6.723895 3.279949 19.679693 8.035874 38.047406 25.255605 25.747598 33.127482-0.163997 0-1.475977 0.163997-1.639974 0.163997 9.511851 3.771941 17.547726 9.839846 17.547726 20.663677l0-289.29148 655.169763 2.459962 0 291.915439c9.839846-9.675849 21.647662-14.595772 34.603459-10.331839 3.279949-6.559898 13.611787-9.839846 19.515695-10.331839l0-307.495195C884.192184-63.38501 883.044202-65.516976 878.780269-65.516976L878.780269-65.516976zM878.780269-65.516976" horiz-adv-x="1024" /> + + + <glyph glyph-name="carousel" unicode="" d="M1002.069333 144.38400000000001L1002.069333 611.6906670000001c0 24.213333-16.917333 49.578667-42.069333 49.578667l-64 0 1.152 6.4c0 31.338667-26.005333 57.6-58.538667 57.6L186.432 725.269333c-31.936 0-58.410667-31.957333-58.410667-64l-0.213333 0.96L67.178667 662.229333c-25.152 0-45.226667-20.288-45.226667-44.501333l0-467.328L21.354667 150.39999999999998c0-24.789333 20.629333-44.693333 45.312-44.693333L127.786667 105.70666700000004l0-5.184C127.786667 69.03466700000001 153.792 42.66666699999996 186.432 42.66666699999996l652.842667 0c31.658667 0 56.277333 10.901333 56.725333 42.602667l64 0c24.661333 0 42.666667 34.325333 42.666667 59.114667L1002.069333 144.38400000000001zM128 149.26933299999996L64 149.26933299999996l0 469.333333 64 0L128 149.26933299999996zM853.333333 106.602667c0-6.421333-14.848-21.333333-21.333333-21.333333l-640 0c-6.485333 0-21.333333 14.848-21.333333 21.333333l0 554.666667c0 6.378667 9.258667 18.56 15.744 18.56l5.589333 2.773333 640 0c6.442667 0 21.333333-14.954667 21.333333-21.333333L853.333333 106.602667zM960 127.93600000000004l-64 0 0 490.666667 60.842667 1.984c4.970667 0 3.157333 2.944 3.157333-1.984l0-469.333333C960 144.29866700000002 965.013333 127.93600000000004 960 127.93600000000004zM412.458667 399.829333c43.925333 0 79.637333 34.773333 79.637333 77.482667 0 42.752-35.712 77.482667-79.637333 77.482667-43.925333 0-79.637333-34.730667-79.637333-77.482667C332.8 434.602667 368.533333 399.829333 412.458667 399.829333zM412.458667 516.0533330000001c21.952 0 39.829333-17.365333 39.829333-38.741333 0-21.333333-17.877333-38.741333-39.829333-38.741333-21.952 0-39.829333 17.408-39.829333 38.741333C372.629333 498.709333 390.506667 516.0533330000001 412.458667 516.0533330000001zM785.92 457.386667c-95.914667-23.338667-137.728-87.765333-168.256-134.805333-24.213333-37.269333-39.082667-58.346667-65.109333-58.346667l-0.042667 0c-35.456 0-57.109333 14.272-80.042667 28.16-24.362667 14.741333-49.536 29.952-88.64 29.952-75.648 0-156.906667-93.269333-165.930667-103.893333L213.333333 167.38133300000004c0-10.709333 8.917333-18.112 19.925333-18.112l557.504 0c10.986667 0 19.904 7.402667 19.904 18.112L810.666667 438.570667c0 5.973333-2.837333 11.626667-7.658667 15.296C798.186667 457.536 791.872 458.858667 785.92 457.386667zM770.858667 188.52266699999996L253.162667 188.52266699999996c24.874667 27.733333 85.290667 95.082667 130.666667 95.082667 27.733333 0 46.229333-11.157333 67.605333-24.128 25.152-15.168 53.632-32.426667 99.712-33.941333l2.944-0.064c47.637333 0 71.722667 37.12 97.237333 76.416 26.645333 41.088 56.469333 79.104 119.530667 102.485333L770.858667 188.52266699999996z" horiz-adv-x="1024" /> + + + <glyph glyph-name="help" unicode="" d="M690.2 741.8C635.2 783.6 573.2 798 494.6 798c-59.6 0-110.6-12.2-151-39.4C284 718 256 649.8 256 542l153.6 0c0 28.8-2.8 59.8 14 86.4 16.8 26.6 40.2 47 80.4 47 40.8 0 61.8-11.8 81.6-36.2 16.8-20.8 23.2-45.6 23.2-72 0-22.8-11.6-43.8-25.4-62.8-7.6-11.2-17.6-21.2-30.2-30.8 0 0-83-49.4-112.2-96.2-21.8-34.8-29.6-78.4-31.4-130.6-0.2-3.8 1.2-11.6 14.4-11.6 13 0 112 0 123.6 0 11.6 0 14 8.8 14.2 12.4 0.8 19 3.2 48.2 6.6 59.2 6.6 20.8 19.4 39 39.4 54.6l41.4 28.6c37.4 29.2 67.2 53 80.4 71.8 22.6 30.8 38.4 68.8 38.4 113.8C768 649 741 703.2 690.2 741.8zM484 155.6c-51.8 1.6-94.6-34.4-96.4-90.6-1.6-56.4 39-93.4 91-95 54-1.6 95.8 33.2 97.4 89.4C577.6 115.6 538 154 484 155.6z" horiz-adv-x="1024" /> + + + <glyph glyph-name="code-circle" unicode="" d="M513.544163 893.525741c-282.101629 0-510.78094-228.679311-510.78094-510.76288 0-282.083569 228.679311-510.76288 510.78094-510.76288s510.76288 228.679311 510.76288 510.76288C1024.325103 664.8464309999999 795.645793 893.525741 513.544163 893.525741zM513.544163-83.46335899999997c-257.503523 0-466.22622 208.740757-466.22622 466.22622S256.0587 848.989082 513.544163 848.989082s466.22622-208.740757 466.22622-466.22622S771.047686-83.46335899999997 513.544163-83.46335899999997zM171.771357 359.77212099999997L414.357086 256.088033 414.357086 300.805295 221.978945 380.50532599999997 414.357086 459.464886 414.357086 504.182148 171.771357 401.76228ZM442.585309 193.38272800000004L478.814238 193.38272800000004 584.737801 572.1429949999999 548.743656 572.1429949999999ZM612.749301 504.182148L612.749301 459.464886 804.874598 380.50532599999997 612.749301 300.805295 612.749301 256.088033 855.33503 359.77212099999997 855.33503 401.76228Z" horiz-adv-x="1025" /> + + + <glyph glyph-name="windows" unicode="" d="M437 329l0-325.5-341 47 0 278.5 341 0zm0 371.5l0-329.5-341 0 0 282.5zm491-371.5l0-393-453.5 62.5 0 330.5 453.5 0zm0 439l0-397-453.5 0 0 334.5z" horiz-adv-x="1024" /> + + + <glyph glyph-name="water" unicode="" d="M862.315763 33.684211000000005C802.869868 33.684211000000005 754.526289 82.94399999999996 754.526289 143.50371900000005 754.526289 162.33094700000004 759.35885 180.96056099999998 768.520956 197.43438600000002 768.64671 197.79368399999998 768.808394 198.15298199999995 769.006008 198.49431600000003L849.075622 334.542596 849.057657 334.542596 862.315763 357.052632 875.573868 334.542596 875.573868 334.542596 955.140464 199.356632C955.715341 198.67396499999995 956.164464 197.865544 956.380043 196.96729800000003 965.380464 180.60126300000002 970.123201 162.151298 970.105236 143.50371900000005 970.105236 82.94399999999996 921.761657 33.684211000000005 862.315763 33.684211000000005L862.315763 33.684211000000005ZM924.33064 188.57768399999998C924.204885 188.79326300000002 924.115061 189.02680699999996 924.025236 189.27831600000002L862.315763 302.996211 800.606289 189.260351C800.516464 189.02680699999996 800.42664 188.79326300000002 800.300885 188.57768399999998 793.977236 176.505263 790.635763 162.81600000000003 790.635763 148.965053 790.635763 105.29235100000005 822.792956 69.75775399999998 862.333727 69.75775399999998 901.856534 69.75775399999998 933.995763 105.29235100000005 933.995763 148.98301800000002 933.995763 162.81600000000003 930.654289 176.52322800000002 924.33064 188.57768399999998L924.33064 188.57768399999998ZM682.684605 392.982456C593.50678 392.982456 520.982429 469.602807 520.982429 563.8108070000001 520.982429 593.093614 528.240254 622.071018 541.965447 647.706947 542.163061 648.281825 542.396605 648.820772 542.684043 649.341754L662.815412 860.968421 662.797447 860.968421 682.684605 896 702.571763 860.968421 702.535833 860.968421 821.89471 650.689123C822.774991 649.647158 823.439692 648.3716489999999 823.781026 646.970386 837.25471 621.514105 844.368815 592.8241399999999 844.35085 563.8108070000001 844.35085 469.602807 771.844464 392.982456 682.684605 392.982456L682.684605 392.982456ZM791.408254 630.1192980000001C791.21064 630.4965609999999 791.030991 630.891789 790.887271 631.322947L682.684605 823.924772 574.446008 631.287018C574.320254 630.891789 574.140605 630.4965609999999 573.942991 630.1013330000001 562.840675 609.6931930000001 556.912254 596.075789 556.912254 572.631579 556.912254 498.634105 613.375973 428.876351 682.684605 428.876351 751.993236 428.876351 808.367131 489.058807 808.367131 563.056281 808.367131 586.500491 802.492605 609.6931930000001 791.408254 630.1192980000001L791.408254 630.1192980000001ZM538.695833 276.983018C540.115061 275.330246 541.174991 273.33614 541.713938 271.12645599999996 563.433517 231.11859600000003 574.895131 186.02666699999997 574.895131 140.43171900000004 574.895131-7.581192999999985 458.051341-128 314.403903-128 170.738499-128 53.89471-7.581192999999985 53.89471 140.43171900000004 53.89471 186.47578899999996 65.589868 231.998877 87.704675 272.294175 88.010078 273.17445599999996 88.387341 274.01880700000004 88.872394 274.863158L282.408394 607.411649 282.372464 607.411649 314.403903 662.45614 346.453306 607.411649 346.399412 607.411649 538.695833 276.983018 538.695833 276.983018ZM314.403903 590.614456L119.807973 257.79649099999995C119.556464 257.113825 119.251061 256.449123 118.873798 255.78442099999995 98.932745 220.48336800000004 88.387341 180.42161399999998 88.387341 139.91073700000004 88.387341 12.072420999999963 189.799271-91.89052600000002 314.421868-91.89052600000002 439.026499-91.89052600000002 540.420464 12.072420999999963 540.402499 139.91073700000004 540.402499 180.42161399999998 529.857096 220.50133300000005 509.916043 255.78442099999995 509.53878 256.449123 509.233377 257.131789 508.963903 257.86835099999996L314.403903 590.614456 314.403903 590.614456Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="username" unicode="" d="M514.594 824.888c-144.11 0-260.979-118.46-260.979-264.558 0-88.783 43.497-166.928 109.711-214.898-135.361-59.354-230.159-195.858-230.159-354.931h0.894c1.541-21.375 18.641-38.377 40.117-38.377s38.575 17.051 40.117 38.377h0.645c0 0.944-0.099 1.79-0.099 2.734 0 0.05 0 0.099 0 0.149 0 0.099-0.05 0.149-0.05 0.199 0.05 159.967 120 291.054 273.009 304.924 8.948-0.944 17.598-2.734 26.844-2.734 144.11 0 260.979 118.46 260.979 264.558s-116.919 264.558-261.029 264.558zM514.594 377.54499999999996c-99.769 0-180.698 81.972-180.698 183.183s80.879 183.183 180.698 183.183c99.719 0 180.647-81.972 180.647-183.183s-80.879-183.183-180.647-183.183zM896.021-6.615000000000009c0 0.348-0.199 0.645-0.199 0.994-1.043 105.038-43.397 200.034-111.35 269.131v0c-7.157 7.357-17.001 11.98-27.986 11.98-21.574 0-39.122-17.747-39.122-39.668 0-11.135 4.573-21.127 11.83-28.334l-0.099-0.05c52.742-55.229 85.302-130.589 85.302-213.853 0-1.043-0.149-1.987-0.149-3.034h0.994c1.491-21.375 18.691-38.377 40.117-38.377 21.475 0 38.575 17.051 40.117 38.377h0.597c0 0.796-0.099 1.491-0.099 2.287-0.05 0.149 0.05 0.348 0.05 0.547z" horiz-adv-x="1024" /> + + + <glyph glyph-name="find-fill" unicode="" d="M512 896C229.236364 896 0 666.763636 0 384c0-282.786909 229.236364-512 512-512s512 229.213091 512 512C1024 666.763636 794.763636 896 512 896zM657.291636 383.976727c0-77.195636-60.392727-139.729455-136.424727-144.407273l-175.732364-151.714909-22.877091 13.242182 58.228364 222.021818c-8.634182 18.548364-13.800727 39.074909-13.800727 60.858182 0 77.195636 60.369455 139.729455 136.378182 144.430545l175.802182 151.714909 22.877091-13.172364-58.251636-222.068364C652.125091 426.309818 657.291636 405.806545 657.291636 383.976727zM512 384m-66.048 0a2.838 2.838 0 1 1 132.096 0 2.838 2.838 0 1 1-132.096 0Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="about" unicode="" d="M514.27174 834.607768c-249.516844 0-451.789687-202.272843-451.789687-451.789687s202.272843-451.789687 451.789687-451.789687 451.789687 202.272843 451.789687 451.789687S763.788583 834.607768 514.27174 834.607768zM514.27174-20.12919999999997c-222.541469 0-402.947282 180.405813-402.947282 402.947282s180.405813 402.947282 402.947282 402.947282 402.947282-180.405813 402.947282-402.947282S736.814232-20.12919999999997 514.27174-20.12919999999997zM514.295276 593.979362c-9.44614-10.360975-14.307867-22.951735-14.307867-37.483706 0-11.960403 3.886517-22.396079 11.534707-30.457686 7.783267-8.211009 17.853623-12.450567 29.313629-12.450567 9.312086 0 23.139 2.849908 35.782971 16.900925 9.865695 10.641361 14.866592 23.437805 14.866592 37.693484 0 11.68104-4.031826 21.900799-11.744485 29.832446C562.925856 615.325529 532.358677 613.449809 514.295276 593.979362zM549.461193 293.282882c-12.110829-11.541871-20.589944-18.759249-26.236548-23.316032 2.77009 14.953573 9.976212 44.614104 27.330462 103.023398 17.297968 57.890478 18.799158 67.991534 18.799158 72.955592 0 8.65717-3.63683 16.335037-9.921977 21.642926-14.124695 11.661597-39.035038 9.349949-69.131497-7.677866-16.779152-9.408277-34.595936-24.759917-54.493102-46.576805l-10.377348-11.541871 34.425044-26.548656 8.818853 8.715499c9.573029 9.292644 16.086373 15.35164 20.411889 19.393699-26.294876-86.460164-39.093367-140.190903-39.093367-164.262134 0-10.907421 3.172249-19.970844 9.573029-26.839275 6.460132-7.039323 15.510252-10.736529 25.891693-10.736529 10.146081 0 21.792329 3.926426 35.922141 11.949146 12.741185 7.212262 31.883151 23.029506 58.641585 48.190559l10.837836 10.391674-31.30703 30.475082L549.461193 293.282882z" horiz-adv-x="1024" /> + + + <glyph glyph-name="location" unicode="" d="M451.673935-98.39569900000004C478.883834-129.01914699999998 524.254807-128.8089789999999 551.400292-97.92885100000001 553.755808-95.38790800000004 558.821323-89.79676199999994 565.872444-81.84834999999998 577.572838-68.65901699999995 590.597131-53.62432000000001 604.615947-36.99831500000005 644.662065 10.495494000000008 684.708678 61.282182000000034 722.129538 113.35355300000003 759.658524 165.575381 792.492213 216.29072599999995 819.314991 264.54153799999995 868.685946 353.35368300000005 896 430.456574 896 493.714285 896 715.890551 719.301715 896 501.333333 896 283.364952 896 106.666667 715.890551 106.666667 493.714285 106.666667 430.401284 134.05152 353.19426999999996 183.54613 264.23737800000004 210.371803 216.02347099999997 243.193308 165.34812399999998 280.699364 113.16684599999996 318.155192 61.05544999999995 358.239268 10.22578999999996 398.322835-37.31103099999996 412.354743-53.95207300000004 425.391185-69.00072999999998 437.102468-82.20257900000001 444.160087-90.15846599999998 449.230214-95.75492099999997 451.982775-98.73670600000003L451.673935-98.39569900000004ZM486.822684-65.32134799999994C484.281231-62.568254000000024 479.425084-57.207989 472.585916-49.49835900000005 461.135889-36.591016999999965 448.364015-21.84776099999999 434.602351-5.527214999999956 395.275714 41.11192700000004 355.949587 90.98045200000001 319.289224 141.985137 282.808749 192.739548 250.983685 241.87642200000005 225.158316 288.29247799999996 179.388826 370.55419500000005 154.50505 440.709839 154.50505 493.714285 154.50505 688.960095 309.785362 847.238095 501.333333 847.238095 692.881306 847.238095 848.161617 688.960095 848.161617 493.714285 848.161617 440.753978 823.345286 370.701737 777.693969 288.58074899999997 751.873483 242.13293399999998 720.038415 192.96007499999996 683.537446 142.16873799999996 646.912604 91.20503299999996 607.624538 41.38032599999997 568.335977-5.21503800000005 554.587654-21.52024300000005 541.828177-36.24924999999996 530.389289-49.14379699999995 523.556841-56.84571100000005 518.705521-62.20043499999997 516.166694-64.95052599999997 507.543772-74.74891100000002 495.255793-74.80583000000001 487.131524-65.66235300000005L486.822684-65.32134799999994ZM714.955981 428.971194C723.919106 453.372045 728.565658 479.331002 728.565658 505.904762 728.565658 627.091817 632.184774 725.333333 513.29293 725.333333 394.401086 725.333333 298.020202 627.091817 298.020202 505.904762 298.020202 384.717709 394.401086 286.47619 513.29293 286.47619 549.003859 286.47619 583.510052 295.36805300000003 614.373097 312.125591 626.032316 318.456132 630.449257 333.22218 624.238611 345.10648100000003 618.027966 356.99078199999997 603.541579 361.49299399999995 591.882359 355.16245100000003 567.900883 342.14136099999996 541.111735 335.23809500000004 513.29293 335.23809500000004 420.821495 335.23809500000004 345.858586 411.648164 345.858586 505.904762 345.858586 600.161359 420.821495 676.571428 513.29293 676.571428 605.764365 676.571428 680.727273 600.161359 680.727273 505.904762 680.727273 485.192019 677.117041 465.022684 670.154965 446.069408 665.522846 433.459117 671.796821 419.408892 684.168282 414.687349 696.53974 409.965809 710.323861 416.360905 714.955981 428.971194L714.955981 428.971194Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="up" unicode="" d="M513.6 539.2l384-384c12.8-12.8 32-12.8 44.8 0 12.801 12.8 12.801 32 0 44.8l-403.2 403.2C532.8 609.6 520 616 513.6 616c-6.4 0-19.2 0-25.599-6.4L78.399 200c-12.8-12.8-12.8-32 0-44.8s32-12.8 44.8 0L513.6 539.2z" horiz-adv-x="1024" /> + + + <glyph glyph-name="pause" unicode="" d="M512-128c-282.714 0-511.893 229.232-511.893 512 0 282.768 229.179 512 511.893 512 282.714 0 511.893-229.232 511.893-512 0-282.768-229.179-512-511.893-512zM512 863.996c-265.043 0-479.9-214.91-479.9-479.996 0-265.097 214.857-479.996 479.9-479.996 265.043 0 479.9 214.899 479.9 479.996 0 265.086-214.857 479.996-479.9 479.996zM639.973 181.32299999999998h-21.329c-23.558 0-42.658 19.1-42.658 42.658v319.933c0 23.558 19.1 42.658 42.658 42.658h21.329c23.558 0 42.658-19.1 42.658-42.658v-319.933c0-23.558-19.1-42.658-42.658-42.658zM405.356 181.32299999999998h-21.329c-23.558 0-42.658 19.1-42.658 42.658v319.933c0 23.558 19.1 42.658 42.658 42.658h21.329c23.558 0 42.658-19.1 42.658-42.658v-319.933c0-23.558-19.1-42.658-42.658-42.658z" horiz-adv-x="1024" /> + + + <glyph glyph-name="date" unicode="" d="M933.185668 758.3591759999999l-167.054737 0 0 56.506968L732.333174 814.866145l0-56.506968L539.505447 758.3591759999999l0 56.506968-33.796734 0 0-56.506968-216.255299 0 0 56.506968-33.796734 0 0-56.506968L88.005356 758.3591759999999c-12.255115 0-22.224164-9.970072-22.224164-22.224164l0-706.60521c0-12.255115 9.970072-22.225187 22.224164-22.225187l845.179288 0c12.255115 0 22.225187 9.970072 22.225187 22.225187L955.409832 736.135012C955.409832 748.389104 945.43976 758.3591759999999 933.185668 758.3591759999999zM939.036933 29.528778999999986c0-3.226484-2.62478-5.852288-5.852288-5.852288l-845.179288 0c-3.226484 0-5.851265 2.62478-5.851265 5.852288L82.154092 736.135012c0 3.226484 2.62478 5.851265 5.851265 5.851265l167.650301 0 0-55.657624 33.796734 0 0 55.657624 216.255299 0 0-55.657624 33.796734 0 0 55.657624L732.333174 741.986277l0-55.657624 33.796734 0 0 55.657624 167.054737 0c3.226484 0 5.852288-2.62478 5.852288-5.851265L939.036933 29.528778999999986zM206.835765 608.260623l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM458.879152 608.260623l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM684.827207 608.260623l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM206.835765 433.345871l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM458.879152 433.345871l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM684.827207 433.345871l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM206.835765 257.877511l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM458.879152 257.877511l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM684.827207 257.877511l129.098263 0 0-94.008071-129.098263 0 0 94.008071Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="layim-uploadfile" unicode="" d="M914.7359263333336 663.0359498888887c-20.806884999999987 20.806885000000012-48.471967999999976 32.265868000000026-77.89816099999994 32.265868000000054l-352.221993 2.2737367544323206e-13-120.26099099999992 95.03035300000005-11.157106999999995 8.816806000000007-14.220886 9.769962616701378e-15L197.09333633333344 799.148976888889c-51.69538300000001 2.1316282072803006e-14-93.75224400000005-42.88778599999995-93.75224400000006-95.60442799999993l-1.5631940186722204e-13-255.13888799999998c-1.7763568394002505e-15-2.302439 0.08391099999999785-4.716417999999999 0.24968699999999489-7.196911999999999l-1.9895196601282805e-13-340.692403c-1.9539925233402755e-14-29.426192999999998 11.458982999999954-57.09127599999999 32.26586799999994-77.89816100000002 20.806884999999987-20.806885000000012 48.471967999999976-32.265868000000026 77.89816099999994-32.265868000000054l623.083981-3.410605131648481e-13c29.426192999999998-1.9539925233402755e-14 57.09127599999999 11.458982999999954 77.89816100000002 32.26586799999994 20.806885000000012 20.806884999999987 32.265868000000026 48.471967999999976 32.265868000000054 77.89816099999994L947.0028173333335 585.1377888888885C947.0017943333336 614.5639818888885 935.5428113333334 642.2280418888886 914.7359263333336 663.0359498888887zM197.09333633333372 758.2167298888891l141.88345099999998-8.526512829121202e-14L470.3948853333333 654.369569888889l366.44287999999995-2.2737367544323206e-13c38.236859-2.1316282072803006e-14 69.23178099999997-30.99492100000004 69.23178099999994-69.23178100000004L906.0695463333333 465.9195468888886 144.27334033333327 465.91954688888893 144.2733403333336 703.5445488888892C144.2733403333336 733.7361748888891 167.92296933333355 758.2167298888891 197.09333633333372 758.2167298888891zM836.8377653333331 31.28558888888881L213.75480733333322 31.28558888888915c-38.236859 2.1316282072803006e-14-69.23178099999997 30.99492100000004-69.23178099999994 69.23178100000004L144.52302633333338 424.4776928888892l761.546519-6.252776074688882e-13-2.2737367544323206e-13-323.96134599999993C906.0695463333333 62.28050988888867 875.0746243333334 31.285588888888583 836.8377653333331 31.28558888888881z" horiz-adv-x="1024" /> + + + <glyph glyph-name="delete" unicode="" d="M738.923 24.288h-451.956c-27.2 0-49.327 21.603-49.327 48.157v418.017c0 26.548 22.129 48.147 49.327 48.147h451.956c27.2 0 49.327-21.598 49.327-48.147v-418.017c0-26.555-22.129-48.157-49.327-48.157zM286.966 494.547c-4.447 0-7.168-2.644-7.168-4.084v-418.017c0-1.443 2.722-4.093 7.168-4.093h451.956c4.448 0 7.168 2.651 7.168 4.093v418.017c0 1.44-2.722 4.084-7.168 4.084h-451.956zM832.199 496.302h-640.401c-27.201 0-49.327 20.131-49.327 44.876v61.045c0 24.74 22.128 44.867 49.327 44.867h640.401c27.2 0 49.327-20.127 49.327-44.867v-61.045c0-24.744-22.129-44.876-49.327-44.876zM184.631 541.327c0.387-0.733 2.722-2.866 7.168-2.866h640.401c4.445 0 6.782 2.132 7.168 2.867v60.741c-0.393 0.736-2.733 2.863-7.168 2.863h-640.401c-4.437 0-6.776-2.128-7.168-2.863v-60.742zM600.748 605.354h-174.546c-27.201 0-49.327 20.13-49.327 44.876v10.736c0 24.74 22.128 44.867 49.327 44.867h174.546c27.2 0 49.327-20.126 49.327-44.867v-10.736c0-24.745-22.128-44.876-49.327-44.876zM419.034 650.378c0.387-0.733 2.722-2.865 7.168-2.865h174.546c4.446 0 6.782 2.131 7.168 2.865v10.432c-0.393 0.736-2.734 2.862-7.168 2.862h-174.546c-4.437 0-6.776-2.126-7.168-2.862v-10.432zM404.099 430.833h-30.097c-7.297 0-13.213-5.916-13.213-13.213v-272.34c0-7.297 5.916-13.212 13.213-13.212h30.098c7.297 0 13.212 5.916 13.212 13.212v272.341c0 7.297-5.916 13.213-13.212 13.213zM659.583 430.833h-30.097c-7.298 0-13.213-5.916-13.213-13.213v-272.34c0-7.297 5.917-13.212 13.213-13.212h30.097c7.297 0 13.212 5.916 13.212 13.212v272.341c0 7.297-5.916 13.213-13.212 13.213zM531.841 430.833h-30.098c-7.297 0-13.213-5.916-13.213-13.213v-272.34c0-7.297 5.917-13.212 13.213-13.212h30.098c7.297 0 13.212 5.916 13.212 13.212v272.341c0 7.297-5.916 13.213-13.212 13.213z" horiz-adv-x="1024" /> + + + <glyph glyph-name="play" unicode="" d="M512 896C229.376 896 0 666.624 0 384 0 101.37599999999998 229.376-128 512-128 794.624-128 1024 101.37599999999998 1024 384 1024 666.624 794.624 896 512 896L512 896 512 896zM512-95.23199999999997C245.76-95.23199999999997 32.768 117.75999999999999 32.768 384 32.768 650.24 245.76 863.232 512 863.232S991.232 650.24 991.232 384C991.232 117.75999999999999 778.24-95.23199999999997 512-95.23199999999997L512-95.23199999999997 512-95.23199999999997zM733.184 392.192L393.216 588.8c-4.096 4.096-8.192 4.096-12.288 0C376.832 588.8 372.736 584.704 372.736 580.608l0-393.216c0-4.096 4.096-8.192 4.096-8.192 4.096-4.096 8.192-4.096 12.288 0l344.064 196.608c4.096 4.096 4.096 4.096 4.096 8.192C741.376 388.096 737.28 392.192 733.184 392.192L733.184 392.192 733.184 392.192zM733.184 392.192" horiz-adv-x="1024" /> + + + <glyph glyph-name="top" unicode="" d="M812 153.4l-300 172.8-300-172.8 300 604L812 153.4zM264.5 209.2l247.5 142.5 247.5-142.5L512 707.5 264.5 209.2zM371.7 138.3l0-126.2-15.9 0 0 126.2-45.9 0L309.9 153l107.4 0 0-14.8L371.7 138.2zM506.6 154.5c26.6 0 43.3-3.9 50-11.7 6.7-7.8 10-27.2 10-58.3 0-33.5-3.2-54.2-9.6-62-6.4-7.8-23.2-11.8-50.4-11.8-27 0-43.8 3.9-50.3 11.7-6.5 7.8-9.8 27.9-9.8 60.3l0 9.9 0.2 13.3c0 18.7 4.2 31.5 12.6 38.4C467.8 151 483.5 154.5 506.6 154.5zM506.5 141c-22.3 0-35.3-2.5-39.1-7.4-3.8-5-5.7-22-5.7-51 0-29.1 1.9-46.1 5.7-51.1 3.8-5 16.8-7.4 39.1-7.4 22.4 0 35.4 2.5 39.2 7.4 3.8 5 5.7 22 5.7 51.1l0 9.2-0.1 13.3c0 15.6-2.6 25.4-7.8 29.6S525.9 141 506.5 141zM608.4 12.1 608.4 153l59.2 0 5.4 0c15.9 0 26.7-3.1 32.5-9.2 5.8-6.1 8.7-17.6 8.7-34.4 0-16.1-3-27.1-9-32.9-6-5.9-17.3-8.8-33.9-8.8l-6.2-0.1-40.7 0 0-55.5L608.4 12.1zM624.3 81.1l37.7 0c15.8 0 25.9 1.6 30.3 4.9 4.4 3.2 6.7 10.7 6.7 22.3 0 13.6-1.5 22.2-4.5 25.9-3 3.6-10.1 5.4-21.3 5.4l-6.1 0.1-42.7 0L624.4 81.1z" horiz-adv-x="1024" /> + + + <glyph glyph-name="firefox" unicode="" d="M516.010667-128q-161.706667 0-288.277333 85.994667t-188.288 227.712q-33.152 74.858667-38.293333 172.010667t14.848 189.994667 63.424 178.282667 102.293333 138.581333l-6.293333-160.576q6.293333 8 38.848 8.853333t40-8.853333q24 46.293333 91.712 78.848t133.994667 33.706667q-30.848-25.706667-68.288-84.864t-33.429333-93.418667q14.293333-4.565333 35.712-7.722667t36.010667-4.288 38.848-2.282667 28.864-1.706667q8.576-2.858667 5.418667-26.005333t-17.429333-43.136q-2.858667-4.010667-9.429333-10.581333t-32.277333-20.288-57.706667-19.434667l8.576-108.010667-79.424 38.293333q-10.282667-24.576-4.288-46.570667t20.565333-37.994667 37.418667-23.722667 46.293333-3.712q29.141333 5.141333 56 19.712t47.722667 25.706667 42.005333 10.005333q34.858667-2.282667 51.136-18.858667t11.136-37.141333q-0.576-1.152-1.429333-3.136t-4.864-7.146667-10.282667-8.853333-18.005333-5.994667-26.581333-0.576q-34.282667-54.293333-82.581333-77.418667t-119.722667-16.853333q42.282667-34.858667 92.864-47.146667t96.277333-3.434667 88.277333 29.717333 73.152 50.005333 45.994667 59.434667q24.576 52.010667 22.293333 109.994667t-21.418667 107.712-44.864 71.424q49.706667-21.717333 78.293333-45.418667t44.010667-64.277333q8.576 97.152-32.853333 196.010667t-119.722667 162.282667q151.424-44.010667 235.434667-159.722667t86.293333-295.722667q1.152-72.576-23.146667-145.706667t-70.570667-136-108.010667-112-141.418667-77.418667-164.864-28.288z" horiz-adv-x="1025" /> + + + <glyph glyph-name="friends" unicode="" d="M672.02974 765.933689c7.66047-32.266891 8.420787-62.237483 7.713682-95.365998-0.283456-12.778024-7.291057-71.832002-5.3918-89.926102 1.561565-14.936177 5.132904-16.128329 10.759041-28.436656 9.803273-21.422915 6.51846-50.970882 2.76088-72.566736-2.056845-11.816117-6.404873-28.64541-13.017478-38.287001-7.291057-10.645454-21.864984-10.711969-28.319999-23.12365-9.29469-17.848507-4.045129-42.930765-9.903557-62.21497-6.65763-21.883403-23.599488-23.420409-24.877597-52.040237 8.316409-1.243317 16.59598-2.479471 24.877597-3.722788 8.316409-18.498306 23.533996-55.70265 39.08518-66.900689 13.024641-3.728928 26.048259-7.448646 39.07904-11.156084 45.641503-19.593244 96.365768-43.032072 142.108578-63.215764 41.656749-18.381649 91.51325-24.937972 106.575294-70.629617 0-31.026644 2.795673-104.309694 2.025123-144.978952L58.155515-56.631556000000046c-0.757247 40.669258 2.029216 113.952308 2.029216 144.978952 15.065114 45.691645 64.928778 52.247968 106.578364 70.629617 45.74281 20.182668 96.467075 43.62252 142.098345 63.215764 13.027711 3.707438 26.054399 7.427156 39.08211 11.156084 15.554254 11.197016 30.78105 48.402383 39.09439 66.900689l18.492166 4.710278c-4.196579 24.429389-18.658965 26.322505-24.682146 43.62559-2.356674 26.013467-4.729721 52.052516-7.095605 78.079286 0.107447-1.234107-17.006326 3.246951-19.252483 4.716418-24.130583 15.838733-24.618701 80.075757-26.941606 106.793258-1.063215 12.222369 15.163351 22.240537 10.654664 44.62536-26.433022 131.125433 11.437493 219.776496 71.330582 240.123916 41.564651 17.633612 119.167077 50.323129 191.563944 3.716648l17.971303-17.428951 29.061896-5.237281C662.71663 795.172617 672.02974 765.933689 672.02974 765.933689z" horiz-adv-x="1024" /> + + + <glyph glyph-name="refresh-3" unicode="" d="M820.376904 697.14807C740.637816 774.519228 631.884926 822.157201 511.999488 822.157201c-244.621347 0-442.925808-198.305485-442.925808-442.926832 0-244.6193 198.304462-442.925808 442.925808-442.925808 206.075449 0 379.271046 140.739395 428.740738 331.337337L822.859445 267.64189899999997c-45.759183-127.45381-167.656441-218.623229-310.859957-218.623229-182.371584 0-330.210677 147.842163-330.210677 330.210677 0 182.371584 147.840116 330.2117 330.210677 330.2117 88.762603 0 169.32443-35.035958 228.655723-92.015693L557.051567 433.822732l280.641725 0 113.880677 0 3.351328 0L954.925297 831.695438 820.376904 697.14807z" horiz-adv-x="1024" /> + + + <glyph glyph-name="ok" unicode="" d="M960 640L915.2 684.8 371.2 172.79999999999995 108.8 454.4 64 409.6 358.4 83.20000000000005 364.8 89.60000000000002 371.2 83.20000000000005Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="layer" unicode="" d="M96.089 724.318l0-684.236 831.822 0L927.911 724.318 96.089 724.318zM884.178 84.457L140.464 84.457 140.464 489.559l743.714 0L884.178 84.457z" horiz-adv-x="1024" /> + + + <glyph glyph-name="face-smile-fine" unicode="" d="M511.558443 852.9315573333333c-246.787686 0-447.597201-200.783932-447.597201-447.598224 0-246.815315 200.783932-447.598224 447.597201-447.598224 246.841921 0 447.64939 200.782909 447.64939 447.598224C959.207833 652.1476253333334 758.400365 852.9315573333333 511.558443 852.9315573333333zM511.558443-4.962310666666667c-226.247884 0-410.295644 184.046736-410.295644 410.295644 0 226.249931 184.072319 410.296667 410.295644 410.296667 226.27449 0 410.346809-184.046736 410.346809-410.296667C921.905252 179.08442633333334 737.832933-4.962310666666667 511.558443-4.962310666666667zM724.38055 303.5726953333334c-9.698896 3.457752-20.366863-1.566682-23.848151-11.264555-28.500101-79.45461-104.372116-132.844587-188.82353-132.844587-84.798315 0-160.770614 53.689806-189.070146 133.590578-3.432169 9.723455-14.075577 14.772448-23.823592 11.364839-9.699919-3.432169-14.797008-14.100136-11.364839-23.823592 33.547047-94.77248 123.668601-158.434405 224.234017-158.434405 100.142791 0 190.140525 63.314001 223.935212 157.564595C739.125369 289.3978573333334 734.102982 300.0903843333334 724.38055 303.5726953333334zM302.49494 515.3479593333334c0-24.653493 19.98517-44.638663 44.638663-44.638663 24.653493 0 44.638663 19.98517 44.638663 44.638663s-19.98517 44.63764-44.638663 44.63764C322.48011 559.9855993333333 302.49494 540.0014523333333 302.49494 515.3479593333334L302.49494 515.3479593333334zM631.398856 515.3479593333334c0-24.653493 19.98517-44.638663 44.63764-44.638663 24.653493 0 44.63764 19.98517 44.63764 44.638663s-19.984147 44.63764-44.63764 44.63764C651.384026 559.9855993333333 631.398856 540.0014523333333 631.398856 515.3479593333334L631.398856 515.3479593333334z" horiz-adv-x="1024" /> + + + <glyph glyph-name="dollar" unicode="" d="M517.565-65.45399999999995c-244.263 0-442.299 198.014-442.299 442.299s198.014 442.299 442.299 442.299c244.263 0 442.299-198.014 442.299-442.299 0-244.263-198.014-442.299-442.299-442.299zM517.565 863.383c-268.751 0-486.564-217.834-486.564-486.564s217.834-486.564 486.564-486.564c268.751 0 486.564 217.834 486.564 486.564 0 268.751-217.834 486.564-486.564 486.564zM497.036 425.349c-18.443 6.957-33.605 16.314-45.238 27.617-11.581 11.306-20.059 23.465-25.468 36.742-5.423 13.177-8.178 26.235-8.178 39.172-0.004 18.194 2.564 34.357 7.846 48.514 5.327 14.231 13.748 25.85 25.468 35.02 11.581 9.167 26.798 15.204 45.482 18.295v-205.52zM534.455 356.13199999999995c16.937-6.756 32.277-14.997 46.035-24.855 13.748-9.678 24.613-21.601 32.929-35.57 8.204-13.909 12.436-30.734 12.622-50.307 0-14.231-1.859-27.907-5.785-40.833-3.858-12.866-9.542-24.531-17.271-34.804-7.691-10.211-17.271-18.443-28.678-24.613-11.328-6.318-24.613-9.678-39.76-10.341v221.377zM534.455 94.18299999999999c29.037 3.318 53.978 11.306 74.785 24.134 20.985 12.866 37.018 30.15 48.281 51.734 11.125 21.535 16.876 46.832 16.937 76.196 0 16.08-1.67 30.377-5.033 42.985-3.318 12.622-8.204 24.15-14.836 34.357-6.739 10.341-14.836 20.189-24.613 29.326-8.853 8.204-19.107 15.957-30.659 23.041-11.328 7.197-22.836 13.706-34.281 19.261-11.581 5.694-21.601 10.516-30.659 14.231v221.377c14.527-3.318 26.662-8.594 36.62-16.192 9.859-7.395 17.766-16.192 23.776-26.384 5.941-10.211 10.341-20.985 12.972-32.345 2.666-11.328 4.026-22.836 3.858-34.097h46.155c0.004 16.314-1.566 32.345-5.327 48.281-3.543 15.957-9.938 30.909-19.107 44.969-8.996 13.909-21.601 26.235-37.684 36.742-16.192 10.521-36.62 18.295-61.318 23.562v49.426h-37.441v-53.316c-23.465-2.624-42.985-8.178-58.595-16.314-15.633-8.204-28.279-18.194-37.684-29.562-9.441-11.328-16.523-23.302-21.226-35.317-4.59-12.062-7.846-23.302-9.316-33.326-1.566-10.211-2.256-18.194-2.115-24.029 0.004-21.601 3.452-40.612 9.863-57.238 6.479-16.523 15.58-30.909 27.178-43.441 11.659-12.436 25.361-23.562 40.833-33.204 15.633-9.678 32.649-18.443 51.098-26.235v-237.329c-18.194 1.984-33.326 7.197-45.094 15.633-11.97 8.369-21.074 19.107-27.714 31.902-6.739 12.972-11.011 27.178-13.363 42.701-2.256 15.58-3.034 31.313-2.115 47.367h-47.803c-1.183-23.776 0.397-46.035 5.033-66.676s12.357-39.03 23.376-55.019c10.892-16.08 25.361-29.037 43.142-39.03 17.847-9.863 39.472-16.08 64.586-18.295v-65.283h37.441v65.283z" horiz-adv-x="1024" /> + + + <glyph glyph-name="group" unicode="" d="M1328.72893437-13.274022189999982L1325.7954575 10.932401249999998 1319.19311938 40.27361905999999 1309.65730438 68.14729219000003 1296.45423969 96.75473719000001 1283.25117594 118.75984405999998 1264.91331781 140.03117906 1244.37414312 156.90310406000003 1215.76669813 173.03964562 1195.22913594 182.57546062999995 1168.08923563 189.17779874999997 1140.94772187 195.77852437 1117.47507031 204.58056750000003 1088.13546594 218.51740312000004 1064.66281438 229.52076375000001 1036.05536844 242.72382749999997 1014.0502625 255.19473187999995 1014.0502625 332.94718406000004 1023.58446406 343.95054469 1032.38811969 358.61954062999996 1038.98884531 373.29014906 1044.12363969 391.62800719 1049.992205 413.63472656 1052.19191 430.50504 1055.370515 429.77126719 1061.727725 430.75016813 1066.61900281 434.662545 1071.99731188 443.46458812 1075.42104594 453.7325625 1077.37723437 466.4469825 1079.82206656 489.43099031 1080.799355 508.991265 1079.82206656 525.61806187 1076.39833344 535.88764969 1069.55247969 539.80002656 1065.64010188 538.82112656 1069.06383594 560.82623344 1071.99731188 587.2339743800001 1072.97621281 611.19526969 1072.48595656 630.26689969 1069.55247969 647.870985 1064.17255719 664.98642656 1056.83805969 680.63432344 1046.56847188 698.24002125 1034.83295281 712.91063063 1021.13963187 724.15750594 1003.53554656 735.40438125 981.53043969 745.67396812 962.94745344 750.56363437 940.45370281 754.47601125 918.4469825 754.964655 895.95323188 751.05227812 874.43676969 743.71777969 855.36513875 735.893025 838.73834188 725.1347934400001 823.33396063 711.44308594 808.66335125 695.30493188 795.4602875 676.23330187 785.9244725 655.69573969 780.05751875 632.22308813 779.32374687 602.14809844 782.25722375 574.27442531 785.9244725 538.3324818799999 777.85620219 538.3324818799999 772.72140875 531.73014375 771.25547656 519.99462469 772.72140875 492.12095156 776.3886575 459.84625688 779.32374687 443.70810375 784.45854031 434.90606063 793.99435531 429.77126719 799.86130906 430.50504 803.53017031 404.83268344 807.19742 389.42830219 813.06598531 372.55637719000003 821.13425656 355.68606375 830.67007156 342.48299999999995 838.00456906 332.94718406000004 837.27079719 253.72718719 845.06329813 250.99690875 855.81346625 248.0392425 867.37158969 243.73981969 878.39107625 239.43878530999996 888.6058325 235.67638781000005 897.74331406 231.10603405999996 908.76441312 226.53729375 920.85956187 219.54952313 932.95471062 212.56014000000005 942.898535 205.30305094000005 955.80002656 195.62693156 966.82112656 185.41378874999998 977.30358781 172.51229719000003 988.32307531 158.26743750000003 1000.01505219 141.87125344000003 1010.0943425 122.51901655999995 1018.69641219 101.55409219 1026.22120719 82.20185436999998 1031.46243781 64.05913219000001 1035.09098281 45.110066250000045 1038.71952688 23.741970000000038 1041.13855625-1.2546703100000514 1041.54172812-18.187877810000032 1040.73538531-33.30681374999995 1037.30842625-44.99879062000002 1030.79156-57.83254968999995 1023.19742-66.36688593999997 1009.28799875-73.42238906 1298.65555719-73.42238906 1311.85862094-66.82005093999999 1322.12820875-56.552076560000046 1328.72893437-45.54871687000002 1330.19647906-31.611880309999947ZM443.23504906 789.36487031L427.10818437 771.62531906 412.59400625 750.66039469 402.11154406 728.08278469 395.66079781 702.27980156 394.854455 669.21972844 398.07982813 638.57868562 402.11154406 599.06786719 393.24176844 599.06786719 387.59736594 591.81077812 385.98467938 578.90928656 387.59736594 548.26824375 391.62908187 512.7891412500001 394.854455 495.04959 400.4988575 485.37347156 410.98131969 479.72906906 417.43206594 480.53541188 421.46378187 452.31339844 425.49549781 435.38019094 431.94624406 416.83429687 440.81601969 398.28840187 451.29848094 383.77422375000003 459.36191375 373.29176156000005 458.55557094 286.20669281000005 444.84773562 277.33691719 412.59400625 262.01639531 379.53393406 247.50221719 352.92460719 234.60072562000005 331.95968281 225.73095 308.57572906 218.47386094 284.3854325 213.63580125 261.00147875 207.99139875000003 236.81118125 197.50893656000005 214.23357031 186.22013156000003 194.07498969 171.70595344000003 171.49737969 149.12834250000003 155.370515 125.74438874999998 143.27536625 103.16677875000005 133.59924781 78.97648125 123.92312844 51.56081156000005 119.08506875 29.789544370000044 115.05335281 11.243650310000021 112.63432344-10.527616869999974 112.63432344-29.879854690000002 115.85969656-49.23209250000002 125.535815-62.133584059999976 140.04999313-71.80970344000002 158.59588719-73.42238906 965.74546437-73.42238906 980.2596425-66.1653 991.5484475-54.87649499999998 998.80553656-42.781346249999956 1000.41822312-27.46082531000002 998.80553656-7.302244689999952 995.58016438 19.30708218999996 988.32307531 51.56081156000005 977.84061313 82.20185436999998 963.326435 113.64924094000003 948.81225688 137.8395375 928.65367531 161.22349125000005 906.07606531 179.76938625000003 874.62867875 197.50893656000005 852.05106875 207.99139875000003 822.21636875 215.24848781000003 792.38166875 222.50557688000004 766.57868562 232.18169624999996 734.32495625 247.50221719 708.52197312 259.59736594000003 677.07458656 274.11154406 652.88429 287.81937937 652.88429 373.29176156000005 663.36675219 385.38691031 673.04287063 401.513775 680.29995969 417.64063969 685.94436219 437.79922031 692.39510844 461.98951781 694.81413781 480.53541188 698.30882938 479.72906906 705.2966 480.80473031 710.67168406 485.10415312 716.585405 494.78027156 720.3478025 506.06907656 722.49912688 520.04623031 725.18586219 545.31218906 726.26152437 566.8141378099999 725.18586219 585.09071344 721.42346469 596.3795184400001 713.89705719 600.68055375 709.59763438 599.6048915599999 713.36003188 623.79518906 716.585405 652.82354531 717.66106719 679.16516625 717.12242937 700.13008969 713.89705719 719.4823275 707.98494781 738.2959275000001 699.92151594 755.49845437 688.63271094 774.85069219 675.73121937 790.97755688 660.67840344 803.34202406 641.32616563 815.70487875 617.13586906 826.99368375 596.7095825 832.37038031 571.98064812 836.66980219 547.79035063 837.20844 523.06302875 832.90740469 499.40975656 824.84397281 478.44483313 816.24351562 460.16825656 804.4160728100001Z" horiz-adv-x="1449" /> + + + <glyph glyph-name="layim-download" unicode="" d="M186.888458 77.07363199999998l0 581.729108c14.85022-14.450107 35.050284-23.436782 57.359382-23.436782l560.03604 0 0-151.561881 25.029046 0 0 176.591951-585.065086 0c-31.191396 0-57.359382 26.166963-57.359382 57.359382 0 31.191396 26.165939 57.359382 57.359382 57.359382l572.551074 0L816.798914 800.143838 244.24784 800.143838c-45.431725 0-82.388429-36.957727-82.388429-82.388429l0-640.681778c0-41.796942 34.000372-75.789127 75.789127-75.789127l225.950102 0 0 25.029046L237.648538 26.31355099999996C209.661114 26.31355099999996 186.888458 49.078021000000035 186.888458 77.07363199999998zM236.947574 730.269421l560.38601 0 0-25.029046-560.38601 0 0 25.029046ZM686.086897 428.171012c-85.917812 0-164.908864-55.248302-194.553021-135.882783-30.013571-81.641415-4.269233-175.567621 62.624293-230.942813 67.00302-55.465243 164.474982-62.808488 238.931764-17.720593 74.094532 44.868907 113.272833 133.533272 96.080266 218.517829C869.882923 357.47283300000004 783.297916 428.171012 686.086897 428.171012zM686.086897 38.82858599999997c-75.595722 0-145.060817 48.634674-171.092703 119.595842-26.354228 71.839165-3.63069 154.438395 55.287187 203.074092 59.017138 48.718585 144.762011 55.029314 210.191186 15.237029 65.11195-39.59888 99.396801-117.681236 84.064604-192.408171C847.384513 100.72940100000005 771.387655 38.82858599999997 686.086897 38.82858599999997zM698.600909 152.23547199999996L698.600909 311.02496499999995 673.571862 311.02496499999995 673.571862 152.28459099999998 604.675726 221.17254100000002 586.978668 203.47548400000005 686.111456 104.35190499999999 785.185916 203.42738799999995 767.489882 221.123422Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="picture-fine" unicode="" d="M958.648085 84.30682933333333L65.772494 84.30682933333333 65.772494 721.9115253333333l892.87559 0L958.648085 84.30682933333333zM97.660762 116.20328333333339l829.099055 0L926.759817 690.0570263333334 97.660762 690.0570263333334 97.660762 116.20328333333339zM648.731616 419.05893933333334l-1.991354 0c-47.801702 0-86.696548 38.900985-86.696548 86.695524l0 1.978051c0 47.809889 38.894845 86.671988 86.696548 86.671988l1.991354 0c47.801702 0 86.698594-38.862099 86.698594-86.671988l0-1.978051C735.43021 457.95992433333333 696.533318 419.05893933333334 648.731616 419.05893933333334zM646.740262 562.5193053333333c-30.224372 0-54.810327-24.582885-54.810327-54.787814l0-1.978051c0-30.230512 24.584931-54.803163 54.810327-54.803163l1.991354 0c30.222325 0 54.810327 24.572652 54.810327 54.803163l0 1.978051c0 30.203906-24.586978 54.787814-54.810327 54.787814L646.740262 562.5193053333333zM91.097276 181.7900473333334l-22.748097 22.338774 274.373974 279.332916 22.750143-22.351054L91.097276 181.7900473333334zM604.886015 215.92242633333342L339.999113 480.74793033333333l22.548552 22.525016L627.433544 238.4638153333334 604.886015 215.92242633333342zM619.007641 202.70744933333333l-22.763446 22.337751 167.989015 171.035398 22.765493-22.350031L619.007641 202.70744933333333zM925.622924 222.7939273333334L758.534418 389.8343373333333l22.548552 22.529109 167.086459-167.044504L925.622924 222.7939273333334z" horiz-adv-x="1024" /> + + + <glyph glyph-name="link" unicode="" d="M262.4-121.60000000000002c-64 0-128 25.6-179.2 76.8-102.4 102.4-102.4 262.4 0 364.8l134.4 134.4 89.6-89.6-134.4-134.4c-51.2-51.2-51.2-128 0-179.2 51.2-51.2 128-51.2 179.2 0l179.2 179.2c25.6 25.6 38.4 57.6 38.4 89.6S556.8 384 537.6 409.6L467.2 473.6l89.6 89.6 70.4-70.4C672 448 697.6 384 697.6 313.6c0-70.4-25.6-134.4-76.8-179.2l-179.2-179.2C396.8-96 326.4-121.60000000000002 262.4-121.60000000000002zM467.2 204.79999999999995L396.8 268.79999999999995c-102.4 102.4-102.4 262.4 0 364.8l179.2 179.2c102.4 102.4 262.4 102.4 364.8 0 102.4-102.4 102.4-262.4 0-364.8l-134.4-134.4-89.6 89.6 134.4 134.4c51.2 51.2 51.2 128 0 179.2-51.2 51.2-134.4 51.2-179.2 0L486.4 544c-51.2-51.2-51.2-128 0-179.2l70.4-70.4L467.2 204.79999999999995z" horiz-adv-x="1024" /> + + + <glyph glyph-name="diamond" unicode="" d="M998.4 526.933333L797.866667 802.133333c-4.266667 6.4-12.8 10.666667-19.2 10.666667L243.2 812.8c0 0-14.933333-2.133333-23.466667-17.066667C194.133333 753.066667 32 512 32 512L21.333333 494.933333l12.8-14.933333L469.333333-27.733333000000016c4.266667-4.266667 6.4-6.4 10.666667-8.533333 6.4-4.266667 32-10.666667 46.933333 0 4.266667 2.133333 6.4 6.4 10.666667 8.533333l409.6 420.266667c10.666667 8.533333 10.666667 25.6 0 34.133333-8.533333 10.666667-23.466667 10.666667-32 0L561.066667 61.86666700000001l153.6 422.4 0 0 251.733333 0c2.133333 0 19.2 0 23.466667 4.266667l2.133333 2.133333C1004.8 497.066667 1006.933333 512 998.4 526.933333zM782.933333 763.733333l-96-226.133333L341.333333 537.6l-85.333333 226.133333L782.933333 763.733333zM221.866667 714.666667l72.533333-179.2-192 0L221.866667 714.666667zM91.733333 488.533333l215.466667 0 138.666667-416L91.733333 488.533333zM503.466667 44.799999999999955l-147.2 443.733333 307.2 0L503.466667 44.799999999999955zM736 535.4666669999999L810.666667 701.866667l119.466667-168.533333L736 533.333333z" horiz-adv-x="1024" /> + + + <glyph glyph-name="log" unicode="" d="M828.01742 700.357158C743.476979 784.899646 631.076002 831.458031 511.516999 831.458031c-119.55798 0-231.959979-46.558385-316.500421-131.09985C110.47716 615.81774 63.918775 503.41574 63.918775 383.85776c0-87.103824 25.045419-171.548074 72.429613-244.204861 9.393951-14.402011 28.685319-18.46249 43.087331-9.071609 14.404058 9.393951 18.46556 28.685319 9.072633 43.089377-40.768519 62.511729-62.317301 135.194098-62.317301 210.187093 0 212.469066 172.85586 385.326972 385.325949 385.326972s385.325949-172.857906 385.325949-385.326972-172.85586-385.326972-385.325949-385.326972c-70.357418 0-139.188062 19.131733-199.052498 55.323003-14.71412 8.900717-33.856086 4.180206-42.753733-10.534937-8.896624-14.71719-4.180206-33.856086 10.534937-42.753733 69.584821-42.070164 149.556201-64.307631 231.271294-64.307631 119.559003 0 231.959979 46.558385 316.500421 131.09985 84.539418 84.539418 131.097804 196.941418 131.097804 316.499397S912.556838 615.81774 828.01742 700.357158zM494.28964 690.216193c-21.782096 0-39.397289-17.658172-39.397289-39.439244l0-283.524378c0-1.360997 0.358157-2.706645 0.493234-4.03285 2.020006-19.886933 18.959817-34.573423 39.379892-34.573423l0 0 0.146333 0.832971 223.590358 0c21.782096 0 39.438221 17.616216 39.438221 39.397289s-17.658172 39.397289-39.439244 39.397289L533.686928 408.273846l0 242.503103C533.686928 672.5580219999999 516.071735 690.216193 494.28964 690.216193z" horiz-adv-x="1024" /> + + + <glyph glyph-name="key" unicode="" d="M819.2 588.8c0-172.8-140.8-307.2-307.2-307.2-172.8 0-307.2 140.8-307.2 307.2C204.8 755.2 339.2 896 512 896S819.2 755.2 819.2 588.8L819.2 588.8zM512 838.4c-140.8 0-249.6-115.2-249.6-249.6 0-134.4 108.8-256 249.6-256s256 115.2 256 249.6S652.8 838.4 512 838.4L512 838.4zM480 300.79999999999995l64 0L544-128l-64 0L480 300.79999999999995 480 300.79999999999995zM512 192l192 0 0-64L512 128 512 192 512 192zM512 64l192 0 0-64L512 0 512 64 512 64z" horiz-adv-x="1024" /> + + + <glyph glyph-name="rate-solid" unicode="" d="M957.111079 492.519576c-3.927449 11.669784-14.447037 19.86442-26.723641 20.816095L647.68068 535.250796 540.183388 811.873997c-4.586458 11.803837-15.951297 19.579941-28.614711 19.579941s-24.02723-7.776104-28.614711-19.579941L375.458719 535.250796l-282.708803-21.915126c-12.276604-0.951675-22.796192-9.146311-26.723641-20.816095-3.927449-11.669784-0.50142-24.557302 8.701173-32.737612l217.547735-193.358823-67.980277-291.298436c-2.848884-12.20702 2.009773-24.919553 12.273535-32.114418 10.264784-7.195889 23.87271-7.42818 34.375925-0.586354l240.624313 156.709111 240.625336-156.709111c5.099135-3.320629 10.92891-4.974291 16.752546-4.974291 6.173606 0 12.342096 1.858324 17.623379 5.561669 10.263761 7.194866 15.122419 19.907399 12.273535 32.114418l-67.980277 291.299459L948.409906 459.781964C957.613522 467.962274 961.037505 480.849792 957.111079 492.519576z" horiz-adv-x="1024" /> + + + <glyph glyph-name="fonts-del" unicode="" d="M928 448l-143.616 0c-3.456 55.616-14.272 106.56-29.504 144.96C725.504 666.816 617.344 768 464.32 768L256 768l0-320L96 448C78.336 448 64 433.664 64 416S78.336 384 96 384L256 384l0-320 229.632 0c156.288 0 240.768 97.856 267.904 167.488C772.736 280.96000000000004 782.272 333.312 784.96 384L928 384C945.664 384 960 398.336 960 416S945.664 448 928 448zM349.376 711.488l63.936 0c35.712 0 251.84 27.968 266.944-263.488l-330.88 0L349.376 711.488zM439.296 120.51199999999994L349.376 120.51199999999994 349.376 382.528 349.376 384l330.88 0C665.344 113.98400000000004 467.968 120.51199999999994 439.296 120.51199999999994z" horiz-adv-x="1024" /> + + + <glyph glyph-name="unlink" unicode="" d="M150.336 767.6800000000001C133.44 762.304 124.16 744.3199999999999 129.472 727.488 131.2 722.1759999999999 134.208 717.44 138.304 713.664l122.624-122.432C270.208 576.192 289.92 571.52 304.96 580.736 320 590.0799999999999 324.672 609.7280000000001 315.456 624.832 312.832 629.056 309.184 632.64 304.96 635.264L182.336 757.696C175.168 765.44 164.672 769.216 154.304 767.6800000000001 152.96 767.808 151.552 767.808 150.336 767.6800000000001L150.336 767.6800000000001zM406.08 831.424c-13.696-4.48-22.72-17.6-22.016-32L384.064 672c0-17.664 14.336-32 32-32s31.872 14.336 31.872 32L447.936 799.424C448.256 817.088 434.304 831.6800000000001 416.64 832 414.464 832.064 412.16 831.808 410.048 831.424 408.704 831.552 407.296 831.552 406.08 831.424L406.08 831.424zM91.392 511.872C73.728 509.12 61.632 492.544 64.384 474.88 67.136 457.28 83.712 445.248 101.376 448L224 448C241.664 448 256 462.208 256 479.872s-14.336 32-32 32L101.376 511.872c-1.984 0.192-3.968 0.192-6.016 0C94.016 512 92.608 512 91.392 511.872L91.392 511.872zM795.456 320c-17.728-2.752-29.824-14.08-27.072-31.744 2.752-17.6 19.328-35.008 36.992-32.256L928 256c17.664 0 32 19.584 32 37.248S945.664 320 928 320l-122.624 0c-1.984 0.192-3.968 0.192-6.016 0-1.344 0.128-2.688 0.128-4.032 0L795.456 320zM598.272 127.42399999999998c-13.76-4.48-22.72-17.6-22.08-32L576.192-32c0-17.664 14.336-32 32-32S640-49.66399999999999 640-32l0 127.424c0.32 17.6-13.568 32.256-31.232 32.576-2.176 0.064-4.352-0.192-6.592-0.576-1.344 0.128-2.688 0.128-4.032 0L598.272 127.42399999999998zM726.272 191.67999999999995c-16.896-5.376-26.24-23.36-20.864-40.192 1.664-5.312 4.736-10.048 8.832-13.824l122.56-122.432c9.28-15.04 28.928-19.776 44.032-10.496 14.976 9.344 19.712 28.992 10.368 44.032-2.624 4.224-6.144 7.808-10.368 10.432l-122.56 122.432c-7.168 7.744-17.6 11.52-28.032 9.984-1.344 0.128-2.688 0.128-4.032 0L726.272 191.61599999999999zM339.968 28.03200000000004c-49.152 0-98.304 18.688-135.744 56.128-74.816 74.88-74.816 196.608 0 271.488l87.744 87.744c12.48 12.48 32.768 12.48 45.248 0s12.48-32.768 0-45.248L249.408 310.46400000000006c-49.92-49.856-49.92-131.136 0-180.992 49.856-49.856 131.136-49.856 180.992 0l87.744 87.744c12.48 12.48 32.768 12.48 45.248 0s12.48-32.768 0-45.248l-87.744-87.744C438.272 46.72000000000003 389.12 28.03200000000004 339.968 28.03200000000004zM702.144 323.712c-8.192 0-16.384 3.136-22.656 9.344-12.48 12.48-12.48 32.768 0 45.248l87.744 87.744c49.856 49.92 49.856 131.072 0 180.992-49.856 49.856-131.136 49.856-180.992 0L498.496 559.296c-12.48-12.48-32.768-12.48-45.248 0s-12.48 32.768 0 45.248l87.744 87.744c74.88 74.88 196.608 74.88 271.488 0 74.88-74.816 74.88-196.672 0-271.488l-87.744-87.744C718.528 326.784 710.336 323.712 702.144 323.712z" horiz-adv-x="1024" /> + + + <glyph glyph-name="fonts-clear" unicode="" d="M944.787709 197.20939699999997L857.081297 197.20939699999997 741.092979-127.73993700000005 815.146059-127.73993700000005 832.440281-65.58476199999996 966.82809-65.58476199999996 984.512408-127.73993700000005 1062.011328-127.73993700000005 944.787709 197.20939699999997 944.787709 197.20939699999997ZM848.04409 1.1865400000000363L898.951519 153.25866699999995 949.923963 1.1865400000000363 848.04409 1.1865400000000363 848.04409 1.1865400000000363ZM210.238376 489.910857L183.386821 513.121524 12.46009 313.522794C-5.874386 292.652698-3.728862 260.989968 17.271265 242.720508 38.401424 224.45104800000001 70.454249 226.66158700000005 88.853741 247.53168300000004L100.361551 260.599873C106.603075 267.55657099999996 117.200662 268.20673 124.287392 262.22527 131.309106 256.048762 132.024281 245.51619000000005 125.912789 238.55949199999998 107.448281 217.62438099999997 98.085995 173.08850800000005 119.216154 154.81904799999995 140.281297 136.614603 183.841932 151.76330199999995 202.371455 172.69841299999996 208.417932 179.525079 219.145551 180.30526999999995 226.167265 174.19377799999995 233.188979 168.14730199999997 233.904154 157.61473 227.792662 150.65803200000005 209.328154 129.85295199999996 199.965868 85.05701599999998 221.096027 66.91758700000003 242.16117 48.648127000000045 285.656789 63.86184100000003 304.186313 84.666921 310.362821 91.62361899999996 321.025424 92.40381000000002 327.982122 86.29231700000003 335.068852 80.18082500000003 335.784027 69.71326999999997 329.672535 62.75657100000001 311.143011 41.82146 301.845741-2.9094599999999673 322.910884-20.983873000000017 344.041043-39.253333 387.601678-24.039619000000016 406.00117-3.234540000000038 412.177678 3.7221590000000333 422.840281 4.437332999999967 429.927011-1.6091430000000173 436.948725-7.720635000000016 437.598884-18.31822199999999 431.487392-25.144889000000035 413.022884-46.08000000000004 403.725614-90.81092100000001 424.790757-109.01536499999997 445.920916-127.15479400000004 477.973741-125.00927000000001 496.373233-104.20419000000004L667.299963 95.52457100000004 658.652852 132.90869799999996 210.238376 489.910857 210.238376 489.910857ZM844.013106 329.516698L680.10809 471.12127 929.639011 715.190857C933.2799 718.376635 936.725741 721.562413 939.976535 725.203302 977.815773 768.048762 973.524725 833.129651 930.28917 870.513778 887.183646 907.702857 821.58263 903.281778 783.808408 860.631365L783.483328 860.761397 564.249805 571.3107299999999 399.824662 713.56546C385.391138 726.113524 363.480789 724.553143 350.867709 710.249651L248.14263 593.871238 225.322059 567.994921 251.393424 545.434413 695.7119 161.25561900000002 726.26936 136.679619 847.328916 281.014857C859.941995 295.318349 858.44663 316.96863499999995 844.013106 329.516698L844.013106 329.516698ZM817.941741 830.724063C839.136916 854.779937 876.000916 857.315556 900.186821 836.250413 924.372725 815.380317 926.908344 778.906413 905.648154 754.85054 884.452979 730.924698 847.588979 728.389079 823.403075 749.3892060000001 799.21717 770.324317 796.811582 806.798222 817.941741 830.724063L817.941741 830.724063ZM765.473932 758.491429C768.919773 741.522286 777.6319 725.593397 791.80536 713.305397 806.043836 701.017397 823.533106 694.580825 841.087392 693.540571L643.634186 494.526984 593.116852 538.2176509999999 765.473932 758.491429 765.473932 758.491429ZM776.006503 299.739429L709.755328 219.314794 307.502122 566.369524 376.809043 645.03873C382.920535 651.865397 393.38809 652.5155560000001 400.409805 646.534095L774.381106 323.01511100000005C781.337805 317.098667 782.117995 306.69612700000005 776.006503 299.739429L776.006503 299.739429Z" horiz-adv-x="1063" /> + + + <glyph glyph-name="triangle-r" unicode="" d="M293.291 728.256l426.88-355.456-426.88-355.52z" horiz-adv-x="1024" /> + + + <glyph glyph-name="circle" unicode="" d="M511.998 847.999C255.739 847.999 48 640.26 48 383.999c0-256.258 207.739-463.998 463.998-463.998C768.261-79.99900000000002 976 127.74199999999996 976 383.999 976 640.26 768.261 847.999 511.998 847.999zM512.002-16.000999999999976c-220.915 0-400.002 179.088-400.002 400 0 220.917 179.086 400 400.002 400 220.912 0 399.998-179.083 399.998-400C912 163.087 732.914-16.000999999999976 512.002-16.000999999999976z" horiz-adv-x="1024" /> + + + <glyph glyph-name="radio" unicode="" d="M512.5 383.5m-192 0a192 192 0 1 1 384 0 192 192 0 1 1-384 0ZM511.998 847.999C255.739 847.999 48 640.26 48 383.999c0-256.258 207.739-463.998 463.998-463.998C768.261-79.99900000000002 976 127.74199999999996 976 383.999 976 640.26 768.261 847.999 511.998 847.999zM512.002-16.000999999999976c-220.915 0-400.002 179.088-400.002 400 0 220.917 179.086 400 400.002 400 220.912 0 399.998-179.083 399.998-400C912 163.087 732.914-16.000999999999976 512.002-16.000999999999976z" horiz-adv-x="1024" /> + + + <glyph glyph-name="align-center" unicode="" d="M992 448L32 448C14.32 448 0 462.336 0 480 0 497.664 14.32 512 32 512L992 512C1009.68 512 1024 497.664 1024 480 1024 462.336 1009.68 448 992 448ZM800 704C817.664 704 832 689.664 832 672 832 654.336 817.664 640 800 640L224 640C206.32 640 192 654.336 192 672 192 689.664 206.32 704 224 704L800 704ZM992 832L32 832C14.32 832 0 846.336 0 864 0 881.664 14.32 896 32 896L992 896C1009.68 896 1024 881.664 1024 864 1024 846.336 1009.68 832 992 832ZM224 256C206.32 256 192 270.336 192 288 192 305.664 206.32 320 224 320L800 320C817.664 320 832 305.664 832 288 832 270.336 817.664 256 800 256L224 256ZM32 128L992 128C1009.68 128 1024 113.66399999999999 1024 96 1024 78.33600000000001 1009.68 64 992 64L32 64C14.32 64 0 78.33600000000001 0 96 0 113.66399999999999 14.32 128 32 128ZM224-64L800-64C817.664-64 832-78.33600000000001 832-96 832-113.66399999999999 817.664-128 800-128L224-128C206.32-128 192-113.66399999999999 192-96 192-78.33600000000001 206.32-64 224-64Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="align-right" unicode="" d="M992 64L32 64C14.32 64 0 78.33600000000001 0 96 0 113.66399999999999 14.32 128 32 128L992 128C1009.68 128 1024 113.66399999999999 1024 96 1024 78.33600000000001 1009.68 64 992 64ZM992 256L288 256C270.32 256 256 270.336 256 288 256 305.664 270.32 320 288 320L992 320C1009.68 320 1024 305.664 1024 288 1024 270.336 1009.68 256 992 256ZM992 448L32 448C14.32 448 0 462.336 0 480 0 497.664 14.32 512 32 512L992 512C1009.68 512 1024 497.664 1024 480 1024 462.336 1009.68 448 992 448ZM992 640L288 640C270.32 640 256 654.336 256 672 256 689.664 270.32 704 288 704L992 704C1009.68 704 1024 689.664 1024 672 1024 654.336 1009.68 640 992 640ZM992 832L32 832C14.32 832 0 846.336 0 864 0 881.664 14.32 896 32 896L992 896C1009.68 896 1024 881.664 1024 864 1024 846.336 1009.68 832 992 832ZM288-64L992-64C1009.68-64 1024-78.33600000000001 1024-96 1024-113.66399999999999 1009.68-128 992-128L288-128C270.32-128 256-113.66399999999999 256-96 256-78.33600000000001 270.32-64 288-64Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="align-left" unicode="" d="M992 448L32 448C14.336 448 0 462.336 0 480 0 497.664 14.336 512 32 512L992 512C1009.664 512 1024 497.664 1024 480 1024 462.336 1009.664 448 992 448ZM32 704L736 704C753.68 704 768 689.664 768 672 768 654.336 753.68 640 736 640L32 640C14.336 640 0 654.336 0 672 0 689.664 14.336 704 32 704ZM992 832L32 832C14.336 832 0 846.336 0 864 0 881.664 14.336 896 32 896L992 896C1009.664 896 1024 881.664 1024 864 1024 846.336 1009.664 832 992 832ZM32 320L736 320C753.68 320 768 305.664 768 288 768 270.336 753.68 256 736 256L32 256C14.336 256 0 270.336 0 288 0 305.664 14.336 320 32 320ZM32 128L992 128C1009.664 128 1024 113.66399999999999 1024 96 1024 78.33600000000001 1009.664 64 992 64L32 64C14.336 64 0 78.33600000000001 0 96 0 113.66399999999999 14.336 128 32 128ZM32-64L736-64C753.68-64 768-78.33600000000001 768-96 768-113.66399999999999 753.68-128 736-128L32-128C14.336-128 0-113.66399999999999 0-96 0-78.33600000000001 14.336-64 32-64Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="loading-1" unicode="" d="M537.574469 831.696462c-14.123672 0-25.574469-11.447726-25.574469-25.574469 0-14.123672 11.450796-25.574469 25.574469-25.574469 204.495464 0 370.82877-166.358889 370.82877-370.82877 0-14.123672 11.450796-25.574469 25.574469-25.574469 14.123672 0 25.574469 11.450796 25.574469 25.574469C959.551152 642.385838 770.241552 831.696462 537.574469 831.696462z" horiz-adv-x="1024" /> + + + <glyph glyph-name="return" unicode="" d="M927.858848 417.938973L168.863431 417.938973l308.721247 308.86758c11.685133 11.69025 11.435447 30.881334-0.557702 42.868343-11.992125 11.985986-31.18321 12.226462-42.868343 0.536212L75.199191 411.071565c-1.994424-1.662873-3.773953-3.583618-5.294586-5.713119-4.047176-5.373381-6.013971-11.839653-5.9055-18.328437-0.12996-7.794523 2.725064-15.561417 8.595772-21.432125l361.565802-361.744881c11.685133-11.691273 30.876218-11.449773 42.868343 0.535189 11.993149 11.985986 12.242835 31.17707 0.557702 42.868343L168.441828 356.54571799999997l759.417019 0c16.527418 0 29.925566 13.738909 29.925566 30.694069S944.386266 417.938973 927.858848 417.938973z" horiz-adv-x="1024" /> + + + <glyph glyph-name="fonts-strong" unicode="" d="M199.092919 848.487893l355.326704 0c70.335928 0 122.780371-2.942005 157.349701-8.809643 34.568307-5.884011 65.491597-18.131963 92.78522-36.759205 27.27725-18.627243 50.01409-43.427068 68.209498-74.397431 18.195408-30.986735 27.293623-65.699328 27.293623-104.169501 0-41.7161-11.17655-79.977519-33.496905-114.802676s-52.604078-60.951187-90.818425-78.362742c54.075593-15.765055 95.647407-42.626843 124.715443-80.585363s43.602054-82.58388 43.602054-133.877103c0-40.388872-9.417487-79.673597-28.220738-117.839849-18.803251-38.182624-44.482097-68.673056-77.035514-91.489714-32.55444-22.833031-72.702835-36.855396-120.414487-42.09984-29.931706-3.229554-102.122889-5.260817-216.572524-6.060019L199.092919-40.765192999999954 199.092919 848.487893zM378.171504 700.1084940000001l0-205.684546 117.64849 0c69.935816 0 113.410979 1.006933 130.390699 3.038196 30.730908 3.629667 54.891168 14.246469 72.478731 31.850405 17.588587 17.588587 26.381857 40.756239 26.381857 69.473281 0 27.501354-7.594979 49.838082-22.75219 67.042929-15.158235 17.188474-37.702694 27.597545-67.618027 31.242562-17.796318 2.01489-68.945255 3.038196-153.431461 3.038196L378.171504 700.109518zM378.171504 346.04454999999996l0-236.383732 166.622902 0c64.85203 0 106.008382 1.807159 123.43631 5.420453 26.750247 4.828982 48.543599 16.58063 65.363683 35.272341s25.247011 43.714617 25.247011 75.085092c0 26.526143-6.491855 49.03888-19.459191 67.538209-12.983709 18.48398-31.722492 31.961946-56.250118 40.404222s-77.739549 12.663414-159.619394 12.663414L378.171504 346.04454999999996z" horiz-adv-x="1024" /> + + + <glyph glyph-name="upload" unicode="" d="M831.488 478.208C831.488 478.208 831.488 478.208 831.488 478.208c0 143.36-114.688 258.048-253.952 258.048-98.304 0-184.32-57.344-225.28-139.264C327.68 605.184 307.2 609.28 286.72 609.28c-90.112 0-159.744-73.728-159.744-159.744 0-16.384 4.096-28.672 8.192-40.96C57.344 379.904 0 310.27200000000005 0 224.25599999999997c0-106.496 86.016-192.512 192.512-192.512l192.512 0 0 192.512L258.048 224.25599999999997l258.048 258.048 258.048-258.048-126.976 0 0-192.512 192.512 0L839.68 35.84000000000003c106.496 16.384 192.512 110.592 192.512 221.184C1024 371.712 937.984 465.92 831.488 478.208z" horiz-adv-x="1033" /> + + + <glyph glyph-name="dialogue" unicode="" d="M998.4 500.992C998.4 682.24 811.392 829.696 581.632 829.696c-121.216 0-235.904-41.472-315.264-114.048 37.504 8.192 76.416 13.056 115.456 14.464 59.264 30.592 128.256 46.72 199.808 46.72 198.144 0 359.296-123.776 359.296-275.968 0-31.872-7.04-63.232-20.992-93.056 7.552-28.16 11.264-57.344 11.008-86.528C975.104 374.784 998.4 436.736 998.4 500.992L998.4 500.992zM442.368 398.72c-30.72 0-55.808-23.04-55.808-51.328s25.088-51.328 55.808-51.328 55.808 23.04 55.808 51.328S473.088 398.72 442.368 398.72zM243.328 398.72c-30.72 0-55.808-23.04-55.808-51.328s25.088-51.328 55.808-51.328 55.808 23.04 55.808 51.328C299.264 375.67999999999995 274.176 398.72 243.328 398.72zM641.28 398.72c-30.72 0-55.808-23.04-55.808-51.328s25.088-51.328 55.808-51.328 55.808 23.04 55.808 51.328S672.128 398.72 641.28 398.72zM442.368 677.888C212.608 677.888 25.6 530.432 25.6 349.312c0-179.968 173.696-296.192 332.544-321.664l60.8-78.336c5.632-7.424 14.464-11.008 23.296-11.008 8.832 0 17.792 3.712 23.424 11.008l60.8 78.464C685.312 53.24800000000005 859.008 169.47199999999998 859.008 349.44000000000005 859.136 530.432 672.128 677.888 442.368 677.888zM714.88 173.82399999999996c-52.224-45.184-124.288-77.952-197.376-89.6C503.168 81.91999999999996 490.112 74.24000000000001 481.28 62.72000000000003l-38.784-49.92-38.912 49.92c-8.96 11.52-21.888 19.2-36.224 21.504-73.216 11.776-145.152 44.416-197.376 89.728-39.68 34.304-86.912 92.544-86.912 175.36 0 69.76 35.584 136.192 100.352 187.264 68.736 54.144 160.768 84.096 258.944 84.096 98.304 0 190.336-29.824 259.072-84.096 64.768-51.072 100.352-117.504 100.352-187.264C801.664 266.36800000000005 754.56 208.12800000000004 714.88 173.82399999999996z" horiz-adv-x="1024" /> + + + <glyph glyph-name="video" unicode="" d="M952.523633 599.2477269999999L952.523633 599.2477269999999 952.523633 599.2477269999999zM100.53762400000005 661.054062C100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062zM100.74228 720.404517L100.74228 720.404517 100.74228 720.404517zM660.990107 739.9449716666666c8.697911 0 17.498151-0.511642 25.684421-2.353553 12.279404-2.865194 23.22854-8.18627 34.382332-16.679524 15.144599-11.460777 26.196063-29.572899 32.02878-52.187469 3.479165-13.405016 2.967523-28.651944 2.558209-42.05696-0.102328-4.195463-0.204657-8.083941-0.204657-11.665434l0-37.759169 101.407415 70.401919 25.479764 17.60048c0.511642 0.306985 1.330269 1.023284 2.148896 1.637254 4.40012 3.376836 11.051464 8.595583 20.977316 11.051464 3.274508 0.818627 6.549016 1.22794 10.02818 1.22794 9.618867 0 19.44239-3.274508 27.730987999999996-9.311882 18.82842-13.916657999999998 18.726092-35.405616 18.726092-51.061857 0-1.023284 0-2.148896 0-3.172179l0-409.620466c0-15.963226 0.102328-37.963825-19.647047-51.982812-6.753672-4.809433-16.679524-8.390926-27.219346-8.390926-5.01409 0-10.130509 0.818627-15.144599 2.762866-7.162986 2.762866-12.279404 6.856000999999999-16.065554 9.823524-0.920955 0.716299-1.841911 1.432597-2.353553 1.841911l-24.968122 17.395823-101.10043 70.094934 0-37.963825c0-3.581493 0.102328-7.367643 0.204657-11.460777 0.409313-14.735285 0.818627-29.982212-2.865194-43.796542-5.62806-21.488957999999997-16.679524-39.396423-31.107825-50.447886-7.879285-6.037374-18.930748-13.405016-34.075347-16.986509-7.776956-1.841911-16.167882-2.353553-24.45648-2.353553-4.297792 0-8.595583 0.102328-12.688718 0.204657-3.683821 0.102328-7.162986 0.204657-10.232837 0.204657L167.15339300000005 84.94107466666674c-1.944239 0-3.888478 0-5.832717 0-1.944239 0-3.990806 0-5.935045 0-16.577196 0-33.461377 0.61397-47.787349 6.549016-27.935644999999997 11.563106-46.764065 37.759169-53.006096 73.574098l-0.409313 2.251224 0 2.353553c-0.102328 18.930748-0.204657 37.861497-0.306985 56.792245l0 0.511642L53.87588699999998 598.0155226666666c0 4.40012-0.102328 8.902568-0.102328 13.712001999999998-0.306985 27.01469-0.716299 54.950335 9.311882 76.643949 9.823524 21.284300999999996 27.526331999999996 38.066154 48.708304 45.945438 5.730389 2.148896 11.051464 2.762866 15.04227 3.172179 1.023284 0.102328 2.353553 0.306985 3.069851 0.409313l4.093135 1.534926 500.9997 0c3.581493 0 7.572299 0.102328 11.767763 0.306985C651.166583 739.7403146666667 656.078345 739.9449716666666 660.990107 739.9449716666666M304.273409 266.7785886666668L559.889677 394.2797376666667l0 33.973019L304.273409 555.9585626666667 304.273409 266.7785886666668M660.990107 780.8763196666666c-5.62806 0-10.949136-0.204657-15.758569-0.306985-3.888478-0.102328-7.469971-0.204657-10.437494-0.204657L133.79434400000002 780.3646776666667l-7.265314 0-6.446687-2.353553c-5.3210749999999996-0.61397-13.609673-1.841911-22.716898-5.218747-31.210153-11.665434-57.303887-36.121915-71.629859-67.229739-13.814329999999998-30.084541-13.405016-64.159888-12.995703-94.244429 0.102328-4.604777 0.102328-9.004897 0.102328-13.20036l0-371.349655 0-0.102328 0-0.102328 0-0.511642c0.102328-18.930748 0.204657-37.861497 0.306985-56.792245l0-2.251224 0-3.479165 0.61397-3.376836 0.409313-2.251224c4.195463-23.944839 12.791046-45.126811 25.479764-62.727291 13.609673-18.82842 31.107825-32.847407 52.08514-41.545318 21.488957999999997-8.902568 44.001199-9.618867 63.443589-9.618867 2.046567 0 4.093135 0 6.139702 0 1.841911 0 3.78615 0 5.62806 0l473.166384 0c2.558209 0 5.62806-0.102328 9.004897-0.204657 4.195463-0.102328 8.902568-0.306985 13.916657999999998-0.306985 13.302688 0 24.149495 1.125612 33.973019 3.479165 22.819227 5.423404 39.089437 16.474868 49.322274 24.251824 21.693613999999997 16.577196 37.963825 42.363944999999994 45.84311 72.653143 2.251224 8.595583 3.376836 17.088838 3.990806 25.377436l36.838213-25.582093 24.558809-17.088838c0.306985-0.204657 0.61397-0.511642 0.920955-0.716299 4.809433-3.683821 13.609673-10.642149999999999 26.400719-15.656241 9.516538-3.683821 19.647047-5.62806 30.084541-5.62806 18.009793 0 36.53122799999999 5.832717 50.8572 15.963226 16.577196 11.767763 27.730987999999996 27.935644999999997 33.052064 48.094334 3.78615 14.4283 3.78615 27.628659999999996 3.78615 37.34985499999999l0 409.518137c0 0.920955 0 1.739582 0 2.660538l0 0.409313c0 9.41421 0.102328 22.409913-3.479165 36.53122799999999-5.116419 19.749375-15.758569 35.81493-31.721795 47.68502-15.144599 11.153792-33.666034 17.293495-52.08514 17.293495-6.753672 0-13.507345-0.818627-19.954032-2.455881-18.21445-4.604777-30.289198-13.916657999999998-36.019586-18.419107l0 0c-0.204657-0.204657-0.511642-0.409313-0.716299-0.511642l-25.172779-17.293495-0.102328 0-0.102328 0-37.14519799999999-25.786749c-0.511642 7.674628-1.637254 15.553912-3.683821 23.433197-8.18627 31.721795-24.354152 57.508544-46.866394 74.597382-15.758569 11.972419-32.02878 19.851704-49.833916 23.944839C685.8559009999999 779.7507076666667 674.702109 780.8763196666666 660.990107 780.8763196666666L660.990107 780.8763196666666zM345.204757 332.9850436666668L345.204757 489.75210666666663l157.074048-78.48586L345.204757 332.9850436666668 345.204757 332.9850436666668zM347.455981 429.177975L347.455981 308.02118499999995 347.455981 429.177975Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="headset" unicode="" d="M356.285031 2.1522690000000466L356.396571 2.1522690000000466 356.396571 285.236626 253.462201 285.236626 253.462201 2.1522690000000466ZM665.076886 285.236626l103.042841 0 0-283.08538-103.042841 0 0 283.08538ZM63.809793 301.950286c0-38.758746-3.195785-112.220874 5.457292-148.208507l65.735144 0c-10.112312 35.644825-7.747451 109.176538-7.747451 148.208507 0 219.937155 172.264389 398.231887 384.763131 398.231887 212.498742 0 384.763131-178.294732 384.763131-398.231887 0-39.031968 2.266623-112.563682-7.845689-148.208507l65.735144 0c8.653077 35.987632 5.555529 109.449761 5.555529 148.208507 0 256.20415-200.670346 463.898469-448.208115 463.898469C264.479115 765.848755 63.809793 558.1544349999999 63.809793 301.950286z" horiz-adv-x="1024" /> + + + <glyph glyph-name="cellphone-fine" unicode="" d="M731.514252 896L292.485748 896C195.323702 896 116.154627 816.830925 116.154627 719.6688790000001l0-671.337759c0-97.162046 79.169075-176.331121 176.331121-176.331121l438.628661 0c97.162046 0 176.331121 79.169075 176.331121 176.331121L907.445529 719.6688790000001C907.845373 816.830925 828.676298 896 731.514252 896zM292.485748 853.216712l438.628661 0c70.772355 0 128.349863-55.178446 133.147989-124.751269L159.737602 728.465443C164.135884 798.038266 222.113237 853.216712 292.485748 853.216712zM865.062085 48.73096399999997c0-73.571261-59.976572-133.547833-133.547833-133.547833L292.485748-84.816868c-73.571261 0-133.547833 59.976572-133.547833 133.547833l0 45.582194 705.724326 0L864.662241 48.73096399999997zM865.062085 137.096447L158.937915 137.096447 158.937915 685.682155l705.724326 0L864.662241 137.096447zM512-54.82858299999998c13.59469 0 26.789535 5.597813 36.385787 15.194065 9.596251 9.596251 15.194065 22.791097 15.194065 36.385787 0 13.59469-5.597813 26.789535-15.194065 36.385787-9.596251 9.596251-22.791097 15.194065-36.385787 15.194065-13.59469 0-26.789535-5.597813-36.385787-15.194065-9.596251-9.596251-15.194065-22.791097-15.194065-36.385787 0-13.59469 5.597813-26.789535 15.194065-36.385787C485.210465-49.23076900000001 498.40531-54.82858299999998 512-54.82858299999998z" horiz-adv-x="1024" /> + + + <glyph glyph-name="add-1" unicode="" d="M566.935 57.63900000000001c0-30.366-24.612-54.972-54.935-54.972v0c-30.384 0-54.996 24.612-54.996 54.972v610.057c0 30.361 24.612 54.972 54.996 54.972v0c30.33 0 54.935-24.612 54.935-54.972v-610.057zM817.004 417.633c30.384 0 54.996-24.606 54.996-54.966v0c0-30.354-24.612-54.966-54.996-54.966h-610.062c-30.33 0-54.942 24.612-54.942 54.966v0c0 30.359 24.612 54.966 54.942 54.966h610.062zM817.004 417.633z" horiz-adv-x="1024" /> + + + <glyph glyph-name="face-smile-b" unicode="" d="M511.931733-128c-136.738133 0-265.284267 53.213867-361.984 149.879467C53.282133 118.51093300000002 0 247.09119999999996 0 384c0 136.738133 53.282133 265.3184 150.050133 362.0864C246.749867 842.683733 375.296 896 512.136533 896s265.4208-53.316267 362.1888-149.9136c199.645867-199.714133 199.543467-524.5952 0-724.206933C777.454933-74.71786699999996 648.772267-128 511.931733-128L511.931733-128 511.931733-128 511.931733-128 511.931733-128 511.931733-128zM512.034133 829.303467c-118.920533 0-230.741333-46.2848-314.914133-130.389333C113.083733 614.8778669999999 66.7648 502.8864 66.7648 384c0-118.9888 46.2848-230.912 130.3552-315.016533 84.0704-84.0704 195.857067-130.321067 314.811733-130.321067 119.022933 0 230.946133 46.318933 315.016533 130.423467 173.704533 173.636267 173.704533 456.157867 0 629.794133C742.877867 782.984533 631.057067 829.303467 512.034133 829.303467L512.034133 829.303467 512.034133 829.303467 512.034133 829.303467 512.034133 829.303467 512.034133 829.303467zM330.103467 244.25813300000004c0 0 59.904-95.9488 181.828267-95.9488s201.8304 95.9488 201.8304 95.9488 45.294933 0.136533 45.192533-47.957333c0 0-78.506667-111.8208-247.022933-111.8208s-223.368533 111.8208-223.368533 111.8208S286.856533 244.25813300000004 330.103467 244.25813300000004L330.103467 244.25813300000004 330.103467 244.25813300000004 330.103467 244.25813300000004 330.103467 244.25813300000004zM363.2128 548.590933c-34.5088 0-62.702933-28.091733-62.702933-62.737067 0-34.679467 28.194133-62.6688 62.702933-62.6688 34.679467 0 62.702933 28.091733 62.702933 62.6688C425.915733 520.4992 397.858133 548.590933 363.2128 548.590933L363.2128 548.590933 363.2128 548.590933 363.2128 548.590933 363.2128 548.590933 363.2128 548.590933zM684.544 548.590933c-34.679467 0-62.702933-28.091733-62.702933-62.737067 0-34.679467 28.023467-62.6688 62.702933-62.6688 34.6112 0 62.600533 28.091733 62.600533 62.6688C747.144533 520.4992 719.121067 548.590933 684.544 548.590933L684.544 548.590933 684.544 548.590933 684.544 548.590933 684.544 548.590933 684.544 548.590933zM684.544 548.590933" horiz-adv-x="1025" /> + + + <glyph glyph-name="fonts-html" unicode="" d="M194.33 416.235h-101.295v101.28h-46.035v-267.03h46.035v119.7h101.28v-119.7h46.035v267.03h-46.035v-101.28zM277.205 480.69h73.665v-230.205h46.035v230.205h73.665v36.825h-193.365v-36.825zM627.815 335.58000000000004l-46.755 181.935h-73.665v-267.03h46.035v211.785l46.035-211.785h55.245l46.83 213.93-0.795-213.93h46.035v267.03h-73.665l-45.3-181.935zM848.09 287.30999999999995v230.205h-46.035v-267.03h174.945v36.825h-128.91z" horiz-adv-x="1024" /> + + + <glyph glyph-name="screen-full" unicode="" d="M641.750109 511.899972l205.227128 204.519-0.704035-115.89966c-0.282433-9.611915 7.489578-18.09103 17.101493-17.808598l12.297071 0c9.611915 0.283456 17.667382 5.936199 17.808598 15.689331l0.565888 172.57752c0 0.14224 0.282433 9.187243 0.282433 9.187243 0.14224 4.804423-0.99056 9.187243-4.100388 12.297071-3.109828 3.109828-7.347339 5.086855-12.297071 4.946662l-8.763594-0.14224c-0.141216 0-0.278339 0-0.420579-0.14224L697.581696 797.833213c-9.611915-0.283456-17.667382-8.200776-17.808598-17.950837l0-12.297071c1.416256-11.44875 10.458189-18.092054 20.070104-17.808598l112.789832-0.283456-204.66124-203.814965c-9.329483-9.329483-9.329483-24.449855 0-33.778314 9.329483-9.470699 24.452925-9.470699 33.782408 0L641.750109 511.899972zM383.095141 319.11010699999997L177.726797 115.29411900000002l0.707105 115.338888c0.283456 9.607822-7.492648 18.086937-17.104563 17.808598l-13.001105 0c-9.611915-0.283456-17.667382-5.937223-17.808598-15.690354l-0.565888-172.718737c0-0.14224-0.282433-9.187243-0.282433-9.187243-0.14224-4.808516 0.99056-9.187243 4.096295-12.297071 3.109828-3.109828 7.351432-5.086855 12.297071-4.946662l8.762571 0.14224c0.14224 0 0.283456 0 0.425695 0.14224l171.873486-0.708128c9.607822 0.283456 17.667382 8.196683 17.808598 17.950837L344.93503 63.42477399999996c-1.415232 11.44875-10.461259 18.092054-20.074198 17.808598L212.069977 81.51682800000003 416.59 285.32872299999997c9.329483 9.329483 9.329483 24.453948 0 33.782408C407.40685 328.58182999999997 392.424624 328.58182999999997 383.095141 319.11010699999997L383.095141 319.11010699999997zM894.047276 60.03251399999999l-0.424672 172.718737c-0.283456 9.612938-8.200776 15.406898-17.809621 15.690354l-12.296047 0c-9.612938 0.278339-17.243733-8.200776-17.105586-17.808598l0.708128-115.903753L641.750109 319.11010699999997c-9.329483 9.329483-24.452925 9.329483-33.782408 0-9.325389-9.328459-9.325389-24.452925 0-33.782408L812.490795 81.51682800000003l-112.789832-0.283456c-9.611915 0.283456-18.515702-6.502088-20.073174-17.808598l0-12.297071c0.282433-9.611915 8.200776-17.667382 17.808598-17.950837l171.166381 0.708128c0.141216 0 0.282433-0.14224 0.424672-0.14224l8.763594-0.14224c4.803399-0.141216 9.187243 1.694595 12.296047 4.946662 3.109828 3.109828 4.238534 7.488555 4.097318 12.297071 0 0-0.14224 9.046027-0.14224 9.187243L894.047276 60.03149099999996zM212.216309 749.493252l112.789832 0.283456c9.607822-0.283456 18.512632 6.502088 20.070104 17.808598L345.076246 779.883399c-0.283456 9.611915-8.196683 17.667382-17.808598 17.950837l-172.011632-0.708128c-0.14224 0-0.283456 0.14224-0.425695 0.14224l-8.761548 0.14224c-4.808516 0.141216-9.187243-1.694595-12.297071-4.946662-3.109828-3.109828-4.242627-7.488555-4.096295-12.297071 0 0 0.282433-9.046027 0.282433-9.187243l0.420579-172.718737c0.14224-9.608845 8.200776-15.406898 17.808598-15.686261l13.005198 0c9.611915-0.282433 17.242709 8.196683 17.10047 17.808598l-0.564865 115.334795 205.231221-203.958228c9.324366-9.329483 24.448832-9.329483 33.777291 0 9.329483 9.329483 9.329483 24.452925 0 33.782408L212.216309 749.493252 212.216309 749.493252zM212.216309 749.493252" horiz-adv-x="1024" /> + + + <glyph glyph-name="form" unicode="" d="M314.278111 437.019389l395.439892 0 0-30.297458-395.439892 0L314.278111 437.019389zM314.278111 315.83495200000004l395.439892 0 0-30.297458-395.439892 0L314.278111 315.83495200000004zM314.278111 194.62833l263.626661 0 0-30.297458L314.278111 164.330872 314.278111 194.62833zM609.376235 739.9931730000001c-7.849678 42.966669-48.394988 75.742447-97.378777 75.742447-48.961604 0-89.51311-32.775778-97.380776-75.742447L116.55177 739.9931730000001l0-787.725922 790.893774 0 0 787.725922L609.376235 739.9931730000001zM446.091342 670.440529l0 17.613058 0 36.791056c0 33.410348 29.57295 60.594317 65.906116 60.594317 36.352353 0 65.907115-27.183969 65.907115-60.594317l0-36.791056 0-17.621053 16.672696-8.712493c32.358061-16.929922 57.169039-42.663874 71.406386-73.213161L358.043239 588.50688c14.240345 30.555683 39.051523 56.281241 71.408385 73.213161L446.091342 670.440529zM874.489888-17.436289999999985L149.505227-17.436289999999985 149.505227 709.694715 413.138884 709.694715l0-21.641327c-51.44492-26.923746-88.727643-74.124144-98.86377-129.845165l395.44289 0c-10.102151 55.730615-47.40466 102.921419-98.859773 129.845165l0 21.641327 263.631658 0L874.489888-17.436289999999985z" horiz-adv-x="1024" /> + + + <glyph glyph-name="cart" unicode="" d="M365.920994 84.618469c-39.030945 0-70.78516-31.754215-70.78516-70.78516s31.754215-70.784136 70.78516-70.784136c39.030945 0 70.784136 31.753191 70.784136 70.784136S404.951939 84.618469 365.920994 84.618469zM365.920994-5.784493999999995c-10.818393 0-19.61985 8.801457-19.61985 19.618826 0 10.818393 8.801457 19.61985 19.61985 19.61985s19.618826-8.801457 19.618826-19.61985C385.540843 3.015939000000003 376.739387-5.784493999999995 365.920994-5.784493999999995zM808.821219 84.618469c-39.030945 0-70.784136-31.754215-70.784136-70.78516s31.753191-70.784136 70.784136-70.784136 70.78516 31.753191 70.78516 70.784136S847.852164 84.618469 808.821219 84.618469zM808.821219-5.784493999999995c-10.81737 0-19.618826 8.801457-19.618826 19.618826 0 10.818393 8.801457 19.61985 19.618826 19.61985 10.818393 0 19.61985-8.801457 19.61985-19.61985C828.441069 3.015939000000003 819.640636-5.784493999999995 808.821219-5.784493999999995zM443.99107 305.940157c-14.057157-1.416256-24.305569-13.959943-22.890336-28.0171 1.328251-13.187347 12.446473-23.02132 25.423019-23.02132 0.856507 0 1.723248 0.042979 2.594081 0.130983l439.314561 44.245713c0.088004 0.007163 0.174985 0.01842 0.261966 0.026606l0.180102 0.01842c0.50449 0.051165 1.001817 0.119727 1.496074 0.198521 0.222057 0.035816 0.443092 0.076748 0.663102 0.11768 0.552585 0.103354 1.100054 0.217964 1.638313 0.355087 0.085958 0.022513 0.169869 0.047072 0.254803 0.069585 0.586354 0.156566 1.161453 0.334621 1.728364 0.530073 0.077771 0.026606 0.155543 0.051165 0.233314 0.078795 0.626263 0.222057 1.239224 0.469698 1.840928 0.737804 0.039909 0.017396 0.078795 0.035816 0.118704 0.054235 1.277086 0.577145 2.496867 1.252527 3.647063 2.020006 0.001023 0.001023 0.002047 0.001023 0.00307 0.002047 0.553609 0.369414 1.088798 0.76134 1.609661 1.170662 0.069585 0.054235 0.137123 0.10847 0.205685 0.163729 0.48607 0.38988 0.958838 0.795109 1.413186 1.218758 0.092098 0.084934 0.180102 0.173962 0.270153 0.25992 0.394996 0.378623 0.778736 0.76748 1.14815 1.169639 0.11154 0.121773 0.222057 0.243547 0.331551 0.367367 0.333598 0.3776 0.653893 0.766456 0.964978 1.163499 0.12382 0.158612 0.249687 0.314155 0.370437 0.475837 0.322341 0.432859 0.629333 0.876973 0.925069 1.329275 0.113587 0.173962 0.224104 0.348947 0.333598 0.525979 0.296759 0.479931 0.580215 0.968048 0.845251 1.467421 0.069585 0.130983 0.134053 0.265036 0.201591 0.397043 0.289596 0.568958 0.563842 1.147126 0.811482 1.738597 0.00307 0.007163 0.005117 0.014326 0.008186 0.021489 0.569982 1.369184 1.019213 2.796696 1.345648 4.26514 0 0.001023 0 0.002047 0.001023 0.00307l0.00307 0.013303c0.035816 0.162706 0.075725 0.323365 0.10847 0.487094l56.17951 252.734118c0.895393 4.030803 0.780783 8.04728-0.165776 11.794627 0.50449 2.003634 0.774643 4.101411 0.774643 6.261611 0 14.128789-11.452843 25.582655-25.582655 25.582655L195.47502 616.098125l-52.358485 159.553902c-3.631714 11.067057-14.093996 17.972327-25.177426 17.590634-0.207731 0.005117-0.413416 0.01535-0.62217 0.01535L54.663994 793.258011c-14.128789 0-25.582655-11.453866-25.582655-25.582655s11.453866-25.582655 25.582655-25.582655l45.614897 0 197.955514-603.235934c3.536546-10.776438 13.546527-17.613146 24.303522-17.613146 2.067079 0 4.16281 0.26299 6.245238 0.788969l567.583946 0c14.129812 0 25.582655 11.453866 25.582655 25.582655s-11.452843 25.582655-25.582655 25.582655L340.816223 173.1979 212.265428 564.933839l701.224666 0-48.137347-216.557174L443.99107 305.940157z" horiz-adv-x="1024" /> + + + <glyph glyph-name="camera-fill" unicode="" d="M512 480C436.515555 480 375.111111 419.712 375.111111 345.6 375.111111 271.48800000000006 436.515555 211.20000000000005 512 211.20000000000005 587.484446 211.20000000000005 648.888887 271.48800000000006 648.888887 345.6 648.888887 419.712 587.484446 480 512 480M512 172.79999999999995C414.808889 172.79999999999995 336 250.15679999999998 336 345.6 336 441.0432 414.808889 518.4 512 518.4 609.210667 518.4 688 441.0432 688 345.6 688 250.15679999999998 609.210667 172.79999999999995 512 172.79999999999995M903.111113 691.2L723.767113 691.2C713.383113 691.2 703.448887 695.2512 696.115554 702.4512L640.792887 756.7488C633.459554 763.9488 623.505779 768 613.141333 768L512 768 410.878222 768C400.494222 768 390.56 763.9488 383.226667 756.7488L327.904 702.4512C320.570667 695.2512 310.616889 691.2 300.252445 691.2L120.888889 691.2C77.866667 691.2 42.666667 656.64 42.666667 614.4L42.666667 76.79999999999995C42.666667 34.559999999999945 77.866667 0 120.888889 0L903.111113 0C946.133333 0 981.333333 34.559999999999945 981.333333 76.79999999999995L981.333333 614.4C981.333333 656.64 946.133333 691.2 903.111113 691.2" horiz-adv-x="1024" /> + + + <glyph glyph-name="tabs" unicode="" d="M310.30303 523.636364L124.121212 523.636364c-17.128727 0-31.030303-13.901576-31.030303-31.030303l0-186.181818c0-17.128727 13.901576-31.030303 31.030303-31.030303l186.181818 0c17.128727 0 31.030303 13.901576 31.030303 31.030303L341.333333 492.606061C341.333333 509.734788 327.431758 523.636364 310.30303 523.636364zM294.787879 306.42424200000005L139.636364 306.42424200000005c-17.128727 0-15.515152-1.613576-15.515152 15.515152L124.121212 477.090909c0 17.128727-1.613576 15.515152 15.515152 15.515152l155.151515 0c17.128727 0 15.515152 1.613576 15.515152-15.515152l0-155.151515C310.30303 304.81066699999997 311.916606 306.42424200000005 294.787879 306.42424200000005zM418.909091 352.969697l480.969697 0 0 31.030303L418.909091 384 418.909091 352.969697zM418.909091 228.84848499999998l480.969697 0 0 31.030303L418.909091 259.878788 418.909091 228.84848499999998zM418.909091 89.21212100000002l480.969697 0 0 31.030303L418.909091 120.24242400000003 418.909091 89.21212100000002zM418.909091 492.606061l480.969697 0 0 31.030303L418.909091 523.636364 418.909091 492.606061zM992.969697 725.333333l-15.515152 0L977.454545 849.454545c0 17.128727-13.901576 31.030303-31.030303 31.030303L775.757576 880.484848c-17.128727 0-31.030303-13.901576-31.030303-31.030303l0-124.121212-139.636364 0L605.090909 849.454545c0 17.128727-13.901576 31.030303-31.030303 31.030303L403.393939 880.484848c-17.128727 0-31.030303-13.901576-31.030303-31.030303l0-124.121212-124.121212 0L248.242424 849.454545c0 17.128727-13.901576 31.030303-31.030303 31.030303L31.030303 880.484848C13.901576 880.484848 0 866.583273 0 849.454545l0-946.424242c0-17.128727 13.901576-31.030303 31.030303-31.030303l961.939394 0c17.128727 0 31.030303 13.901576 31.030303 31.030303L1024 694.30303C1024 711.431758 1010.098424 725.333333 992.969697 725.333333zM992.969697-65.939394c0-17.128727-13.901576-31.030303-31.030303-31.030303L62.060606-96.969697c-17.128727 0-31.030303 13.901576-31.030303 31.030303L31.030303 818.424242c0 17.128727 13.901576 31.030303 31.030303 31.030303l124.121212 0c17.128727 0 31.030303-13.901576 31.030303-31.030303l0-124.121212 744.727273 0c17.128727 0 31.030303-13.901576 31.030303-31.030303L992.969697-65.939394z" horiz-adv-x="1024" /> + + + <glyph glyph-name="heart-fill" unicode="" d="M729.068827 776.44202c-94.686523 0-176.905082-48.314379-217.069851-118.640074-40.163745 70.325695-122.382305 118.640074-217.044268 118.640074-143.767358 0-229.665727-123.660414-229.665727-243.219417 0-283.128359 415.870616-527.841803 433.576883-538.126031 4.062526-2.363837 8.584516-3.538593 13.132088-3.538593 4.547573 0 9.070586 1.174756 13.132088 3.538593 17.706267 10.283204 433.576883 254.997672 433.576883 538.126031C958.708971 652.781606 872.811626 776.44202 729.068827 776.44202z" horiz-adv-x="1024" /> + + + <glyph glyph-name="fonts-code" unicode="" d="M270 626c-12 12-32 12-44 0L9 409c-12-12-12-32 0-44l217-217c6-6 14-9 22-9s16 3 22 9c12 12 12 32 0 44L75 387 270 582C282 595 282 614 270 626zM1015 409L798 626c-12 12-32 12-44 0-12-12-12-32 0-44l195-195L754 192c-12-12-12-32 0-44 6-6 14-9 22-9s16 3 22 9l217 217C1027 377 1027 397 1015 409zM624 696L624 696c-16 6-34-3-40-19L382 119c-6-16 2-34 19-40l0 0c16-6 34 3 40 19l202 558C648 672 640 690 624 696z" horiz-adv-x="1025" /> + + + <glyph glyph-name="ios" unicode="" d="M821.235026 351.984884c-1.287001 129.729651 105.791442 191.891776 110.553344 194.980577-60.102924 88.030835-153.796561 100.12864-187.258574 101.54434-79.794032 7.979403-155.598362-46.975519-196.010178-46.975519-40.411816 0-102.831341 45.688518-168.983167 44.530218-86.872534-1.287001-167.052666-50.57912-211.840284-128.442651-90.347436-156.756662-23.166009-388.931554 64.864826-515.958505 42.985817-62.162125 94.337137-132.046252 161.647264-129.600951 64.864826 2.574001 89.317835 41.956217 167.696167 41.956217s100.38604-41.956217 169.111867-40.669216c69.755428 1.287001 114.028245 63.449125 156.756662 125.86865 49.42082 72.200729 69.755428 142.084856 70.913728 145.559758C957.14228 145.550002 822.522026 197.030023 821.235026 351.984884L821.235026 351.984884 821.235026 351.984884zM692.277575 732.550935c35.778614 43.371917 59.845524 103.474841 53.281821 163.449065-51.48002-2.059201-113.899545-34.234214-150.83646-77.477431C561.647023 780.041254 532.560811 718.78003 540.411514 660.092806 597.811737 655.588305 656.49896 689.307718 692.277575 732.550935L692.277575 732.550935 692.277575 732.550935z" horiz-adv-x="1084" /> + + + <glyph glyph-name="at" unicode="" d="M514.162246 831.556269c-246.201331 0-446.51045-200.783932-446.51045-447.571618 0-246.772336 201.037712-447.539896 448.157973-447.539896 50.29857 0 99.615788 8.224312 146.523121 24.436552 18.414395 6.370081 31.060413 12.423961 31.472805 12.630668 7.194866 3.217275 12.614296 9.049097 15.213493 16.401552 2.63092 7.305383 2.155083 15.133675-1.299599 22.043039l-2.883677 5.831822c-7.131421 14.262842-24.974811 20.569478-40.156582 13.850449-0.031722-0.031722-5.8001-3.02694-20.094664-8.082072-41.075511-14.627139-84.21196-22.059412-128.235616-22.059412-210.92592 0-382.487298 171.57775-382.487298 382.487298S305.423131 766.487298 516.349051 766.487298c210.894198 0 382.455575-171.5931 382.455575-382.423853-0.887206-51.868321-13.882172-100.486622-36.606733-136.855948-20.664645-33.104979-46.939055-51.994188-72.199369-51.994188-0.317225 0-0.601704 0-0.887206 0-45.829791 0.792039-75.433016 68.586075-75.433016 172.718737l0 185.269587c0 5.53097-1.426489 9.635451-4.373611 12.550851-4.944616 4.944616-12.360516 4.817726-21.267373 4.864798l-2.472308-0.016373-9.223059 0.016373c-7.701402-0.031722-13.469779 0.063445-17.495466-3.945869-3.645017-3.613294-4.119831-9.096169-4.119831-13.469779l0-31.060413c-45.196365 36.100196-80.440054 59.474556-131.9758 60.378136-1.045819 0.016373-2.059915 0.031722-3.074012 0.031722-108.74368 0-198.470237-99.218746-200.657043-222.779899-2.155083-124.701117 84.845387-227.723491 193.969737-229.625818 1.045819-0.01535 2.059915-0.031722 3.074012-0.031722 63.293535 0 122.276904 34.087353 159.992901 92.103698 24.373107-60.251246 61.519122-91.216491 110.48637-92.071975 0.697895-0.01535 1.394766-0.01535 2.060939-0.01535 33.945113 0 66.716494 14.610766 94.924953 42.328038 47.63695 46.796816 76.066443 124.796284 76.066443 208.643947l0 2.883677C959.595154 630.772336 759.761873 831.556269 514.162246 831.556269zM646.73975 354.651578c0-92.230588-58.475809-167.282934-130.390699-167.282934s-130.390699 75.052347-130.390699 167.282934c0 92.246961 58.475809 167.298284 130.390699 167.298284S646.73975 446.897515 646.73975 354.651578z" horiz-adv-x="1024" /> + + + <glyph glyph-name="fire" unicode="" d="M890.059904 352.19948999999997C845.890699 458.956706 840.554889 548.4951550000001 857.396326 618.42714 859.144623 625.686731 860.991676 631.9776790000001 862.858846 637.425182 863.763607 640.064841 865.906573 645.659889 866.16406 646.532651L880.890349 696.448108 833.062903 675.9309969999999C832.106692 675.5208 830.618069 674.894716 827.426684 673.550492 824.667648 672.380966 822.310677 671.354022 819.868514 670.244809 813.291441 667.2575449999999 807.049466 664.090938 800.697749 660.4128450000001 784.089623 650.795565 768.486253 638.656896 753.86285 623.033596 727.630498 595.007563 706.526618 557.766355 691.78157 509.713231 675.041103 455.157161 671.516484 411.46006 673.004574 347.939834 673.477918 327.73476900000003 673.463923 322.197583 672.83965 318.324215 673.779618 324.156339 684.455526 333.67819899999995 696.104608 329.19567600000005 693.056849 330.36844199999996 685.695898 339.012828 676.314007 361.368339 660.550914 398.92921 646.834249 460.170272 636.817284 549.350468 625.445924 650.588768 630.103925 734.7280519999999 644.646978 801.338628 647.677924 815.221065 650.899934 827.082435 654.086773 836.904609 655.91465 842.538316 657.254607 846.094657 657.880284 847.554385L678.645286 896 628.243642 880.578031C617.409833 877.263087 599.94569 869.52239 578.105438 855.845223 542.547644 833.577626 507.199569 802.385036 474.400401 760.836776 447.596676 726.883228 423.611383 687.30061 403.118547 641.7016189999999 378.907516 587.829195 363.003277 542.798944 353.158029 503.238462 349.274261 487.632585 346.433259 473.323627 344.1945 458.925156 343.334411 453.39353 342.592734 448.063234 341.804612 441.911844 341.502524 439.553997 340.356619 430.329551 340.073506 428.145504 337.596047 409.033293 335.848224 404.35337 329.235273 398.312868 336.081933 404.566848 343.232634 404.098227 346.608002 402.086756 344.852318 403.133013 341.598345 406.493651 337.991853 411.887149 327.030897 428.279226 317.980358 454.883162 313.690598 489.339595 311.250185 508.941598 310.203772 539.08627 310.370048 576.545325 310.480474 601.422138 311.113088 628.122479 312.099068 654.977888 312.481453 665.393013 312.891081 675.105466 313.30045 683.8491750000001 313.545346 689.079919 313.735044 692.813105 313.84201 694.783403L317.55517 763.179488 271.360516 712.604139C270.467691 711.626645 268.852992 709.837042 266.618705 707.326295 262.927895 703.178805 258.823678 698.493751 254.407949 693.3614689999999 241.78797 678.693606 229.164348 663.340425 217.341267 648.004036 211.724185 640.717803 206.411389 633.591345 201.450577 626.6638379999999 176.017063 591.147305 156.617347 555.4025280000001 138.122768 512.155497 90.841957 401.595812 76.97672 299.64870599999995 99.261816 188.13489300000003 126.80821 50.29373899999996 188.553235-37.64422200000001 278.8297-84.690336 344.19104-118.75233700000001 408.837235-128 507.940695-128 525.713007-128 557.977207-125.567138 590.857378-120.46215900000004 641.152493-112.65333099999998 687.496192-99.78932299999997 726.063273-80.59104400000001 738.155853-74.57148800000004 743.07901-59.88870199999997 737.059454-47.79612199999997 731.039898-35.70354299999997 716.357111-30.780384000000026 704.264531-36.79993999999999 670.855859-53.43041900000003 629.092954-65.02289699999994 583.352478-72.12456999999995 552.984316-76.83953499999996 523.228215-79.08327499999996 507.940695-79.08327499999996 416.16215-79.08327499999996 357.934257-70.75375399999996 301.436271-41.310745999999995 224.830174-1.3887230000000272 171.977796 73.88423 147.230072 197.72094500000003 126.99711 298.965952 139.514783 391.004811 183.099329 492.921284 200.282663 533.1021499999999 218.020237 565.784358 241.22153 598.183718 245.831691 604.6215589999999 250.802959 611.289899 256.082244 618.137961 267.31885 632.713596 279.402035 647.409487 291.488864 661.457681 298.732051 669.8762429999999 304.338773 676.1767130000001 307.478705 679.614406L264.997214 697.435142C264.883874 695.347445 264.688038 691.493511 264.43725 686.13688 264.020474 677.234965 263.603959 667.359281 263.215279 656.7726250000001 262.21142 629.430212 261.566827 602.224414 261.453805 576.7624579999999 261.278897 537.3588179999999 262.385015 505.49418 265.148621 483.296209 276.058157 395.668083 322.627019 326.024497 362.226031 362.19561799999997 379.341732 377.829698 384.756649 392.328523 388.584361 421.857186 397.932742 493.974714 407.332926 531.746825 447.736538 621.64966 466.587287 663.594818 488.484326 699.731218 512.795234 730.526996 542.034492 767.565749 573.156162 795.028785 604.068111 814.386984 614.696751 821.043029 624.472062 826.201428 633.124687 830.036563 638.02329 832.207788 641.258688 833.404991 642.556233 833.802016L612.91959 866.825663C608.658554 856.884484 602.686705 838.478616 596.856038 811.772799 581.186705 740.003594 576.231674 650.498985 588.206246 543.890345 607.295279 373.94226100000003 638.819345 298.82556999999997 678.537329 283.542234 701.302332 274.78234499999996 717.731637 289.43566899999996 721.133156 310.5407 722.475759 318.870999 722.489387 324.26340300000004 721.907881 349.08549100000005 720.532565 407.791853 723.691247 446.952173 738.546223 495.36355 751.151827 536.44438 768.544047 567.135763 789.576147 589.605967 809.230566 610.60429 821.725461 617.839716 852.347733 630.9761169999999L842.705318 653.453557 819.246577 660.374464C822.235501 670.505564 813.450321 644.87463 809.839253 629.8801189999999 790.647573 550.1890470000001 796.611315 450.1135 844.8591 333.498332 883.105728 241.056017 874.587669 126.06492400000002 824.002925 61.39712899999995 815.680378 50.75754500000005 817.558709 35.38570000000004 828.198295 27.063153000000057 838.837879 18.740607999999952 854.209724 20.618939999999952 862.532269 31.258523999999966 924.762731 110.81426299999998 934.658528 244.404363 890.059904 352.19948999999997Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="set" unicode="" d="M466.496-126.62400000000002l-1.056 0.064c-25.184 2.08-47.456 22.368-51.744 47.232l-17.344 102.4c-0.672 4.064-6.624 11.04-10.56 12.416l-30.336 12.416c-5.44 2.496-15.424 0.8-17.472-0.64l-84.992-60.16c-19.584-14.016-51.456-12.736-70.08 3.168l-64.288 64c-17.952 20.48-19.488 50.592-4.736 71.296l60.416 84.672c2.176 3.072 2.784 11.52 1.024 15.04l0 0c0 0-1.664 3.104-7.264 16.608-6.176 14.848-6.816 17.44-6.816 17.44-0.992 3.04-7.456 8.672-11.36 9.376l-102.56 17.248c-25.152 4.288-45.44 26.624-47.168 52L0 428.288c2.112 27.36 22.496 49.6 47.52 53.728l102.528 17.344c4.128 0.672 11.008 6.56 12.416 10.496l12.608 30.336c2.368 4.992 1.6 14.112-0.8 17.504L113.984 642.24C99.36 662.88 100.704 692.896 117.056 712.192l64.416 64.224c20.672 18.208 51.296 18.784 71.36 4.64l84.992-60.16c1.952-1.376 13.28-2.016 15.04-1.056 0.384 0.192 2.528 1.344 16.704 7.168 14.24 5.92 16.576 6.592 16.576 6.592 3.84 1.184 9.504 7.648 10.144 11.424l17.44 102.4c4.32 25.152 26.752 45.376 52.128 47.104l90.528 0.064c27.328-2.112 49.632-22.368 53.952-47.232l17.344-102.432c0.672-4.064 6.656-11.04 10.624-12.48l30.304-12.352c6.24-2.784 15.456-0.8 17.44 0.608l85.024 60.16c19.52 14.016 51.392 12.704 70.08-3.136l64.288-64.032c17.952-20.48 19.456-50.56 4.736-71.264l-60.416-84.672c-2.208-3.136-2.848-11.616-1.056-15.04 0.16-0.352 1.376-2.56 7.232-16.672 5.856-14.112 6.592-16.512 6.592-16.512 1.248-4.032 7.712-9.6 11.648-10.304l102.56-17.248c25.152-4.224 45.44-26.592 47.168-52l0.096-90.304c-2.112-27.392-22.528-49.6-47.552-53.728l-102.528-17.376c-4.128-0.672-10.944-6.496-12.32-10.432l-12.736-30.432c-2.336-4.928-1.568-14.112 0.832-17.472l60.288-84.512c14.624-20.736 13.216-50.816-3.232-70.048l-64.192-64.096c-11.328-9.92-24.64-14.72-38.784-14.72l0 0c-11.904 0-23.52 3.552-32.704 10.016l-84.992 60.16c-1.952 1.408-13.312 2.016-15.072 1.056-0.288-0.16-2.432-1.312-16.608-7.2-14.08-5.792-16.384-6.496-16.384-6.496-4.16-1.28-9.792-7.776-10.432-11.52l-17.408-102.4c-4.352-25.152-26.72-45.344-52.032-47.104L466.496-126.62400000000002zM347.84 100.60799999999995c10.368 0 20.192-2.112 28.48-6.112l27.648-11.296c20.416-7.072 38.976-28.992 42.848-51.584l17.344-102.336c0.288-1.6 3.136-4.32 5.056-4.832l87.296 0.064c-0.032 0.064 3.04 2.944 3.328 4.672l17.408 102.368c3.872 22.656 23.328 44.832 45.28 51.584 0 0 0 0 0 0-0.096 0 2.976 1.152 12.448 5.056 9.472 3.936 12.384 5.248 13.12 5.568 18.208 9.6 49.44 8.032 67.776-4.96l84.928-60.16c0.192-0.128 1.312-0.64 3.104-0.64l0 0c2.048 0 3.52 0.672 3.872 0.96l61.536 61.408 0 0c-0.16 0 0.064 4.416-0.992 5.952l-60.224 84.448c-13.248 18.624-15.68 47.168-5.792 67.872l11.648 27.84c6.944 19.968 29.408 38.912 51.68 42.496l102.464 17.376c1.824 0.384 4.736 3.648 4.864 5.408L972.8 428.288l0 0c-0.096 0-2.88 3.072-4.576 3.424l-102.72 17.28c-23.168 4.032-44.896 22.976-51.776 45.056l0 0c-0.032 0-1.216 3.04-5.12 12.512-3.968 9.568-5.28 12.512-5.632 13.248-10.24 19.36-8.288 48.736 4.96 67.456L868.448 672c0.96 1.408 0.736 5.6-0.384 6.912l-61.408 61.184c0.704-0.8-0.768-0.192-2.848-0.192-1.728 0-2.784-0.416-3.008-0.576l-85.024-60.16c-17.824-12.8-47.776-15.36-68-5.664l-27.712 11.296c-20.512 7.2-39.04 29.088-42.88 51.584l-17.344 102.336c-0.288 1.76-3.616 4.704-5.504 4.864L467.616 843.52c0-0.064-3.104-2.944-3.392-4.672l-17.408-102.336c-3.84-22.624-23.264-44.8-45.216-51.584 0-0.032-3.008-1.184-12.416-5.088-9.568-3.936-12.512-5.248-13.248-5.568-17.984-9.568-49.344-8.032-67.744 4.992L223.264 739.36c-0.416 0.32-6.176 0.288-6.848-0.224L154.688 677.6320000000001c0 0 0 0 0 0 0.224 0 0.032-4.384 1.056-5.856L216 587.264c13.312-18.752 15.744-47.296 5.76-67.968l-11.52-27.648c-6.976-20.032-29.472-38.944-51.776-42.624L55.968 431.68c-1.824-0.384-4.704-3.648-4.832-5.408l0.096-86.56 0 0c0.096 0 2.912-3.104 4.608-3.424l102.656-17.28c23.04-4 44.704-22.912 51.712-44.928 0.256-0.736 1.44-3.84 5.088-12.64 3.68-8.832 5.024-11.84 5.472-12.736 10.592-20.288 8.672-48.96-4.672-67.904l-60.512-84.768c-0.96-1.408-0.736-5.632 0.384-6.912l61.408-61.184c-0.736 0.8 0.736 0.224 2.816 0.192 1.728 0 2.784 0.416 3.008 0.576l84.992 60.16C318.624 96.32000000000005 333.088 100.60799999999995 347.84 100.60799999999995zM512.032 133.856c-138.336 0-250.848 112.224-250.848 250.176 0 137.92 112.544 250.144 250.848 250.144s250.848-112.224 250.848-250.144C762.88 246.08000000000004 650.336 133.856 512.032 133.856zM512.032 583.136c-110.08 0-199.648-89.312-199.648-199.104s89.568-199.136 199.648-199.136 199.648 89.344 199.648 199.136S622.112 583.136 512.032 583.136z" horiz-adv-x="1024" /> + + + <glyph glyph-name="fonts-u" unicode="" d="M0-49.23076900000001L945.230769-49.23076900000001 945.230769-128 0-128 0-49.23076900000001ZM0 896L407.076943 896 407.076943 834.065644 319.153861 827.872177 299.076923 809.911217 299.076923 365.841959C299.076923 281.19796199999996 317.076716 220.709337 353.076933 184.37435100000005 389.077071 148.03936499999998 448.153442 129.87210800000003 530.307702 129.87210800000003 606.000364 129.87210800000003 660.807522 149.17482299999995 694.730752 187.78072599999996 728.653982 226.38662899999997 745.61536 289.66226700000004 745.61536 377.60953099999995L745.61536 804.956475 724.153817 826.633531 633.461524 834.065644 633.461524 896 955.384596 896 955.384596 834.065644 868.846119 826.633531 849.461563 804.956475 849.461563 364.60331299999996C849.461563 246.92743900000005 819.923338 161.66533900000002 760.846178 108.81441500000005 701.76894 55.96348999999998 606.462188 29.53846199999998 474.923087 29.53846199999998 406.153531 29.53846199999998 345.807951 38.51886300000001 293.884613 56.47990200000004 241.961275 74.44093999999996 201.230887 100.143419 171.692347 133.58820400000002 149.076834 160.01362700000004 133.038474 190.25793999999996 123.57695 224.32200899999998 114.115348 258.386078 109.384625 307.21047599999997 109.384625 370.796702L109.384625 809.911217 89.307687 827.872177 0 834.065644 0 896Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="triangle-d" unicode="" d="M773.128299 88.65234199999998M889.696178 575.195553L158.862147 575.195553 524.357446 209.64704300000005 889.696178 575.195553Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="tips" unicode="" d="M967.280184 578.537671c-24.915459 58.887178-60.544935 111.76755-105.96745 157.161413-45.393863 45.393863-98.273211 81.051991-157.160389 105.96745-60.988026 25.803689-125.735679 38.853913-192.494129 38.853913-66.729797 0-131.504056-13.0799-192.494129-38.853913-58.887178-24.916483-111.766526-60.544935-157.160389-105.96745-45.393863-45.393863-81.051991-98.274234-105.96745-157.161413-25.803689-60.988026-38.884612-125.734656-38.884612-192.464453s13.0799-131.50508 38.884612-192.464453c24.915459-58.887178 60.544935-111.737874 105.96745-157.161413 45.393863-45.393863 98.273211-81.051991 157.160389-105.96745 60.988026-25.803689 125.735679-38.853913 192.494129-38.853913 66.729797 0 131.504056 13.0799 192.494129 38.853913 58.887178 24.916483 111.766526 60.544935 157.160389 105.96745 45.393863 45.393863 81.051991 98.274234 105.96745 157.161413 25.803689 60.988026 38.853913 125.734656 38.853913 192.464453S993.084896 517.549645 967.280184 578.537671zM511.687892-55.138552000000004c-243.302305 0-441.241446 197.909465-441.241446 441.21177S268.385587 827.284989 511.687892 827.284989c243.273652-0.029676 441.210747-197.938118 441.210747-441.21177S754.990197-55.138552000000004 511.687892-55.138552000000004zM511.657192 573.565427m-45.511543 0a44.475 44.475 0 1 1 91.023086 0 44.475 44.475 0 1 1-91.023086 0ZM542.729885 184.14011300000004c0-17.162892-13.906731-31.071669-31.070646-31.071669l0 0c-17.163915 0-31.070646 13.907755-31.070646 31.071669L480.588593 426.998303c0 17.162892 13.906731 31.071669 31.070646 31.071669l0 0c17.163915 0 31.070646-13.907755 31.070646-31.071669L542.729885 184.14011300000004z" horiz-adv-x="1024" /> + + + <glyph glyph-name="picture" unicode="" d="M765.376 615.424c0 0 103.04 1.024 103.04-100.992 0 0 9.536-98.752-103.04-100.928 0 0-100.864-2.176-99.84 100.928C665.536 514.496 664.448 605.8879999999999 765.376 615.424ZM968.32 770.56c0 0 54.208-4.224 54.208-52.032l0-712.832c0 0-3.2-51.008-54.208-52.096L968.32 770.56ZM1.472 5.631999999999948c0 0 2.176-52.096 52.096-52.096L968.32-46.464000000000055l0 150.848-99.712 0-203.072 206.144-153.024-153.984L304.32 413.568l-205.056-307.072-45.632-1.024L52.48 718.4639999999999 1.472 718.4639999999999 1.472 5.631999999999948ZM968.32 770.56L53.568 770.56c0 0-52.096 1.088-52.096-52.032L968.32 718.528 968.32 770.56Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="more-vertical" unicode="" d="M511.998465 623.681848c40.525995 0 73.386404 35.771715 73.386404 79.892585s-32.860409 79.892585-73.386404 79.892585c-40.524972 0-73.384357-35.771715-73.384357-79.892585S471.47247 623.681848 511.998465 623.681848L511.998465 623.681848zM511.998465 463.893608c-40.524972 0-73.384357-35.772738-73.384357-79.893608 0-44.12087 32.859385-79.892585 73.384357-79.892585 40.525995 0 73.386404 35.772738 73.386404 79.892585C585.384869 428.12087 552.52446 463.893608 511.998465 463.893608L511.998465 463.893608zM511.998465 144.320199c-40.524972 0-73.384357-35.733852-73.384357-79.894631 0-44.119847 32.859385-79.893608 73.384357-79.893608 40.525995 0 73.386404 35.772738 73.386404 79.893608C585.383846 108.58634600000005 552.52446 144.320199 511.998465 144.320199L511.998465 144.320199z" horiz-adv-x="1024" /> + + + <glyph glyph-name="bluetooth" unicode="" d="M844.799642 221.19607699999995L538.533306 374.84141l307.696917 177.029926c10.583033 5.006014 17.398252 15.59621 17.569144 27.302833s-6.332219 22.491247-16.764825 27.804253L475.584626 830.045869c-9.517771 4.846378-20.869307 4.39817-29.974685-1.181919-9.105379-5.581112-14.656815-15.493879-14.656815-26.174126l0-288.760636L210.662931 699.284733c-12.974499 10.915607-32.339546 9.248641-43.255153-3.724835-10.915607-12.973476-9.248641-32.339546 3.724835-43.255153L430.953126 433.687656l0-102.83511L171.558307 120.428046c-13.166881-10.68127-15.181771-30.013571-4.500501-43.180452 6.068206-7.480368 14.924921-11.360745 23.859407-11.360745 6.794753 0 13.634532 2.245134 19.322068 6.859221l220.714867 179.046862 0-283.065937c0-10.689457 5.561669-20.61041 14.680351-26.188452 4.903683-2.99931 10.455119-4.510734 16.019859-4.510734 4.78498 0 9.580193 1.118474 13.980409 3.368724l371.449917 224.085638c10.664897 5.456269 17.182334 16.618493 16.691147 28.589129C863.284645 206.04091200000005 855.875908 216.63110800000004 844.799642 221.19607699999995zM763.458055 580.639542L492.351498 420.917818l0 21.60711c0.563842 3.368724 0.558725 6.801916 0 10.153244L492.351498 752.604102 763.458055 580.639542zM492.351498 18.915047999999956L492.351498 311.51001199999996c0.558725 3.347235 0.562818 6.777357 0 10.146081l0 5.809309 267.472797-137.65822L492.351498 18.915047999999956z" horiz-adv-x="1024" /> + + + <glyph glyph-name="flag" unicode="" d="M878.368178 798.272211c-11.363815 4.799306-24.470321 2.360767-33.31578-6.245238-0.36532-0.350994-37.162388-35.304064-95.163383-56.05262-75.462692-26.993794-150.763702-18.409279-223.812415 25.517163-38.347376 23.060205-81.875752 40.665165-129.376603 52.327786-37.582967 9.228175-77.742619 14.777565-119.363552 16.496719-70.805626 2.925632-121.493052-6.224772-123.615389-6.615675-14.56574-2.682086-25.140587-15.380292-25.140587-30.191626L128.58047-31.312913999999978c0-16.954137 13.745049-30.699186 30.699186-30.699186s30.699186 13.745049 30.699186 30.699186L189.978842 266.68306099999995c15.562441 5.250584 47.994084 14.447037 91.40171 17.48728 35.985586 2.51938 72.440869 0.378623 108.35073-6.363941 44.847417-8.420787 89.059362-24.102954 131.409912-46.611597 46.26879-24.591071 93.776803-41.069371 141.203976-48.977481 38.270629-6.380314 76.541257-7.219425 113.740484-2.491751 64.277956 8.16803 103.877859 30.461779 105.532545 31.406291 9.56689 5.464455 15.471366 15.637142 15.471366 26.656103L897.089565 769.958352C897.091612 782.298402 889.73711 793.470859 878.368178 798.272211zM835.69324 257.496841c-14.58416-5.755074-38.82526-13.530155-70.319555-17.225313-30.990828-3.635807-62.940494-2.676969-94.952582 2.851954-40.201607 6.943133-80.731696 21.171182-120.464629 42.289152-48.455595 25.753547-99.208513 43.61945-150.848637 53.101405-29.29214 5.378497-58.896388 8.079002-88.407516 8.079002-12.228509 0-24.443715-0.464581-36.609803-1.39272-34.879392-2.663666-63.618946-8.741082-84.111676-14.355963L189.978842 766.569162c19.971867 2.003634 50.446949 3.910053 86.392626 2.334161 58.186214-2.554172 143.250588-15.041578 218.064504-60.029188 61.32674-36.877909 119.196753-49.491181 169.691797-49.488111 42.293245 0.002047 79.416747 8.854669 109.019972 19.711947 24.269753 8.901741 45.327348 19.747763 62.544475 30.179346L835.692217 257.496841z" horiz-adv-x="1024" /> + + + <glyph glyph-name="loading" unicode="" d="M511.999488 756.654348m-70.608128 0a69 69 0 1 1 141.216255 0 69 69 0 1 1-141.216255 0ZM236.047576 639.997442m-68.561515 0a67 67 0 1 1 137.123031 0 67 67 0 1 1-137.123031 0ZM125.530506 382.12428m-62.421678 0a61 61 0 1 1 124.843356 0 61 61 0 1 1-124.843356 0ZM227.861126 100.71507499999996m-54.235229 0a53 53 0 1 1 108.470457 0 53 53 0 1 1-108.470457 0ZM514.166851-16.84438799999998m-47.192835 0a46.118 46.118 0 1 1 94.385671 0 46.118 46.118 0 1 1-94.385671 0ZM804.730553 91.450061m-33.834596 0a33.064 33.064 0 1 1 67.669192 0 33.064 33.064 0 1 1-67.669192 0ZM935.55411 383.395226m-23.969924 0a23.424 23.424 0 1 1 47.939849 0 23.424 23.424 0 1 1-47.939849 0ZM856.723717 634.80007m-17.135262 0a16.745 16.745 0 1 1 34.270525 0 16.745 16.745 0 1 1-34.270525 0Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="fonts-i" unicode="" d="M897.948 834.255l0-64.322-128.65 0L447.674-1.9329999999999927l128.65 0 0-64.32L126.052-66.25300000000004l0 64.32 128.65 0 321.622 771.866-128.65 0L447.674 834.255 897.948 834.255z" horiz-adv-x="1024" /> + + + <glyph glyph-name="refresh-1" unicode="" d="M688.146 736l-192 128v-256l192 128.001zM496.146 767.7090000000001c-231.174-8.416-416-198.479-416-431.709 0-238.587 193.413-432 432-432 233.23 0 423.293 184.826 431.709 416h-64.05c-8.377-195.817-169.778-352-367.658-352-203.241 0-368 164.759-368 368 0 197.88 156.183 359.282 352 367.658v64.051z" horiz-adv-x="1024" /> + + + <glyph glyph-name="rmb" unicode="" d="M511.998465 896C229.23338 896 0.004605 666.769178 0.004605 384.001023c0-282.773272 229.227752-512.001023 511.99386-512.001023 282.769178 0 511.994883 229.227752 511.994883 512.001023C1023.994372 666.769178 794.767644 896 511.998465 896zM511.998465-91.59690499999999c-262.660188 0-475.589742 212.930577-475.589742 475.597929 0 262.663258 212.929554 475.594859 475.589742 475.594859 262.663258 0 475.590765-212.9316 475.590765-475.594859C987.590254 121.33469500000001 774.662747-91.59690499999999 511.998465-91.59690499999999zM738.742652 301.137781L544.432155 301.137781l0 69.780273 194.310497 0c17.835204 0 32.249495 14.43885 32.249495 32.220842 0 17.784038-14.414291 32.19526-32.249495 32.19526L589.7462 435.334155l149.620669 209.579249c8.916067 15.397688 3.63069 35.099403-11.82021 43.988864-15.398712 8.891508-35.097356 3.629667-44.017516-11.793604L512.187777 437.098335 340.84334 677.108664c-8.864902 15.423271-28.617781 20.685111-44.016493 11.793604-15.395642-8.889461-20.685111-28.590152-11.82021-43.988864l149.622716-209.579249L285.628808 435.334155c-17.781992 0-32.245402-14.411221-32.245402-32.19526 0-17.781992 14.46341-32.220842 32.245402-32.220842l194.310497 0 0-69.780273L285.628808 301.137781c-17.781992 0-32.245402-14.413268-32.245402-32.19526s14.46341-32.220842 32.245402-32.220842l194.310497 0 0-132.435265c0-17.780969 14.46341-32.19526 32.248472-32.19526 17.835204 0 32.245402 14.414291 32.245402 32.19526L544.433178 236.72065499999997l194.310497 0c17.835204 0 32.249495 14.43885 32.249495 32.220842S756.577856 301.137781 738.742652 301.137781" horiz-adv-x="1024" /> + + + <glyph glyph-name="addition" unicode="" d="M544 768L480 768 480 416 128 416 128 352 480 352 480 0 544 0 544 352 895.936 352 895.936 416 544 416Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="home" unicode="" d="M824.084343-40.42033900000001H232.898863c-74.604138 0-85.85232 28.334325-85.852321 49.997718l-0.584307 5.314029V447.645552h48.806589v-402.916582c0-25.547863 13.548574-36.343743 37.629015-36.343743h568.020898c25.928532 0 27.978215 6.220678 27.978215 37.84391V447.585177l48.806589 0.118704c0.022513-14.346753 0-382.76666 0-433.098999 0-38.130436-12.726859-54.765301-51.858088-54.765301l-1.76111-0.25992zM1012.470921 493.103884C849.773422 615.120868 687.101505 737.137853 524.404006 859.153814c-6.207375 4.659113-18.433838 4.659113-24.641213 0C337.077573 737.137853 174.393377 615.120868 11.696902 493.103884c-24.856108-18.635429-0.572028-61.044308 24.642236-42.13361A15995638.709915 15995638.709915 0 0 1 512.025071 807.737794c0.988514-0.715291 1.644453-1.144056 2.823302-2.037403 18.040888-13.524015 36.057217-27.036773 54.073546-40.560788 58.291614-43.718711 116.583229-87.437421 174.874843-131.143852 81.33647-61.008492 162.696476-122.015961 244.033969-183.024454 25.212218-18.911722 49.496298 23.497157 24.64019 42.132587z" horiz-adv-x="1024" /> + + + <glyph glyph-name="time" unicode="" d="M511.98464 829.44c-118.97856 0-230.83008-46.35136-314.95168-130.4832C112.90624 614.84032 66.56 502.95808 66.56 384.00512c0-118.9632 46.34624-230.84544 130.47296-314.9568C281.15456-15.093759999999975 393.00608-61.440000000000055 511.98464-61.440000000000055c118.98368 0 230.84032 46.34624 314.9824 130.48832C911.09376 153.15967999999998 957.44 265.02144 957.44 384.00512c0 118.97856-46.34624 230.8352-130.47296 314.95168C742.82496 783.0886399999999 630.96832 829.44 511.98464 829.44z m275.58912-721.02912c-73.61024-73.63584-171.47904-114.18624-275.58912-114.18624s-201.97376 40.5504-275.57888 114.18624c-73.63584 73.61024-114.16064 171.47904-114.16064 275.59424 0 104.11008 40.54528 201.97376 114.18112 275.58912 73.60512 73.63072 171.47392 114.176 275.584 114.176s201.97376-40.54528 275.584-114.176c73.63584-73.61536 114.18112-171.47904 114.18112-275.58912 0-104.1152-40.56576-201.984-114.2016-275.59424zM519.1168 340.20863999999995V628.08064a27.8528 27.8528 0 0 1-27.84256 27.84768 27.8528 27.8528 0 0 1-27.84256-27.84768v-306.23232a27.81184 27.81184 0 0 1 16.88064-25.58976M734.70464 321.84831999999994a31.0784 31.0784 0 0 0-31.07328-31.0784H496.44544a31.08864 31.08864 0 0 0-31.07328 31.0784 31.09376 31.09376 0 0 0 31.07328 31.0784h207.18592a31.08864 31.08864 0 0 0 31.07328-31.0784z" horiz-adv-x="1024" /> + + + <glyph glyph-name="user" unicode="" d="M611.2 342.4c70.4 54.4 115.2 140.8 115.2 230.4 0 156.8-128 288-284.8 288s-284.8-128-284.8-284.8c0-92.8 44.8-182.4 115.2-236.8C108.8 272 0 105.60000000000002 0-80c0-9.6 9.6-19.2 19.2-19.2h848c9.6 0 19.2 9.6 19.2 19.2 0 188.8-112 355.2-275.2 422.4z m-576-396.8C44.8 115.20000000000005 156.8 268.79999999999995 320 320c6.4 3.2 12.8 9.6 12.8 16s-3.2 16-9.6 19.2c-76.8 41.6-128 131.2-128 224 0 134.4 112 246.4 246.4 246.4s246.4-112 246.4-249.6c0-89.6-51.2-176-128-220.8-6.4-3.2-9.6-9.6-9.6-19.2 0-6.4 6.4-12.8 12.8-16 160-51.2 275.2-204.8 281.6-377.6H35.2zM812.8 361.6c54.4 41.6 86.4 108.8 86.4 176 0 89.6-54.4 172.8-134.4 208-9.6 3.2-22.4 0-25.6-9.6-3.2-9.6 0-22.4 9.6-25.6 67.2-28.8 112-99.2 112-172.8 0-67.2-38.4-131.2-96-163.2-6.4-3.2-9.6-9.6-9.6-19.2 0-6.4 6.4-12.8 12.8-16 131.2-41.6 217.6-160 217.6-297.6 0-9.6 9.6-19.2 19.2-19.2s19.2 9.6 19.2 19.2c-3.2 140.8-86.4 262.4-211.2 320z" horiz-adv-x="1024" /> + + + <glyph glyph-name="notice" unicode="" d="M544 798.976V864h-64v-65.024C289.536 786.304 160 658.624 160 416v-288h64V416c0 192 115.456 320 288 320 180.544 0 288-128 288-320v-288h64V416c0 242.88-122.496 370.56-320 382.976zM672 64a160 160 0 1 0-320 0h64a96 96 0 0 1 192 0h64zM64 128h896v-64H64v64z" horiz-adv-x="1024" /> + + + <glyph glyph-name="chrome" unicode="" d="M515.436 583.685H914.285C840.842 730.955 688.748 832.132 513 832.132c-141.284 0-267.274-65.395-349.42-167.546l151.66-262.682c8.535 102.325 95.704 181.781 200.196 181.781zM514.218 550.803c-91.476 0-165.631-74.155-165.631-165.631s74.155-165.631 165.631-165.631c52.7 0 99.615 24.642 129.95 62.999l1.428 2.474 0.355-0.205c21.252 27.852 33.898 62.624 33.898 100.363 0 84.774-63.702 154.626-145.841 164.413l-6.393 0.632c-4.424 0.354-8.882 0.586-13.397 0.586zM929.561 549.585H627.443c52.209-36.066 86.506-96.297 86.506-164.413 0-45.547-18.268-81.598-41.12-121.192L483.898-63.257c9.624-0.617 19.322-0.966 29.102-0.966 247.521 0 448.177 200.656 448.177 448.177 0 58.508-11.225 114.391-31.616 165.631zM514.218 185.441c-83.583 0-144.927 54.804-185.034 124.651l-0.235-0.136-187.482 324.727C93.081 563.124 64.823 476.84 64.823 383.954c0-225.02 165.839-411.288 381.958-443.298l152.278 263.752c-25.769-12.143-54.518-18.967-84.841-18.967z" horiz-adv-x="1024" /> + + + <glyph glyph-name="edge" unicode="" d="M854.794 669.297C797.923 743.783 683.626 823.59 548.62 830.822 136.707 852.889 85.742 435.448 85.742 435.448c55.449 53.038 58.01 97.116 163.936 154.293C673.983 818.768 676.394 476.432 676.394 476.432H346.111c-7.232 65.092 62.681 137.417 62.681 137.417-202.509-98.844-216.974-284.477-216.974-284.477s-28.93-279.655 219.385-364.034 452.029 42.189 452.029 42.189V193.16c-59.065-32.546-102.292-54.405-153.087-63.887-361.623-67.503-364.034 188.044-364.034 188.044h585.83c0 0.001 39.075 199.761-77.147 351.98z" horiz-adv-x="1024" /> + + + <glyph glyph-name="login-weibo" unicode="" d="M411.270737 288.350316c-17.973895 7.504842-41.189053-0.229053-52.264421-17.542737-11.223579-17.394526-5.955368-38.103579 11.870316-46.201263 18.108632-8.232421 42.132211-0.417684 53.342316 17.421474C435.253895 260.05557899999997 429.446737 280.62989500000003 411.270737 288.350316zM455.545263 306.64757899999995c-6.885053 2.721684-15.508211-0.579368-19.550316-7.329684-3.920842-6.790737-1.751579-14.524632 5.146947-17.367579 7.019789-2.883368 16.006737 0.458105 20.048842 7.370105C465.071158 296.259368 462.551579 304.087579 455.545263 306.64757899999995zM427.52 426.684632c-115.968-11.439158-203.924211-82.216421-196.378947-158.073263 7.531789-75.910737 107.654737-128.161684 223.649684-116.749474 115.994947 11.439158 203.924211 82.216421 196.392421 158.140632C643.664842 385.859368 543.541895 438.110316 427.52 426.684632zM529.300211 247.70021099999997c-23.673263-53.355789-91.769263-81.798737-149.530947-63.232-55.754105 17.933474-79.373474 72.811789-54.945684 122.246737 23.956211 48.464842 86.352842 75.870316 141.541053 61.561263C523.506526 353.562947 552.663579 299.85684200000003 529.300211 247.70021099999997zM512 896C229.241263 896 0 666.772211 0 384c0-282.758737 229.241263-512 512-512 282.772211 0 512 229.241263 512 512C1024 666.772211 794.772211 896 512 896zM455.531789 101.02568399999996c-145.354105 0-293.941895 70.197895-293.941895 185.667368 0 60.362105 38.386526 130.182737 104.474947 196.069053 88.252632 87.929263 191.164632 127.986526 229.874526 89.397895 17.084632-17.003789 18.741895-46.457263 7.760842-81.623579-5.726316-17.690947 16.666947-7.895579 16.666947-7.936 71.343158 29.763368 133.564632 31.514947 156.321684-0.862316 12.139789-17.246316 10.954105-41.472-0.215579-69.510737-5.173895-12.921263 1.589895-14.928842 11.466105-17.879579 40.178526-12.422737 84.924632-42.455579 84.924632-95.380211C772.837053 211.36168399999997 646.090105 101.02568399999996 455.531789 101.02568399999996zM718.672842 468.197053c4.715789 14.457263 1.765053 30.962526-9.202526 43.061895-10.954105 12.072421-27.136 16.666947-42.037895 13.527579l0 0.026947c-12.463158-2.694737-24.724211 5.268211-27.392 17.664-2.667789 12.463158 5.281684 24.697263 17.744842 27.338105 30.531368 6.467368 63.595789-2.937263 85.989053-27.715368 22.447158-24.764632 28.456421-58.489263 18.849684-88.064-3.907368-12.099368-16.936421-18.728421-29.062737-14.848-12.139789 3.920842-18.782316 16.922947-14.874947 28.995368L718.672842 468.183579zM853.261474 424.865684c-0.013474-0.013474-0.013474-0.080842-0.013474-0.107789-4.567579-14.026105-19.712-21.706105-33.778526-17.165474-14.133895 4.554105-21.854316 19.590737-17.300211 33.670737l0 0.013474c13.999158 43.169684 5.12 92.429474-27.567158 128.565895-32.714105 36.122947-80.949895 49.92-125.507368 40.488421-14.484211-3.085474-28.752842 6.130526-31.838316 20.574316-3.098947 14.403368 6.144 28.631579 20.641684 31.717053l0.026947 0c62.625684 13.271579 130.519579-6.117053 176.545684-56.966737C860.483368 554.886737 872.892632 485.618526 853.261474 424.865684z" horiz-adv-x="1024" /> + + + <glyph glyph-name="voice" unicode="" d="M463.380164 644.0568969999999v-0.003069c-4.550643 4.549619-10.484795 7.02295-16.913205 7.02295s-12.365632-2.473331-16.915251-7.02295c-4.549619-4.551666-7.020904-10.485819-7.020904-16.914229s2.471284-12.365632 7.020904-16.915251c60.437487-60.438511 93.675496-140.756791 93.675496-226.222301 0-85.464487-33.238009-165.783791-93.675496-226.220255-4.549619-4.551666-7.020904-10.487865-7.020904-16.915252 0-6.429433 2.471284-12.365632 7.020904-16.914228 4.550643-4.549619 10.486842-7.02295 16.915251-7.02295s12.364609 2.473331 16.913205 7.02295c35.114752 35.116799 62.317301 76.06849 80.814584 121.668037 17.904789 44.018539 26.90579 90.608647 26.90579 138.384768s-9.101285 94.26799-26.90579 138.384767c-18.59552 45.697785-45.698808 86.550215-80.814584 121.667013zM781.892405 618.929614v-0.002047c-31.358195 77.452-77.550237 146.990772-137.098471 206.539007-4.550643 4.549619-10.485819 7.02295-16.915252 7.02295-6.42841 0-12.363585-2.473331-16.914228-7.02295-9.29776-9.299807-9.29776-24.531719 0-33.82948 54.997592-54.998615 97.631598-119.195729 126.613676-190.71153 27.993564-69.044516 42.237987-142.045133 42.237987-216.924541s-14.244422-147.882072-42.237987-216.923518c-28.982078-71.517847-71.616084-135.616724-126.613676-190.711529-9.29776-9.298783-9.29776-24.531719 0-33.82948 4.551666-4.551666 10.485819-7.02295 16.914228-7.02295 6.429433 0 12.366655 2.471284 16.915252 7.02295 59.547211 59.547211 105.740276 129.085984 137.098471 206.53696 30.369681 74.78117 45.699832 153.817248 45.699831 234.928591 0 81.111343-15.331173 160.146397-45.699831 234.927567zM299.474141 427.621497c-11.670807 11.573593-27.103288 18.004049-43.522236 18.004049-16.419971 0-31.852452-6.429433-43.52326-18.004049-11.57257-11.57257-18.003026-27.104311-18.003026-43.522236 0-16.420995 6.42841-31.851429 18.003026-43.52326 11.574616-11.57257 27.103288-18.003026 43.52326-18.003025s31.852452 6.429433 43.522236 18.003025c11.573593 11.573593 18.003026 27.104311 18.003025 43.52326 0 16.419971-6.427386 31.852452-18.003025 43.522236z" horiz-adv-x="1024" /> + + + <glyph glyph-name="upload-drag" unicode="" d="M666.931 445.918l-124.245 99.362c-7.221 5.639-16.428 9.042-26.429 9.042-9.963 0-19.136-3.376-26.438-9.047l-124.215-99.391c-9.615-7.772-15.713-19.565-15.713-32.782 0-9.946 3.453-19.084 9.223-26.284 13.828-17.359 41.51-20.465 58.918-6.505l56.252 45.022v-261.12c0-23.177 18.842-41.984 41.95-41.984s41.95 18.842 41.95 41.984v261.12l56.286-45.056c17.545-13.892 45.09-10.718 58.914 6.554 5.754 7.137 9.236 16.316 9.236 26.308 0 13.211-6.086 24.999-15.609 32.716zM235.827 142.95000000000005c-85.026 0-152.542 31.71-188.655 89.839-36.113 58.095-34.406 134.724 4.335 195.174 37.342 58.334 102.366 92.023 178.995 94.549-19.866 130.492 42.667 202.377 84.753 235.008 90.112 69.871 234.257 79.053 335.565 21.367 58.982-33.587 94.037-85.675 100.454-146.978 113.937 18.978 177.562-33.826 206.814-69.905 63.317-78.131 71.27-204.39 18.91-300.203-46.524-85.06-130.389-127.317-229.82-116.497-18.739 2.116-32.222 18.978-30.174 37.683s19.285 32.017 37.683 30.174c96.7-10.718 143.258 46.353 162.406 81.408 39.014 71.373 33.826 167.868-12.049 224.495-38.673 47.684-100.352 60.518-178.483 37.069-2.94-0.916-6.319-1.443-9.822-1.443-18.851 0-34.133 15.282-34.133 34.133 0 1.495 0.096 2.969 0.283 4.414 8.549 68.506-31.114 106.53-65.93 126.362-77.346 44.066-191.522 37.035-259.925-15.974-58.266-45.193-75.947-117.18-51.132-208.179 0.761-2.688 1.198-5.775 1.198-8.963 0-18.851-15.282-34.133-34.133-34.133-1.481 0-2.94 0.094-4.371 0.277-70.759 8.822-128.991-13.535-159.677-61.424-24.61-38.434-26.146-86.46-3.823-122.368 27.716-44.578 86.05-64.375 164.147-55.637 1.132 0.133 2.443 0.209 3.772 0.209 18.853 0 34.138-15.284 34.138-34.138 0-17.525-13.205-31.965-30.208-33.914-14.153-1.653-27.874-2.404-41.118-2.404z" horiz-adv-x="1024" /> + + + <glyph glyph-name="login-qq" unicode="" d="M512 896C229.227789 896 0 666.772211 0 384c0-282.745263 229.227789-512 512-512s512 229.254737 512 512C1024 666.772211 794.772211 896 512 896L512 896zM738.856421 258.93726300000003c0 0-16.208842-44.220632-45.945263-83.941053 0 0 53.126737-18.054737 48.64-64.983579 0 0 1.778526-52.345263-113.461895-48.734316 0 0-81.071158 6.319158-105.377684 40.609684l-21.423158 0c-24.306526-34.304-105.350737-40.609684-105.350737-40.609684-115.280842-3.610947-113.475368 48.734316-113.475368 48.734316-4.500211 46.928842 48.626526 64.983579 48.626526 64.983579-29.709474 39.720421-45.918316 83.941053-45.918316 83.941053-72.057263-116.439579-64.848842 16.249263-64.848842 16.249263 13.527579 78.524632 70.238316 129.967158 70.238316 129.967158-8.111158 71.316211 21.611789 83.941053 21.611789 83.941053C318.410105 709.712842 508.025263 705.859368 512 705.751579c3.988211 0.107789 193.576421 3.961263 199.828211-216.643368 0 0 29.709474-12.638316 21.611789-83.941053 0 0 56.737684-51.442526 70.238316-129.967158l0 0C803.678316 275.18652599999996 810.873263 142.49768400000005 738.856421 258.93726300000003L738.856421 258.93726300000003zM738.856421 258.93726300000003" horiz-adv-x="1024" /> + + + <glyph glyph-name="snowflake" unicode="" d="M480.695-64h63.725V59.291000000000054l68.854-68.242 44.945 44.546-113.798 112.79v180.02l177.271-102.44 41.67-155.652 60.725 16.284-25.398 94.872 85.259-49.266 31.87 55.246-84.726 48.961 94.497 25.343-16.495 61.622-156.068-41.855-176.934 102.245 177.667 102.667 155.513-41.709 16.274 60.793-94.78 25.418 85.255 49.264-31.869 55.247-84.733-48.965 25.326 94.594-61.557 16.51-41.817-156.206-176.948-102.251V644.461l113.849 113.951-44.459 44.496-69.392-69.454V832h-63.725v-97.935l-69.188 69.249-45.068-45.107 114.256-114.355V438.89l-156.557 90.469L283.45 684.39l-60.188-16.458 24.84-94.632-107.544 62.145-31.868-55.247 106.667-61.639-93.463-25.557 16.074-61.237 154.482 42.243 156.169-90.243-156.138-90.226-154.485 42.243-15.855-60.409 94.289-25.784-107.534-62.14 31.868-55.247 106.672 61.642-24.621-93.801 61.012-16.685 40.69 155.028 156.179 90.25v-180.455l-113.801-112.79 44.338-43.944 69.463 68.845V-64z" horiz-adv-x="1024" /> + + + <glyph glyph-name="heart" unicode="" d="M512 4.100000000000023c-108.9 0-447.3 277.5-447.3 522.2 0 131 106.6 237.6 237.6 237.6 94.9 0 174.8-50.2 209.7-76.1 34.9 25.9 114.8 76.1 209.7 76.1 131 0 237.6-106.6 237.6-237.6 0-244.7-338.4-522.2-447.3-522.2zM302.3 708c-100.2 0-181.7-81.5-181.7-181.7 0-221 326.8-466.3 391.4-466.3s391.4 245.3 391.4 466.3c0 100.2-81.5 181.7-181.7 181.7-103.9 0-190.2-76-191.1-76.8-10.6-9.5-26.7-9.5-37.3 0-0.8 0.8-87.7 76.8-191 76.8z" horiz-adv-x="1024" /> + + + <glyph glyph-name="logout" unicode="" d="M512 832a32 32 0 0 1-32-32v-416a32 32 0 0 1 64 0V800a32 32 0 0 1-32 32zM683.34 798.06a32 32 0 0 1-24.48-59.15C798.07 681.24 896 544.06 896 384c0-212.08-171.92-384-384-384S128 171.91999999999996 128 384c0 160.06 97.93 297.24 237.14 354.91a32 32 0 0 1-24.48 59.15C178.25 730.78 64 570.74 64 384c0-247.42 200.58-448 448-448s448 200.58 448 448c0 186.74-114.25 346.78-276.66 414.06z" horiz-adv-x="1024" /> + + + <glyph glyph-name="file-b" unicode="" d="M790.08 177.91999999999996l-138.112-119.232V177.91999999999996h138.112zM198.848 763.008h627.328v-516.16H617.088a34.56 34.56 0 0 1-34.816-34.432v-206.528H198.848V763.008z m662.208 68.8H164.032a34.56 34.56 0 0 1-34.816-34.432v-825.92a34.56 34.56 0 0 1 34.816-34.432h453.056l278.784 240.896V797.376a34.56 34.56 0 0 1-34.816 34.432z" horiz-adv-x="1024" /> + + + <glyph glyph-name="template" unicode="" d="M734 172.89999999999998v82.8h-59.9v-37l-35.7-9.7 15.7-57.8zM674.1 419.3H734v-81.8h-59.9zM734 600.2l-95.6-26 15.7-57.8 20 5.4v-20.7H734zM866.1 131.29999999999995v-37l-35.7-9.7 7.9-28.9 7.8-28.9 79.9 21.7v82.8h-29.9zM740.9 60.299999999999955L651.4 36l7.9-28.9 7.8-29 89.5 24.4-7.8 28.9zM740.9 781.7l-89.5-24.3 7.9-28.9 7.8-28.9 89.5 24.3-7.8 28.9zM830.4 806l7.9-28.9 7.8-28.9 20 5.5v-20.8H926V832zM866.1 612.6v-120.3H926V612.6h-29.9zM866.1 371.9v-120.3H926V371.9h-29.9zM541.9 665.6l35.7 9.7-7.8 28.9-7.8 28.9-50-13.6L98 832v-783.5l384.1-104.3L512-64l29.9 8.1 35.7 9.7-7.8 28.9-7.8 28.9-20-5.4V120.79999999999995l35.7 9.7-15.7 57.8-20-5.4V486l35.7 9.7-15.7 57.8-20-5.4V665.6z m-59.8-659.4l-324.2 88.1V753.7l324.2-88.1V548l-192 52.2v-427.3l192-52.2v-114.5z m0 360.9V182.79999999999995l-132.2 35.9V521.8l132.2-35.9v-118.8z" horiz-adv-x="1024" /> + + + <glyph glyph-name="transfer" unicode="" d="M320 768H128c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h192c35.2 0 64 28.8 64 64V704c0 35.2-28.8 64-64 64z m0-672c0-16-16-32-32-32H160c-16 0-32 16-32 32V672c0 16 16 32 32 32h128c16 0 32-16 32-32v-576z m256 544h-64c-19.2 0-32-12.8-32-32s16-32 32-32h64c19.2 0 32 12.8 32 32s-16 32-32 32z m-64-448h-64c-19.2 0-32-12.8-32-32s16-32 32-32h64c19.2 0 32 12.8 32 32s-16 32-32 32z m384 576H704c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h192c35.2 0 64 28.8 64 64V704c0 35.2-28.8 64-64 64z m0-672c0-16-16-32-32-32H736c-16 0-32 16-32 32V672c0 16 16 32 32 32h128c16 0 32-16 32-32v-576z" horiz-adv-x="1024" /> + + + <glyph glyph-name="auz" unicode="" d="M324.266667 435.2c-17.066667 17.066667-39.822222 17.066667-51.2 0-17.066667-17.066667-17.066667-39.822222 0-51.2l153.6-159.288889c5.688889-5.688889 17.066667-11.377778 28.444444-11.377778s17.066667 5.688889 28.444445 11.377778l295.822222 290.133333c17.066667 17.066667 17.066667 39.822222 0 51.2-17.066667 17.066667-39.822222 17.066667-51.2 0L455.111111 304.355556 324.266667 435.2zM927.288889 753.777778L523.377778 896h-22.755556L96.711111 753.777778c-17.066667-5.688889-28.444444-17.066667-28.444444-34.133334v-432.355555c11.377778-250.311111 409.6-409.6 426.666666-415.288889h22.755556c17.066667 5.688889 415.288889 159.288889 426.666667 415.288889V719.644444c11.377778 17.066667 0 28.444444-17.066667 34.133334z m-45.511111-460.8c-5.688889-182.044444-301.511111-312.888889-369.777778-341.333334-113.777778 45.511111-358.4 182.044444-369.777778 341.333334v398.222222L512 822.044444l369.777778-125.155555v-403.911111z" horiz-adv-x="1024" /> + + + <glyph glyph-name="console" unicode="" d="M30.552 104.72699999999998c4.654-16.29 23.272-23.272 37.236-18.618 16.291 4.655 23.273 23.273 18.618 37.236C16.588 314.182 84.08 521.31 237.68 640c11.636 9.31 23.273 16.29 37.236 25.6 25.6 16.29 53.528 30.255 83.782 39.564 58.182 20.945 118.691 30.254 176.873 27.927h25.6c6.982 0 11.636 0 18.618-2.327 30.255-4.655 58.182-11.637 88.436-23.273 235.055-86.11 356.073-346.764 269.964-581.818-4.654-16.291 2.327-32.582 18.618-37.237 16.291-4.654 32.582 2.328 37.237 18.619 41.89 116.363 39.563 239.709 0 349.09h2.327C921.897 656.2909999999999 738.043 784.2909999999999 537.897 793.6h-48.873c-200.145-9.31-384-137.31-458.472-337.455-39.564-109.381-41.891-232.727 0-351.418z m707.49 386.328a29.498 29.498 0 0 1-41.89 0L521.606 316.509c-4.654 2.327-9.309 2.327-13.963 2.327-32.582 0-58.182-25.6-58.182-58.181s25.6-58.182 58.182-58.182 58.181 25.6 58.181 58.182c0 4.654 0 9.309-2.327 16.29l174.546 174.546c11.636 11.636 11.636 30.254 0 39.564z m228.073-458.473H58.48c-16.29 0-30.255-13.964-30.255-30.255 0-16.29 13.964-30.254 30.255-30.254h907.636c16.291 0 30.255 13.963 30.255 30.254 0 16.291-13.964 30.255-30.255 30.255z" horiz-adv-x="1024" /> + + + <glyph glyph-name="app" unicode="" d="M432.022 818.946h-376.324c-6.627 0-12.078-5.45-12.078-12.078v-376.324c0-6.627 5.45-12.078 12.078-12.078h376.324c6.627 0 12.078 5.45 12.078 12.078v376.473c0 6.627-5.45 11.93-12.078 11.93zM391.517 471.196h-295.169v295.169h295.021v-295.169zM976.847 635.717l-211.95 211.95c-8.837 8.837-23.124 8.837-31.963 0l-211.95-211.95c-8.837-8.837-8.837-23.124 0-31.963l211.95-212.098c8.837-8.837 23.124-8.837 31.963 0l211.95 211.95c8.837 8.987 8.837 23.271 0 32.109zM432.022 313.45000000000005h-376.324c-6.627 0-12.078-5.45-12.078-12.078v-376.324c0-6.627 5.45-12.078 12.078-12.078h376.324c6.627 0 12.078 5.45 12.078 12.078v376.473c0 6.627-5.45 11.93-12.078 11.93zM391.517-34.15499999999997h-295.169v295.021h295.021v-295.021zM932.511 313.45000000000005h-376.324c-6.627 0-12.078-5.45-12.078-12.078v-376.324c0-6.627 5.45-12.078 12.078-12.078h376.324c6.627 0 12.078 5.45 12.078 12.078v376.473c0 6.627-5.45 11.93-12.078 11.93zM891.859-34.15499999999997h-295.021v295.021h295.021v-295.021z" horiz-adv-x="1024" /> + + + <glyph glyph-name="prev" unicode="" d="M62.573 384.103l423.401 423.662c18.985 18.985 49.757 18.985 68.727 0 18.982-18.972 18.985-49.746 0-68.729l-355.058-355.067 356.796-356.796c18.977-18.971 18.976-49.746 0-68.727-18.982-18.976-49.751-18.976-68.727 0l-39.753 39.753 0.269 0.246-385.655 385.661zM451.365 384.103l423.407 423.662c18.985 18.985 49.757 18.985 68.727 0 18.982-18.972 18.985-49.746 0-68.729l-355.058-355.067 356.796-356.796c18.977-18.971 18.976-49.746 0-68.727-18.982-18.976-49.757-18.977-68.727 0l-39.762 39.754 0.273 0.249-385.662 385.661zM451.365 384.103z" horiz-adv-x="1024" /> + + + <glyph glyph-name="website" unicode="" d="M777.073418 147.443038c-30.460759 21.387342-40.83038 40.182278-76.47595 53.792405 25.275949 60.273418 40.182278 83.605063 42.126583 154.896203H887.898734c-3.888608-99.159494-45.367089-143.878481-110.825316-208.688608zM136.101266 356.13164600000005h167.210126c1.944304-71.291139 16.850633-94.622785 42.126583-154.896203-34.997468-13.610127-68.050633-31.756962-98.511393-53.792405C181.468354 212.25316499999997 139.989873 256.97215200000005 136.101266 356.13164600000005z m103.048101 259.888607c29.164557-23.979747 61.56962-42.774684 96.567089-57.681012-19.443038-53.792405-30.460759-90.734177-31.756962-152.951899H136.101266c3.240506 90.734177 46.663291 147.767089 103.048101 210.632911z m309.144304-209.98481V523.989873c47.311392 1.296203 71.291139 10.36962 114.065823 25.27595 18.146835-51.2 28.516456-84.901266 30.460759-143.23038H548.293671z m104.344304-195.078481c-40.182278 12.962025-60.273418 20.091139-104.344304 21.387342V356.13164600000005h144.526582c-1.944304-68.050633-16.202532-88.141772-40.182278-145.174684z m36.941772-57.681013c31.756962-12.313924 39.534177-28.516456 66.75443-47.311392-51.848101-44.718987-114.713924-73.883544-182.116455-84.901266 36.941772 37.589873 90.734177 82.308861 115.362025 132.212658z m-163.321519-137.397468l22.035443 165.913924c40.182278-1.296203 56.38481-7.777215 92.678481-18.794937-27.220253-56.38481-66.106329-106.288608-113.417722-147.118987h-1.296202z m-75.827848 5.18481c-67.402532 11.017722-130.268354 40.83038-182.764557 84.901266 27.868354 19.443038 57.681013 34.997468 88.789873 47.311392 23.331646-48.607595 55.088608-93.326582 93.974684-132.212658z m47.311392 335.068355v-123.787342c-44.070886-1.296203-64.162025-8.425316-104.344304-21.387342-23.979747 57.681013-38.237975 77.124051-40.182278 145.174684h144.526582zM383.675949 549.265823c42.774684-14.906329 66.75443-23.331646 114.065823-25.27595v-117.95443H353.21519c1.944304 58.329114 12.313924 92.03038 30.460759 143.23038z m-37.589873 57.032911c-31.756962 12.962025-60.921519 30.460759-88.141772 51.848101 53.792405 51.848101 115.362025 91.382278 192.486076 104.344304-44.718987-44.718987-80.364557-97.863291-104.344304-156.192405z m151.655696 161.377215v-193.782278c-44.070886 1.296203-64.162025 9.073418-103.696202 22.683544 29.164557 68.698734 49.903797 127.027848 102.4 171.098734h1.296202z m75.827848-4.536708c77.772152-13.610127 149.711392-49.903797 206.744304-104.344304-29.164557-22.035443-46.01519-37.589873-80.364557-51.848102-25.275949 59.625316-82.956962 112.76962-126.379747 156.192406z m-46.01519 4.536708c54.440506-46.01519 97.21519-104.992405 124.435443-171.098734-39.534177-13.610127-59.625316-21.387342-103.696202-22.683544l-22.035443 193.782278h1.296202z m-31.10886-751.149367c-46.663291 38.886076-62.865823 88.789873-91.382279 147.118988 36.293671 11.665823 53.144304 17.498734 93.326582 18.794936v-165.913924h-1.944303zM887.898734 406.035443h-145.174683c-1.296203 61.56962-12.313924 98.511392-31.756962 152.303798 37.589873 15.55443 57.032911 33.053165 88.789873 57.681012 56.38481-62.865823 84.901266-119.898734 88.141772-209.98481z m-375.898734 427.746835c-244.334177 0-442.005063-197.670886-442.005063-442.005063S267.665823-50.227847999999994 512-50.227847999999994s442.005063 197.670886 442.005063 442.005063S756.334177 833.782278 512 833.782278z" horiz-adv-x="1024" /> + + + <glyph glyph-name="next" unicode="" d="M948.066926 382.958838l-411.990051-412.24426c-18.47333-18.47333-48.417689-18.47333-66.875207 0-18.47333 18.461167-18.47333 48.405526 0 66.875207L814.691135 383.088983 467.512212 730.269123c-18.466032 18.458735-18.466032 48.405526 0 66.873991 18.468465 18.464816 48.410391 18.464816 66.872774 0l38.682336-38.682336-0.261507-0.239614 375.259894-375.265975v0.003649m-378.312834 0L157.756743-29.28542200000004c-18.47333-18.47333-48.415256-18.47333-66.872775 0-18.47333 18.461167-18.47333 48.405526 0 66.875207L436.369787 383.088983 89.19208 730.269123c-18.4636 18.458735-18.4636 48.405526 0 66.873991 18.470898 18.464816 48.415256 18.464816 66.872774 0l38.692067-38.682336-0.266372-0.239614 375.267191-375.265975-0.004865 0.003649m0 0z" horiz-adv-x="1024" /> + + + <glyph glyph-name="component" unicode="" d="M917.376 652.544L500.8 891.2a34.304 34.304 0 0 1-34.176 0L50.112 652.48a33.92 33.92 0 0 1-17.088-29.376v-477.44c0-12.16 6.528-23.296 17.088-29.44l416.512-238.72a35.136 35.136 0 0 1 34.176 0l416.576 238.72a33.92 33.92 0 0 1 17.088 29.44v477.44a33.92 33.92 0 0 1-17.088 29.44z m-51.264-487.36l-382.4-219.136-382.336 219.136V603.52l382.336 219.136 382.4-219.136v-438.272zM198.784 535.488a33.792 33.792 0 0 1 12.544-46.4l237.824-136.32V83.20000000000005c0-18.816 15.232-33.92 34.176-33.92a33.92 33.92 0 0 1 34.176 33.92V352.384l238.656 136.832a33.856 33.856 0 0 1 12.544 46.4 34.368 34.368 0 0 1-46.72 12.416L483.712 411.52 245.504 548.0319999999999a34.432 34.432 0 0 1-46.72-12.544z" horiz-adv-x="1024" /> + + + <glyph glyph-name="android" unicode="" d="M391.405714 619.995429a22.308571 22.308571 0 0 1 0 44.544c-11.995429 0-21.723429-10.276571-21.723428-22.272s9.728-22.272 21.723428-22.272z m241.152 0c11.995429 0 21.723429 10.276571 21.723429 22.272s-9.728 22.272-21.723429 22.272a22.308571 22.308571 0 0 1 0-44.544zM168.539429 514.852571a58.514286 58.514286 0 0 0 58.294857-58.294857v-245.723428c0-32.585143-25.709714-58.843429-58.294857-58.843429S109.696 178.285714 109.696 210.834286v245.723428c0 32 26.294857 58.294857 58.843429 58.294857z m605.732571-10.861714v-380.562286c0-34.852571-28.013714-62.866286-62.281143-62.866285h-42.861714v-129.718857c0-32.585143-26.294857-58.843429-58.843429-58.843429s-58.843429 26.294857-58.843428 58.843429v129.718857H472.594286v-129.718857c0-32.585143-26.294857-58.843429-58.843429-58.843429a58.660571 58.660571 0 0 0-58.294857 58.843429l-0.585143 129.718857H312.594286a62.683429 62.683429 0 0 0-62.866286 62.866285V503.990857h524.580571z m-132.571429 231.424c80.018286-41.142857 134.290286-119.990857 134.290286-210.870857H247.424c0 90.843429 54.272 169.728 134.838857 210.870857L341.705143 810.276571a8.338286 8.338286 0 0 0 2.852571 11.446858c3.986286 1.718857 9.142857 0.585143 11.446857-3.437715L397.147429 742.838857c34.852571 15.433143 73.728 23.990857 114.870857 23.990857s80.018286-8.557714 114.870857-23.990857l41.142857 75.446857c2.304 3.986286 7.424 5.156571 11.446857 3.437715a8.338286 8.338286 0 0 0 2.852572-11.446858zM914.267429 456.557714v-245.723428c0-32.585143-26.294857-58.843429-58.843429-58.843429a58.660571 58.660571 0 0 0-58.294857 58.843429v245.723428a58.148571 58.148571 0 0 0 58.294857 58.294857c32.585143 0 58.843429-25.709714 58.843429-58.294857z" horiz-adv-x="1024" /> + + + <glyph glyph-name="more" unicode="" d="M224 288c-52.928 0-96 43.072-96 96s43.072 96 96 96 96-43.072 96-96-43.072-96-96-96z m288 0c-52.928 0-96 43.072-96 96s43.072 96 96 96 96-43.072 96-96-43.072-96-96-96z m288 0c-52.928 0-96 43.072-96 96s43.072 96 96 96 96-43.072 96-96-43.072-96-96-96z" horiz-adv-x="1024" /> + + + <glyph glyph-name="login-wechat" unicode="" d="M516.464646 896C233.714646 896 4.464646 666.75 4.464646 384S233.714646-128 516.464646-128s512 229.25 512 512S799.214646 896 516.464646 896z m-74-523.375c-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.5-1.875-0.25-0.75-0.5-1.125-0.5-1.875-0.25-0.75-0.5-1.125-0.5-1.875-0.25-0.75-0.25-1.125-0.5-1.875s-0.5-1.125-0.5-1.875c-0.25-0.75-0.25-1.125-0.5-1.875s-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875c0-0.75-0.25-1.125-0.25-1.875s-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875 0-1.125-0.25-1.875c0-0.75-0.25-1.125-0.25-1.875s0-1.125-0.25-1.875c0-0.75 0-1.125-0.25-1.875 0-0.75 0-1.125-0.25-1.875v-22.5c0-0.75 0-1.125 0.25-1.875 0-0.75 0-1.125 0.25-1.875 0-0.75 0-1.125 0.25-1.875 0-0.75 0-1.125 0.25-1.875 0-0.75 0.25-1.125 0.25-1.875s0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875l0.25-0.875c-4.25-0.25-8.625-0.75-12.75-0.75-3.75-0.25-7.25-0.25-11-0.25-3.5 0-7 0-10.5 0.25-7.25 0.25-14 0.875-20.75 1.875-4.25 0.5-8.125 1.125-12.375 1.875-3.5 0.5-6.75 1.125-10.25 1.875-3 0.5-6.25 1.125-9.25 1.875-3 0.75-5.875 1.125-8.875 1.875-2.75 0.75-5.875 1.125-8.875 1.875-2.75 0.5-5.625 1.125-8.375 1.625l-3.25-1.625-3.75-1.875-4 1.375-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-2.75-1.375-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-2.5-1.375 0.5 1.375 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.5 1.125c-0.5 0.25-0.75 0.5-1.125 0.75-0.875 0.75-1.625 1.125-2.5 1.875s-1.625 1.125-2.5 1.875-1.625 1.125-2.5 1.875c-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.375 1.125-2.375 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-1.875 1.875-0.75 0.75-1.375 1.125-1.875 1.875l-1.875 1.875-1.875 1.875-1.875 1.875-1.875 1.875c-0.75 0.75-1.125 1.125-1.625 1.875s-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-0.875 1.125-1.625 1.875c-0.5 0.75-0.875 1.125-1.625 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.125 1.875-0.5 0.75-0.875 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.5 1.875-0.25 0.75-0.5 1.125-0.5 1.875-0.25 0.75-0.5 1.125-0.5 1.875-0.25 0.75-0.25 1.125-0.5 1.875s-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875 0 1.125-0.25 1.875c0 0.75 0 1.125-0.25 1.875 0 0.75 0 1.125-0.25 1.875 0 0.75 0 1.125-0.25 1.875V457.25v1.875 1.875 1.875 1.875 1.875 0.875 0.875 1.875 1.875 1.875 1.875 1.875 1.875c0 0.75 0 1.125 0.25 1.875 0 0.75 0 1.125 0.25 1.875 0 0.75 0 1.125 0.25 1.875 0 0.75 0.25 1.125 0.25 1.875s0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.5 1.875c0 0.75 0.25 1.125 0.5 1.875s0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.5 1.125 0.5 1.875c0.25 0.75 0.5 1.125 0.5 1.875 0.25 0.75 0.5 1.125 0.5 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.875 1.875 0.25 0.75 0.5 1.125 0.875 1.875 0.25 0.75 0.5 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.625 1.875 0.5 0.75 0.875 1.125 1.625 1.875 0.5 0.75 1.125 1.125 1.625 1.875s1.125 1.125 1.625 1.875 1.125 1.125 1.625 1.875 1.125 1.125 1.625 1.875 1.125 1.125 1.625 1.875l1.875 1.875 1.875 1.875 1.875 1.875 1.875 1.875c0.75 0.75 1.375 1.125 1.875 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.375 1.875 0.75 0.75 1.625 1.125 2.375 1.875 0.75 0.75 1.625 1.125 2.375 1.875 0.75 0.75 1.625 1.125 2.375 1.875 0.875 0.75 1.625 1.125 2.5 1.875s1.625 1.125 2.5 1.875 1.875 1.125 2.5 1.875c0.875 0.75 1.875 1.125 2.75 1.875 0.875 0.75 1.875 1.125 2.75 1.875 0.875 0.75 1.875 1.125 2.75 1.875 0.875 0.75 1.875 1.125 3 1.875 0.875 0.75 2.125 1.125 3 1.875s2.125 1.125 3 1.875c1.125 0.75 2.125 1.125 3.25 1.875 1.125 0.75 2.375 1.125 3.25 1.875 1.125 0.75 2.375 1.125 3.5 1.875 1.125 0.75 2.375 1.125 3.75 1.875 1.125 0.75 2.5 1.125 3.75 1.875 1.375 0.75 2.5 1.125 4 1.875 1.375 0.75 2.75 1.125 4.25 1.875 1.375 0.75 2.75 1.125 4.25 1.875 1.375 0.75 3 1.125 4.375 1.875 1.625 0.75 3 1.125 4.625 1.875 1.625 0.75 3.25 1.125 4.875 1.875 1.875 0.75 3.5 1.125 5.375 1.875s3.75 1.125 5.625 1.875c2.125 0.75 4.25 1.125 6 1.875 2.375 0.75 4.375 1.125 6.75 1.875 2.5 0.75 4.875 1.125 7.5 1.875 2.75 0.75 5.625 1.125 8.625 1.875 3.5 0.75 6.75 1.125 10.25 1.875 4.375 0.75 8.875 1.375 13.25 1.875 11 1.125 22.125 1.875 33.25 1.875h2.5c11.125 0 22.375-0.75 33.5-1.875 4.375-0.5 8.875-1.125 13.25-1.875 3.5-0.5 7-1.125 10.25-1.875 2.75-0.5 5.875-1.125 8.625-1.875 2.5-0.5 5.125-1.125 7.625-1.875 2.375-0.5 4.625-1.125 6.75-1.875 2.125-0.5 4.25-1.125 6.25-1.875 1.875-0.75 4-1.125 5.875-1.875s3.75-1.125 5.375-1.875c1.625-0.75 3.5-1.125 5.125-1.875 1.625-0.75 3.25-1.125 4.875-1.875 1.625-0.75 3-1.125 4.625-1.875 1.375-0.75 3-1.125 4.375-1.875s2.75-1.125 4.25-1.875c1.375-0.75 2.75-1.125 4-1.875 1.375-0.75 2.5-1.125 3.75-1.875 1.125-0.75 2.5-1.125 3.75-1.875 1.125-0.75 2.375-1.125 3.5-1.875 1.125-0.75 2.375-1.125 3.5-1.875 1.125-0.75 2.375-1.125 3.25-1.875 1.125-0.75 2.125-1.125 3.25-1.875 1.125-0.75 2.125-1.125 3-1.875s2.125-1.125 3-1.875 1.875-1.125 3-1.875c0.875-0.75 1.875-1.125 2.75-1.875 0.875-0.75 1.875-1.125 2.75-1.875 0.875-0.75 1.875-1.125 2.75-1.875 0.875-0.75 1.875-1.125 2.5-1.875 0.875-0.75 1.625-1.125 2.5-1.875s1.625-1.125 2.5-1.875 1.625-1.125 2.375-1.875c0.75-0.75 1.625-1.125 2.375-1.875 0.75-0.75 1.625-1.125 2.375-1.875 0.75-0.75 1.375-1.125 2.375-1.875 0.75-0.75 1.375-1.125 2.375-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 1.875-1.875 0.75-0.75 1.375-1.125 1.875-1.875l1.875-1.875 1.875-1.875 1.875-1.875 1.875-1.875c0.75-0.75 1.125-1.125 1.625-1.875s1.125-1.125 1.625-1.875 1.125-1.125 1.625-1.875 1.125-1.125 1.625-1.875 1.125-1.125 1.625-1.875 0.875-1.125 1.625-1.875c0.5-0.75 0.875-1.125 1.625-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.125-1.875 0.5-0.75 0.875-1.125 1.125-1.875 0.5-0.75 0.875-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.5-1.125 0.875-1.875 0.25-0.75 0.5-1.125 0.875-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.5-1.875 0.25-0.75 0.5-1.125 0.5-1.875 0.25-0.75 0.25-1.125 0.5-1.875s0.5-1.125 0.5-1.875c0.25-0.75 0.25-1.125 0.5-1.875s0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875c0-0.5 0.25-0.75 0.25-1.125-4.625 0.5-9.25 0.875-14 1.125-3.5 0.25-7 0.25-10.75 0.25-4 0-8.125 0-12.125-0.25-6.75-0.25-13.25-0.875-19.5-1.875-3.75-0.5-7.625-1.125-11.375-1.875-3-0.5-5.875-1.125-8.875-1.875-2.5-0.5-5.125-1.125-7.5-1.875-2.125-0.5-4.375-1.125-6.5-1.875-1.875-0.5-4-1.125-5.875-1.875-1.875-0.5-3.5-1.125-5.375-1.875-1.625-0.75-3.25-1.125-4.875-1.875-1.625-0.75-3-1.125-4.625-1.875-1.375-0.75-3-1.125-4.375-1.875s-2.75-1.125-4.25-1.875c-1.375-0.75-2.5-1.125-4-1.875-1.125-0.75-2.5-1.125-3.75-1.875-1.125-0.75-2.375-1.125-3.5-1.875-1.125-0.75-2.375-1.125-3.5-1.875-1.125-0.75-2.125-1.125-3.25-1.875-0.875-0.75-2.125-1.125-3-1.875s-2.125-1.125-3-1.875-1.875-1.125-3-1.875c-0.875-0.75-1.875-1.125-2.75-1.875-0.875-0.75-1.875-1.125-2.75-1.875-0.875-0.75-1.875-1.125-2.5-1.875-0.875-0.75-1.625-1.125-2.5-1.875s-1.625-1.125-2.5-1.875c-0.75-0.75-1.625-1.125-2.375-1.875-0.75-0.75-1.625-1.125-2.375-1.875-0.75-0.75-1.625-1.125-2.375-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-1.875-1.875l-1.875-1.875-1.875-1.875-1.875-1.875c-0.75-0.75-1.125-1.125-1.625-1.875s-1.125-1.125-1.625-1.875-1.125-1.125-1.625-1.875-1.125-1.125-1.625-1.875-1.125-1.125-1.625-1.875-0.875-1.125-1.625-1.875c-0.5-0.75-0.875-1.125-1.625-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.125-1.875-0.5-0.75-0.875-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.75-1.875-3.125-4.625-3.375-5.125-3.625-5.75z m433.625-71.25v-11.375c0-0.5 0-0.875-0.25-1.625 0-0.5 0-0.875-0.25-1.625 0-0.5 0-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.875-0.875-1.125-1.625-0.5-0.5-0.875-0.875-1.125-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625l-1.625-1.625-1.625-1.625c-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.375-0.875-1.875-1.625-0.75-0.5-1.375-0.875-1.875-1.625-0.75-0.5-1.375-0.875-2.125-1.625-0.75-0.5-1.375-0.875-2.125-1.625l-0.75-0.5 0.25-0.875 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.25-1.125-2.125 1.125-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-0.5 0.25-0.875-0.25c-2.125-0.5-4.25-0.875-6-1.625-2.125-0.5-4.25-0.875-6.25-1.625-2.125-0.5-4.25-0.875-6.5-1.625-2.375-0.5-4.375-0.875-6.75-1.625-2.375-0.5-4.875-1.125-7.25-1.625-2.75-0.5-5.375-1.125-8.125-1.625-3.25-0.5-6.5-1.125-9.75-1.625-5.375-0.75-10.75-1.125-15.875-1.625-2.75-0.25-5.875-0.25-8.625-0.25-3.75 0-7.5 0-11.125 0.25-6.5 0.25-12.75 0.75-19.125 1.625-3.75 0.5-7.5 0.875-11 1.625-2.75 0.5-5.875 0.875-8.625 1.625-2.375 0.5-4.875 0.875-7.25 1.625-2.125 0.5-4.25 0.875-6.25 1.625-1.875 0.5-3.75 0.875-5.625 1.625-1.875 0.5-3.5 0.875-5.125 1.625-1.625 0.5-3.25 0.875-4.875 1.625-1.375 0.5-3 0.875-4.375 1.625-1.375 0.5-2.75 0.875-4.25 1.625-1.375 0.5-2.5 0.875-4 1.625-1.125 0.5-2.5 0.875-3.75 1.625-1.125 0.5-2.375 0.875-3.75 1.625-1.125 0.5-2.375 0.875-3.5 1.625-1.125 0.5-2.125 0.875-3.25 1.625-1.125 0.5-2.125 0.875-3.25 1.625-0.875 0.5-2.125 0.875-3 1.625-0.875 0.5-1.875 0.875-3 1.625-0.875 0.5-1.875 0.875-2.75 1.625-0.875 0.5-1.875 0.875-2.75 1.625-0.875 0.5-1.875 0.875-2.5 1.625-0.875 0.5-1.625 0.875-2.5 1.625-0.875 0.5-1.625 0.875-2.5 1.625-0.75 0.5-1.625 0.875-2.375 1.625-0.75 0.5-1.625 0.875-2.375 1.625-0.75 0.5-1.625 0.875-2.375 1.625-0.75 0.5-1.375 0.875-2.375 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-1.875 1.625-0.75 0.5-1.375 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.5 0.5-1.125 0.875-1.625 1.625-0.5 0.5-1.125 0.875-1.625 1.625-0.5 0.5-1.125 0.875-1.625 1.625-0.5 0.5-1.125 0.875-1.625 1.625l-1.625 1.625-1.625 1.625c-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.125 1.625-0.5 0.5-0.875 0.875-1.125 1.625-0.5 0.5-0.875 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.5 0.875-0.875 1.625-0.25 0.5-0.5 0.875-0.875 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5 0 0.875-0.25 1.625 0 0.5 0 0.875-0.25 1.625 0 0.5 0 0.875-0.25 1.625v1.625 1.625 1.625 3.25 1.625 3.25 1.375 1.625 1.625 1.625 1.625 1.625 1.625 1.625 1.625 1.625c0 0.5 0 0.875 0.25 1.625 0 0.5 0 0.875 0.25 1.625 0 0.5 0 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.875 1.625 0.25 0.5 0.5 0.875 0.875 1.625 0.25 0.5 0.5 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625l1.625 1.625 1.625 1.625c0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.375 0.875 1.875 1.625 0.75 0.5 1.375 0.875 1.875 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.375 1.625 0.75 0.5 1.625 0.875 2.375 1.625 0.75 0.5 1.625 0.875 2.375 1.625 0.75 0.5 1.625 0.875 2.375 1.625 0.875 0.5 1.625 0.875 2.5 1.625 0.875 0.5 1.625 0.875 2.5 1.625 0.875 0.5 1.875 0.875 2.5 1.625 0.875 0.5 1.875 0.875 2.75 1.625 0.875 0.5 1.875 0.875 2.75 1.625 0.875 0.5 1.875 0.875 3 1.625 0.875 0.5 2.125 0.875 3 1.625 1.125 0.5 2.125 0.875 3.25 1.625 1.125 0.5 2.125 0.875 3.25 1.625 1.125 0.5 2.375 0.875 3.5 1.625 1.125 0.5 2.375 0.875 3.75 1.625 1.125 0.5 2.5 0.875 3.75 1.625 1.375 0.5 2.5 0.875 4 1.625 1.375 0.5 2.75 0.875 4.25 1.625 1.375 0.5 3 0.875 4.375 1.625 1.625 0.5 3.25 0.875 4.875 1.625 1.625 0.5 3.5 0.875 5.125 1.625 1.875 0.5 3.75 0.875 5.875 1.625 2.125 0.5 4.25 1.125 6.25 1.625 2.375 0.5 4.875 1.125 7.25 1.625 2.75 0.5 5.875 1.125 8.625 1.625 3.75 0.75 7.5 1.125 11.125 1.625 9.25 1.125 19.125 1.625 28.875 1.625h1.375c9.25 0 18.375-0.75 27.5-1.625 3.75-0.5 7.25-0.875 10.75-1.625 2.75-0.5 5.625-0.875 8.375-1.625 2.375-0.5 4.625-0.875 7-1.625 2.125-0.5 4.25-0.875 6.25-1.625 1.875-0.5 3.75-0.875 5.625-1.625 1.625-0.5 3.5-0.875 5.125-1.625 1.625-0.5 3.25-0.875 4.625-1.625 1.375-0.5 3-0.875 4.375-1.625 1.375-0.5 2.75-0.875 4.25-1.625 1.375-0.5 2.5-0.875 4-1.625 1.125-0.5 2.5-0.875 3.75-1.625 1.125-0.5 2.375-0.875 3.5-1.625 1.125-0.5 2.375-0.875 3.5-1.625 1.125-0.5 2.125-0.875 3.25-1.625 1.125-0.5 2.125-0.875 3.25-1.625 0.875-0.5 2.125-0.875 3-1.625 0.875-0.5 1.875-0.875 3-1.625 0.875-0.5 1.875-0.875 2.75-1.625 0.875-0.5 1.875-0.875 2.75-1.625 0.875-0.5 1.875-0.875 2.5-1.625 0.875-0.5 1.625-0.875 2.5-1.625 0.875-0.5 1.625-0.875 2.5-1.625 0.875-0.5 1.625-0.875 2.5-1.625 0.75-0.5 1.625-0.875 2.375-1.625 0.75-0.5 1.625-0.875 2.375-1.625 0.75-0.5 1.375-0.875 2.375-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 1.875-1.625 0.75-0.5 1.375-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625l1.625-1.625 1.625-1.625c0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.875-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.5-1.625 0.25-0.5 0.5-0.875 0.5-1.625 0.25-0.5 0.5-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625v-11.375h-3.125zM589.714646 384c-12.625 0-25.375-12.75-25.375-25.375 0-12.75 12.75-25.375 25.375-25.375 19.375 0 31.875 12.625 31.875 25.375-0.125 12.625-12.75 25.375-31.875 25.375zM729.589646 384c-12.625 0-25.375-12.75-25.375-25.375 0-12.75 12.75-25.375 25.375-25.375 19.125 0 31.875 12.625 31.875 25.375 0 12.625-12.75 25.375-31.875 25.375zM328.714646 568.75c-19.125 0-38.375-12.625-38.375-31.625 0-19.125 19.375-31.875 38.375-31.875s31.875 12.75 31.875 31.875-12.875 31.625-31.875 31.625zM506.964646 568.75c-19.125 0-38.125-12.625-38.125-31.625 0-19.125 19.125-31.875 38.125-31.875 19.125 0 31.875 12.75 31.875 31.875s-12.875 31.625-31.875 31.625z" horiz-adv-x="1059" /> + + + <glyph glyph-name="shrink-right" unicode="" d="M52.294-28.71900000000005h899.793c16.546 0 29.999 13.405 29.999 29.999v59.974c-0.013 16.562-13.436 29.985-29.998 29.999h-899.795c-16.57 0-29.999-13.429-29.999-29.999v-59.974c0-16.617 13.429-29.999 29.999-29.999zM952.087 451.165h-479.884c-16.57 0-29.999-13.405-29.999-29.999v-59.974c0 0 0 0 0 0 0-16.572 13.428-30.01 29.997-30.022h479.885c16.571 0.013 29.999 13.448 29.999 30.022 0 0 0 0 0 0v59.974c0 16.593-13.429 29.999-29.999 29.999zM52.294 691.0840000000001h899.793c16.554 0.013 29.972 13.423 29.999 29.974v59.999c0 16.57-13.429 29.999-29.999 29.999h-899.793c-16.57 0-29.999-13.429-29.999-29.999v-59.997c0-16.546 13.429-29.975 29.999-29.975zM45.183 383.53499999999997l239.919-150.598v301.196l-239.919-150.598z" horiz-adv-x="1024" /> + + + <glyph glyph-name="spread-left" unicode="" d="M942.974 770.924h-843.556c-15.513 0-28.124-12.567-28.124-28.124v-56.226c0.012-15.527 12.596-28.111 28.123-28.124h843.559c15.534 0 28.124 12.59 28.124 28.124v56.226c0 15.578-12.59 28.124-28.124 28.124zM99.418 321.033h449.891c15.534 0 28.124 12.567 28.124 28.124v56.226c0 0 0 0 0 0 0 15.537-12.589 28.134-28.122 28.146h-449.892c-15.534-0.012-28.124-12.608-28.124-28.146 0 0 0 0 0 0v-56.226c0-15.556 12.59-28.124 28.124-28.124zM942.974 96.10900000000004h-843.556c-15.519-0.012-28.099-12.584-28.124-28.101v-56.249c0-15.534 12.59-28.124 28.124-28.124h843.556c15.534 0 28.124 12.59 28.124 28.124v56.248c0 15.513-12.59 28.103-28.124 28.102zM949.641 384.436l-224.924 141.186v-282.37l224.924 141.186z" horiz-adv-x="1024" /> + + + <glyph glyph-name="camera" unicode="" d="M884.3 648.6H704.2L679.5 698l-0.2 0.4c-1.9 3.6-3.6 6.9-5.1 9.9-12 23.4-21.5 41.9-54.1 41.9H416.7c-32.9 0-43.7-21.3-55.1-43.8-1.3-2.6-2.7-5.3-4.2-8.1l-24.8-49.7H152.4c-34 0-61.7-27.7-61.7-61.7v-488c0-34 27.7-61.7 61.7-61.7h731.9c34 0 61.7 27.7 61.7 61.7v488c0 34-27.7 61.7-61.7 61.7zM904 98.89999999999998c0-10.8-8.8-19.7-19.7-19.7H152.4c-10.8 0-19.7 8.8-19.7 19.7v488c0 10.8 8.8 19.7 19.7 19.7h206.1l36.2 72.5c1.5 2.9 2.9 5.7 4.3 8.3 10.6 20.8 11.1 20.8 17.7 20.8H620c4.6 0 5.8-0.6 5.8-0.6 2-1.2 7.2-11.2 10.9-18.5 1.6-3.1 3.3-6.5 5.3-10.1l36.2-72.4h206.1c10.8 0 19.7-8.8 19.7-19.7v-488zM525.5 565.5c-123.5 0-223.6-100.1-223.6-223.6S402 118.20000000000005 525.5 118.20000000000005s223.7 100.1 223.7 223.7c0 123.5-100.2 223.6-223.7 223.6z m0-402.5c-98.8 0-178.9 80.1-178.9 178.9 0 98.8 80.1 178.9 178.9 178.9 98.8 0 178.9-80.1 178.9-178.9 0-98.8-80.1-178.9-178.9-178.9z m246 402.5v-44.7H861v44.7h-89.5z" horiz-adv-x="1024" /> + + + <glyph glyph-name="note" unicode="" d="M987.2 384.36L512.43 859.13a84.75 84.75 0 0 1-65 24.71L111.55 864.09a84.83 84.83 0 0 1-79.65-79.65L12.15 448.57a84.57 84.57 0 0 1 24.69-65l474.8-474.8a84.91 84.91 0 0 1 119.93 0L987.2 264.41999999999996a84.9 84.9 0 0 1 0 119.94z m-39.28-80.66L592.29-51.91999999999996a29.31 29.31 0 0 0-41.37 0L76.1 422.9a29.22 29.22 0 0 0-8.49 22.38l19.74 335.88a29.29 29.29 0 0 0 27.48 27.48l335.9 19.75a29.32 29.32 0 0 0 22.38-8.52l474.8-474.8a29.31 29.31 0 0 0 0.01-41.37zM236.86 659.14c-50.92-50.95-50.92-133.8 0-184.72a130.61 130.61 0 1 1 184.71 184.72c-50.89 50.86-133.77 50.86-184.71 0zM382.29 513.7c-28.38-28.38-77.78-28.38-106.15 0a75.08 75.08 0 1 0 106.15 0z" horiz-adv-x="1024" /> + + + <glyph glyph-name="refresh" unicode="" d="M928 810.666667c-18.133333 0-32-13.866667-32-32v-164.266667C816 747.733333 669.866667 832 512 832 264.533333 832 64 631.4666669999999 64 384s200.533333-448 448-448c230.4 0 422.4 172.8 445.866667 402.133333 2.133333 17.066667-10.666667 33.066667-28.8 35.2-17.066667 2.133333-33.066667-10.666667-35.2-28.8C873.6 148.26666699999998 709.333333 0 512 0c-212.266667 0-384 171.733333-384 384s171.733333 384 384 384c137.6 0 264.533333-74.666667 332.8-192H693.333333c-18.133333 0-32-13.866667-32-32s13.866667-32 32-32h266.666667V778.666667c0 18.133333-14.933333 32-32 32z" horiz-adv-x="1024" /> + + + <glyph glyph-name="female" unicode="" d="M774.4 800c-48 35.2-108.8 51.2-172.8 51.2-105.6 0-208-51.2-268.8-150.4-89.6-134.4-57.6-313.6 60.8-416l-32-51.2-188.8 121.6S128 384 108.8 352c-22.4-35.2 22.4-64 22.4-64l188.8-121.6-105.6-163.2s-19.2-32 16-51.2c38.4-22.4 57.6 12.8 57.6 12.8l102.4 160 185.6-121.6s48-28.8 70.4 6.4c19.2 28.8-25.6 57.6-25.6 57.6L432 192l32 48c44.8-22.4 92.8-32 137.6-32 105.6 0 208 51.2 268.8 150.4 96 147.2 51.2 345.6-96 441.6z m35.2-400c-44.8-67.2-118.4-108.8-201.6-108.8-44.8 0-92.8 12.8-131.2 38.4-112 73.6-147.2 220.8-73.6 332.8 44.8 64 121.6 105.6 201.6 108.8 44.8 0 92.8-12.8 131.2-38.4 112-73.6 147.2-220.8 73.6-332.8z" horiz-adv-x="1024" /> + + + <glyph glyph-name="male" unicode="" d="M889.6 800h-240s-35.2 0-38.4-41.6c0-19.2 16-38.4 38.4-38.4h140.8l-179.2-179.2C556.8 582.4 489.6 608 416 608 240 608 96 464 96 288s144-320 320-320 320 144 320 320c0 73.6-25.6 140.8-67.2 195.2l179.2 179.2v-140.8c0-22.4 19.2-38.4 38.4-38.4 22.4 0 38.4 19.2 38.4 41.6V764.8h3.2C924.8 800 889.6 800 889.6 800zM416 48c-131.2 0-236.8 105.6-236.8 236.8 0 131.2 105.6 236.8 236.8 236.8s236.8-105.6 236.8-236.8c0-131.2-105.6-236.8-236.8-236.8z" horiz-adv-x="1024" /> + + + <glyph glyph-name="screen-restore" unicode="" d="M582.6 454.6v320h50V540l274 274 35.4-35.4-274-274h234.6v-50h-320zM117.4-46l274 274v-234.6h50v320h-320v-50H356l-274-274 35.4-35.4zM132 764h302V814H82v-352h50V764z m760-760H590v-50h352V306h-50v-302z" horiz-adv-x="1024" /> + + + <glyph glyph-name="password" unicode="" d="M519.2 343.29999999999995c-41.1 0-74.4-33.3-74.4-74.4 0-29.7 17.5-55 42.5-67.1v-81.9c0-17.6 14.3-31.9 31.9-31.9 17.6 0 31.9 14.3 31.9 31.9v81.9c25.1 12 42.5 37.4 42.5 66.9 0 41.3-33.2 74.6-74.4 74.6zM827.6-62.10000000000002H189.4c-35.9 0-65.1 29.2-65.1 65.1V428.4c0 35.9 29.2 65.1 65.1 65.1h638.2c17.3 0 33.7-6.7 46-19.1 12.3-12.3 19.1-28.7 19.1-46V3c0-35.9-29.2-65.1-65.1-65.1zM231.9 427.2c-34.8 0-41.3-6.6-41.3-41.3v-340.4c0-34.8 6.6-41.3 41.3-41.3h553.2c34.8 0 41.3 6.6 41.3 41.3V385.9c0 34.8-6.6 41.3-41.3 41.3H231.9zM519.2 86.70000000000005c-18.3 0-33.2 14.8-33.2 33.2V201c-26.3 12.8-42.6 38.8-42.6 67.8 0 41.8 33.9 75.7 75.7 75.7s75.7-33.9 75.7-75.7c0-29-16.3-55-42.5-67.8v-81.1c0.1-18.2-14.9-33.2-33.1-33.2zM519.2 342c-40.4 0-73.2-32.9-73.2-73.2 0-28.3 16.1-53.6 41.9-65.8l0.7-0.4V120c0-17 13.7-30.7 30.7-30.7S550 103.10000000000002 550 120v82.6l0.7 0.4c25.8 12.3 41.9 37.5 41.9 65.8-0.2 40.4-33.1 73.2-73.4 73.2zM207 523.1c-9.1 0-17.6 3.5-23.9 10-6.4 6.4-10 15-10 23.9v2h-0.2l0.2 1.4c0.1 0.5 0.1 0.9 0.2 1.4l0.2 1c0.1 0.6 0.2 1.4 0.4 2 15.3 75.7 57 144.2 117.2 193 29.9 24.2 63.4 43 99.8 56 37.5 13.3 77 20.2 117.5 20.2 61 0 120.8-16.3 173-47.2 50.6-29.9 93-72.8 122.5-123.8 4-5.6 6.1-12.2 6.1-19.2 0-18.3-15-33.3-33.3-33.3-13.2 0-25.1 7.7-30.4 19.8-49.2 84.6-140.4 137.4-238 137.4-128.1 0-238.2-87.1-267.6-211.8v-0.2c-0.7-18.4-15.4-32.6-33.7-32.6z" horiz-adv-x="1024" /> + + + <glyph glyph-name="senior" unicode="" d="M719.9 249.39999999999998L514.7 379.5V485.1C615.6 419 731.5 344 731.5 344s139.2-45.6 139.2 106.5c0 93-172.5 112.1-197.2 11.8l-69.6 47.3s24.2 101.5 162.4 106.5c138.2 4.9 192-94.6 190.9-199.6-1.2-104.7-136-198.3-237.3-167.1zM561 414c-4-19-23-33.7-47.6-33.7l-6.9 4.3-217.3 137.8S171 555.2 160.8 439c-10.2-116.1 147.4-129.5 186.8-23.8l81.7-47.6s-65.1-119.1-198.5-119.1C97.3 248.5 0.6 423.8 114 546.3c113.5 122.4 218.6 64.6 257 35.7 16.4-12.4 85.3-57.9 158.6-105.9l3.1-2.4c28.3-18.2 33.4-35.6 28.3-59.7zM434.1 149.70000000000005h212c16.7 0 30.3-13.6 30.3-30.3v-15.1c0-16.7-13.6-30.3-30.3-30.3h-212c-16.7 0-30.3 13.6-30.3 30.3v15.1c0 16.8 13.6 30.3 30.3 30.3z" horiz-adv-x="1024" /> + + + <glyph glyph-name="theme" unicode="" d="M512 800C229.696 800 0 570.304 0 288c0-90.368 30.304-174.496 85.344-236.896 55.264-62.624 129.152-97.12 208.128-97.12 81.568 0 161.536 36.832 231.264 106.592l2.272 2.496c65.792 81.472 132.896 121.056 205.088 121.056 46.72 0 89.216-15.872 126.688-29.92 30.336-11.328 56.576-21.12 81.216-21.12C1024 133.08799999999997 1024 241.664 1024 288c0 282.304-229.696 512-512 512z m428-602.912c-13.088 0-35.296 8.288-58.784 17.088-40.48 15.136-90.848 33.952-149.12 33.952-92.352 0-175.328-46.944-253.76-143.456-57.184-56.704-121.056-86.688-184.832-86.688-60.352 0-117.216 26.784-160.128 75.456C88.64 144.12800000000004 64 213.216 64 288 64 535.04 264.96 736 512 736s448-200.96 448-448c0-27.328-1.952-90.912-20-90.912zM800.704 379.93600000000004m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM457.024 582.624m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM672.704 555.9359999999999m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM291.392 443.936m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM278.4 197.24800000000005m-96 0a96 96 0 1 1 192 0 96 96 0 1 1-192 0Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="tread" unicode="" d="M860.8 172.79999999999995l6.4-57.6-6.4 57.6c12.8 0 25.6 3.2 35.2 12.8 6.4 9.6 6.4 22.4 3.2 32l57.6 12.8-57.6-12.8L800 553.6c-6.4 28.8-25.6 51.2-48 64-9.6 6.4-22.4 9.6-32 9.6H182.4c-22.4 3.2-41.6-6.4-51.2-25.6-6.4-9.6-6.4-19.2-9.6-28.8v-342.4c0-19.2 9.6-38.4 28.8-48 6.4-3.2 12.8-6.4 19.2-6.4h192l19.2-25.6 147.2-188.8c6.4-9.6 19.2-12.8 28.8-9.6 16 3.2 25.6 19.2 22.4 35.2l-9.6 118.4-6.4 67.2h297.6z m-233.6-57.6l9.6-128c3.2-28.8-9.6-54.4-28.8-73.6-35.2-32-92.8-28.8-124.8 6.4l-156.8 195.2H179.2c-19.2 0-38.4 6.4-57.6 16-35.2 19.2-57.6 57.6-57.6 99.2V572.8c0 19.2 6.4 38.4 16 57.6 19.2 38.4 57.6 60.8 99.2 54.4h537.6c67.2-3.2 121.6-48 137.6-112l102.4-339.2c6.4-28.8 3.2-57.6-12.8-80-19.2-22.4-48-38.4-76.8-38.4h-240zM304 627.2v-451.2h57.6V627.2H304z" horiz-adv-x="1024" /> + + + <glyph glyph-name="praise" unicode="" d="M860.8 595.2h-297.6l6.4 67.2 9.6 118.4c3.2 16-6.4 32-22.4 35.2-9.6 3.2-22.4 0-28.8-9.6l-147.2-188.8-19.2-25.6h-192c-6.4 0-12.8-3.2-19.2-6.4-19.2-9.6-28.8-28.8-28.8-48v-342.4c0-9.6 3.2-22.4 9.6-28.8 9.6-19.2 28.8-28.8 48-25.6h537.6c12.8 0 22.4 3.2 32 9.6 25.6 12.8 44.8 35.2 48 64l102.4 336 57.6-12.8-57.6 12.8c3.2 9.6 0 22.4-3.2 32-9.6 6.4-22.4 12.8-35.2 12.8l6.4 57.6-6.4-57.6z m-233.6 57.6h240c28.8 0 57.6-12.8 76.8-38.4 16-22.4 19.2-54.4 12.8-80l-102.4-339.2c-16-64-70.4-108.8-137.6-112H179.2c-41.6-3.2-80 19.2-99.2 54.4-9.6 19.2-16 38.4-16 57.6V537.6c0 41.6 22.4 80 57.6 99.2 19.2 9.6 38.4 12.8 57.6 16h144L480 848c32 35.2 89.6 38.4 124.8 6.4 19.2-19.2 32-44.8 28.8-73.6l-6.4-128z m-323.2-512h57.6V592H304v-451.2z" horiz-adv-x="1024" /> + + + <glyph glyph-name="star-fill" unicode="" d="M752-43.200000000000045c-9.6 0-20.8 3.2-30.4 8l-208 104-209.6-104c-20.8-11.2-48-9.6-67.2 4.8-19.2 14.4-30.4 40-25.6 64l43.2 224L89.6 411.2C72 428.8 65.6 456 72 478.4c8 24 27.2 41.6 52.8 44.8l228.8 41.6 102.4 208c11.2 22.4 33.6 36.8 57.6 36.8s48-14.4 57.6-36.8l102.4-208 228.8-40c24-3.2 44.8-20.8 51.2-44.8 8-24 1.6-49.6-16-67.2L772.8 257.6l41.6-224c4.8-25.6-6.4-49.6-25.6-64-9.6-8-22.4-12.8-36.8-12.8z" horiz-adv-x="1024" /> + + + <glyph glyph-name="rate" unicode="" d="M959.008 489.984l-308 47.008L512 832 372.992 536.992l-308-47.008 223.008-228-52.992-324L512 90.976l276.992-152.992-52.992 324zM512 156L304 39.00800000000004l40 235.008-179.008 182.016 242.016 32 104.992 224 104-224 240.992-34.016L680 273.024l36.992-235.008z" horiz-adv-x="1024" /> + + + <glyph glyph-name="template-1" unicode="" d="M512 384zM43.52 601.6l409.6-176.64c58.88-30.72 110.08 0 110.08 0l414.72 174.08 2.56 2.56c10.24 5.12 15.36 15.36 15.36 28.16 0 15.36-10.24 28.16-23.04 30.72L563.2 837.12c-56.32 23.04-97.28 0-97.28 0L46.08 660.48c-12.8-5.12-20.48-17.92-20.48-30.72s7.68-23.04 17.92-28.16z m0 0M512 222.72000000000003c-2.56 0-7.68 0-10.24 2.56l-486.4 215.04c-12.8 5.12-17.92 20.48-12.8 33.28 5.12 12.8 20.48 17.92 33.28 12.8L512 276.48 988.16 486.4c12.8 5.12 28.16 0 33.28-12.8 5.12-12.8 0-28.16-12.8-33.28l-486.4-215.04c-2.56-2.56-7.68-2.56-10.24-2.56zM512 71.67999999999995c-2.56 0-7.68 0-10.24 2.56l-486.4 215.04c-12.8 5.12-17.92 20.48-12.8 33.28 5.12 10.24 20.48 17.92 33.28 10.24L512 125.44000000000005 988.16 332.79999999999995c12.8 5.12 28.16 0 33.28-12.8 5.12-12.8 0-28.16-12.8-33.28l-486.4-215.04H512zM512-79.36000000000001c-2.56 0-7.68 0-10.24 2.56l-486.4 215.04c-12.8 5.12-17.92 20.48-12.8 33.28 5.12 12.8 20.48 17.92 33.28 12.8L512-25.600000000000023l476.16 209.92c12.8 5.12 28.16 0 33.28-12.8 5.12-12.8 0-28.16-12.8-33.28l-486.4-215.04c-2.56-2.56-7.68-2.56-10.24-2.56z" horiz-adv-x="1024" /> + + + <glyph glyph-name="vercode" unicode="" d="M513.807059-128C351.171765-128 58.428235 126.19294100000002 54.211765 376.16941199999997V662.287059a93.364706 93.364706 0 0 0 81.317647 88.545882 570.428235 570.428235 0 0 1 163.237647 40.357647A393.336471 393.336471 0 0 1 446.945882 872.508235a101.797647 101.797647 0 0 0 120.470589 5.421177A629.458824 629.458824 0 0 1 716.8 792.395294a1255.303529 1255.303529 0 0 1 169.863529-38.550588 98.785882 98.785882 0 0 0 79.510589-90.955294 2911.171765 2911.171765 0 0 0-3.011765-291.538824C924.611765 49.09176500000001 672.828235-128 513.807059-128z m0 963.764706a39.152941 39.152941 0 0 1-24.696471-7.830588A438.512941 438.512941 0 0 0 319.247059 734.569412a608.376471 608.376471 0 0 0-180.705883-43.369412 33.731765 33.731765 0 0 1-24.094117-30.117647v-283.708235C118.663529 155.10588199999995 389.722353-67.76470600000005 513.807059-67.76470600000005s354.183529 148.178824 391.529412 444.536471c9.035294 175.887059 0 281.901176 0 283.105882a38.550588 38.550588 0 0 1-29.515295 33.731765 1287.830588 1287.830588 0 0 0-180.705882 41.562353A676.442353 676.442353 0 0 0 536.094118 829.741176a37.345882 37.345882 0 0 1-24.094118 6.02353zM784.865882 479.171765L487.905882 198.47529399999996a40.357647 40.357647 0 0 0-49.392941-4.818823l-7.830588 6.625882-161.430588 171.068235a40.357647 40.357647 0 1 0 60.235294 55.416471l133.722353-141.552941 267.444706 252.988235a40.357647 40.357647 0 1 0 55.41647-60.235294" horiz-adv-x="1024" /> + + + <glyph glyph-name="service" unicode="" d="M849.00812012 487.71642715A27.54528398 27.54528398 0 0 1 849.00812012 496.71080566 337.28919434 337.28919434 0 0 1 174.42973145 496.71080566a27.54528398 27.54528398 0 0 1-1e-8-8.99437852 147.28294776 147.28294776 0 0 1-112.42973144-140.53716386V328.06620849a148.40724551 148.40724551 0 0 1 123.67270459-143.34790781A308.6196126 308.6196126 0 0 1 414.4672083-9.222985839999978h5.05933769a84.32229815 84.32229815 0 1 1 0 56.21486573 252.40474688 252.40474688 0 0 0-172.01748955 137.16427235h31.48032481A35.41536562 35.41536562 0 0 1 314.96689531 215.63647705000005V458.48469697a35.41536562 35.41536562 0 0 1-35.97751406 34.29106787H230.64459717A26.42098711 26.42098711 0 0 1 230.64459717 496.71080566a281.07432862 281.07432862 0 0 0 562.14865723 0 26.42098711 26.42098711 0 0 1 0-3.3728915h-48.34478497a35.41536562 35.41536562 0 0 1-35.97751406-34.29106875V215.63647705000005a35.41536562 35.41536562 0 0 1 35.97751406-34.29106787h63.52279893A150.0936917 150.0936917 0 0 1 961.43785156 328.06620849v19.11305479a147.28294776 147.28294776 0 0 1-112.42973144 140.53716386zM498.22735801 46.991879880000056a28.10743242 28.10743242 0 1 0-28.1074333-28.10743242 28.10743242 28.10743242 0 0 0 28.10743329 28.10743242zM258.75202959 240.37101797000003h-43.28544639A93.87882598 93.87882598 0 0 0 118.21486572 328.06620849v19.11305479a93.87882598 93.87882598 0 0 0 97.25171748 89.94378516h43.28544639zM905.22298584 328.06620849a93.87882598 93.87882598 0 0 0-97.25171748-89.94378515h-43.28544727V437.12304844h43.28544727A93.87882598 93.87882598 0 0 0 905.22298584 347.17926328zM633.70518418 705.83010615l-20.7995001 7.30793232a28.10743242 28.10743242 0 0 1-17.42660859-56.21486571l16.30231084-6.18363458a28.10743242 28.10743242 0 1 1 21.92379785 51.71767646zM330.14490928 639.49656503A28.10743242 28.10743242 0 0 1 376.80324805 609.14053711 177.63897568 177.63897568 0 0 0 511.71892578 676.59837597a28.10743242 28.10743242 0 0 1 0 56.21486573 231.60524678 231.60524678 0 0 1-181.57401651-93.31667667z" horiz-adv-x="1024" /> + + + <glyph glyph-name="cellphone" unicode="" d="M785.066667 896H238.933333a102.4 102.4 0 0 1-102.4-102.4v-819.2a102.4 102.4 0 0 1 102.4-102.4h546.133334a102.4 102.4 0 0 1 102.4 102.4V793.6a102.4 102.4 0 0 1-102.4 102.4zM238.933333 827.733333h546.133334a34.133333 34.133333 0 0 0 34.133333-34.133333v-648.533333H204.8V793.6a34.133333 34.133333 0 0 0 34.133333 34.133333z m546.133334-887.466666H238.933333a34.133333 34.133333 0 0 0-34.133333 34.133333v102.4h614.4v-102.4a34.133333 34.133333 0 0 0-34.133333-34.133333zM512 8.53333299999997m-34.133333 0a34.133333 34.133333 0 1 1 68.266666 0 34.133333 34.133333 0 1 1-68.266666 0ZM426.666667 725.333333h170.666666a17.066667 17.066667 0 0 1 0 34.133334h-170.666666a17.066667 17.066667 0 0 1 0-34.133334z" horiz-adv-x="1024" /> + + + <glyph glyph-name="print" unicode="" d="M843.946667 603.733333h-47.36V725.333333a90.026667 90.026667 0 0 1-94.72 85.333334H312.32a81.493333 81.493333 0 0 1-85.333333-85.333334v-121.6H170.666667a81.493333 81.493333 0 0 1-85.333334-85.333333v-325.12a89.173333 89.173333 0 0 1 85.333334-93.866667h56.746666v-52.48a89.6 89.6 0 0 1 89.6-89.6h389.973334a89.6 89.6 0 0 1 89.6 89.6v52.48h47.36a97.706667 97.706667 0 0 1 94.72 93.866667V518.4a90.026667 90.026667 0 0 1-94.72 85.333333zM279.466667 725.333333a30.72 30.72 0 0 0 32.853333 33.706667h389.546667c18.773333 0 42.666667-11.52 42.666666-33.706667v-121.6H279.466667z m465.066666-678.4a37.546667 37.546667 0 0 0-37.546666-37.973333H317.013333a37.546667 37.546667 0 0 0-37.546666 37.973333v170.666667a37.546667 37.546667 0 0 0 37.546666 38.4h389.973334a37.546667 37.546667 0 0 0 37.546666-37.973333z m142.506667 146.346667a45.653333 45.653333 0 0 0-42.666667-42.666667h-47.786666v66.133334a89.6 89.6 0 0 1-89.6 89.6H317.013333a89.6 89.6 0 0 1-89.6-89.6v-65.28H170.666667a37.546667 37.546667 0 0 0-33.28 42.666666v324.266667A31.146667 31.146667 0 0 0 170.666667 552.106667h673.28c19.2 0 42.666667-11.52 42.666666-33.706667z m-640 281.173333h-37.546667a13.226667 13.226667 0 0 0 0 26.026667h38.826667a13.226667 13.226667 0 1 0 0-26.026667z m94.293333 0H298.666667a13.226667 13.226667 0 1 0 0 26.026667h42.666666a13.226667 13.226667 0 0 0 0-26.026667z m426.666667-116.48H248.32a13.226667 13.226667 0 0 0 0 26.026667H768a13.226667 13.226667 0 0 0 0-26.026667z" horiz-adv-x="1024" /> + + + <glyph glyph-name="cols" unicode="" d="M128 448h384V832H128z m64 320h256v-256H192zM576 832v-384h384V832z m320-320H640V768h256zM192 384h64v-384H192zM384 384h64v-384H384zM640 384h64v-384H640zM832 384h64v-384h-64z" horiz-adv-x="1024" /> + + + <glyph glyph-name="wifi" unicode="" d="M723 275.5C666.8 324.4 593.4 354 513 354s-153.8-29.6-210.1-78.6c-3.2-2.8-3.6-7.8-0.8-11.2l36-42.9c2.9-3.4 8-3.8 11.4-0.9C393.1 258.8 450.3 282 513 282s119.9-23.2 163.5-61.5c3.4-2.9 8.5-2.5 11.4 0.9l36 42.9c2.8 3.3 2.4 8.3-0.9 11.2zM840.4 415.6C751.7 489.5 637.6 534 513 534s-238.7-44.5-327.5-118.4c-3.4-2.8-3.8-7.9-1-11.3l36-42.9c2.8-3.4 7.9-3.8 11.2-1C308 423.8 406.1 462 513 462s205-38.2 281.2-101.6c3.4-2.8 8.4-2.4 11.2 1l36 42.9c2.8 3.4 2.4 8.5-1 11.3zM957.1 554.6C835.7 654.2 680.3 714 511 714c-168.2 0-322.6-59-443.7-157.4-3.5-2.8-4-7.9-1.1-11.4l36-42.9c2.8-3.3 7.8-3.8 11.1-1.1C222 589.3 360.3 642 511 642c151.8 0 291-53.5 400-142.7 3.4-2.8 8.4-2.3 11.2 1.1l36 42.9c2.9 3.4 2.4 8.5-1.1 11.3zM512 118m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="export" unicode="" d="M896.4374528 479.830016c0 26.673152-21.6236032 48.2967552-48.2967552 48.2967552H630.8069376c-26.673152 0-48.2967552-21.6236032-48.2967552-48.2967552v-83.04831147H384.69522773l-2.71428266 5.36849067c-41.336832 87.44686933-35.95195733 204.128256 150.601728 199.94487467v-108.91537067l172.19037866 164.757504L532.58267307 822.7110912v-106.57245867c-228.64418133 5.70709333-263.651328-183.517184-157.433856-314.01028266l4.6891008-5.34664534h-88.46595414c-26.673152 0-48.2967552-21.6236032-48.2967552-48.2967552v-66.78882986h-98.43616426c-26.673152 0-40.4258816-21.6236032-30.71781547-48.2967552l79.10304427-217.33485227c9.70806613-26.673152 39.20145067-48.2967552 65.87460266-48.2967552h603.70670934c23.75898453 0 37.2506624 17.16169387 33.05745066 39.76178347 0.4980736 2.77108053 0.77441707 5.619712 0.77441707 8.53497173v463.765504z m-60.37067093-306.4528896l-21.8464256 60.02223787c-9.70806613 26.673152-39.20145067 48.2967552-65.87460267 48.2967552H303.44697173v30.56708266c0 13.336576 10.81125547 24.14783147 24.14783147 24.14783147h315.28605013v107.1972352c0 13.336576 10.81125547 24.14783147 24.14783147 24.14783147h144.88917333c13.336576 0 24.14783147-10.81125547 24.14783147-24.14783147v-270.2311424z" horiz-adv-x="1024" /> + + + <glyph glyph-name="rss" unicode="" d="M810.666667 42.624C810.666667 395.562667 523.562667 682.666667 170.666667 682.666667v-85.333334c305.834667 0 554.666667-248.832 554.666666-554.709333h85.333334zM512 42.624h85.333333C597.333333 277.930667 405.930667 469.333333 170.666667 469.333333v-85.333333c188.202667 0 341.333333-153.130667 341.333333-341.376zM256 128m-85.333333 0a85.333333 85.333333 0 1 1 170.666666 0 85.333333 85.333333 0 1 1-170.666666 0Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="slider" unicode="" d="M228.7 683.9v-66.7H112v66.7h116.7z m333.2-266.6v-66.7H112v66.7h449.9zM295.4 150.60000000000002V84H112v66.7h183.4v-0.1z m116.6 600c9 0 16.8-3.3 23.5-9.9 6.5-6.5 9.9-14.5 9.9-23.5v-133.3c0-9-3.3-16.8-9.9-23.5-6.5-6.5-14.5-9.9-23.5-9.9H278.8c-9 0-16.8 3.3-23.5 9.9-6.5 6.5-9.9 14.3-9.9 23.5V717.1c0 9 3.3 16.8 9.9 23.5 6.5 6.5 14.3 9.9 23.5 9.9h133.3v0.1h-0.1z m66.7-533.3c9 0 16.8-3.3 23.5-9.9 6.5-6.5 9.9-14.5 9.9-23.5v-133.3c0-9-3.3-16.8-9.9-23.5-6.5-6.5-14.5-9.9-23.5-9.9H345.3c-9 0-16.8 3.3-23.5 9.9-6.5 6.5-9.9 14.5-9.9 23.5V183.89999999999998c0 9 3.3 16.8 9.9 23.5 6.5 6.5 14.3 9.9 23.5 9.9h133.4v0.1zM912 683.9v-66.7H462.1v66.7H912z m0-533.3V84H528.6v66.7h383.3v-0.1h0.1zM745.2 483.9c9 0 16.8-3.3 23.5-9.9 6.5-6.5 9.9-14.5 9.9-23.5v-133.3c0-9-3.3-16.8-9.9-23.5-6.5-6.5-14.5-9.9-23.5-9.9H612c-9 0-16.8 3.3-23.5 9.9-6.5 6.5-9.9 14.3-9.9 23.5V450.6c0 9 3.3 16.8 9.9 23.5 6.5 6.5 14.5 9.9 23.5 9.9l133.2-0.1zM912 417.3v-66.7H795.3v66.7H912z" horiz-adv-x="1024" /> + + + <glyph glyph-name="email" unicode="" d="M834.446 682.553H194.105c-50.176 0-91.022-40.846-91.022-91.022v-423.026c0-50.176 40.846-91.022 91.022-91.022h640.341c50.176 0 91.022 40.846 91.022 91.022V591.531c0 50.176-40.846 91.022-91.022 91.022z m36.409-514.048c0-20.025-16.384-36.409-36.409-36.409H194.105c-20.025 0-36.409 16.384-36.409 36.409V591.531c0 20.025 16.384 36.409 36.409 36.409h640.341c20.025 0 36.409-16.384 36.409-36.409v-423.026zM786.773 537.941L514.275 366.023 241.777 537.941c-12.743 8.078-29.582 4.21-37.661-8.533-8.078-12.743-4.21-29.582 8.533-37.661l286.72-180.907c4.551-2.845 9.557-4.21 14.563-4.21h0.91c5.006 0 10.013 1.365 14.563 4.21l286.72 180.907c12.743 8.078 16.611 24.917 8.533 37.661-8.306 12.857-25.145 16.611-37.888 8.533z" horiz-adv-x="1024" /> + + + <glyph glyph-name="subtraction" unicode="" d="M785 348H239c-19.8 0-36 16.2-36 36s16.2 36 36 36h546c19.8 0 36-16.2 36-36s-16.2-36-36-36z" horiz-adv-x="1024" /> + + + <glyph glyph-name="mike" unicode="" d="M512 256c115.2 0 208 92.8 208 208V624c0 115.2-92.8 208-208 208s-208-92.8-208-208v-160c0-115.2 92.8-208 208-208zM368 624c0 80 64 144 144 144s144-64 144-144v-160c0-80-64-144-144-144s-144 64-144 144V624zM844.8 416c0 17.6-14.4 32-32 32-16 0-30.4-12.8-32-28.8C758.4 289.6 646.4 192 512 192s-246.4 97.6-268.8 227.2c-1.6 16-16 28.8-32 28.8-17.6 0-32-14.4-32-32v-4.8C204.8 260.79999999999995 328 144 480 129.60000000000002V-32c0-17.6 14.4-32 32-32s32 14.4 32 32V129.60000000000002c152 14.4 275.2 131.2 299.2 280 0 1.6 1.6 4.8 1.6 6.4z" horiz-adv-x="1024" /> + + + <glyph glyph-name="light" unicode="" d="M512 72c-172.313 0-312 139.687-312 312s139.687 312 312 312 312-139.687 312-312-139.687-312-312-312z m0 64c136.967 0 248 111.033 248 248 0 136.967-111.033 248-248 248-136.967 0-248-111.033-248-248 0-136.967 111.033-248 248-248z m0 696c17.673 0 32-14.327 32-32v-51c0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32V800c0 17.673 14.327 32 32 32z m0-785c17.673 0 32-14.327 32-32v-51c0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32v51c0 17.673 14.327 32 32 32z m325.945 11.055c-12.497-12.496-32.758-12.496-45.255 0l-36.063 36.063c-12.496 12.497-12.496 32.758 0 45.255 12.497 12.496 32.758 12.496 45.255 0l36.063-36.063c12.496-12.497 12.496-32.758 0-45.255z m-568 565c-12.497-12.496-32.758-12.496-45.255 0l-36.063 36.063c-12.496 12.497-12.496 32.758 0 45.255 12.497 12.496 32.758 12.496 45.255 0l36.063-36.063c12.496-12.497 12.496-32.758 0-45.255z m561 81.318c12.496-12.497 12.496-32.758 0-45.255l-36.063-36.063c-12.497-12.496-32.758-12.496-45.255 0-12.496 12.497-12.496 32.758 0 45.255l36.063 36.063c12.497 12.496 32.758 12.496 45.255 0z m-563.572-565c12.496-12.497 12.496-32.758 0-45.255l-36.063-36.063c-12.497-12.496-32.758-12.496-45.255 0-12.496 12.497-12.496 32.758 0 45.255l36.063 36.063c12.497 12.496 32.758 12.496 45.255 0zM960 384c0-17.673-14.327-32-32-32h-51c-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32h51c17.673 0 32-14.327 32-32z m-781 0c0-17.673-14.327-32-32-32H96c-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32h51c17.673 0 32-14.327 32-32z" horiz-adv-x="1024" /> + + + <glyph glyph-name="gift" unicode="" d="M796.3 600h-6.7c5.1 6.7 9.6 13.4 13.4 20.1 18.3 32.2 20.8 63.1 7 87.1-9.1 15.7-33 41.2-91.9 36-35.4-3.2-76.1-17.2-114.7-39.4-37.9-21.9-68.9-49.3-89-77.5-4.5 6.4-9.5 12.8-15.1 19.1-19.8 22.3-45.4 42.8-74.1 59.4-38.4 22.2-79.3 35.9-115.1 38.5-43.3 3.2-75.8-10-91.4-37-13.8-24-11.3-54.8 7-86.7 3.7-6.5 8.1-13 13.1-19.5H236c-21.3 0-41.6-7.2-57.4-20.2-17.8-14.9-27.6-35.4-27.6-58v-50.8c0-34.4 23-64.6 55-76.6v-283.9c0-23.3 10.9-47.1 30.1-65.3 18.3-17.4 41.4-27.3 63.4-27.3h434.3c22 0 44.9 10 63 27.6 18.7 18.1 29.3 41.8 29.3 65.1V395c11 4.3 19.6 10.9 27.2 19.5 13.3 15.1 20.8 35.2 20.8 56.6v50.8c-0.1 45.3-32.8 78.1-77.8 78.1z m17.7-78.1v-50.8c0-7.7-3.2-20.3-15-22-0.9 0.1-1.7 0.1-2.6 0.1-1.5 0-2.9-0.1-4.3-0.3H543v91h253.3c11.9 0.1 17.7-5.8 17.7-18zM633.4 651.8c30.7 17.7 63.5 29.2 90 31.6 21.5 1.9 32.6-2.8 34.6-6.3 4.2-7.3-6.3-41.2-52.9-77.2H569.8c14 17 35.3 35.6 63.6 51.9z m-362.8 24.4c2.2 3.7 13.3 8.7 35 7.1 26.6-1.9 59.2-13.1 89.5-30.6 27.7-16 49.4-35.1 63.9-52.8H323.5c-20.3 15.6-36.4 32.9-45.8 49.4-8.9 15.6-8.5 24.4-7.1 26.9zM211 521.9c0 11.2 12.9 18.1 24.9 18.1H483v-91H240.1c-1.4 0.2-2.8 0.3-4.3 0.3-0.9 0-1.8 0-2.7-0.1-11.5 1.5-22.1 11.6-22.1 22v50.7z m55-411.3V389h217v-311H299.4c-13.2 0-33.4 17.5-33.4 32.6zM733.7 78H543V389h223v-278.4c0-15.5-19.1-32.6-32.3-32.6z" horiz-adv-x="1024" /> + + + <glyph glyph-name="mute" unicode="" d="M739 294.4l180.2 180.2M735.391 297.9l180.24 180.24 7.07-7.07-180.239-180.24zM631.4-29.700000000000045c-5.1 0-10.1 1.3-14.5 3.7L277.1 162.20000000000005H116.8c-16 0-28.9 13-28.9 28.9v384c0 16 13 28.9 28.9 28.9h160.3l339.7 189.9c4.5 2.5 9.5 3.8 14.6 3.8 5.3 0 10.6-1.4 15.1-4.1 9.1-5.3 14.8-15.2 14.8-25.8v-767.6c0-10.5-5.6-20.4-14.7-25.8-4.6-2.7-9.9-4.1-15.2-4.1zM305.8 551.5v-336.7L601.4 51V716.8L305.8 551.5zM145.7 220.10000000000002h102.2v326H145.7v-326zM913.2 258.9c-9.3 0-18.1 3.6-24.7 10.3l-63.4 63.4-63.4-63.4c-6.6-6.6-15.4-10.3-24.7-10.3s-18.1 3.6-24.7 10.3c-13.6 13.6-13.6 35.9 0 49.5l63.4 63.4-67.4 67.4c-6.6 6.6-10.3 15.4-10.3 24.7 0 9.3 3.6 18.1 10.3 24.7 6.6 6.6 15.4 10.3 24.7 10.3s18.1-3.6 24.7-10.3l67.4-67.4 67.4 67.4c6.6 6.6 15.4 10.3 24.7 10.3s18.1-3.6 24.7-10.3c6.6-6.6 10.3-15.4 10.3-24.7 0-9.3-3.6-18.1-10.3-24.7L874.6 382l63.4-63.4c13.6-13.6 13.6-35.9 0-49.5-6.7-6.6-15.5-10.2-24.8-10.2z" horiz-adv-x="1024" /> + + + <glyph glyph-name="reduce-circle" unicode="" d="M512-65.5c-60.6 0-119.4 11.9-174.8 35.3-53.5 22.6-101.5 55-142.7 96.2-41.2 41.2-73.6 89.2-96.2 142.7C74.9 264.1 63 322.9 63 383.5s11.9 119.4 35.3 174.8c22.6 53.5 55 101.5 96.2 142.7 41.2 41.2 89.2 73.6 142.7 96.2C392.6 820.6 451.4 832.5 512 832.5s119.4-11.9 174.8-35.3c53.5-22.6 101.5-55 142.7-96.2 41.2-41.2 73.6-89.2 96.2-142.7 23.4-55.4 35.3-114.2 35.3-174.8s-11.9-119.4-35.3-174.8c-22.6-53.5-55-101.5-96.2-142.7s-89.2-73.6-142.7-96.2c-55.4-23.4-114.2-35.3-174.8-35.3z m0 848c-220 0-399-179-399-399s179-399 399-399 399 179 399 399-179 399-399 399zM772 359H252c-13.8 0-25 11.2-25 25s11.2 25 25 25h520c13.8 0 25-11.2 25-25s-11.2-25-25-25z" horiz-adv-x="1024" /> + + + <glyph glyph-name="music" unicode="" d="M575.4 832h-74.5v-633.5C385 251.20000000000005 249.3 180.70000000000005 226.8 76c-7.3-34.1 7.9-70.9 21.9-87.8 79.3-94.6 252.2-50.5 331.6 51.3 35.2 45.2 32.3 84.6 32.3 181.3V608.5c48.8-36.3 103.9-70.1 123.7-135 12.2-40.3-4.1-107.3-17-141.5-3.9-10.3-14.7-18.9-9.7-29.2 34.2-25.4 51.1 28.6 60.9 51.2 10.6 24.5 20.8 54.7 24.4 75.6C833.2 653.2 595.5 661.7 575.4 832z" horiz-adv-x="1024" /> + + + + + </font> +</defs></svg> diff --git a/view/font/iconfont.ttf b/view/font/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..06e30f9e2a856cbfefff25111ceb4b9c034f35fd GIT binary patch literal 46508 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 literal 0 HcmV?d00001 diff --git a/view/font/iconfont.woff b/view/font/iconfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..66a1783caaacf3f01bdfece7652a590e7c676bfc GIT binary patch literal 30628 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 IJpTXy03rurQ2+n{ literal 0 HcmV?d00001 diff --git a/view/font/iconfont.woff2 b/view/font/iconfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..47e9980f2d183e2e0e284a0000fadbfb1c5647cd GIT binary patch literal 25964 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 literal 0 HcmV?d00001 diff --git a/view/images/admin_logo.png b/view/images/admin_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..651908647f61377d54f928c7cb48791c8585e41c GIT binary patch literal 4260 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 GLSTXd!3`(? literal 0 HcmV?d00001 diff --git a/view/images/header_user_logo.png b/view/images/header_user_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a3f6ef85becfe2a4fd189eaaea10c4382b383927 GIT binary patch literal 1344 zcmV-G1;6@<P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00001b5ch_0Itp) z=>Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR917@z|H1ONa40RR917ytkO0OB=utpET7s!2paR7eedR^Lxsbrk>HwzQ?~ zrIb;Al#bEf${Zl*Vg@WGCdTN@vf<(r1|Jru@oCBaf@Se(dvIniK4>ych&(6~7Kw{7 znc1@7WWvTWhl7?5`n$By_V)J2TCU&krM<nZ?M~A6e9w>1`F_v$obxS%m(a9NwC6Jz z1A~*qjDrZ9WX>Q!e%)j}r)|XSM|Q?n4~D6wnA#9+Vjh=>@~kLAUCX8{V;B@g;5wtl z#qn;22Hr<i0j5^P)5KwtSh4#oUs&XFMQAiCsMRt=if|L-uP`^1rYhxPYE3*ZGMFK< zy5M*ITt{Ljhg*NRkxXQj?kx4C7)qfWptSR=B(JheX~^?=gaRo^wCUYOp|A^cvtDTe z>Pt?4m130@5}1^8nwC1?)VNp>v9uUKG?K>jPmeHi{2){+IXz{(a*#=iNrh4XdZC1` zo0e!ejpYYH#NrwF{Rw>f#WBRAJQn}jr~vQh*b*ifsT8yDzN}hk-YpgbHhl?nuqt$# zHR!V&aQA5%M@Aj{p-U@TU0OYQG_=l1-s+ZODw%`5(*!Ze<J2IF*Ig`Jb`u_Zk|?ZZ zYJyWC-7v-0NKHf{D2ZNR*q=f!o`j`g7w`5qq2JjJqh1YfP{238c(AaN!0>y0O1EmB zG^mD1Ii)5R6EJ^s1rzVvF*Im}&8nAnYtZc-vZvF4&p&j)xe&$DjsUYor*waj=TxL} z_S(Os+S$(H#Bduv7-^Hhskq<S1d>ykG^Dv+<5=Xk)3U54L$IrAo^!QeBd5VvKYQ`( z-7psZ-NAZ5sPgZ!Hex55!oB;!DxFfGB6m<VKb-v?XzuO8s%XSbZxQD%KY%Z?uWPZp z3k>!caO>|N?mrAGF)KX5rYCS$Bo(gF(14B(6Wk#IR;v+hEtOoylh5(}Z<~0?H^6-S zFlHu~kSDXL2D#}S%+*lHBDXhzt}YhkrhT%W!j&67{E#%`pMnu$LO|<VM{xUIRU&9t z&#CA<r%fRvDwt4^2k(nx{#gbyw?pvw)A({WfIGY%`bZ1|x;#eOH87=8V9Glv`AdyP zvFZB9HSt>#?VJJ|Y5qAD?)%|7YKQy3E%J#%*yf?@Zo`1X3<oI&H5u2G9xZHwvzc(n zVW~hc`0isD^O<Bp9}A+{8<iy!k0*{6doy%;G8Tq9!1c93W7OlF(Jr`NZI!{P`5{*; z0wKQSDgC5Mn0v#HzC`3G6QrU@Z2;M90TI%0?RGOln+e2-vstUc$gmyBa8jDA)Q(T& zNHvLQvNS><mz>EIKrtv*`E`@~fWAaTae*2{!aUdmCOli+A|P38$J6LD<nhUX4oA&J zX_C?a-ltI{$b_ZTM1~=0QVM=S`KrkQsL{BKxyFb%6AGkLMzbD5I*-STeloZi&?+3@ zn&2T#7YQY?;f@h-0iGuj>I$u)A(hJ&&QJ_VQ2HVPtLgOR6<d$9<&qGHo$cpX_55-S z-J}oNSv8hD3HZYq93JIx&~*SNR!b}Jx^H#s;*~LLRjt+xP!4%*+GjuZhGi@m5l((R zxx!7Ha@yX0vmL+B`vPlugWJ(-onwlaJwH_cZ_EF%&Eb`-e=iUK0000<MNUMnLSTZq Cqh~<? literal 0 HcmV?d00001 diff --git a/view/images/pdd_icon.png b/view/images/pdd_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fe37b9c38c1940c3af94197a2e0f2b10ad19e421 GIT binary patch literal 460361 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%0AcVKI;$C~!OQ2LKH(39g^ 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	gou+;9 z2S(^DE?xci!^rOBI7XL)(>X?h*tqZv?3o~5=zylC%ZH1d`-g-mc}mO$O=)qHrLdm} z_*L+@>gxWGpZg`i{1u-{yD$zEw`o(f%4+{`&WOeVuMZ=;=odGHrdCBD89clL_t;J( zUwB)cEzWVoQqSJpf|53N{*ZLB4aS;A=I$V5f4+^F4nx@ma;Kd>@{hM@g1o^6YRyOZ zUEvH>V#%d2_)(xJYMGTjdz-EEvz`B1u&<*}_nZ@vgnSjA|Cks6%4vyC)&T>UThUtZ zYweo5a!0E6?^^+657Tb#BH-##2ds3d{2Kx7$8gzq(#&oeK4l_xZA8zLE(X@u9I#M1 ztP(T>j$f|_S~s^CQ4sfVRtc{#)$SX*#W&Q|@9=?rKVUaCHT&X$cP3p2;kGalYMj!T zdGTsfspB^ezbd7O!KsW47UXFGo?O2PpVxMov79%&j^tz>uZ5Ci;@o@n^I&onYD-xI zeDseBpHh16z>S{#M}{E4+RZ<D3CyPj0YDTK45n%Ki}N<m$e*Qdo*S51rgLN^z4x++ zmKjUX%3Tqyhh=uepw{`$@N4_iAps4#x-p+lcb=!ni;vMm`ciwSQLsGv>jL#KaG>7r zd4Rd<W9sq9901}dY-E_;2r7J30xTo&tZC2C+-g_91@++7X87y8b*O2}=H|F{D2ed5 zOrio!&E|86Z~Z(g%}N+eGu*IN6)-WCpNOaxaAUA!-fFVd-m{2w?D;TDV<u$qI&zH> zN8v3%>8IlYedc{OA~v@%K3pTy74i+Zsjo+ysBf=n9xe)PZR~N>>aRgw1D~*Ys?F~h zPI@|RWZjA!-IJvv^2t_KaK!McH|2v|p=;^8EXT~EB6*2$D!*X|dnMhqL>W~WVHUo2 zx8#l#;Z>(?;V-9lKaDd;tGg7NmX5CA`x^JAngBg-wlHA3-*uvX2exS`{%?0t+D{u1 zKGVz<0HwqgtFtx$ywp`yNv>VNSOz6WI$&{BYiUK7?H>v;JcKxBOp9^D7&4<OY%8){ zo4q-M`I}nef@!M;%w_*Cj$|0T-dj_hkyN`L{2#49#tSH6zl`6$2JxO^R9EMMn+ni0 zpPjfMb7FgGi;<JXu;^8A!gRklCp&ybV}f$D0BtRGlI=ocUXB+R0WW4i@L)SCfWzLH zvK+sqc^hD+=)8C;&-V;4&{Oq(?K_+&2(2+-^S(=;Ugg2e5y~?!k-5NMBq0w8ypb>@ zzU_}ZLnJ32)@dHM1r5fH&0g%u*O3?i%y_w9AH=>uS$9h$=ZvsNl+Ia#X<JN`{3@V) z{-38G{Mm23s8yzat~{%lKfn!R(JJ1il1w+_@eV06SskPS2R_zHczB|C>c?|j;`u{y z7(F$~&9PPPpTWF!8tE`C=>^@eDE$JRh<#rzd;b6!A>4FQ)5;DqEiNZ0c59w~yn6kN zUzNFJ*G~g?*rx~>crvHx;|M)oDG%>@C=u?L?9y+3a}-S=Czlk7oRQK0aDA{u)H`Zh ze>JSeRBhKsR`KCt_onEz)neDIt5uq@Q!AwN1nFb~Yv{u(w%SFCSXj4XeavQ7_Ir(j z2xSl`+@fEC>g+r1Z0=g>7TI*91s>w`IoH+x7g+s10dMoH({3Mp;dhCfk5|LG96xHG z=Q)v+6>6_9p>OLv?{@H8E?L!0?=g4~)(N>w+mp_RtFP!v%79X7dMn(?`Z_3#`})k# zi$XG_tZXweV<Gi$mLglCDbVaTiWoCH_En$0;2t+ZlqSNvKHKR-F?C+^&%-bLYAeaN zis)#XpHS*LC51?o!|{ay)(zn?++-&`<6J<erhWBv2JzD}%rCcC0|Sg!eWMy_{=>xk zmd7k2y%OUvdP{zvXG3L=XjijM%$lRPoF|6f<Gzfzcosa3=><VL1q;dv-Cw#^hT9n5 z^(^s9s0zd@G5~G+CYw{0%_~SOPv$$N#^6`vy9m#fDlK8Rm`anQvA6@dV;-ss`anp! z4YF}+J6o8hTI4)h#bts0_3yvB#_wPFF8Z}EB+?9__fXC<{kWrjA5N*228Nw|jb}}~ zGIWQI@qhVB5#CSXj!ARw@_tKvq$-m=pZP?zS7ZYYPBkW>xRBE**vuEhcF;!njU3S{ z#DA!knav8ggH3Faz}liZNNeprH#;jEKy)MNc016)QM9c^!ro3nHT&Q%^mkDKNL$W4 zg=QjMUW@*C`Zr}qUd^J7CwK&o=<py&$tL;c4$|9J2_%{HZ60pf3t>{9*WlA(W02Rw zrS-{v6j!^zp7l)EKQF_WN4(|xxoVbA2uz0$5eEmslW@@+ZN|4J_R+px<A-Ou*T4?l ze312U+sHtP#rG7?syTlX13Fy4Lb2{2Ft|W2-{2Gqw^6=rQ7!+E%)Pa^IQnT~b#QAt zL}?#Xf+OErlBW5A=7s<)6aHtJc;+Wtq15$`cv++;Y8sG6Pu^S!34qla0&eI!rhBTY zcHG@AFYX<3gufAz<Q*Igx#AEZiw3b_m+o?#mh0i7PE4E$ip3)T3LfQ%OcV#2=C4qQ z<4@1hG<!!zc&|N=cScT0>{bJhKY?cP;F!`nyweiDuD6Ikk8uAr3T1o;?{2i{a^E)@ zf|waW)-W!L23(DIX#2bFb0Un6reEEL5m_M+3RNgksA)2<pPmv$I~>#77V`7&z~`>l zccPRxFbiWG7--(DF{d=VwY%(#Hk%8YjwdIV_e{SoVcOeB5kvR&)wS@Gg8i-k%JJph z`F%^nhMPmu6K6F(^+h?;7w?SfBLwSEEpLzmw)cIoU-1=>vB5vQ%kqt?lCb{Q#K$*e z?s}S?IZ#D0f<YOQC(ljn&Zpw7cn{y7h}i`cktig?e!#!xjsXB6Cip!|@Cr)8K{JTq z<8@4THSwp+%pZwR5CC+cqAoV(KauY=B|E}mW>;Q@I}h(0nnV*;SNG%?b~U_VCaU;e z0Gi1L|5S`nV!O+GQ%s0_(s|ngP(i7M1t<iC$bkMJfCb;#BwqLLXNO6>%3*4V$Kq}s zZ^Y?+-G!21X{}w|+!C{;(Tyd{dzeKfoq1WbkoD#)tdML3m%j)X`hZ9>DiOwI$-uoD zTU=}DzJNAl1%wh|df`5J0f<E+$$v2TG!?gJp5c{^y+j72Q`XH(Xz-_iG<E@sZma1L zXh)(QruGY0pVz{Uw-C(v>hzV|-zcT%iaYC>Az_;fswRIFogFfD(v<qHuyLeUyQ7<i zR_Nd6!Szs_qy<95e;_@f!8Te}HlWm|JpcWD-SB}3iAe$(`U&OT!YVX7R?2+}7uH-} z0n^9(7|0^P1OH6FoQ~K0GLAGuqm0<bCqO|=j20Ig-fnHgCefk^YZ2=ISJNRTr52V6 zt<c0mGl0SoaVcgNu^|0m-a_PXLuF0x+nOHQO<vlvy$wjnLt<x{Bk{Aahd+3wuTjVN zeRJ1t;HcI;iX(XBYbwV{GXGC#DWj&S>`e67SYQ_a*7nkMcqSlqu|eSA>JXis)tig5 zYaFl1DVEGi3n-q8nvS}wlt3vb3J|396#K8JDRFRsxz!J)sn+Udo$;%C1y?Zh<3&>j z&mp4axiaM0$L8IC`}_ZqI^LR~H2s+Mx`L~HT1(<E!m6uDA1-vs7lCbe@5`e!;0Ne5 zyM0F5S{DfPWvf5*){@fu{Ub(sl#??kX?vXOsU*<DS<=^A;{A!^XqKfA@M^bvi(&_6 z(N?*1B(DGQP<yTVXJ*(--ErVN_rU|N=$;t!&SSfBvLWUq%^y9ce~~ZVzAS=YW#6JN zE4FCSf%9*8k~T0P?)ie`iywOMi}b}Y^=YuK>ZTrrxZ7W*b{k+0X^*i<-4dw6_V!l( zD#ZO!Y=G-^l&Y+Vq4~^4W(Sh`E)P|Z#M&=Pat6+&@}RPe1g}u~+zu&4`aLJy_5<Ou zYFWkeE>rd5Wi9qagpYsq;MT!HZ&w~-IA{TNzmJ6Nrp4ezds>4|Zso)vmR+2Kz6@(x zC*xkOj7PVOLcpk@>n4|7<c6Xi(cLysIt<&1wfG2b_!=W$Ia2p07OTJRQ)RttW~xoO zoPdnrjB-K)Tu@%oaaI;u6k2~j)$laiQ#aaj6!gq*mLXV{(>HFO5|K))1@$yS<hc*S zLVBrxk}2;3&vtuiNyXHT3Tn{D`Q+XEijV{~fU%epiIu6yr`p7&4;`~~=CI-Xr`k)~ zz9z2xCVwve7y?T4Sqf!yWx!~<+h)?zfp(wFG&*HztmlAnvp10?rw#LQ!%t2L0z6K9 z07z73q=B8hp4it?_M$7D>vv(KdL#Y182Z=SnpJZ7qaIUVm#g494CM+AZs;zgsB1${ zTu9_)aZ16#v@3wJD6chf_(`MjG^HbS8@*7WBv~u{kq3Xud7y{CQzT40lit@F8o(zF z7YsI!Grb;1);3250%PpsWy0kX$JX<gNHqRa3^a08DDLU6wV;OE#&V0~P;U*D1bR~| zBT+)6=?$bjFUiAoR4M2=1Yg^j(=Cd07Q-3uE9e*+Wf|agkTroR?!aEq$9KP*?`e+T zR*fgh&Vq-?qrcsab_Gy^cxvbjI*UDCvR`j#B6rk!_K<F2-Bfl#=(J2WdMTEEP%@yc z#RUi8)O_`lyWb9Z(i8mOi|ED(@EYsz55*2$9|NyO-X=HZP#Hh4cjX#UMcx0`_LVCF zPWJmcYdj1UE(}dd7{}77Cp!aq;VOu{D}KV(ytD$8IS{}pD-quq8p4ovh~2&>BtlY9 z5({jWI{Nqt5wXvAWhB%5Pi$h6R!NC=VuH5(^I@Ba^uMg;8W)9ZHty&w7Bie6u4|+R zg%WR(&Vi%nm9y&7wfRuFJ^}|#NQ9!vplA&5RNpBJMP!b4MT~@+K7!w7`Rd(Ty_hB- z>+c;CyM=Yk`=zwkN$9vtUta7pZ8qPj8pZkxOCf3a)rsF=Rv7=3*XxBw?)}lCr>LT~ zGly%^sjFFGpe`C3A^#S<{TMz)(v=%m&XH}RqPIX;&)^VCE9asfKnD8*DQxN_f1QAn zM5|?E02VNf!=is&f^L^FpldYv5v&@t-GbKmS(Eso9TLC*YFg{y<y|3gE&n0&h8;d& z=?r~hf=<XM|M3j#>El5d^W!mj8xRPCSTNVEjTluN0aXWVwIi^9utUIA{AI7qX^ySl zG>>R>#@ytWf?UiQU&XhIHfM<{|LU<?d_0f`NGkF#exDh}**y@N(An*a0`^&<4sN23 zZa+77$GM_m<59*jJ*{U=LN=5K3O+|=qTT(CO2r?ogSh?}A&mD(oHs2x_zv%{Dv|gI zRY>(`&LW-@Ke*E5NnMnvDELqM&A^RIbRtFMN=t4&t~mqxsEI1jOL!DF0BcPuL`1`T z&19XCI@~-=j*$_k!-R`WHaf+aQQ2!~Y{&?8@li=TB#c$5^JnsLWzZejvdOV^^|2&Q zhIs;rBCk2fd`k_kI@G5yaM+I5B8`!vV_>2h#V_FwG{%0=V^&Dhz=P&LM1%9mbfzRB zjwdFbZvI!BbcoKI{K9v&tkwgBh6*rxe)wk-;zuz|MywO)AqKZ~aXG)}2{CDJ3`n78 z-OArMAXo^IB0u+SaIIXRMUfqU($=T)yo?_}5uSPk+z4&20jKZKYb(#V(HScjhYu@Q zW2`mBe<c!95BjX-=NUKJC|<7-o`m0jLM#j_!=^kuTcC-;&=|qTk)<cq6CP}TWgflM z6`({RNt^s{mHPIIF&u>hxElygs`Qj8uMkMfJWj5nhZa$sc2gK?f(DJvwlT4+$^R`D zH9IV)Kr8_6&bqhJdsWq<C~XiBW`e9NUBDQI;yQ$e&I1+R4r)p2FnKSq#)X(+ELtYk zRCRYlKJCHixlfC-2^Bf3tE=tqLw}oTVN&vu!Hu5kMr}Vrn`DUq!l$R_+uRHB{|Wb8 zzrC+tY>ZqTiEi{CC65GDp4xah{<v=}@6WbI*oV~D)PA#61eK_jgz{e`eueq5eg!|D zj2ON$yk`rcK{ZT|MqaU85u;2Q8i@Nv?5QZ3W-!MmQ!_wwV@cwehIGNOBR!{Vb%1&R z-#X;zR=a|e-NK|<DripEKcFyT*rnXp)jRtBS%VOQIW?{MhKK>8E!vWbzIv?z$D%Xt zzU43%4&O0L9SA<k_&o;P+6yOkcn5Sg*~8n{%f&dV?mY~9V+*RJy{yCdRo}1V-^u-g z9MX9i&lhR++1`VBnnvqCV2R%7D0)2Oxi<7I@OTTo-1DDm=OlA3_~|sBjOA?}QrH-1 zuOX8AgpF1ZqMY>bsPV^16jB&6;K?x1jtMF$gqEw@NiafPZb4zMiDm*<KADqVc8W59 zlkB#|!q5M{C3uD*!8eZgRO}<v!$<O~FpZ}}j)^@udSI0a+Op)bzNP!0({JP1b%rh` z9VfJmo!P!6FH1Zz^uVH#{vV4O)ZyG$<J8sk4(&Ws0Y5-quBFcrIC&aJ5&ZpT<zoc} z668hS4d;Cqyyj?RKzJ`BFLW1KHE||ckH7egQ=TdVxYK1)QXsNel1<!6EDqPck{Ws) z*y{$FZrnKfS{!Som*LymMs>mwrukgJY>F>;4sz)4NzRQqWMlxW+{C*V%s1k^RW48c z&M@ScU|c#eiJQC-DasVuvWYkx!LmawNeNCk&5_4YaRJIP>HP|>^BcLt4O~`dN7+-? zJlfo8){n|Yb>LnBG^Vsd@+fWUN4@TTYS9PWGrQt0td!h<b6+f7k*I?&W)GwW^(Gk` z%ji#u4K06w5oV}O_Rl?MV3fq-{q184u>TBa3)3vGi>_1+x0TPXkyT}BC`28a1z2hp zM^BL0^!bAQD{c^aw$PqlP%!N`RNJ2C7eeE5K9`tVEP4;4!ZFh=o9*fN2P!l2Ioc9+ z{!?=LKs%Z}FkvwSy*(CG6~qy5H*sSZI}NZ|e1DfcK=Ip+%LI)=rye_K_`>B`)2}(o zf_474n(@~L9HXZWJ3e1r^*VEHZGd>+7(+SRf6Q3#*EV1CRyQ|Vuj4#1Gf&HN$UwAq zkA1!&xclbyc$=_&Lw5B@cy>P~4K1%*u2jtQjS0O)Fh3hT>T|o$FE`moCkYR?A9JU` z0C^4;zjqr<I0m~5SerH+^HzJbnd&$|uo%Kv)2AdS38_-m=Yk-<cSU_Zer-;j!jl_( z9ndc+C_kY-y>4Xk#cDFJ`!v{ZOa$+m@=M+JP(CHNJnL9IV1STLs@X__(W!wp#?%~* zF(IV?Rk-n^{QM`3kq=Vy3xdCf8`zc1p<oWHrDf^I--N9PcT_GlLsbMe2ce(4g218q zwcfZ(8;wL4GxoIteKJ)OuK<g`7j1?>#LwSCWCl<*7YmX9WAaQ2Cw}z}uB=hEZE?j$ z#;y`HOUofS)+A$JG#wOXa3!_opSJTAH)Qd!hpfp*uW1bqqUZ@j0nQ_t-%HALtNSj= z#`5s<G<@x9z4DX=DFXwQ$NWI!%798)7X!7iNGH`F5m!5<q!rS6f%2;l7cgp7|NNw+ zxs2tpFTtfY<YzXW9H$BI2M{J0(`fiLPwqr5VES`)&F5NwBM6?w|CYg9WJmSD1CX64 z<QoWlZLpWM?w_=jJwjnzTax~YUG1vuR4PN^?BbIryW6|PcVt_tub$a24{jOgV~C=k zuKJ{dSf|P{G>|-O#1DgQ6|;}6Vr-b-JTu99wSk<5ZhsT}89~Yr2`bf32kSF~X^&BI z?xA;}v)u~yO|0cN(-eEU`V01d#s6BrvfNf8JDNlr59gP8Kn2e&(-sY??pZ(Rmj$sK zOOv{8>L0A(VBR!bTU%cq<_$}PiQis-Y3G%$t`1)W3}_;bL=j|zNV@UdF`~cCsBv62 zs@1R}(5|lqjd3|_@DOupix2YHJtW0NZV1P%!ISKuH^Ezbzxu|;d5Hy$gvA>89AWKn zF}6Zn%y^XPpU`rw4PP|UAhhnaKf|P>Ota!&pn@j8oNqwS;0WV7+&y$AzC8w=0YO!p z=*ctB@^^i&>U?M9f<IcatiIPl0mD$jerC5@&|BmGf$@fgy-5j^=t^*YyImOJ)~^=8 z8Yh<367+lOl>`A4X`kEp-79fW$)s$~R|>D!rT4Q9K@(#iG7qlvEyIMI$zd{ci0V~e z*RRO*q>XE<a^u2rbbgEW&^2a`D^%hC&r|K|SMlXVIL`krd3`OANAatjaSY|%&<e1V zLvjBQs_Triu_LQ$!aRc8o<>VDKnP~th%TqxnHRW!vG^SQ%g5M|C<|3NHlm~?C3Ti0 zmu>sOjfu`?V0EV&+rEb8<8x}l%JRWd8*yL&oE6Qfgkdt_-=m6MDz%W7*fbLU5ZLe1 z2~O^&eDCz##WS}}{CgN!!BCFGOl>|JTk*VvXpxzy2*#g+fzf^InOZhHh|Do*$Eb}f z<t^^yz^=!@xtcTXO}RgBucE-}^^^eV^<0TgR_@zHrNyPj?!gs8?J5U+^3A@_i~`!- z&Ue-bG@|{XAD;`z(7#BazpjMhjlW+O1ZYm?WLSEoZ@ic7PG&3bpLY?~i(%h7GC^$t z9;G9M{u7?v&exH{MMGd`miPD?@_HKX;3G-6U#gt@FHqNZM?=#g3!B***BNk-F(R~& z)X)voju@xy-kv#cGUk>c+-C29IF-6SIr8(RUJ)-^<eSnH$VT2M9=b*Jk|DkvPLp|d zT9d)ilmyp1Z!7-h#Z4%KdWat0rm+^+C;lj5%yNZIaZe#FHAQ2D0&Zlhc~O<sxN3}} zq>eiwW$7nG1BG?|a5qCv*mPEvAW%1U#7+<>9DRguLqK%!#_Wme;}kaw0!}F!%gR^5 zNt)#Gcw!4h&+FnV@=tV?8}qpRr(PmU?s4#xR|7bx-kDc;(6x1!3_Vnz6B`qN5#o~# zL;ThN>Zqo*>lll8OmXF3b}WKpVOdXijQ%{h1wJO3I0JyRpp#16f>KaV@<|2Y5%he= zWQutznwP>?yyh&p#M{~)qYSW`5fL+h%8RUEBxVr#w&U>;)WnLrc)AHxxOqN7F9S^+ z|Jib`dgVcbD2~<@1G}wiOV3<8*Rp2!eTDjD65D^29lgb_&Y_>|YjEG53Ht48fM6j7 zAql!&HBcjyzZOPqnZ{}%Do$SnMJDUWP(k_f0vJmZ-XEcXOrb1*DDioWH}N9q{2SUJ zzzw(N+M(Xr;WzJQ_Rr)0WeEM`Gge$jQzNdW*;Ipv({{bnzPa0*eUVA?I^dM#=4Sls zX-u@dCbF=YFhM_~-CyPMnZfq<61AE+7c3s-z0Ia(7tM)jA&i?kbC&4twZG*&%aQi; zA#~{iw6+$1YDdAqAk%6ajkSMMI8fqIZis}D1or$WybUJ(WR!prg+>+~J}p98))pq= zkjFVbuQFhQvlFJ5W%dQ5-XhCMhyhP+wutoRH1ztDoefsG@i07=e-X92gu*fIHKb&x zywIsy@LFbr7;?MyE3m9TPG367>m|eAPGURCfqD#A;Hc>kWxxK7TjB0jnvSEapH9Oe z-oD;fBv7~~n1bG=M!L@@$=hJ$J16~&CrcsOR*&JOZbUq_1wnM1Hx$D(eH?$jLE-b9 zbh;-GET}GDUSvw@|E%e{;I-uDzAbzs=Xek?hp3DYb?vWCH8-#fKm6g33>#cw9mxWR zX%9|z>NXrUY|nqZjc{;OBD}3UD8b_t7--Yc?{3n4G&8fzuwrDc(qgAVm{zJe=$3w4 z5zpZod@`gY%QQtgOybE~gQ{EXs;rBPV)6Mc2O&R$ID^fJ-<Lt)vQ(e{b{d#3OsRJV z0C|o4emLd%#+^P#n%JWpxx}ZuRX5}3lo&x-Wrc9*^Ma8=S>aT1H_yAh5{2Y#$7M0J zEGaTh2KIS7MKm;#yzk+AKF6TZ?a7e`Iul=@xBU{RiR8A==;qns6s9vxonO;pYaB#e zh$L#;OuyA|XdjrTf7@%IC7qO)%1nv=XF?v<Y05Q!p=aDFE5@5=;MfXZ%&f#PCoC_f zb#lbto+7(_Hfo<J=!<yp+rc@gFMJd~S}Arc$DUQ<1v;4Q7|z1V67)EurZ|WE9@(Y< z%N@}v3&zZ$e3TkxBwA>aArZ!_&jPL&Y-Barp6OeE*=LGn#i?pB6~R^<I{FmCk7ABK z0myKy^vjFgZLAbj9LjwQIKN{Bb0`(#%?O$r#jgS9E^uc83`;S96aRmjO$`DyXPxdM z@6=%CY1z5r=GcjG9^&#@`F8J+`j_bnlue&c?Q4eoIO^{K&!&g7C?dsYH<rE^^x%r& zj9J9t^haP)ee;<qnWPS&5q=lBeyj}uRV^e<&Y$iq^4;{+u$H~&p3Pz!1Fa{-;I{uO zX}m{S2Oq^`ygHZgvNIGk_af{r$XvsW7e&Z|@PQhP@dh`a7!&u5KTYCS_e57W((+yZ zc%|Wdj2Oe~364rxadSV5Ql!Uyej|vCQj45bt1F<`P8@uMd${s?0TNX*=!7@t{PR-! z_6(e(F(u5r)C+j#FCjLlF|chhPTLMLZ1}2};$qRP>}~;SQN?b|wTe2la(+oYN}QcA zT{FDJp_(}qN<K*uj6J>sZY;HHsWDaJ3>-`Bjw<T#{ozJ)=9o^A*RFzSi>+jO`e@ZP z5j;G7AUl*J&F9K@U;jpS4>zv+`KlVKkNrHp*;VY3PuQ68{7g&V(l&}UWdkHQ_M|H( z`$S2YzVs~9{p1W3MQI^s39RT@3Keev*C%?$G%FEwwwuF@*B=zdktCj8>}Y80uSpEB zx7atgM+KtTF^EVO5AGPr-T>9+4<OC$aisn$x~s?3?NP|5Rd?XLskHe?1L_y>^VM}v zmmnM`flPf&gQg<)lHFE4;%`dqbJTGjT8#+6o3AT8@6O@4s}^TF5vE-7Ug=I@_~EK} zZ0uK!G3Q?mgU?-+fuxC*ilawO)jFjmyz(%VtBi{ru?~q@qR|%@%B`H0jf#vS$G0VT zqqMdmrLoey%vVU9MAjrst<BkC-nciRXyR6s)|L`_Y63rFNd{!zD1nM2;7<Z%?BQN= zna>uVQ|QAWJ-59*mwpgyCBqrP5Qg`u8gLIcWj&Zwj_1_jy6I8su$y|~#l|1><)t|b z%pqq>oc&s7k`{H+Jy;ajthy+hqIr`^w(LFj8x82^oMJ+V9i^1N5)c3`Dx_>l#QD~j z??i;&0XrDC+mX0oDf>8t(a#dUH|Zms8RKyssFt)Nn0!?4YqAs*BZNI9o=@?HQCI*Y zkt8>d!gfopJ>ZV;bO1v%Qc?l-j*E+JVIOi~L4awAUQ;t|0H%!cw8PPslh;q*CP31w z2yxL_Xj<gH^!mGB2zZ$Ro&5TeY<OWm^-7=<d5Eb=yIA!Z`z;9@=4w0A!$an358>&* z3BJ?#_MYeoNVpmz!w=FN-f^)_vP~HMLqVQiAmSoj=SqJB;N|zsN4;<+z?-ezTlV@E zz9R{-Wt|8b2Zw0%P(uFK>fN~L-mg|fcXGV!-_J@#?HU(!s@F)PL0#!rorg^<vh^U* z>7wZWuY-idv!%(tm$St1C*l^m7e32YA-h&l12|iGj@NtYCm`nfCK!2U8+qq?y>Fe5 zu{{j$I7N{X!41W$nmOqpRJ(NJo8#dmacHQPNu)+df`)<;K~qww$zy?bMLzV*pYG9t zJtH_umVg)AmCy80b@ErrI23bU%1;Itc_<1kFX<``h{BVnqomN|U)OfmNF@43C+G2J z{M9^S=*3M1;ZLy=7#cw8sovO@eTs3^Gn9*o_;DmD$$42`x}K%Ad*~oTh#2jYOkjOJ zxjr}-ETnc?(Rr^mb9JcIMwSyQZ!WOpy)2%x{g+#|Uu6z3o&D19845({Sx&<{bA#zC zu(~Ebdtg#($IUCFSzaRbdW{EcDs?5wvKME%pPJnfct+h9EbEQm+$Z>FDMQi@1Yd5* zQm?MI$O?EanA9)t2&8Jjs6sxZ#3UFs)#2^gkiJEO@zy+f^J3{t400e$7G%w0OP!HT zt#NK<a>O?M%QY9#yIj|W1f^!sN0f3alK<~3q~sMwegct_Mz(6>T}q|SAIE5meO_VQ z9Jmd+0<0-Nhazx(?-t~-T_B^t8+M>(lf-v;1OSEe=oI9w7OjFP%|j15EhlHWa>HHd z2Q-K^*E(|ooD4o^a+bJ4qI04uUASDB-AiqaT-sbpJsf&iEn5STOc5Blu3tffiO~Kv zU#mjaDsho8abrKfb>Ibp^>)N!32tSszrk03!2D&c2f%SNZ`#%=N%e!xQGHjj#m}sE zMM!bPA}Kw`_;t0Ay1GLdTzd7AmvF%qqriiXy7Spcsgg)r-Q4QFocK4_6@l*K%fqEI zNum%C#C`=(Z6%a(#GCH!WA^l;#Tuo*CLPYWhueMh3If0zeZp;FAGc|{L;k>HCD+z0 z(W-AOQqGoK_^HObM7-{Aq)p`xPm=?{aah*}0ph@0d&C^GwZeKMZ)5h_UxY+~ho7~y z;hLJklZLduFEP{hoe7=3<A=Ro*DQuWfjj0pF=8n7@*R^vFvAzl*pb3PRpJcpcz{?C z22j9s<?I1dxQt<2*TsL)+{YMKV`b)NMk;U?-QUzT{*s|U!QzRl#1ibx8vj#{n-gI+ zSeFF^xBt7{Vp?@yyxAFFA(05`#F{9>S!QQCOQTyfZ|bavLI8TxWdp%ly=Qh9+zV9> z=as3Hl#1|{p#lPA_g*sD1Zwd1#9w3sc~67i%);GjHn%f9e38w6JNSqbBEpl!WAnXl z2)Y<UgNKUSYWGv#%EFs1Nv+2|KQ4qAx}M6S-DI-jqur26B7X8mb)1f^ri|DGp?A^e z%9YNbKc|8u$D}%c&qp4Ue=al=GZfgWjxID^X>%VdO`H+WXV=#Vi$c@X04rhr=5mY~ zo9Whj`u83(@423PYyI{B7UJHjV4s)#s8&G9EIYFYEV?U{5eYU^G=M4otF$p`DDbNS zBOP5|LTUblw?<E{wNs)JTxYBN^DEvmFns3-ku7fwaMks@tK2c@?%7u$ssBiLw0q`S zcX4}UWW+9rxu{@>ETFh{Cjmx#2Ebb{cLmsaQAong2d6HU4**<6<%(@$Y$JZWsfG!k zxq+CegJ=koh2ZWF(KOa5&6twU+TNI~?>8SKiN|=dr4!(<Whx?Nkiu9y=mTBbkCW=G zp-l%e6(QDpQ-s@IJSpD+8xRXi#NzM6WxT7~Xpdh?&73M~H)#BX+wSfPQUKkrE7rT; z+PvJsKt)nHRhf$~r@W}{?j<<Gx@V7S>lM8Y_Nqnx6lH2_2>Fu~#avmQiqRMcgewdg zR0ug)3c46Vv&uo`_X&AV&2Oo69f>oit=CRb?#R26*+0sYll(;5I><9~5_A4bTL90# zQ*Bgd3-!I%BWlNX7_C~tP8@cCrr9aRuPY*)`x2J#Hwb}vkBeQaoZYrIq%qWWEnk2& z@k;sKXfju1GFQ(u{MIpO>0(9n_aSDP<EiAnDp1d9Xh^fXO5<}Ke%p^QLt>~yzYzr2 zT!mD)++d<`VP4p-201t+2M4y<<X&*_Y6Z@x400U2^k83s@$G4*hmRs*Y&d>50?6#q zY!(E|v*4(k(VS(wcF%3+Je#V(K%`f12~yMc4*y295k6MKT4y1sDlZh>OSZKg_+PRI zC?x|rREIteNOtWF)Cj%vn%hWYuhD7UWvnWtkgE0IqL}~~%{aENapG;acpVOl#p~IH ziQmhzNh%5nX;w<Wg!V6a<u-!%6ak1zd+@yXx^g|S+;_CCPP43EI39PCP(S~_m%~SQ z^XRhV`%az1k^Zg$hk8;{$gl|td3@1lI?MV9c@E0qG3&f#|9NDaY6`;+Qkp>r$AGol z1Smb)u4UN{PlsI##$0=|?fzVm$iR3U%wEX;d90&E4#21~HLke!oNoJ9K4n->so+(V zS0-A9v7Jnem0KfoIo(ns(qE=ay*9Yk4P>xULEo=p_T_68fz_zX%I_bJ>$PofSW~6y zqUz8XdS_nq5BhY{-x>=UYS4sX|BzZY%G}>yW)L(ht+uhhSJ{+4w{s~i^Gdy^Fzt4t zkIiU9gI9%G*VsBvPI*UMdd?JQrZEzQF<}5h@rzI7J4Aa6*?miK@Fg+PEqss=h`R7B zR<<l#kizFF5J(KIt*kWIhfO^4Myy?<bxux8m5e2t`}&TQ8jH?s4yAJSAHnyszyU&G zVyDmGVUuRCrak<H5W2F`&pED3Kz*JnpAB#$u;d!2TqP*o{EpN%!|$PPOlh_Lq>R(- zJdXY3$Lil=!Tei$z0RA&gApv;$+Vx(eEF)qBw$6FdwAMKd(flPtz)j4GMlU6((K4z zp1Yw;`Rfa_r3ffbc8{m%aC~SX^gTYGC%D72sNdkXhqJho+ke!bqYZ<9LY1p}e?NzH z#PoPY!DztKL_;#d7<~@jg1|$L4}u2riH<_z_0(Iv=711+bsV^KfgbAfo!lZ8fsbvM zwILpM6!IHql1(Lj<Fq!&meEP9Q=SlsY&Un~>pFdBzDl4LLe7>gZXAB8o2xDL6C7N0 z2k?0E4pvom-D3|A!*87;cGmucQ{D3>=cspfb?=xD-W0A<S`dI}9o~|_J6Ek*jF8q4 zcyvqTRJ4tovr4G6S2;Zgj6wvh_s@~Mhv<=nOpNi8nFKGrR592c?P7KRB<q@#uP+0L zRDjj*^)8y7*X+JX0^3WAFNFH?m*y{PWw^lr1m?IL(mF%;@SNH41F^lCm1O3p5ab{9 zo1^QjSQrx<JKXTbj@T2Ic(Z~A`qZ#rW^r5Ji#3CuyXWVWvAe|xs%wCyuKe((H1PS* z`o1M^13@$8oT*V~TqK)`OZaq3Qx9ZRM#y<nycH|p%md6o*^6}wAZP(>3Wfn{_-z;t z@KR2nn`O%WLaKDuZ)#>T9R0)nn{X$C^sBD-4!Ic?+Q}Ux*m0=pl||4+`~NEXeiQdH zh?i43bN8urd3WJ!t#JegZFVMT5{>@%jIMv@8;<tJm~DHOL6VKBfFU>j<%RbG5fP}D zTJMy;1}gPhANqjrdALCbSLgyVe)^F_PofidiGZI01_p^II6bt|)%KUtG{8g*%;ID| zx8Z<53Ic%Zz;@a{YK~d*eC5ZQuYnoO`kuKwdf_zdKh;k2YtgI6!hp$iN=xV*6VeoK zZ25b2)8Jz{jGd7Ki4q7p28%2nKa3LCuj(!0Wo;+}e(ovQRDld1f(zmhnZ2IIEfJ~C zsXoOPGtwe$@h<#8$wPwBuOHb8RmH=kojMV(-&*rlM=HxT2jEL}gNWag;V!Ufd0XKt zGbrN(hq0kx5@|h-iOn0mERKR(IrG`xjcURS4DxX_gY7zR!=c;6rNue1_oM3m#&)_- z4)g=V(2JR!KAXzGI~&5q)A~$+<o)`*tqL{U#w^;6s<HFPHcciD5CJvTYxn8h94C;n z2gmz)C|_N1{Bn@^+S<2AA<>p~UgPqk2>J}0lVED7%afwf!ZMIZ9+gzdYbWOHe-U+- zQE^4vvc}!r-QC?KI0Oi8!Ciwpf#B{E971pp?$CI!5S+%{-FZ9b-gDm={Oe!9?zQKt zS@l&*#T1LsHX_}ZbTPM#wI=_49B~7ii9^M1E1Dkf?k-frCnE3C=4cIF7HrL#?0GLA zlk!`GT)6!b4V=G(g+Qk++Fx7LmuiL5VYu<V6>E5E*6*oXHmstK;nYpwVgV5zM8o@V zZ%;`#7m2GI#`>#mpQ?xIN!JItE^<{;H=8(x;<<afqXJM`o>tm94#qX+@@e6@Qp#~9 z8Kpf|0$|?kqW_*x_)r4Py+DR%GZELuD<4S}zWvS3ir8<ub@n^ybplD6a!tLu&uNzZ zcL!`dj~Q6wZ~8DzE7W<p*yxICg`v_{mB@xY5e|;Yfr9^R|9UIEo2I3r8U1vc#u9Fo z1M07l4(c+aJ<Sd2L+?L#2{PaCxtD8$o_x-19e-c1KNTR<%u_7^@!tR`0de~8xtfOG zv7Krd;6&XsR|FJAYG!(y4QNiaUdEUL15yB>PEVs_L)V(o>R&pZ*+(C9JJMN$5ai2s z0xdo0)2adk1Dh6uWdxkTXwpN`<m`p=CjDQv28WA~{j3w6?XvxbwTVM`xY&d(ShY2X z5fNbt`Gf&4Ht@vfVjumVBp$8+1NK*AW6EOn!zeqkeDi_lv4+AVLSYB%;k#I1z4*^| z^-%BQ1prxr?MqY?axb%yHybT?LDzb6c`HFD@f2?hgh^vh<?W-Zx~`-pqxz&dw;fu! zQP>fAmzM!ROZy+J0-WWb-)Yzr`dVRt2_@e%D}M)l7wVw?VJdwh^T=8J%%A&v1-@Sl z`lQiKvLXUNAPHNEJn{%OSLr0x;F~T?YdaN++`&BR*+UqR*%lC_H8zgNUc}N8MpPct z^bcgWmU61y8p_)Ly-YNE#y0vGaDm7<mBd49+k6>^CuYBe#ayLToSUAukpc+$XVq`a z<~b=JWo`VdH}b!<9u4;J9K@-DW|PNYhEM`e-EmDq44PYg^E0P1znC*xuzby}`8so| zqa%L?oMKNfEiLBi7eQ7~oA*$i*w(c@B|3NHo^_00om-Opo)h;E9$_ypB3-;=jg2tb zeluP{!bF7kPxu(Hu7c7Z|AF|x;DKtDMXdKcvyWp%W@1^YTBq)>H{Z9``~b2=+UEO< zI9$(b|G}$pbg}f-F6}Hag)F19WAjBWT2<4GHuj_jPx)x8;<TdF+P)f|ghxy%ldGrG zv*uaM1S#ChxlmbowY5I~7q{&|Do!kD+5)=m$I&)Cfj(NqY`$qHuoTJ%*v&sLxC4*0 zLo=MCz(BXvFM?}MF&_+G1<}rnFe0P-IYE1s;Y&m)O-wJ-mP3wmY8Ym$JMc>jhz#-T zPoHKdY|qo;3?N>RQD^VV$J#h8I4Qj;BgmabjzY<NEnSupT<|k@j+5qaYTGX)Al9Y+ z<uq7C@!bR~UR6=N9vWEx4vjL(z7rwBp6!HfUE>3zxV%1dD}siDL?vQW%gy2#`FI;A z@>NgQ=(#RFAgts7dXgj{6Wnzi0BzPjDz1U5t{#%WRwHy1rq`~;B^NhY3%c$f3C05# z;O<r9)hux(RKvdN+HtQ8KF@Jp9#>4pZC#wEb7p7@C*p78^k3q(B6=%ngcFpElCIl7 zJ)ha{j(V<@0)p|≻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%0D1S~V z53QKvR6tMDOdc*up_G-%k|LGD6^?gs3$YZ5fAO{=`c#RJh9-tbnstyfQF!WP>c6(J zDOi2pkbuC4%4OHy7^?@S)HkAH8oP2VCQoH2APCc0?v?a*0w~#ZV5^=$N#?*tX$7eq ziJo1KVislZm?5=8D#ZVzM6<DVh3-)O4*}BGqqAc}fPG?sfrgN=VH(>D=s+dH2V1ey z#iFXQNdP;k8{XwZWMBXIJMy4h$&ApEY2B0(B$L`7PzdQgzCv7AYPsa@vE3$Jt}j7f z?$T4FieJ4*FDlTc3!qIC-<L1K3=<B?YxDp)eJ6r(Za@RPcnrJ@4ULL3fmOJ@;W2c< zUuho{`$}kA2)#|BciA6YDPJ-@g3;qfW!Ps1ShI$Nv%&OGeQOgH4)w?rX1wg5@5rFR zpzIK>Hgd*Qi==AGpXERp=<H0Pi!>GVCJtE_st2s(Kus(n$>O5KX!hQK!JW><Ys1aJ zGnR!N`gRj9kdaXUN~>O<!2gbX2lGlrr;aC=T+QmJpZ~m{UA}w7tt<BTc%7@MN&c}< zpF~<J+?+M3o-raa-T0RNb?Q=yF8BXn&o^fM&rM@ojhX+b2erwO$%!x;nm>|ejm?qk zEB(K!;fd6*Pd`muZ#P?ZGMmODcX$6p9oW6`kl(V43YuhA;1J=(swbmSNvr=>TX&Wj zXWe1@49_|H!-etLdzvM*pVRX*@~3L}pekz|gGwC0iaJiWEQ#ZF5AWrJ416Cvg@WOC z&WkY@3+@E(onqCvftr9$Hqb0^nZ*GcN7>XjhVzhQJ))`QO7dOuj>*%VrBSSwzoL-L zlrh1+EJ3nNeq>@E2RrfOhTq)*Z4^{i=d<Jwt6sZeUDT^j@$JHxTx2(<@5|@EFAzfM z=vNoH;>Jpm`5MK%3RYEuJ^77NCv{0+uv1Zv{I&#r$-G<T09~9XGZf-uE1c?+?4E^8 z;<F7;IX6l$<KX<n&J`)dkb!1ffFrvIDXo9W4&A_n(uoC|mpIFgtb#6C*WWVwecT|G z;|vX+L$N|*hh+V4tStOERPOyhpNZ;^c%h_^U~3zu`p+D27AyNVs1ty*0$F>VOk-R8 z=R{atRQY188FLc!F-h+GjCs3|4+Jt@-}zEEw{+0EwK^IibOBj2x@_;AF7V*%qr`ko zw}X26*x@FS2|vjTiLz=SjOWc_2o8=84_|2D2A*BF%Jm+x#_#KcPu;jY^71;$+dbcE zz;NM5LCrjKoMNPmb#?I}3>Yl?y-Ld4ge#n&)xo>a-NiB@pLW<g$Lqp`W1!jHZ*81* z`f9(QB)6yKm$BT>^g1^rA}NkCl{uUP2!E0wyP4n}_lECL8rNmIf=O4KgD}<+`3V-n zalsYfnhXM?P#$ez9lnwuMq!o!qio1&M1Rk*{Xt{T-!K^_-381=r5NTcS?+kC=rT2L zzn|SCrNc++vZWw8=oz}9A;PC0f2#$S1LTa!<J>ioclTrQ`RxA*r*m7toixOQOGjg; zn|A~o`YYd#rDOF!Y_!%6ldaR<-sSzIR-dNcPnamI<~swRzc0kb0L)=boZ66q&v9(O z)znDH*J}|YumTRwd~>*#ce@`@l3l>D@snhLBOv}KLOo)7-4>*IFWTr5CAT|4rI)yi zu^f=d!V=%HNJ%R<_~&b3iK?tK^=tq&T?CR9(+lp+<kVnsDrIG5AyT4wk!+Z)W4f(< zn7?xvK*0zIho&{uV%;8&5f9z89n5PTz^?N>+~8eYaE@eVN&{9&;||KeSF~n+&hbH- zVM>kBEt2)tBrYgA$gJg2!Pv=<S>v=H+d72N4XS(eyXY1baqmqM{3$xL0A#L}MnsfK zOpxy7i#R}rzy3vi{X_8FL-0HRf87?1RH_l8Pxi?f;I%dFZByaiT0|RwX99HD_q7lU z>LQ8D;3k{mNXkl2KBIgAK_V~b7KY^T2pbR%hzY(AY6hT!Fa`;xi?4m#>edH3BH@AK z2Ef@vFYlR6aNv&4_7Y8#skSy+&xC&T()7T%28)#yhqd}$O%)a^n>jIhxegUFxeW1u zgeuWcmH?x8m9IRnp<WLVuD;7qfHYn7_xA`B4@tbXfH3r8_4EgAJ|}1L5&*Nata;ud z0EMr{7k{yXuh8NIX!Ghwoof8u1qER)b~Kz7_jn&#oU5F#k9E2vGjy4mF`Yo2jP&Yi z@?Uw&Q2*L#q;5S8bkpy=@ErT+zs_N<XvsfPQK2c%aFhbYqWHN~>CLm~C$p<U!0IT+ z>tX|b_D(T$s;h-d+2~m5izSe1p8X!^75}^AEJ5X~#u79G0v;>&lQPuJ&#hMydnt<O zwjNYwrRgX{Lt<f^D`QkIkHnXHwd+f~v%mI$Z6i!<;Sq2!lkMyekEN@+^L(}1)ZsHt zOCM}k-trjvx~Pow`HS!!4y07&SYw4aomOjhso*bOS%>N{E`wU<(7IT1K|UZM0j7Ov zfv?J*wQ`<7bAV^0v0;(dUE!pXsqMB=%Hv@acu|w{53}^7m%Q;ws&J6(C2;b(G6H%i zV)8|R7Lo)OHr(KKmNBEUl9_Sc6HQRBE9<GcmW?oCHW#$*A!s~rFer`>vF?B4FK0uP zqjwA`qVksayhTB!&Pwjs$?pc`Ig4{KSb;NX*8*qV#z*qfPV%!e46iSWuYZxe0z)9~ zQWtfkD1r@jkw60A=q3fnpB37IdLT;}<5nT4PqZ$UAQGei%v&jqjbs*`r=R@R`e0vA zzMY(r2Qa9LQY+!gP*vN&u_UWYd1=wnz~QWVXR{1iF~RZqbjA<1qEarv-9|KJ{eU0a zL%3bWU%th!{~f`?mNI}x8rlVt9Hq=4l$Pvodk=`T13g0Q!8>dd!<e9C2*tau5APpV z!BeV$G_L3S@82Ac@v(Qg7$yk>lepNem)19jtCg?#fnVaDu0yB<_5E#sW0M`47thSq zY)PX`odF*~O5jE@pq&6NKJsFL@5PpeOuqHKpnvg8y4L8ImA)ZfaS-o}0kV}PFzTAP z+OYzNAcj#y#xS&H+@RVI_Hd>eth!;-;<Dx59h2vsY`#7*z+&4#zn_KG;s{+6-7^4w zmBN`CQt@M-i-j;ky<)<-;fW$mG~NFTXn}rC9?A!wpw0l$mj{XG^q5Sr@WcR?Oh7*Z z+;*A&M09CF**sPR^}8k`%kTvYtCI$U6!AV)NdCBAX2g5$M`}O-^g)&O(N`gdUrWn* zv+Q`~zY-8|jz>Tl4)h4c0`*%U2IRN+zJi;O$_lHpL~;SNM5WRY^g&A3@ajd$ONZ*% zUp07_jOZF50gNc}ftPm{2m?On0bh#i{fH(yXEG&7aL}%Hkm`lAzM2@pca^P@_?JZp zCY9i)Eq2>Puk`rt6T#d{B@J_qttO421trz#5Bd!<>##24`-%zdq=0G)nrxe3QqUPY z(v6XfY+Jt1qE}U2q4_$lJs{V2$@#lPi;46Zz2&veQeBWY^Cjzh=+lfGto<xDZM6H$ zo31|Q=IK)WolYM5Ws}$PoAA#JriT@koydeqdO_EZ8v5;nck<lBmN|Hb4MSzXB6a%Z zf%UKpJo9v&a<YpQ<b{5UQ3Bse7IhBifl+Wn=_R$%62r;NEDih!J^yoKzIrh^8)HGv z5VY3-fvzj3w^6oUs!^UWW-{aP&&29Hi?|Ba0JS_gHOuSe1d)+t*&VmtzwOYKdVY2P zcf{&?$kz<)8!#LcXAQ7i<jj5e!JVPp%?w%}Ffl@eI^Lxz!9dCS3xBd;4JD(UQK*hN zu=3TJkv8od0$#=hi^mUWR~}q)UF^~M21OYgrh@a5De{VR_<N@K6)9CE?bLc=Q|b>7 zu3LvqI!&jEUL>mq_(-z!@fsS#jSPBNSgGUU<eMVvkh2q972pF}CF;p@ga}JC@k%#0 zwuBhnS9{)eftj*vLi_JNFG1V<Eg<)PYR=EkiHaKXK{FVqq3aIqA^L0V7{t4Lw1&X= zejfLCO^D2Isaag0_lAvKK`fy3?pCC;1#$rLQ@iy^dcKAe#MCXY(5!QfcjPfM!vcUt zZK*Ux0Y?bIb_5Y`z@8SEUS&5)%sxG!7G)FG9)@u7G+gp@4}pN_(hjd;F~ttO2rf<9 z)`~~k?0F>9G{)Jp^U>q+PgZq<GGZRAsil<s0C4p>bD}JBbVM{?*oFaO`O|xJ(~rJT z7r7qg+Cb8fQepy5R`!F!coq~niO(f;lx|%0d~#D$vO_jJw+~Z#cll49Ft9Oc)GjDx zj*sX*Cq2O3{YbeI3<Bwqh&R&E^u|6GHf6#k$Ax~Nd2dy=&loQtBNHj(6(qvk(R3a` zumt470C|&d=(mDGFKil!9;OH55m}K_ue5(?0(a|MS3S!kLDeZvJXn;uDw)cjqMHkb z4+RkiSzbeiNsA{@-7TqESXAW#*cZ9M@9(z)1Iqx^#j|ZcqhXD07IabDCVf+MeA(CH zJLOTf-7bG4Tm*4#@S<WVixAgEoZt>)fYb>4*zIqo#|Ue^bHny_ptP#ErA6%#5P7`4 z5&#c*>KVo6S<O^c)CI95X%V3V5++ixt$hF2VO*9G+HIS5nztKFrnkGdj}QA|k}wAo z7|qj2BZYiSAv&K9Dw4jDC9E`yjl()Tx5<(BEE!*}CRXpAw(mo+a<8~!SpB!aYyl&8 zK8h^QajQB}tbVpdR?Lz&(Lj%Q0r-<6!FyvPBdMJC34)#$VgKq@7U=3*krcSvvPsjF zN4?fWeJuNET;q)l!%xv1MK*!-LH)Pq-LKErXa%>D7oS;E_ksA7Wg)WqH9GhQP24?t zca``A>Ol3O+?t&FR^}(#pZw7o86$iPu4VN1$A6#{n}obG5xWSWFUYm{TNg!DMrKGM zWU+lVj1MnlK+J0T47KQ#tSI58n=m^?me=EtzHe!gRo}~AdfwNc6e&dFTR8dpXFxer z>lNzd755B#)U{~f_a^|tD4Vo=LIfs#jUGvxC?9m8aama48gBJrRj@mFsVXYZ+lpAC zG+wS8ZvV)1;B(QEbVSKBy`wcVyl!&|kO_PTzpUE?gk$Ue#0_uv;^Hr~n(GGM{VM*{ z75}w6fw4A$^CKfvRi>V4PSXlfsN-CWwvOa<R|n~C*gQ>bjWkG5@Y(>#Lyp-O>JP+* z0Gl?b1xc|7&KS<iYa;tS>>psx0tJQ3yK3&R^J~2Ulo{K1)iql!EitNUby3GzeNwH_ z7a#%*j!U#v#FRMAHKN3wB*VKP&s|j!Zw<1K>6(fG-cVTx=Zyt0^s-?m{3@=U<k!Bf zJVPI%ls*{(R)qEe6BES4l|cmS0QB}ofmY|)g7|oSg7~0WdP=f@2h-nu@mar<lm?Ve zD(iKgibXVS!0WDoH^ZXkvwcQJJ3t3WV&WlLAl3S6@!bXW;S*4)^8{eza~_e9BB^^F z)Q_6QgcbDCaVjT(j^8bJcOFRO-V3F7z2Pda0wqzInWdx*>HMjej)bx?)z3|4)d%hi zPwbH@dmM{i)tc012(Jo=C^(pQi5~xZDxIrSAE$3#`k7C2`QLsP&{A`;5iR;(^Ji0s z2><X;3p8W3*#1DFO8)OTeav|VGLC!rz<fj5(kB~WNuExKtS!i9%Mq7{;U>Owe|nHb zmsdQ<MT0G*HzXY0EoVRx&p}%GoJLkfHP7^GbpX7!?bj*Mi^+gx%A8JFkgYNF)rwi) zx>!Nsx}<n4p?*0sUM^DQ$4t^jVZEUw%11VRy#d0w3jSzqotWn4XycRQ(^KG-R|wdc z04GJ4+-y8$ETabTA1@wAvPs^~{Fc5WAcL&m!P(xyN#%DwcQ(dpHv-gI&8f=X(Fd9z zrQ~9<4_8-5-4}}sNgZdLt#Oe^9)F3nt)Di?mh3iC_2JfWg~@^j-M^4`wo|`-k-h~! zhJ7`6;LZJXh|}2@_Wt!5f5j2a)De(nnjJ@YeJsX$-Y9Ze9Po3A6^z2IVrKkds({Rr zB1Vd;R4QtJN^h?SrOE?@S+TRoI@wmvzVF+ZnwK;O1C60)4)9`mb{;Ny)G&Vot7f`? zowOvpoVkHCWeYDt=nIG8glsw{6=;z`s_Nmteo1Cf!M$-C)R^S}8i9xqv-?>)v^?l+ zwLE-86Qg7S<nKjHgc8L_O_4Q`S|ae>Gt<so-EwsO3S53UPa?h!O`$C8SdNbGP8}@x z`C$E;zJxZf-mh)Vl4e@<oOcj<trS!$lIy@?S#_}=u$!U1AuKW_1!Yrqo!q%6l_NA8 z&`MN<rN8T+I_s7q*>9WryrZV(q8HoMF2g=?QDy^xx`SQ55ieURwd5xHXi?(S_SPvS zHVh;8kx+5U=%o2y<OkiC?Zi@iTD`CDn4m4OZp=Vhli|)qUwbMF<H8cr%ZGxQp}?nG zfY-wB$+AFn8ZfVIY>+Q+i5^~DxCFR}IQXmqq8Xl&2>mdc^yGJK&9UptKrKS*{k(nZ zVhvzIc^`PoLQ2QVI-yI@D6hIOEu^OittpEWG4wR3E0>e#f_C;meP=o5YraX#(2%BJ z1Jlce*j$<rL1lf6bs-OSm+;7XCmd&0-q&V<VgA3bhY5)3h5YY6&P=R_-F-crub)rx z_80$lvMe0}0>DS<Uj{p93LHCgNtW^)i>k-pjTj@;JW{Heab1Z#eXT!y+CBV*X7P); zXL7*F$-G5si{(bp7x0aV&?}`T|I$L;;PCW;uh3SSd;ZMRq>;kCy>z7;{5%`W&uTSu z%uvN?OBeG`{Vj=OWI_#I189f-Up3UIsJ2a!Nz~WZ01XKXWEJ|5^N5%g1Bg3f8-at; zI$(?irl{M1O-YrWhO~`T&!A5eW#>Zjkr#_wY)@J2Fq;m%U@{bVoZF_5?V$xzD{Do` zHSP`X@xfi{`M1yqD!;dsv#!^ujn$TG(STAfe`#Nm$M#)v5*cY%cmu%BU8If9l1n2& zO(MP`%uIU2i>v*DUiS45|En;`U22L4g9FUm&xP;lDEgJfpA*%jE=lOib`xYSPaTVN z+FSD+$IPidv5Lfn(3-|noIi!Z^&(-jC2?>(UMZ7C&4KiJOE~N}?TJ5m>o3dU5ZXY? z3PNih&VBHOdcL8b8-{5%{WUx`G=!`B`$W7<-~7B>c|z6%RoEM?GHCmfUhO3IQ&2Oo zfvkdi>rU`E`EqW)bB0lXcs_bPW9sXyl5B<N)}DcxRqDU}PWhg?#FFbaPu3+0TFC-R z`+9yf1s-R&M5BT#oef(jMHRK+_8dU|12Hf$T>>JE4Y%3ZqMe<iXUTJZEajbUR%lni z`4|QbD++KS7aWw`A+U~w+pI|fd$ymZQ0d)2>kl7jo)m4S5UuV91CST8(6lTy`2_Bf z_IoQ=QJ?ZB5rN4Y?aPA=K=A&9ISL9=*Vnh(JKy1knMNxjdV<bhad{Lu0N2mB%JzCD zjo7RB<y}|Gzc#)&qoVNyiQezZ>yQJ$b7N=C>u9M)A&j$QVvX4!LcN9iHsJ~u^11HY z-<)GN@b|DZM9VKem<<g0Z+|zwYC@oAfe<d4OuPn^-Q@wWz?Kt49B-E8{Ynd8-LZXE z1Rb^vbuQb>Ak3aYS33qxQlI$*3m>p0tZSdFL!5NEyE_1mbw@cTe=;e()|LS~uLORs z#7};Ga<0z}PJvf`VoDZN5!We-cop-gpEbysw95IDBV=3ehJe0@ghq18W0l{K*geMA z4JrOUuXfuO)J}4DA=@YD&UPs;ue!?0VM&}>hlyL!?E49Dm->s0fgyF$sAMT$&AlpO zP*4)kBms<YR#)l&IloRP0mo)C8QIR+8KoMhIfp_-xd!b|zUU(l<tCVPxc6}@n__#N zQ620gXt`>z2ja3?gx@P)KkTDG)J+IYa-mG8ZNLBSQ$pyRN)iyG7DS3kxP4GfzWepd zbemx~8{uW(O)l=6x^re(!UZT>#FZ!8^VaC^$Vu09&CxH*y*Zwv0B#Fqv?Wp*BbFqS zY4!-`>k+qL(O0@pFC%C(4yM`}oc5JVf2|xE5@X&Q=4=CRu|_(q1$||zI;pX#%ro|e zl4GPeYfAcf)_&wv0U8Akh0tc~gU0V99W~FVWIpX-!i{}7Q%>+|-R%b3e=?;f^UW3) zOwFij)e_LY?Mip!#<P&Q|8&keM78k!)S>w@46%Dyl2eMWg6N09aa)|<^9+E+HqRig znL3t0900I0f;;Jh-a`D}pu9W<<=ZT4Q8|D3Pi$ME0geLgg=o+Gl#W1|%f2Mwp_9LC zp@=a#MVRdH?ZnmO_{_(?vzdOR40U`#HjsutzsY{5l6(o^68|G6?3*CeW&Urk9$ZY; zvBSkQuxVTP4&h%<L{^-3Cc+?qxfc2qqcqi&KU8|ysS2~Z@}l?i+6RR)D66E^DvU&L zB`zK^*g9n@W9AJ;1&-t6erMyYe+)D&SWFzy!U3iVByzdw0lfOwXwJAoN>;J*`bKf3 zluHwZJaR*@4r_p{#ZcJ~In`<{5?+p6nn8rY<(c=M7U=*vbTDi4{3`0}O`6)uLncJa z8;rg;ogMasD4Z{>HXS8&ee|A2os10U6x1&YrV4Dv87o&(i1@_c#N^K#RqOAzt3!;$ zm5Z-&_6O%ON;~fP`5S<Z`#UF{^vTtCid?cs?M9iL)0eq;CAqQ@o@(1?>F1T}_t7;` ziY0_)|AzdD??8}E^pfc1PTtLcO9_&!kj_?#@pXyl;R>ZgUa`eZJwStS(M-DDd07q( zNf(G(@VC_7$TA3L;-~ml^N5U$!Ht6F?9Z^Qr&+%5*}uJbf7T%;66Dj6#a<u1TA_ip zr$oyv%ScTVUy5emLPHDa{b(Xf)NU0->T}{(uB?}tukn1eh}HGkqAS%DKL^+xos438 znn8c6h8uLr*ls7|!9dt2mVy01`X2o8@-4D?zH9q)l5+g|>w9w)=lX790C2~KAF(eB zb8nkca@En<<N_j(>tNvJu?h00dcBY<0(O`{#7f^}h>a~i;AV?zipHP!km|!G<=wJ& z1j`hDaKd6>7yAMstFODl?SqN|GvoNcr@$T?y;=nUK`J3(n$<T+Ky7qpN)dDqALI`} z)UpPro7H^19-e6n$m77pALI7#A1K3@>hs@#B<R|Ko)l)`CwKe9`Nr58P>niF4But> zm|?CA`n3a%3|=wwz*Qy<>;zpK<|7$Tu6l2Apz$(9U{v^9ZOlF7<^Lx{>vE9#88%1H zo!WeDpPBQB<jVm~f0*T>Lf4YHVuuKc>Z4wpMh3>>7LLgnPLAe4u}LL!&s)?N{Eyj> zV#>cY$iUj;t)FQf<Yee7uF=N-$_OjQ(BkTijdD#_X40G*pJymy0}3i8gvHM(z>jm@ zw{FR_VM1lI1M>U?BIwM~ks~f`^CV|HIxF#)0sza(Na*lbaQilq%h815P(|GY*HACr z_*=H4O}4pF+1NRG6|M%sD<EOk=>m?$+`QKH-b<@r2=GK^dQPp9TyLX!eUSxh6aWSE zd>*{_A;oR!#}Cf1yTG8c27XI-9O2W4(R*2)pz1AN=<u=rIG{`n({hL&Xb`*J=%fZr zcnV+;t(b5>*s$+Kq_I8Px5y6fGfxWO`lvSBMxl$1rTHEBQ<G}>g1iR)Nl^*Apy(rE zN$1Pqk`5Q)<dKoLL#h0qI2QdH_zLBGiHsspgj#!RC2D==WY)ZvLvf<QHf2n;mK=?r zAZMwZeYuHH_D4bjR06lOJKOx7D>TCkG?f&5YwFr*4ps>AW_rfcy?}9PgE%KySdBY& zM-EDB{N7~74-NfG3H3oF0~`d1R7|Dvn7kkvXu7b~cLhAomRFj-Y~tf7H~=m?@vvbn zHSS|$HP_LJ*3PIKM*w*wsa+-4X7+!q_>PxEM#K52E-dxR-RIEX0y$3HO>?HQ`lzWi zS(nVMRJaET(@}^gM1HH%q^yvflU#L_|Ma|Wg!BTG5|S7E>kiFa?Dx8p_>#2`jbqP; zc(vY7%n4&L96qo?Ni&GZUMc!C>Pz;H2Qm0zvqJ@uQacFbjoVE;#%L{VEP6?8Jna;9 z@)!vOx;LJZ{sFw8w`gD!CnglqPEs-tV0h{SON7dWCs!YSK5W7!5CYNMy=Au|ia;75 z%m2?#!zA{C3*)??&55d_+$6|J>~6`g#rO2J2ZWLhv#xT&I`nEp&MA>B2Q@{sxiV*x z#mSdGMBD9VYjrJ(Ms5`Zrlk7Z2BwJgOmV{ph`0Zz>!{W#1&0OP^mh@7(K7ex<XGFb zs|5PWzWO9NI8%7}Vz5a8GRI10K!hSqa-6l-8}070>BIZJ?`g#=wMG&*34l*{w9x?Z z-^wyZt_G|*I<Sdwr_D?=F*e8OqD)}w&tPblFODJN&e4v%9WW8{q7Zw^!F#^vB~pEu z^FMGE*&F|)QhR|?x=aaFw>h(z+M{2V$dc;}Z!>-IhC3x0ZoAKy<BVo}{@@SYVM&zZ z<#LMn{K9&63+?4c5x?O_W>}*%=Y-?z{I9|8_y$TFLpX4-+}ea%EB-0{phloM>w1>h zznUi^G$a!kS)ZNGzMO|#gWpQ;+>+5AE0u=1&|-P<f!o~?s=ON(Fk=&th-cOH3EXt! zJ*T^Hnj2S+m4AwveHFWiY~c7h5EhMI&q^(!_!SQ-!*|$i4G@8DQCXW|wYLTv8TbCG z?j0SKHu~`vvdRSwZAJ8Y#^&AIBvgo0t;sp=E3a8KPnjqSb+&btp&qL~;_j>Qh1ul7 z_er)e51-*_Q@n_@mXf>YmWt)J(NNmQ9P*NcUlfq`Vh!6~uiV(C+}Il2{=2vAGnC#e zj5i}n4-^~bk)OBk;39=*fjUB*rRn{Nx*Yg3NeWDVEKW3z@;7lqi8Mlrf%^qm(bI^p z<DMk{0NJ(yuQs5|9DH23j<IqKD8$T;61q_mfw`GDg6^Pu5FJ?+rfd&xNHuJ&9?Xt3 zW1ZNLFk{(GXH3}l&mgmi$#iG<g2|KJtm~bBg-X;f4`j<xNv*}T8H)Ml-y%gVifYN_ zlUL!b4dQ9A=n|s=eO0w%(V}zo+pAY<*IU{yL<~4>L>L(%GZsb&7t}3FmYpV9a`pKL zAJM>(jcU5cgSb|*FARB<F7(JlRi#7oByiyoE|H+v`mBB}wGWSJn&#DG=1A!#q1%xO z<UT%h{?Er36zqG>?^|=BG8O&%iBM(j>!e)+sh5vTpu2Qii`wf2&cig;$|2P_Lh~{j zqu{Z<gy=^V#aGVJxpJHPfk4g%6xwX<{(jEsQN^WcABwRNnPJSNDJK#yKdDD63MMRo zcBiFM#3m$ENdn7Fdg;f%F-`gm2NPb>hw^Kq;|xS|65^Pp!L?8ISN$@(#Y~RFX$6J< zF)*yeNkuU-&QcSiq_~f_UEOl)`Afdf?XW`E-bn=#p!KO!s=tc&wzoIs6PjT1;i*u1 zf!al$?0Y*3ju`8W^%J??M)3-i@bpylbP<PK*|ZgirQG%`H@NYfnkvIJq5P|UL{~13 znLCo#KxZLE*_`|%-aDf<a!KuJ$_3m0;#QD>v7fvdMQevjr;V%2dgE*Qxk=x)3^<t) zKbtIQhZ$PmeXzDi1v-5|+!J&6dAWB0d@x*chXFV{-{H15hOaNvZLCOY!`s`T1(c1B z*jl6}ez9Aj9y~I^nIB`)qED0XxaRIE<d{nlssSSvzV!Guzf)exML!uu@pL3>uMho= zHsj@iF>+N)?#;S}{zM*inMquUb7lGl)dTgbTRI*tqY$YdzH&wp%Bl*v5G{{w<yc~2 z(25-Id}2$`acvy9d7!*q(oXLI9Xfao^~6~jW7ZdAkH4&+h14u?(Fqy3K585;s!CaN zY|MXHTQ@Sz2EOTJ`N=^aD4#myZV$O1-U>S39FleiXFR7##HCAq*!UEu&RK6P`xU&s zu}}QI9dlP}DY;DC_z{N$b?mPj?XFzUuv&c<{!0@t&eEC?F8F4X(|H3+EKqu4Qi5*m zzKG7zSh|);fma4`^?1{>#YM<qx4nHgsUSJ%CiMBZW+cChGUyh!rHkLH>doDKX6-Ql zPm->e(WjbNTkpvS_^nHn3Z9W=k9Ipgu+H1Zos*km;mnQSdx+JmZPly9-TEyaPwTMS z+^`ce*~4RH-D}fKLoDgc^|h-_hGWBxpzKVvBb$lSKLhfu9VNbZiAO=NiVrWC;dc}% zBZRAvG!F<cHUnf&TYN1Xc@vV`8Kc%YyG^(|tKSN;;K_savZK8_kGdv|YR7i5JXI5^ zXYEbDg{el35yLATDULT`9VJm9_d#FuAy$95A_Y9qf=2yTS!3g(vtxCn_!(i=73Uz3 z;J3F!tL3b<FFG|o*TdhE67(!x4x;n7JUzeqES#2?4W<n(c|qzR;GXuD^INjZhhT5d zka#BPBh3L8WTi@!4`THF#6lgt<Ya&(HaO@u<$RpKzotu8l9FH6D$}bH=bE%=^n?Zh z{)73mOlAu+!BJYOw|jWdOUBW>{m;dkij5BQ%QLc@9-E^boZe-44a6$P3b9XJsCgLf zD<9n{C)2>*-|$1wz42!4M-e!#pcdA`ShycfASx2J+PKQI;kATiRWkKxD`dRx?97%t zl!o7W%J6SD$Zvp+*pLbB^2M1)XNKM$>&BqPGiTTtHbb*y4oN5dw><Suf0YN5w}hZK ztatTMm<+N~o#_$vN)D^z=__Un^m_<Q7IS}WBxv|gQLRTnyS_zBEP1Y~2Mm99!dZTL zT2ckOnT>Veu-M{<8!LU)cz7S(RBy{?g3_N(ff$)h!nXXJWci_ak$!c(4;&QS?uF^) z9^T$2DQlq;cLhxX!xyV+q7s`Q^NBBcY@~4v5^+(x8&wjM&P-Rj7bx4K8*n&hmm)0J zW&~ebPg)OSF_bj|XQw70ss&~5q9C9R?!SMCejd;{O885?{F)z1vNpb8&l&I$5~VBE zm|=^q9xgE1t%%LU$+aJKv$KhfMP+EL(e);NbHw{PPja;Aj06GW0P<uCavZhEO}pUq zTK5OyE@p|UzD9#3GOHi^lljSF0g|uxSPwfxmPr(8>s?9f>wS*Sm6~pUd38zme}Vbj z=&|3}sm9X?W5Tw^o~{p~1&GZWNLw0;N%Zc{dTuimdrvj6&!3xe@{`saLRyr2c<m#n z9VhQQSabCB@Xo2Xc03GPc!Qgqj+>oKa{L23Kb*#a^H7ZU(1iC1_FcJpf?ky$TDpMm z{p%aU+pEYIADIQnR<jpCOply_>4AD7ccHdnBL>|4zsx53^3`8h+XBq2GlKJTKfoT6 z0&c?z42=x=Q!EoKS*hN6_=|hO3j3-*uIuE#T0&S+4(>AXEw7Y@DdhYz+t)nZaH5+S zo>SmWzbFVNe*k)Atc#<5w<P&ozsnaM?C=Rbagu65m5~@Gz0i#AgTCjG%bnr*6|Mg6 zxGHoS?-rQqc}oijQ++de7bTSr4i~>YpyC_(8SiESBIcCDQ6YzYzhx~}9^vh-#}VCm zgI$WtTw%X$D=jQS-4P)7atC2}yL0|3=C5{hhCaVVWhOwgz)Kf=>V7j1+4MD1t`x6F z<8<;o;nG>-`#z7`VV>e)Wt0B}UAMDU{!N5!YP=}uQ`^FL7m<CTE!8Ph8nPJ|jVA3E z&)Ape>?5EJ9+P6^OswCdZOV~*@d>{t4eYLrkN#6YpeXPm_7X_VAI+19Gvtefu?#sn zr8+_=Nl1_eVB%T%OW`NNrey=RiHkD)ec(73Wjp3A;!;+@RzAC5g_Kn)m)ga879I#f zi-Xo$5}I-r+FIiL&XZ4iq}KLf0f%i})tt=;qQhz3hDC!<+TlZO@?V}6umUH8Nvn-p z<fd$q6W3=DqHcP0cC%KD?sTLl!76c|ZFv09JEj{Q(u8Omo8b%Oi`}m-p0c8(6(_ad z7+`;`_UsP0i}J2@W8(Jo>wPhYE8;xlUB@;s<fH+!#6TmfOR#{t1+di_4UKjXVSzUw zW7k{$QP5lB+mqKlaDXYmNCvuMT;M9Y2n`=ke78PlzSq%y1gP^JdR%r;>3tu6BPdYf z_L}jb4{>ST$e{++2lREOBVIU%{THj#Q4BYG?I3^ELyUk?ck~#E?=N!udBj>eG`a9% zoFm|41R8aNo~23AT&gqb)rWAZkS6rgCD>>_m>||`_jX$^r+FBWSN-qT!Jy?(&`joo zc?Q%wtdgJQNlA<*AnQx9AhTy+$9Z$yqHABr4(fGsEQid$JS|m^56Ju>fQk%S8zFHh zOITf(@)sYZe!jp0%6^|Wvjo0vI)*@QE;>~l+Ep_4M?u*JJh7aMGnhfE8tn=mIZ^#5 z<|B}AIfO0xQ^&osYHufvP2Z1i%K3foG06l3-{%)l?;xk{rbw35t!KV7)x@Hs<;wY( zq*TttKtF658Xx%&Cx5!DHOOsEKvz~@GuDK^k?rN@8gy|h_>2uPw}=fKdevGSHkEG` z(0Ob2q9`{3Odzj*KOtSS1NSMRI`2bAP<d@2w{<U~&8vfr2J(B27|~cbbB0U({TTA! zwZ7H6U_YCirO>&tJ|zb+LSp;7B^&8uU6T#Wl{ik3xg4;LQHYZ2hKA-K8|q#DGN6{E z<C|Jc3h|U`hOx7w=4(_Q3ZA^{-LK~tIIrXJ6^o?l?Qg;7&&aL<bD$@K@0em01yxMW zZ|K=*3#voUC)3oIYDpIqqSzQ1DU~6QYxCqs`a`G<n)>{F+_UVj136=2UFbr-zq$la z6DHNQ4+yjI<fnUaKX4IKYAKMSA?<K-5#vNrKf8z%q9bJz^rwBQrymvmvTCqo?96uP zB@<Uf9!iBRgY@3}D>bP$lnx)$I~gRwnjwx=)7HNoR^JkzwnLAuY({lz7`vVlAKM}4 zHO5pFV$@~(Szpkolv`r<_TQ`<dK-n7^2pX+o-8MUaM%rcwR6{x`$zZzoyqjiZJi$U zzc(-KdN*9J)82VdGx3o~slPc2I!7{or~Ry&2ae2T;@Rg5>~#qj`%w6LA9GpFmGQC< zYbh}3vC`k*ru?qz4>omE#Q#UsTSr9|u6>}ibV?)LJ#?3(4Bg$`Dbgj4bR!5z_t0HK zmq>RC(j{GYpL6eb?!PP+%v!VG{XWkxN3Xvs_58s(Y<6z_&&&9@8L4i;Y5g^eF#d`( z-J0dI*<>iKdB}>1_I-*5aCb1hy?*%f7AW^{#JhbT?*Ez4*9eHvY#qjOySoK-ouzs; zm`<&;4wm4i<F^HH(@jpsX0;9OJPWd(ld@MB?t7aah>Zx8<}pH4$S?pC81?NY-b0)r zMl^-^ZU?Gqn=;|5v&D6QQSbD};7Mw2T|G*YGx_SR2!y?d4(eF0yd}fguZX_6a7l|B z<s)vwt4Hx#@0TVqczHHf3s%+(fJE?%ThZ6Q$i!HQvZ!h4)3Q`3U}+5JY2{1Yq|qp! zFCpS$CHMXkmpd#F8<o*~pxb+M*m4;|cQ|*V=(0aKQG&Y-X%@tQmLwdeLoV3U3moW| zvk&u?{F)pl>Rn$xz8u28?#dm_;#rDl-`CpG?Hf_79-4JH(Q;rPB-elw89nlh7C)lw z(Ywubrpj5ed#Vw{IRzzT&ZC=x4{TvAKnr$3tO)u}RxV(ADA5IB1}goTze-or*HiCN z1H}E;SM!*)-`A8ZlYv2PDM=8`o}Rn>3zyAZAfJ?s0&i-%Prv_xc>7<tt1o~q{pJiN zYU<7ZR&IUy$__ep{;aLPpY|;9R`GROm#LP!Qc^OBqdULNnux>SY_465ep4{q;`Je) zP>wzR{<E5tKH4dt_veh0%P1e$;GnzUi&wndT)blz@M%HSkFtLahJ02^eEAKwFwWZI zt39sVJzJ||J8w0kf|GNeejv?{$#K&>RPXhWK7@_NX=AnZeItt-p4|#t@sr}EH#RyN z>WfTxZvsrwm-r72HkJwGNB(<jHwTi|FpA(>q}Hptd&eZp2&VePAI|5qZ9C2ETqKoP zJEhZOoxU#-SAP@{Z8v&o$jQyv*+D6|cmttOEn4<ER;SY1-*doM2fV0XC;8u-1bw`G z7JL|pw7ferYvyx#cd9L-_W80BHyArg3vpNd$xVyOtD3383$c%-4qvKWR&APUs4eh& zo`;2Ix31p}n@G<OA=M$rhgXdG;X5Jn^d=;|IC|aV_l@@Wnck!s2bsnP>GjXnBLQYk zLgMV}JhIh)zFvp@skk5e{|A_!_lZB}oKs@DtYPgy%&Xb8Xy>}MCaX3*lFc^RMwShY z_KvuB=Cp=}_91VdCKZnpD57<A+DSXQqW$h+?(T7Jw*!E<u@YOhZXIwhl=X?f7;(K> zh+lE=2t($(AwPF_V0-+zb^~K0TB^UnUfqn`?JY7EIriB)O`sShI)keqW#E0>=2Gv? zQ)WE*m)h9nmCkxr1Cb-rzxR+8ieq*r<MFT0o^sw(?6yZ)W|n_=L3$CZE713d&JHPc z9Uq%J!q%7jZuxo2e_7v$eeAakmY0`NiU9F-Nzh7YmFu1Rgp2q55ECj81LD5&ev>d( zhG36=Zk{J}`jTY#dnyp#J=1fVmi6C_EVFr>DMpl%Olm`{`}`jVqjYErcmGqu9ES-r z@>5HXMwh=rz(w@qQ8H(zbcGO|y0_bU_a_TsQO8QvFOdp?EXIUSZe!gsXd5Tv!NDMw zyw3!Ec|q~pjtYgppV#SCgdLi;*z_}<u_{O^P~6mUFcZp6x(iqSI#4jV=Yq1qJ_B7Z zGM$mm%s$C(egXpOySFVaDDU2(YCfP=(UtT@y1GjVi0e=g^%M`THd5%;c~Azc^<K3T z#;=7NZkEF(8HDM(Fa}KS&|wo~{j~nmq<`8(!$10W?_iCl!B?5PQm$W^*8x;bF!e_@ z4JyY>GvR%g`jwX{?NCEIvv7`941Gu-j@JYBTSJ?4c6h%DPUj<Up#Y&{W6l{rKL>k) zfwZR#wW&;r?BO24F6sztNt%T|8(0lHlE$1@GD0W3oz~cB8|xcNJ{F3c9J4S*d{Vnq zsLpW+T}cfH`@0NRq-FZwlTd$E>@=Z54$?y34A=z$B{)yz1A-27vP*Je^vhv}`_Jd) z#=smgpg5Mn!L-?3^7<U@;}${ujk9SO^)XM$-2zo`hCR!ygS7P>Pzfi_@H9X%^7bqj zBkr$wc_R1#j2iJ6j-}PRTkG379JSZx680*&;HaYdv4=<+qIffPYOAkv_yz1<Vz*SF zJiL!AsGy-N$IZWwvxzWO71WsT<`_yf^TpHxp5?tRP=W%%nP5&3^(iJ_=ww=!T)J7V zj8w0)i`nX7Cn-U`2iimx2b?EAo$MG%mYy*sdzBpZTPJhW|DCK`8tkH=F}(u{u4%US zAzUhiDyi23d0SYR<(pl@JprY$&+eh8o}BCK4?5HHKW;{8PBv<?z4^B0I?v~EO+God z^Fz#G`Fn&}7lF7Vd&l{Xqp1^gpe-qeQUka&lps%cC@OiB!=;&S3L-tU#)ey)K~QIB z(`G(SQqf!xbCxUd&cxV!M%(Vr*jjyLw!v#()hGKD!IZ#;{vd{N*BA1d*`XUvSz93^ z$I5tzrt)O}sr(N(L-3h%TZnj*o{?fP*cK9FC<Ux$0`%yz;WN5_!c$Pd^dqLhB7t$M z>ofnly$y)<kidC|i{HNyh=0lJhbI`XD)H0LLCqGKZN2nHn`I^-Xu_pY*Jffm%)K~+ zzZut=+YC^7xH~WFe#(1%5q{pvP4xcdlw=`fWaxsoxZ3L_)LPg}4<iFxNh^mEqSv^E z0qyw0DM0{Rz1s2hIeg=C8Wb^F{lW*DaPOL0@Uyh+^V@Nie>ub}nWZNnhNa2@kK~CA z-gYb%W|9==h!_~fZ9E7~1)WDAK!}q1kb``pg6=TiUg5X*h?wLsxa4xd$Tl|jMKsT& zDBJcD`!BqSPH7nP6Dbd87H^IwlG@)=u5GNfx8>c155~bkQxhLnCU{n={%slr+xPs! z3*30_wB2+G^gXKtB?_NR@tyU-L*%eVZ|}-mnvug`)s++5BPtLM>W0j@{626w<=Jt! zcu-!^JZ^}4Pr4pA*gF$V!x1T1<b$G|g6+`s&|=6^4q7{VEd{M@ql=QbycqD^#U$8k zqQa=$MCie?&>8%}dAh5;a+0jOc4jY?>DEb)@1#N>l;Ea35UFS4K{T*5I62{~Q$)Gr zZq?}}J2$?}Rt`hxIOax`(m;BjD}Y|SB^}+6R%FyN2KgvF>;vcpL;oK^brnv@O@lZ( z<wIKq#caYQ?~qd`vpe!Ky%&les<+t|%b;iY!PwgOokutC!QA|QQ&}AAheS#G#kV`6 zGk&5O5KT^30pJnDtzkD42;bH{*o4q)<5Puv-O)0({Vk;OQL_^gqqeUFZ^}g4M2%T{ z!C*5dCuhGF=!W`7Ue85)a-{#E?b|N<>;aV~bX-yC>EzDKgL~R@w$7I73ue}UCBg3d zi~gfch2yaNP87G*qFW1cinc+Cz%xJdz=_q@6wqL|ZE6ov&w>+%>3<<CaXMG)65MLt z#UmpS39d57h0DgyW;X*Fxujn5&C`-{#>s}*L(p^9^Qwz07KN!_S8?>YuV=?|98H=q zn{xV+s{8m|y0@THY1rx}jo<D2w$9Lsev8D>aG$`4w+q;Ydf2XSXUu@e##i(PI+hDL zn3&$R-{j3YoEoQ2B4xpwWz~eBx3rZD7Y>=nlC{)_tZtSDJ|n+f!oP0eUEYWLhy`y; zTOoTWgv2+>*(Vrc_K{U^%vpxEwNjFkW9Ny@&K1igxZVMvK{Kb!H#d@=Q$Bvzt~>(r zsqGBkByDclS}&GJZ!{q%$Cfa=7D8p=Z$rRie58^OYz68)f!~b*G1>->m_MyyE|t1N z!MvS?@CV1*gkxvZ6{8y;H$KF%uUVhvHSJ>Ta8LHxeRGXhTTzGZKa;9kC!1#B`!5LE zwtzsm@n7BHsIb}DfmiV$UYXp-wQZ{96b8$uC(90D%ML$4U2~)9&=RQCCST>y?;0#F zRPuVC^f=4V|G<=rhtDxohF+C|msU(prkeX5XE>qm<u%!G=y@;ukF&)_!q-sejsR<g zlxmYDj#Q%_Ex}twF`1HC0GQYivkt;)=)$nEfvP%0No$!IMohX}>5=5*9X)*cL;vgO zZj-=9F{}PNjVS?t2$aM%y1?LXk8pOKmK<3^8ltB5$SAQGDz1IMrM!qJz5grNCs5*b z4`n$;?t-$KLEdpYkfNhL`jnR|kXJc_s1CQp&?}Z+sa^S9OTA=s*VolGO&C^K-TI1) zQk(GUclQYtm*<<in}?OYZy}GfHvN}O?q8zID|nm_Wj_JvuUZRZrTX=$62$Lrgj|%$ z?-qYKwsy4J_uJDE)AB4s>$^M9%WFb<q{)*V1&{xpy*!yAF49M%B8-UeN?12e2_zk$ zZ`REfu?WYykV~rE!TiGo6*k=w)8G)9xVeRN=wfZg5F3tUMYaGrPAw8NR*?wZRqHE$ zn5AB_l5nPGII!46aglLMqW~Y0ujL<kvv6i%@wHb=Y@_fm_PXzlA@l5Y|H&U7^z0BC zUJatIlj}x@)P~k9_7DB<s&beVeQV90u5$Ny^eX8*&eN$RWZ71?s5{2WNBQq_6w0EM zU7tX1!N)(6Cr0(Q+wy+XU#YpH<#(B1UI3-iSbE!+rp_w^Y7feVDpO8~XK{MrhD@s- zE_dltmQclB+mMlXKxiuJ?<nN$3*>T^olDT`B&jWa6qY^I*M!H80q~xB+6_C;M{*2p zjB}O!L(I3z%0QiZ$<e#*&`ak2)J{B9mHw{HneciGwt2lDaNdafeR|nJe7$iv%HX)H zHQwC}pmhfmVe+g;mm#e;n++1(un?o8Y-nKBZ2e8V*cN>~6uu%fscbB)V2q;!uCMjg z!d|cT$4}kF3oC-UO|W&jzG_XYzfS-5x7Z$jbAlJs#0Mk=e?E(=2HbUhLNw{=57NY< z5fuDb6G0g|DU=yV`1m29NBf<IC#T*wq9~C0&*cJb>~ZDdGV8HflW=>&;xKxJVL%x! zW2<e6qRV@wA|A*)ygWi+*`1$Fzs@Y>=zoCTJW^j0D-bJC>R8e~L_sboSSTVm)a|Qu z`xj>rfOV$x)H_w-EqBS-PuFTm7_>!&t)sV@DkJ;s>e;nqTH6c71PjCjdMPM?@bski zY)~9M-p*)rgqZ(*_?v%l&_Cqa;~n+ONnQ!x!FSom8{Tl-(F_0l`g8ja79=%m2Gm(z zzgwzzdyWReZFqn1<iGwkjKTeDGOSxKd0`A!{W*5eE5?@M$kVg|%YYObn4ww`q%j~( zkAzrRe5t3869{QkgUGKWn%I7zUTmM3HbysGJ=Y6RvE2CSKWeX*%_E#uZ3Nz*dmACD z8c*s}B2$UlO(qh#JW9Urrbn+u&KEyMTGpY6-V9VEd(B$Yy<$Kt8Npjx8glyQ8CFzu z4Zl#*n!GF<Q?GpxW=zr2^cAS4@$S%glR*h_^;Uk_ub#r#3`z)kA$hwL-M+{Ke%49? z40tH87OYYw!TY%kMSVLlnASEqC!=`!LH7~Q2|=`P`v#DM>H52KGw;uH>IJKMUj_of z{D}~C>-od1u@5TWP=KoJ1`nkGk)B_dfYXlHu-^wkt2_ijjCf0~Pm!yekeipH4w+9@ zbn|^@JvIs+Z>x-6G=51HXk)idb#JT?lFnFI@{o~nf0^m?B|`i@>fB|k{X^RB=k`o* zLLsB2rC?($U(pF|ijKCB<Ikgy0XswV&K?@IoBK$6%PM}|K~ij{ffIgH24>*l(~i#b z7@U(*U9#6WkhG<s!fiXN$D?j7ithj690k}5;tmgYImRJcSA7rB0D1DlEJjgwH{O9Y za>xXgXzr>$6ao?o0&e0?9=IU@&OzEfz*vdO&HWZ_{gq=Jb>vKrByg%X+@QZ?a%b9D z_-*Ld%S^zHx76HjKXLyh$c;-9_<Q9p`c<pmib}_;Yy{}*q`IHFb04h&L!28{YORT( zToYNXhHrEZTKm78w{P#FRr0sUMTa&!B3D;R&Ti{u&`bmbrjTi@%5jvqj<kc&@DL3a znOQp9!)Nh!wnN71fjkrjJYM)_`>3-=Q6+^&f}De;&RzmG$8?K$stJ>iIhC+Jih4Sz z*(5htFy>l2Dk@At_aT=-Z~TAWo@HWFvCgAyN;!!w{GqzB$Nxa<?0}-6<_uxiy~@pQ zJ5N1F+9clW`QI`qxE_POLA8Q|li+L#OFKcMhX$oU4`F~*La*dN{Gc|OPKC-QdLg7C zd?t#M92c`DaR46tgaL$lY#(auTvGg~sQV(ha89$H2RHng{CE<BW;=!ezgN9^fbMlC zRDcMZ1+g~Hg9(|tA3(>&`hxD|Z*D(02btjM-XX5qGlfmJ6&G=~z|Br<e~0{omvzPp zZH<0oYWWuV*#cGGHm*M9q%3J#FTgv#DT<fd`T+OGlj6j*^;C|U`KN3}>$zErPn4qL z!=RwU+^<4TbKoIqheYjfo-6W|zv9VkG+-HGC27$D9)`sR-bAMBANrHl2q-u|Oq2YW z$%KyZYShi_BMw<-c7AOXsW-wkU?%-HPdkbn89wlFXLx#K8+7?>NW7)@&8}&FO?29; zo88^9qneaV1~zN<l_0yQVXVZd1+-3HvO3Vb>RTJeb<{sdceC1}8T3R7d<j^8-d^J$ zPf2$!sV?1vQ}Geh=pkw*vM9;WXxsb|ZpX^7^$mKzf8jf;E=;f2;<hjOZ<KGhq$fp@ znSm4#@UnuPQ6sa>?a&z>&5py*iZs|jZ%F|mda@7d6l6PCSY=oV<q0at45hy7H8qKS z*z_O4M&{;FzKwjGLLxX>SXPVDz)Auu)8!xP6VQSD{!lIq5}YdOT-`W<t_3}a8YfZ? zc&8{I8>jzkUy!%YLEV(ubvjqhs_5U_#CWBpzrd}=xth~@%C@$E^stZQ?3d$c^RA^O z5+J~w|9KjE>8)^1)M@N5#)l2=guPkdiJyhyk~VDlFez3Bo0!etv82l?;!0inm3;@W z#|4-LfI@BO)kwRu@AdVS6%nD&%QK@-fle&b`Q4_T45C45^UNsL0K#H|n6MTm?M$71 zvL4&n#4#spyW^ohw09!RX57V5hn)eeM!CA$s!2Ooq3(i=0-&^e01ti0{hsYaHovtc zc6~D^6yN>eYKx*%7sSu{x2kVRM8>qG{`4E<?24dfe#omsGbdo;=?<9tbMx^cEz02K zzv3$;LuM?bs>w-jh{Vaw>G7nraHJDy4-!>VfD?P_op>qVC0mt4(x;!X?VpB9QwgIn z)8DwVRMi`$7L<04R%ZYFKs?`Z2Yx;7VR}36VSFn={3IY6Vjl{qSQ^s~=Z`DF#YJ0b zmY7ibT0&kshHwOusu6HU3f64T`Hsr|TH>4mT}Tk$L$2<P2uL<0fl*CqJrX`tnkXTv z2o@b_X(gp;6}m3E6ZX{l-RN)Q*}`<tUJ(_DIZB+olIqF_%*qll)L<y7VaD7R9R|C7 z4SQ3$xD;rjm<fS8x$Fu#fh()Kjau*xdNeVv@Fe0mLUrKg$mvtET8y;lku;D_37TiM z>i}~0{TCD;{6M|Y(z_8`X(HOgIor^=G+%ByPNfE+2}cVm{3{|vs&f118LFGU5Ux)a znnA_he%@@q+p5M}41{t=)^e-9*48Trq+XHjy3@wmpM1BG->#!k%ten*0nuY#6akH2 zCeg?<R#8oRD)}XKNo1Fj8es;A&03T)H5T5Uj}uvjqL39-sboRK&<G2n_-I1HxqLB= zfH%>36M#)$>`?~*CxQDo9y1#1(M`2s#`Q+za*n;sKoz>M4!^ww@|nQb(1n)G-;c8t zOt1HBXQLJ;vOy&39!iEnY2P<rS)ntTu5J<HqB`jZ2Orb6^T{d?HfHJ}A62GNYzRl@ z@xk<}8AK*#DI+-6FZ?kIWRM{pcd>O9$;y&aIqL$Z$$W3KI5+0XYU&+Q!BRPYjQZ>l z6I=bCSx=%@a95#A_8&`Q*Z*3y@VOb}Sds>;ML-T9-%k-NPq&*}>Pbn*oKNpSq@=Br z7>+%kE!r<@!ydCuPC<|Jl+~N88~*G6->UXv&}hxS%oF#6DQu)F)$f_WYBH5~Pc)8! zGtabhSU2+YcJ%g^2leri=Ei#|uh=<@l)=icW%{L`)!F%FwW3ysC}Yzs#C(Mfa>`cb zV97(BjyGXhXp(Ql%)PrK6#!9(OL(y2nsF99=-5!Y{&UX8pu7R$Z1~Q%))NT=6p}#S z8t2^|2p9-9I={A@Cr(GY1}gu<1H;4)7IgH)Kc&p^UOp$oKoLykFGeh-{jb6u{R{&5 z*lSajtUl0laO#EJ_y!DG*=Obu3S?MNb7oTl?T8BHh-1Uk*_1aKJ;3z%`3UPg^^2BL z-O!dk8^oAm@fg56Zgv<^5$D3~sAuPnKUwccWZ3|%)!h3BHC{n?(VrH*`mT?RvOZOi zAp2ql^ATw52~<X>*R!MCATSN<Bc#z?-bbl6Mm;@+A53d8YiM1==EUZAp$pXbM_G;` zq&dK(LwJ9(CPBj6Ly17jyW2`F)zf}P9}n@tf`Y|?52(9j^|{zUxi*EE>d?`CNdzqq z{oLo3WtZT5x`$=Y;WuB(h_x#|w7T{O9F533&ho_VC|9=-ap76$;C3QoVekBHy0hcS z86%|#7L1Z#?}=F(lhX;w?l9}O6^+|8WUjoe1c09s-xd#|&&{PC0O5vZOCGSp>Iu~{ zTPXiSL{)_b8yev#s{l|TK+x3-$(rJ>P6}B)^1v+h*Jrk^UI;7U@$Nr*Tx#r>ei2mn zI3+<IAd2Hw6^OGd4;N@y0^1;uQSFFspRg{Y6NO5Y*~b8BU%+%@U~t&Rp>bt~DN|4z z@!`Pz=d3!?ckb{CXnsBmr(hm7CT7`2ck$zyFhK1U0cG4iK2dQ)B<b0IGJlj@M9K9( zzp&4R9nZi6^a@j+Xwm%<i~e*zuxiL&-h*zp;nO-^plt!D#!B=6e4z;>{B@}z`QQJ; z5fqbU=KzSb`*Fo*Qwg#-Pk1|ZI%lm<P&(NCX4uq_Un2;j^1WLJLw}E_H${-={Y9Sw zDTjWLn=SDO4<T}PK6KSxh`}C#>dEos2s5wA{1*Cd+7+yqhCEkWomD39{6rzI^v)J& zEnPCr9dh1pV#_obCazd#DNZh%6GPuAF4EuS8F+>7Gfai=M-1D2Av57UV~eewoXlbU z?5}P^KyK}Pk|yJlVC`=#)83B9``Kvx|5QFoFhxP#yIJpQ@8_G&TiA=^vc@FiJhBO9 zPfe=^PS1DF)@K(t*u9H_;IEG`?Sy);e_Sg*pFoxd%z^Y0Cl@>lk>2=W=r%I3N|YA@ z#X<7l9mkm|r_Rb^>dogy__s^GI+ObeVOB8!rwB+?Prda9PFwxc)6%ICVu+zE1~isi zzN1H5TC^(e3?`B&+Dl2KN40K*sPJyY2Q1J*xw$$kb$t&Ol}B*g7-|;UnuV)m{9$Wh z7=l-q@*jdd@ehK-#V~`W%ZB>v1^j$v#=QzfQl-ZQdB%a|DPPU%@D2Z5ER9USFjD8I zXmD~c3!YgzP=ZIcsG5{x31>Z;bNcP>UpnY0-|6|${T#1wLQ{5@Jp=qBC(smve#}bH zHz+|M8X?cB7?9sCH8q7S$1sN4r7oDCCXm***4b&&_2Rhq*p)?KzkxSyk7}HSee>Xr zSTf)5{iu7u*%awmc-7Pg^R^9-3m51rBho`D5&#Z-%NsN0<DZANZsv!IEQ)k$Zv$wi z%Lp%wBEi(aL=b;gW))YmNvnFO@ibKEXHAkqxy6QSl%e5vLIQ6H-~n*`Qa<`UhZNAZ zsLeHfVrc-sMCayQOLObL#_;g1Dq>&!j^?1{$v&3QL53E5nyxsXKd5=VQ2R4RWzL0I z=a_D18eDJRM__(+YQcOxw5XcS1oDc*51}qzi#Cl{t6R?`_86S#JfFZ-7oeej5zE^> zrnSB<N?1llV``zVPe+gh=fWls{2ZZd$fVXFHr<el5R8kEH^O6Q-<mX#`hc<<<KreN z@DKw)YzRR6rH*!ElYAw{sdIae6!=PVl(nGd!p0`^j-u`XkoIhE2K@+piFuq?1m2P; z48zbF-D0;d-<p((d%aM))dhxrxDUmDIN4>e1OSK21M%OFw+1n_J@i3WQI0NHi<`e} zd@=9!zGe}5T+8ar*1l}x{2A8)zh3E#y}gjW&O7Y%*|c^Bt7k>jS9rcwiQMm(k8#ph zuNoqKE&2B;or#p)r_6rhr}Po7d2#S>Hiv>^QEJhYg}<G4CnvdurnEa!n!#vRCX-=i zZiiO1rj;P+1aO3OX)s6+Nv~$wHE&m66f)@qVDSJOTX6p<`0yb3;41I`54)u)`q<NR z4RmXr`b-E@e%8Iu(^7UZQ5~qa_A7GlfGjafu2K75W}}yfx96nL^MBW2C6B_f*#rKG z^Zq!$$GZ&qSsx`&p-;yfn;MDC9CdehZdhj)cXx9wreE!zda&1`4?SIlJ1mQmd==w{ z!pkBmtR3)tjd(p<&UBQdpPYoY*}$w8Jg2o<iNI2w(YB~Tvrt&<KBgRbaY$1DO8lPc z0V$C6$Ns^dbnVeuUm;R1Vu+sDCF+<*Q-pE}<b}c|14JSr>1-$qhvv6Gxe${nj%Wa3 zG%=)X8m9QJ+6_p6&M>zB!Vnvq6_u^k&C;KH*ROZqo)*F!G`14V6pBt1qbna$@9TrQ zjE7&q=%Q5mQkv5|VUN>Ud|AlS3272h_Nb1uKi^k@%y_gpgw9>Q#socrWYcid(ntsv zneiH<VQnFE?_vpt{Hn$aa<Qc(rlu~^h9-x{75hhVUS9(sFQREsM@MshKDSljOhDgJ zT1-DL6T-xGv!EC;(xC3<oFNjzSh*jSpGuGq9-|A<GE?ujjROy%w35&iQE`z`9uP7c z2nqcZ6QVXWrdrs#y~92Sedn`oNI1Mpbk>12wP<Bal)guia=<CG-`PS9a+Q90<W1>$ z)yiT%Ak6-BKvt5L@<(vNPK`q?N(?t(u3!po!L+(hH_QvQMBn25KZx?Qq^0%}?*rLT z6~%3_vUiti2GlYe{+U%sXJ4?Sn9EhCu|#&ujVIh)3V22Ms<~Qo$+EMf+?`9FC5|iZ z%%_Q!$`mMgE5ov;;4>pK-~#HPFnCLz-xp!mX#J5Y_n%#Ozg(PT3Xo7yRdlw%nv*Q# zd$oF_t)5B*;oWV4fIg`I5@ZMBYR}uGF$dGG9UYm4su$_2-|w`=P?Dc-hww1s1%yg` zuOmh`dy1ZG-%1{jHvyd;O&B-W$RcH$NQ1a}pouF^ZEMIB&p{Pq!LH>!Is^$%#95sl zn;1$eEuwqlr!md0gqZiq1}`>=w%n0VAg3p`>2QH0HyBS1TbCNAFM10hRNDW2p|q6d z?0r-T<qBhK*~=ibj7lmcnxwxJ2JzS(QmE8i|M6uT{`DgG<RbX_g8Lz5c<(MX`VZe@ zrnekF$x3y3&<Y2aoOG76dpQUFs5_MrheJ(>(tb9|<N5-&gZk|M<f}&W-aR`c*DD7o zNl^amRRz9G!<X-C8{|F-%c>vMTN=XF*ZZ8AkzH-DDBC_}Sp`D<3|HxS6zOJ+uoTmg zF=Klij3R)%W9Nj{wy!7W3}FW(9c|Iet093Vu~R{j*46ZifH#~NUa!Q&#bxLGRILY) zS3KZtU%&_o(R~{pGtT-%s%cKC6%VLGZZn05h~lCnhwXhoAQFFzE>e&EuFOG)Zog7A ziWbM6X%7ZaKNVT&gG2>|fIwjLrOwUm{R!18-O}oaKW%b5#cZBmc$&Ze$D`jO%g5*e zsrE{GjExh%c27pE(^Oa6@?5K*vLmr-siai@5WNeUvlk+>(Dc?cDwQ%vggv$)uMCH= zs)jlF3Dx9X@T)3|M5oV!5FX7~S3yXL5>Tw-=MKV0<pVmE6XySZ@goIL@P*CZTl`*# zfdQaSIaxsRcEIasD)^z@li<`87~Zq;fdRjv(DjzrO#nDD%nhf1!vS)-Q=aQ^Mz?mr zC*05&dwS~fpmgrw06K#lBPAN=E4miu7ru>cke+Qj1c4hg9;Y!Br17_-Mqgprk@++V zWXJ+^V8v&b%P?4ZO>AbTc7Y5#HHxp;)HCnQnMFpcO3a!KGQC5XP+vrauQ9Sq&gn`{ z&jX8g_>Jb|QF}O1{GBo#P!~uthPEfn+#^T1EKL*LqS29{)A^SmKtuG>8GG2QRpaMX zY$36qdNWt|;#gv;djY-n@JEJ<4BSg}c2bj5Y-1(NUHFSg+FM2Ah}4hLU?avj)kdyw z4vTgs1l$wdod})*+xx*ZQ=T}D-&Lk#(D{Orh{r%anv)1s-gk`;<Z3`P|IHa2a08`^ zKT81ONEDY%s*F-1sTCwHqQ(BbY92ysjl>1h)M)y`K5C4SG#lUeqFEcNo1k)TBlvv+ zJHlV5X1=1}hQ5@8G3yDg5j+;=5QCviCQiF5H5jxo?pSIe3PcJTDum8Eg!44PbmNj+ z)Cn!#66U0e{tP;6^`nSEpYT+R&^y&{(K;F7;~xDFC}$TmXQvKVkys<=>kK__!Owm0 zYp<efujI=cHQ(xcppR9z%uM;I@<vo*jJ@9l!3Et8CF{SB*H|;oVDw(_go|qc)gNpX zz!i9P5KCmeb?EIVyyT8fvd+iMQvV)_i7`u}b*$1#?;AoYsj!Z1R3>#}&mvo#jdC!b z`)Xyx(6HaOo7mwKMg)cEOEH-iPBhm`6YK;5lb#8Ej<C_)Ae4xk_ZHBG8YbAOQ-@J; z<(U?m#t?Yh$c@*ZDot$Uh5E^KQx;?z-Ea2&-YW?`;gi))I-c@K2Xg#JDAoqVzewK# z)A>A0MTYp+y20LGB4W&5oy^1T+Q%8_&^a?Qx*T+asd--g@FUL{dObnA(YhT!mz9#K z3}F-SA?6XJm=ybcz(nysYUV@)&dpb=EoDtuiNM2*4GeWj=<G	v>lpsu5R>YEFA# z5rR(b40$m}$by$t4XXyM5gUbm-EPs~qPH4S{mPVxYL_*KZV|xR+MOLi&{EniE0=Yd z?6r;4k7Bt=Du<1XEd0&iLH7>kGk=k$WoKd6Q&D><RMCfzB2TG+PWifL2ff;tyyb|4 za}1WM+1Ac5mjQWN<lQLw#;}-w8KUWaU9<d)iZ+>BHiz@CQZQS$<<XkAQ>}#goM*$e z$8+iQeam^7NmoJOTZpTFA*2t|?^8=|YGGwQc!?}dg3~qZDI}k_%}!2Bb5lPB8xKy< zvTGT?&gnDc?nz#5;D4(oN~`7~!k(JG1fp9~EC62ob%*S{a+yqfQTm{%RRty;MKUY> zhlS!<B2i=JG%Me@_4WLftC%=Hn~KIUs^=eDN{<~w9Ld5B4HTSurja5AB1iPQc&cnF zuJS|x68DM92XitEXFALAD@iAA;s3B>8kfDRuYwR&k_d|HnDWV5oy5yRD_NBAzNbPH ziQ)@crSZ~0wh(k*qcuS58e2Q^cEPsHzqw`XAMbZ1{ik=;pgn~5o$+Xl+qw1@bIjw| z_gvMW``*2IQhE*(t}hQUN2dk=FB%m&%t>xBT1TJrHK$QOQ(KXEG;4sDv0KG)tet)+ zN+66kl!@#6yZAxRLP)8GKs=-p?e87u>MClLi=(OV2XMz%w)acLBR6SQLJ53Zne}7l zJoKYPg!#9by_Kqd-)oOQ4WBWMYteOD7Y0@W3h)HE@IGvDB7i(awmE=~!_MJJ!<l)0 z^}oFbMAsKEZ@wwMHVG#)yXE|PfCMZmQ4sB=8#1OnF}bgJ{UvII(@7pZ;^>8c!3`7V z)NeFu!|9(!jE6x8TZ8Rn{gw=4rL{@}*Mmn^+h^h0n=_Ap3B;{?1U;M$NH>fBF9rVc z#C{vd>%TKJ_y@JOI7wY=-m^fwIOa)$Oyz=*FiN`LHvG`@A6}@=>~6buogKM9?n9wq z6%S1M_sTl!cNMXUUOEdO)*q(jV;P(;eDt(z<#+NX;dO_IMm!AF%J?IZL8spy8#MX{ zzd|H)XN|_zKTJ&Vl`JaZh6l}bGeK14`Ra0++yNoGvj_ay>3>A{s~zuzg@2t&&QLW9 zyZR&O5UQqaiSj9+U7&hDuHX&R^jpc%k;)hl9_kesGo2Es!l<3=?}}<GMWsb@$;2-j zqtS%H#h*&ShG{GQ(bG$(l}Pq3CuFmm{Qc!MwYYF?d->_JJ->c}ynclu-X(eIqFx`B zQU#X`T8a({Tsq;A%zGI<U9Dm&m_3$IvWeffy%_IoT9KM_Rt8$bXOM~G)gd~FeINf} z4@^v~>M4ogSvi}A3q)r|M<&rTqDI(qOO@C;HrtxD8%+!${YQ5=1Ald(GWyOWDb{qw z$+5QbU_3ee!e)YH@g!bKLe`@H66N(&c&z8;`&DgFQQ!?pkWV<eTz0QrFK(X>^P7|I zdt`c_6WgE31CY6cUknt2&ao@^(bI}isG24i$b=a}^d`&(V1LoiCe<Y}?NV>-NQPGp zpU{*3vL+w5npQz{Cg#fZ`>yDJNjo2LUkR^P-OE)wgfrzRf#(v#6Vca<%#oKd7b>17 zTjTx?LEQ_J`x{6ibjI8dJ?pBe>uqm7m;O-L9Z+37veRD7CfC;nekBCkEB;<T!3tA@ zU%8L71JEq=$h|(ZT#3I$FT6c)KTy0y`Mr`gv{a&ROwc_%oSF`Za5_u<QX;Mex^Q^_ zpl3%s;HU3R_T`;8Cvfhr*8QGGqmfV>Q6U>2A%(?u)oxQRj`kByp3497h%}Ige$tY_ zmM$*db}*Ycf391Y{OS7h{fshcLsNNoiEu}2^&|qc(NzX+JO<9LoFi@2Lo{#CZ5e?s z6JJ!qT-u*@A@8rl&3VOfqnfJHIetp?So*NVdQ^LRVRt(;-w0cI3YozMx{U||L87ut zi8wgsJud#`y1EtbY8xG6jQ(3Hb3o*qU7;GAApdcB=)fmVf}q}iA~rY<g#LaFwF`qa z<B_Uh{!)rRCb7OoySWV1x(}W@GGNz<BHFr;zGzF@9nV<)-`ZBa`hg%@R$4N6RGN;q z)CM{W5JrHa=m$(%eWrGj@u)#as;;iqClnXT0xO$61K6s)H!EkjI&-*w5`})l8SeZw zAGF{mBB7#%Vy=Td$GEfJ4uEcplJQK+B9J%Z()J!1qOVz3r>q>AM_yYAdU&m`=;fKJ zsP|GcHE;sY$m+AL<DcJM8W@Z`eI7Yb89B@%xmv)Zq)et2tsi<+k8eN5)MGGhAB*5# zDEI734jz|4CkI+l2(=V)Q`=)n5#v6gryc&D32zj6XA?C<iAx!E);|1zxF@pe*p2Yu zmOSV6gz`Z#n=D+m0?`zwauAmfJ|%Q1?2$r24_7fQ=a=)FJGf=9mUcH95<Rr5iL4`E zCaG>4Mtk3pboie57aS>wT`hm8FzL1_QkTwk3OkM~$h<OMP>fnwd@vybfdVM>Iy(cn z!ynhPuphH5t~N##G02HA@!<Dp=8ySP0rhf^uM8m0Um(Vbl!;SJ^Pv2cS(2n+blj=> z<>zgKYAmAby<Dhc%Znp26r#xo{Zq{481eCE4Gdx#xU%;TBKxta5n8O8E6#V}xSv0H zazrLex-A5W_(f3_GAmdU0;%~+^&z)IkGS&XknO#$62>rJX2H_Hm}Gx}_yK_;NmNPV z=6HTHp3o*FLy#4$k{+cRkfO?>q^7OHU%>@SiV~bI5TFd!wk7I2V_zP4_g*Dm&HssQ zkm6P1vQ#`V;0E72NF}S6W$IX)k`JNGzTc-XuCg!K$4f>)ut@A4{BkKe-|<<~Wm7Fc zNEOcy2hwG9wQdx%E^1gCi4!$&87IR>Mx|A5np;~?5w(lsRu%niM#!-v?9dw!n~hS4 zQ?D)qgM(0Q%%gD@Yos%2LtFH!5_;7uQqAhTmvP>Lz?TS1j9vlw>h}oQHj3;<S&Z46 z*zma2(n=h(jDKZML0Z+j540h1yC{JIl<1M+u`K-$g4-v+aZv`;DiJy((#s2OoO6>% z6iGA4LB27kUiIIh-AH@(KX%QkaeH;=nc_7Q=IM!lX1%*R&KAhRMuPYM6o8(g;|t!c zcm6>OGwv;HNlN-&*sqaXoI2<>_4(4GH3+Mt-i@uwqU~UU&v3%!p7MW#=H|5dQNCbd z;D+BphKRBS0acU(ll^3<=n?hbs~A^*sr!qhi%Xi<YuMLkbwWb89ai&{_muSv;ES;` z6t^KgJ>%&$cV!K_nTi1wn1z3jtX&CdGFcghXmrMt1t@663UGB-aaF})jIz{bB12e6 z_oGqR@Fj~3fCFev?_?o@YktQlrYT?c{xy=|!*$Zl#212f7=ldiSjQl&dfCs;pFdyT zo#B{l3;++M|25{c@Xj&{F0=V{K5(iIFhJv_YXZCPJ9_E#6wJ3KlV{OqNX#41I2d;e zZCSqds0Mqj=tRdJK<u?LysanKxZSz=l7CvZz&2b>_t+bj`*#gY2OiE%u)Q%}TO?%K ziFJVAxTEUjlZP_PDBGA6i4vMji4&3(P}X6-c)tMsz0`_w#9C5}|M7G%eJm&2J&s9K zpXY=iyYZRqVb&w+DxlO5*Nhcl>QdCHY3}Tbc2`BuhwFYrnb!>nguu15D84=u&)wYM ze5^qOPb9zPx6Lr9&T<oud~DKrt4!g3-llrpf(df}DPt}=RJdR{C6KFuMWz5|z4S5% z(cZ2Z!blCIH)-JA9T%@Su4Np0{QkMV$*2Aa85&(eJrs*}!%GsMk~{GiNxDUG;dJ+k z{TmOvJk9jtNyC0S6KCliYDRGT*UC<w9DlVCnvr(ZTroX&4NCb>{#vq4;E$@(;H!Fj z$&5XX^uudPwGbGGn$57rt;`brsRY<)E$2=-Da7!>HPOXBr_)67FW}2(;%b-flAFoJ zJq}~w2U38Y&D!OT#D~r#`;SHV3Lb;Sj;XwWC<9r(Dh2s=!nccjtTM5HLa}GSXF{86 zL~Rv4>3;GmR(&vS+jXD4b4g=Z8XHGHmoKgXbk0BP(&%IW1Dv|@d*rJoI4>_j#6O0$ zwHvA&#=jnK5g!JITPKwet0nlixk^cu*D*^r2fRCuNSB#4mF=pzlw6ia+MC+;KVLa) zsLt}=!0Pxx88|yDT>l_2F+gX+Imwu9`AMjY3gEnosJ3^2l;^_agIGm#EsGebzS2rS zG{v-GwG_+JML59nfg9<gRr!3=1_S&8$*I1AEO})zXV%v6$D=-&{9u->)bMudxje=~ zK2#aWjl*9X%QS&E_*`U1*^nZb!qK(0uQ{hD>~RN+zs)9_*k4ofKI&C)INubd2~VH* zw0KSZ-@^Aam=ww*I7ke8n30b;5hJr`UXD!)!*V(n35eo2Of-6)ewZZCj|Jm+5{e;M z^@S%|@~Q>Ms(w_tra_lNXn-@!ocvj$5T@@dJPV_XHdxO(G*F5-3n5fAgsZEXfn$76 zvW|`;o~4?A<YR(U-RJC_f+c5f3lu;!2VqrwQi@F(4)t$~dlU7VY}@13Yc;8y`t7N| z_vDwkM}>QPhvMfqmt%0ROgM@@6DlY=fB(poK||axl+yW?=V7D-(Il6odYJaDA<7HY z$BP68YA<D&o*a4Q=zD^T&zkb@>1XI|36#RZxjhKdyYsXNb90Vq`jYzUQT><OqZi*B z$uxRQ+ydS@XXu_d3f5pTlMBR*8;n1$-WRJCNV7<WK)CIw_a_9mC>u=&-%Ml%uB2ja z01?)~b;`VY-pDUY(peyOiL72ZcDV5CoKY24E9DaQj~e6@6gMvFIl6i>Tos2xx7H2% z!E3xd^I)dq`DE=Z`0^5F>a5L(Ocrft3C7vGA}ozBU=d-4JQK<Rs$~D4tXqzf3y0<9 zfk}9D)G0VzB#cjEOT<Lm_)sn?bD27Rscd(&6{Z%SE2dz&UC<>nsII0aDg}jp=>5`< z5K?CcQXNmX-y_AEepX;;HZ&Kouo<5GgDL!;FSq}r%Ide4#Ywkupa1p)KN_hmeZ7|> zb4lrLI||9~L^!JvcUw}c$M=YH_$8Oj9@?<5Mcvj7f|f_QCHWR?^&ql*MU*_mPr4(* znd?SZr7CtW+XnhUk2KZdZ%I4HgqA9KTg}ZpRV7*z)uh_oHTzw!P?i)Uq>pLeKjd$T zQ>X)8rJGmyo8bf!F;^dnfWS|==u{F5K>Xs_%;OQu%G+Yl@7L+KpFWT8Q-q(lLFVC) z|1yc-&HQCrMQD`i8!mg1`CQBlKCCT}1Ad*xo)>uFA7?G(zX66;khh0Mh(y*p9tl#e zhlYX^JkjoPxysM6^DH!BJKC4)YajTdX<Rgn=xs}l&;o^8K~D8t$v9ulZ0&ES&0f2| zBN1mmhrSXs;H6=aQ)mQ<^-_@IDo-a?sPF5}{I+oRe~`7fc@h@XI^2IibmOGe#)l@t zSzBgHksfF3YR%1uw=>W8jQbfWhD*r5ECQS6w@j<dNjyWnU7;~wj|6h_kFDJ{xqP$Q zlA5s&I@jY>l)EQNE;*Zv0(1X6hYZgA2C<*enW;KEp%mY@fO_1(r*v1>pB<(%(;~K= za)m0dyptzOnO|x$eOwAG!2!8C6F(wabr%ic>-N8GPT;4G(^c}w&BGXvqKn~&64dd{ zewDYziN0_DS;KHogx@RFBk?Poy7-T{HbMHDG4!oli>|-_chDKR5?Y@oBdO}<H|pUV zU#KzR=4pkXU&q%*ciX1K1d6%d0InfTd|X6_WR#V)vo`6zrMVWVfgkoFvs@#S6Bhjf zag!jXB$S-s79yLIN&(^goDq%6<CmMUGn)iKSy)&FFxvh^2VwAWgwpcK^QxsK`5bsH z6>s7vG!?(3;=KTqy2&#!i~-F~B9VH%CSE}Gp&s%~MPKJQH}79B<yep%kp(3^{`f-3 zcwKc={1)d@qh#;j7}GvXnjxL2+N~qhHUS1><BD_bE1fna61#K>{H%c!g0`}Kp~_LB zfV>L(A-){&4@~{%*g<PSKqTwr48Te}ULd3$N``P`u56N}N;1aa1dT-EHk3|75uyh3 zA}ey+OpYrsJh~x9i8?crq7|$`>^L_>JEv-Pu(_Sc&DW8NM|0y}X`iellre;l3+)|9 z?Inzaau0L5`vD|05;Q)%34Y`Gt$U}~{x05=xnkG|-ruqfQhx=9=V0}PAF}?Bd#px1 z3z(zes7sP=`NS9fJLeB(o6sCPVwczY!~&&WCl?#vo*81qUy^pPHj~A_#I0_qBPC}= zMp(fbwtnkj_Q8*&**QFnTfX1MdmWHF!lGaVo*6L#Rf2^FlmczLpAMhv4TSerg&WC5 z3$J%r^f&!K-u{IJ`P^*sQ0`J~U&TG15Q%sGcAF70Y>7R-bM3-_R2yBrOBn5Wh`0@U zeOLYVB+k?w7_z?F*N7?_S)q>NeHz^qX<xN#jOU46_~|ut@drHMP%MJerstdX1sjKZ zkQxusx~Q+mK@P2OcPrblP_y-*z{zf_-_);acx+(Tu+~k7;me@H)!G39M*`i!0X|XU zVpNz&L^zH!3l6`XOMjuxXv#>8W%~pIbMugiala*cLH4H~N@dY%?-^6&IT=@lVFQxC zxuEtAMy2Ar{oKC>t~`N10m&7{EmJAhA9qS*hEbP-L>vEOWd1Lt8MJx(HA_``&eelU ztzoSJ?fH<&%qJRZ8Aw7+Z8l0_dE1_ozFEa+;w*u$+uWHOfWM!PFuqnf_}P7;RTpg> zIW?iU12S_|$UG$f;gf$d8A5M_;>0NE>>}~`UKeeuoPW57e1ge@_06hAak8cwBx@D0 zx~h;@zQOaaW9gJ_qQfs!<=xV*MgMXeeRs4PpOHB@DnXi*w}!L`?VyCc8T{FGo?{UF zIeBu8Tv#pjixqWc|KLJw|7QF0po4f96N;DH*e`5{x-6Motp=x9h)6&+ZWdQpg?>m1 z5kAi&adpVHMI7`mp3ff?HDscj)KPa{&=juX?26_u5KSmgMBqY2sk(Ct0Rh<93|)YN z=j-gEG{SLL_Fw{O(P0dc$O3`5pGeQcU2=h&Icb!RV7$z-V>2V?3%ld3nZ-vun}A=T zUj#HQ{47e;nJPY+Y`mRZsyYj?QOx~)u>Y}t8WzH(YOWeQCsZ|?F$!U-V50xRK*F73 zL~os_a5csxFoW&4?|bYUcmI_>wXH{gKW;sz<HIbQqC));-83C5pHN~MYcJwq{a^Nl zHBWZh1eO^u)It~rJ;eZ=J8w=v*@i{23q+l~-68_^l>fr=&+-RlB2UzRyWGi`9CjY) zZX#9wBh={mqV%%Q_B!zHxepdl`uYlC)JAz_J!bW_0r4U!pF1qSW7gOngZyf%?q@Zg zw{7|lRKj;Z_WzMt5kXkA2jD9eAW&j(Kn{plNf!5&0wBA=MUIi4SCY>`E~u>|x?Q5X ze<bweKU!%;0AP~J+;n42fi{f?idZ}jcYX(b(!9K;N+rU-A*9~^GS+FKs)ku{rF1*4 zvhhR&+d)<u>u-N?Q<$dbbQ(t7WE4aG)pY;$E?69BM0G4Jm9PP%et>+^r(D7WS+^+q z_f#7cN`lj2G~$kr2A)%#HZ(5F_2bb@X#C;Ginz!HPD*Lgm+wG4B~Z5wmYBdF;es3T z%T3smd6y9yFcRx98YX@P(rfvj_TL3lx6jZlD4-<QmmJu6xxVlzEhqg5gsCS9oAc;# z#@!az;Do&y$}XAlPYUEw#NttUTv96ip{DC0+~y%io|ASACST|*nV_;rIka6#n-^$L z&CHAoh-XCJ^<>~2Lijz%8RihWh<w+;&5PgF{@b&Ns3vw2eNiNN;@tAf@1HJ{HCGtj zYG~@&QD!*OoLK`-PRzgNPEEa=>+Ws=&%yRaCyn3TxBpn<_rQcx`W2K^xGdsINO%tK zqq4aT_>tBp`8|GQA(yxbB*_S9IIE|OIz{zDO5<4(k)P4fv94wVZ`lu=2}1GFHO!Vp zJY2G2mUXM>!mLwp#|(XMXO)Ahn3cK|18INXXKraz*G2ppanHj0kcG&oU061)u7y(( zqdE^ww49Y)hB03Q3oZU^UNG+a4keju<i)^Gq-GE*8ceL$r)>J<C`Ql15MJgkNlIN( zGoLAlXfAKe`YmLfRet-C;AL&8Y=6u>fHO}eC=O#+st)wMv;kGOX+^$6$+41E$FVw3 zIx7cc>i?;l4KG;hseGAFF>?dr_lp-Zc7m8V=NO&v(ir3R9sHhqFnR>4B~qFzKX>w@ zF%t<jf;35qYi>ic$_q`1Ax@W#n{Tz1GEz&S%Q#nXkMn1}$O++Rq6s(yeaq&{Uvb2< z_@PeE7nx(?r3r0`CupIe+I@IoI*ALm?LX}BvrSt8rOwrV$gX7_juD{vCg?W&1fYzj zFujX<a673%eQgCQJaHtKyl$Mm6dyEt{8V19@aHRa0G|wUX(=F{R#i^iDov>LKm;VH zf4<&U&H#Szh%W#k5g5@UQ2O|^S=RGL4mhDe#9apOZKo(i3+}J;ZC@_206(<SfBeud zPnLduzRIgPLfz@bp*DaoGzIVZvV1I(gI%4mAKxuAue>6Z8C2`9R8`3&tSGI1#H_Jz zP7|FY`Y@W_r@w}aHok(s%bF}vm}wQhhI1X4d7!$N2@vAWDNVwAU1H1ofS3xtp(%QK zqu=pg!E7IGzT)bsX^j8=z>0r*JyUKG_1T$uGhe}Cn73ka%qdyW8o+a6GoS_%JMgeI z&xRON%${33iXu+0u>I7MNZR`bNK6gh8Kyg6_coL+tpjX9H7POIFt&3U<l2FuEkOBY z8MDG;cF5?!uYvs6|4eG<aE+WuS75>~q@?W<f4%2B=h)nf;zoH+*;wYV=h_iWCnx>Y zoDu8Ly<vOxby25|m40KkWxJ)olnK0JoWLzX9;LB1E8*jA{>B{)=MlfmiQBjYvf~#! zeZ{5Gq$?q@I7SUEnNrn0a&q&MA!CM@=zP;T!CB0mt$B006modTg6S`z*duoKLjzE4 zpdIsbq~kgH@|oz>x@iAdHxgoQ9-bV{&kCwR=NzH}OnGOVQdl@^b}4`IOipUuo!_WV zOa;kl_op9%bDF|0<RtRZfP@#<Mr%wF=RjI^7><&pJYC)a`@APxj2UElUnxO)^mow8 zKFtcr+RDN4gw|meHpe1HZhM|QE<E#3k~#FHUut{xjy7lfP8;UI<}_t{P)lNHGgn=% zLiA@g@JxTx3Ma7{GaIBDgi1f34Jjjc8|RH`dwsvrs%F~l|A8c^ugo~qJeAGbom=UB ze6`e{u&mkZ7KI(FR5m*cs82#UGq@NXDf)81uKSC`46DV+qG0Rw6>H}(m_D-)+k+Px zH<Y=;pk=y}8^x$N;b-N{7hSAyW?7=FFi~8ZMXQm)^rLC*<Nw3dJ8;(-t!>+J8#Xo? ztt5?Yqj4JBwr$&X8{4*x#&(*<Hov=jzxx^AFUUy7TA6cR*LfbtzD=jk#(97r`(866 z&EwYyCXX<4Z9StIrs|cbjPheVFBPvJHB8U@(>O{YizfzkGFr{TP4&R-iufL=U|{LS zce?$fv;e&Vll)j(2V>=`juU&7B;5$5G(3?oKJvntOnW1703x$jJ9eKypFn5opj94C ztHDJQBQ_rz8dg7FOffKlIyF_Y)lmdQ8G)9D7|F^3X44u#Y$|@-BQgj4v+R{0kIaMY zx{5p=VJ8ngYGhCVd4VZ?dwS|J^!wv<E)cv7$~SyH!nr!N0yw78KPwm-r~1DUNF!8m z79}&np|bkjbg&n&xS*Q#<<^g?kXVzflF_1Psx`5Z9>l~Q<?eGfXtt;bE}s8*K=W$^ zk`b$Yr#6O7?2LGsaCFY?EwcWT@Y<;dtsV&n!S6@-R)?NIlwjfj<l-4=WgGeobWEnX z_!Sc$w;Q(_fRN*twXGf-8}kgkYWR&Nh&<6>4q}G0Fd@TvZ<8Bqq@J(H?S&Hy&<rCC z8zb=`6ld5xjaUkR_hAWUxv_Zm(7E|SD<x-1JnamzxjDOZ0MoQ4!MKMBdkiVO+2;Z@ zZ&a~#rl!hDsW!-0w#QPzDl*d~9N|S-OC-w|o;J!kkMzC`6rKKp1{)`%C(s6)2BVSS zZni(B+F&4$60uV5;~0(#O$$Fi#U;{H=(8(;K6ewkWj%+_Vg1PHbku1kW>%~)=BKu- zJxh^<1S*-uv1fOquCB1Lgr!TX!*cVVLLU>EcL&L%h6c)DG>L;1KWOr~o0}wxGwV)g zt9+s&xig1!3>_-4Lc3AojB$~E7*6Eo^o9f%HWUp2>)w$mjJ7&T_y|e{eSicuNdEqs zb$X4;jjP|xrf$6Up06oAeg6k+if(6D;g192&v|kA0m?`rs8Uvk>@m5-#{ujS{90v7 zc`9n;RAM?DG76kLd(IS%6*5Ly?=B!DJXU?#%jDYqzC@+I)Eh*$#7bO7gu>N@muj9@ zOx;t;=q=4|>Z98S!6pV>i|Zox+td!4;{1EmH)@1?=wyl*DeUMw*3tyQb|%i66{{QK zkn~<Jvn~~Lb><H<UzR!Aq=lzOb|(xQ$3(4W?hVU&^v_J%!UOK}-`<?Ba<I7#J*0lb zcBmx}{6G-~`&*NZWMZhO&iHUoMaZw<TMk5efeQd3|IpcmKDV~9CzI_r25!oBsM?I+ z3wmb-%Ot`1vu!r^Fm7(6R4j&cJ)xjpFlIvYT|(Ffc9q_n(X{8=pdTqp#lydCPz=B7 z=pe_$hEo)8L#|8_-f!|=hssgr@KJp9H#fZR$?f|-ro7GwC$B<R*YyWNzRuJ#RRP}6 z;o)Z;;8>eu_L96wDkrvQQ2`ZxvB)68`ywHiHEzuoPGwy~Mu<H#Q7;_q4wKJ7RKUCj zkWXmdHq2;=pY-EPQNQlv)KY%lpzB)dzx4zXYRjtwR`-mVcxllx>ta9}ycE`_IP}b^ zrjyR8O}w~Lx>6P|6YF2YzoX~=#puP;NSAkxtbZKdIQI#zcN^|b!cu@{?n1wf;IQGB zGNs=_)Zb{^w4at)K3@PP$Hua>zW_DXI(tzD+gQJ@jh4D?&;PQ%-l@tT4PgE2bSdes zP8m0$dIz?zin4~Fy|lN;k&0!OXnTw1NGqE-YirbJUa$7(Nyh+ZWP*f0zimhX^T=}> zcWwb=y;DZ(V9`2D=%yEm32cvrK^>MwJv1`;4#@E?N8MmIES<hAog9xX@?gI=KN7V# ziZIpu7ba=1C)sDVFeXG$At<kqr2(6VZ9MgU#)z@^*j4#x0;h<bDHa;HV_ged3Kg|w z@Rni^AE+8_I<~0Du5S?Y_yl?0BG<PEI&p`wYV>^h{zE3A)}@Mid;RE*8MFc_q&z0K zc|C2xD&)KQ^EzqRYcRWQy-$6^4Mk%MCzX~xw>!PbW|Hn+Su@cgXLN+a9x2(Uj+K$1 zYl0#HD%e7jSH}=^QVW+ioE|29{lobVFwtCM@S<zpL*~1Z<ExfR1?T7kL$9!>=(lgt zWv6RYRhKRDwwQIIyS)X()UP3x(xYJ+B@z-pl%;9Fs<(j3%i(w9WKb;4-Hm(^q;a&g zq_MLKIci@6SOU-k5!-Cy@u5rRfoH*R^iC9j+Jh{*PAgNvOeV{>EZ)vw#ECQ4(1n7P zR<8n$hE<H<yA^_dlhn%_-cOA7!3?utEYg7EIzS#`24F7j)y5#^*Alj4TlHIwH<n~c z4rESSkR`H<AO0PNA&q3)P?UIe;N)OWrQr~)nyJu)H*2kI$Z3X2`$CZ7E)b+%rfpb5 zsC)oQtmR`z{k0L2*K>C9?|3>nsixHN5(S<-F0NSZjp0D?(uqsaefR997j@5d!ONxx z9ml3VmZu|DsnDjyiM!<;=2y2rC&yQO0yG#^kx~@cZ_{|u^AUP1e)VW%)5+erJPH=N z%|p8`5C0x%A9J~8A6K#H(_MYM9s=)=jOXvXR_%z13Ug1WmgQbg5zpJqJGV)0&Jy@Y z@x4EI_lFFPw1m`!vxgWD`VE5J`#&S7;V*JXlNL828J<d`ZWag^Z6_UVWPWPSfKrus zPa+P;ZEsO2+?(M9emLx^4RJQ6QyUza^Xl)jT`q!TTo;f14Zf<SVH=yC#T2GSKr^7J zX@r+KHbM;t@bg^qW4+yStysunLI$qLz~uub@j<|7kyg4q+Ps;ea&g|E-$+7eS-dne zNz9T3x^-?bx7FTz94`I#cz!OIuW01XnaMT%WikRx>nT+OKx+Pnr>WV@4W`HsZn2BC z#>!Zp5^=-Cn~uS$9%9}MXnlT3#8Nu|eMjx8U}>F0h`gom9=xoL=rUnUd<@#PEJTF1 z>Fkq}O=l+HaBaPzMk-_Ezb(4dbiyd4+dHK^UtoJO0zA`|!N!d>(r_|o+bp7}!{?uI z1if{QScs8;OtlEPts~gtMfzF(QookwGtK=pIe%Sn+Cd0g{;0wYJiZ}f(UQMP72_Xn z?lf6EBA)wWI7bJF);WvTDrHOqXrUYdYMHvaISA(}sqqPI(St%knjm>vS`w^W#rQRF zd_$jb(^s3p&1&Yw5iI}mHFj{D$Mv8JxhFWq+#-&f21fHGUfM8n9B}rYW<eHZB?ZaN z76nBkq9kQ`Wd?kCU9Ih@=@EK*<?G$IK1T{>mi>?uBTT*Pql@RC2<12M`}^oqQ;dP& zO?2r@@QM{3YW&=CD0f=5AaZmQ@n1#VMU+Z(q>kY_BDAvE<hbRaxh_x=TAx|cz8IQS zHc#=v^!P-y%>i4D&5%v!keMWO>J_1;%5vT86?fqiPO6;Zc9a@fnTphkvOSDIxEYt$ zS$vzylkw*PY*ju>#GhnKMqTU=)kk~U$^%zv4EQ90;89{}8phlS#%Xzhw5!;u)M!#B zd+q7%YD{OvT8UWfKeH;Z`=c4zIl(vmOxEwx*}8jM^xu2y!_}A3)z`nO^R{5;1*9`U z@|$c*9uZ{D_o82aMf8-1O2pubeRwf?xB&XPSpb;=$dvcpv;Q2a0!OHGxO2`%bj$y} zfGw?4a*=OFQoXkRb#1fP)<)6wW!u3bSAlyN(pYVQ9Ev!_u#gs4cp_^Rr+{<L*`sBH zH^NkR=AHjT@Z}>vp%;K08nZWRaQ(^2K|w+))#?5PJjv2t|5PV!`F{7llu+b8NorCp z21BSu5G92z7`tXkA-}Iv#&I>I)T?0nSvi?N@e@KVp-&~s924CB02Vt@i)SePAxGp6 zOXdWcw4{2`iSM_P;$HI3F$JlSUi<{HdXY|{tRk#-N@8o)5A+}xqO~)9Hg?9B_UBb# z?|)WGu?#HDfvDRMsAz7;+IqK%t+<Dqs&}>}B)qJ2eyGq%y?>XkF6}6d<K|Er;THSv zbAx(qx1I`r@hmpeYyQUFgq&Jpnywjd{r>^r?4_DpgP-pRqLokBcCe89)(OU$md3g2 zr2Q*Qz!Miq(hw3$+2JaY&}r|6#~h<;a~v)v4FrvChxYcThON(UJI!%7#&Q$M-P6@s zo@GJzZD#fw;@pCD_@i(&oZGiKKqZ7a`AZCIfX=aotM^BtYre^1`whIOdTmK6y}z4! zkvA=zlSbTxnsHl=bsZ5}>KKjS7yB;V(FTrea5d(@0~5hVsSR91m51H66^(AuUv6_8 zw}yhHxvQ)beZNYMsy#}uVdwH#*|;wm%U&rYx}wCtY0!e;m`dkk$5b=;4lJ=_E>l%4 zxOng_dT}xH$Es=DRp-H%_H{|VLE^{81F`WHoU3by(jn#-_srR|I(#N$f|BMOOnJ8H z+DZt;1_t-l%4W7ZO9|105FruMa4K_ok^D7dCKcW4-XAzP#;}zsOl@jR!l|4hmgIvs z@a()1n6<{?R8rE)RB<L*Ik}2pJ!zm$R=ORQv79iV{Q?Ad$zUex!e0;^5=EDVRMr!f z^?rnLE$SeK0ZG(eFr3(*Rn8ss8p{AH^Z3x&Rb8^mYT{Pr`ap_#XcnE7fJlW0iyfAu z+FB`W-J6fO+u5Ju<7eycYSoByjoAXO5$t&aCrpZjA-9-Ql<xar3uQDbtX7jK{M?zr zGu}7om%jMw+Y!xpVn<q*UgO_q@y47@b3@J^k9mQO=|yI2?;d-Mwciq{+QwqZ3m!%s zr8noCI&HApYX!TS<*puK&uqI2?{Ysv7lGOK)6L%&SxxYZa`3BHh>s(%j|0SoaaARH z-=F`Wkj=JNrp4mgjG4ryUG{JqSZb+qOZ-C`HC$rx2+NFAzveZPkwLIO)wnkpGV1c? zu!)2r)uw|_2lf-O6oibJ&YR_xOmGs&I6d;9@<asK83&fkkFgB0p#2W}kCB)94y=_w zo!a!h$3UpHx3_fi*1dUOzdVdQ+}o|K{fBM^c{ZiwQF3q+k_mxdgvXrxJp+B6OvXl_ z9ePnOF(QLAnb60)&$^)TL*Ueu)9*0Xv*O>d4-#Mo*nF6coHS>o+kE(Jq{YdGB{Ip( zeuJ%7N1|Km6Ps9<ZC>B*dV$x1e-hoaGbSe<StrpbItprfax3TdPT&k^L=I#UDud(4 zDLy;`YNSGGOrZD1HG?Nx)eWZ?<H~Yr7K~9Mf^z=h(Ib|Xc<df^nSycj&uO5s%CA&q zzH+4c%u)#bcX`L`wv692OTWd}4Y*Y+5Rv$kHH(9(B!(38NvjBx3<we2wf0S`X*T9| zcIbxLeYg)(A3G{54>$->O0m+(Qg%$jAKo)$(-keq4jpJDEvrzEs<nN?vT*JBqtT;; z;lna}JA1|8J|;r@To-jnvzzRXG0tdj7pzr65gkQ=`=*1gi%sEcBrd2V>{O=E`{0nb z#5t5CP`=GHWq!3<6MNcG$_K}?^zEd+pV);(7UouGZr2BN%Gmi=Sri}XQWfhl68?38 z+=q$e8O|zZ5)LT0Ta$N-nX*>Nk}MaQ<rwDEl97NSQfLAwb$9ue?@F%gO<kYj`T4ij z_M8fApH2F6rfLho;zprbJA`87!b86gym{{)6xsa7c#8Gk!X(PoOhwNyvRak>(*ka! zg<4(3;K{xGrhPit>hX|_;qXWB^;Wx*njurO<>gCFEMXjPOKiJqERgEH4vnSE;VpE# z3IKo?TFrq<7(16?$CKQz?XL6HTMFIop&z#>zFs06d?YE!e8cY4>J*gN*4cCR-^LeS z*D+wzT)9%YA}8?~#~IYG(=GR3{Bip2kq*_-<E3!tOa%%`bnH^LGiW|ZOWz|%h}k6O z>LK6lMdVqXBIEj2g)xKgL9#*72>uOkBLPrVJ773DX!Nq%HL)AZJ=WIo*0zcl=W(_d zan`ofVU3*t1D0ZKD-`$*UXbR@H`cLEaB*Us67}=KYlF;ril$5_TXD3z(_EwyQQ6sQ zHqMiH|HJqE?|UC<dD6CXpT)H=+K5lg73XtXf8ROX%Q+~!JHBv2r(Qfhb+w%H=?@UE zVm0POHe@1HaY+G}{(WeX3_G|o^@49>cjG>ut=D1BNbIU<zUdSD7xm`ApsuLGuSHL& zC|sN@(9@K03R&?AOK~g?;rnw&QrLsW{1mv6D+J=lFNV_f8oll*b_OYdU6#5o_hQk> zNsE3qLBXDJ@b|;8;|<R;A{~V{fNr+t8nkB!4JC-?RVPhaUQaXn3GajHAgM;BR%!0^ zW6J$~fU`UM3C?+H>zHc_G|usNeQPqdFVOdN`fU|eC|xSv!pC;zLDJ{??^Jy{*{G5c zlOPDqK)F;7(Z2-0qJT+aB4R&SC_;^$F0^l_AleO?2k1*%fcc%dFrMK!Ucl#HWR<zc z7q<5FSYW4%B6T8}<X3l6IkqWwx0cQ(>3o^9Dd%CB2HxCN0PGt8FnYAOXbz`I1oQI? zBO#%a;li-mBI(4IN&qFecNSc#my=g%<ETL5y4qhqC$g{-YiQzSi}p?4PX^JnT7-Iq z)xQa_5gwK29NPbRLMKnbRwg;@MXuRI3;ZOXu9s9|ZVV8P7zPj%Vxt}$!Qq$m;SG)M zrAHc3jCb@5KM%}^qs`04l*-1IR!?0585p%z2xv7{dv;La#Mtg*;luhA#+v=uCo2ze zQh6Js!HFBmzdVZ*W1-LIs6z2XAM5WO_IpG>Xfj*fjrmrtV0^viyli#SS$$t`nlk3@ z2Jty|v&Igg?wlYe%%Xs23KzjK&-W-|4>=(H1dQUEwzPMIo$%Z^mxv~^bmP^Vc*OUl zAp&Hm-ASx%49?H?hR~on6}T)r+Mr<7mio@m6L@_k?}3yN&`NyY<vgDeUOy+aVRq-V zw$`s8*3#bL_bz%p`A~TO<6G+ECh>O8dvz$Xk|lEJG}^|S{V8x*`nHwbxv==$VFWF4 z6JuKmi6hzU0H;X#5I^hhGr|*?asqMD{z7un37MdlPoHR33?!ZOCvY?j$EKr|#(10- za_|9aPi2KZqp0PQCXA;0<<;`1j>8tRS`c8v%=sEf&B590%=PGkw{-TymCGob(8f_J zT|M?68(s2#H(2LpIF_N4^C#7$xjhR>RyJv|DL@3M1wRw+XNVm8jHJ&slnBs6v49#Q zAU<4MnRzPM&;XKQ-Lt>#GU1G_PC_bu*kOOIb0JmfzyH6}rQ5RS)CRRr*R|HXtDyoz zUeAP~M^|T?o}RU?E9)zxo;7@C=>xby(s?%M3>x>&i<tbn{-Bn=4UA^q{yK5f*Mh+U zVeJ0L2O_CFIpvg|R^EI*cPNml>G3Y0mk7rD2rv(d^eSI~_n8fN03|wI=?F&61i86~ ze|QPJ-4ooMEGbp%$ai~x=ivAa)mNs3DVkGCY*Cd!%Q`C~|1f$XncyXW${n;He+PYg zi>0OV_D&we?@N;oo&_Ul@Z)FyQk$lBGFO$`7f{*QGH4p(1ihvX<^-S3a&MKuYG!a5 z;R;+;l>=R?mV0eqjwq4WD{O6Jk%V;Ir$KY%o82G>5XMZRy1GR{>WvXgQ-KGb&1<Ve zR@T7nL?f;V&Pu*SsifO~ZF%6%b8PY2-_73NixMDS>>wNG%M593ld%PiQ9%~b!K$iS zG<Z2l^Y9UGw#P~k+LQ6)r$1b@K_f6oF{DleMmo!+Nnh?U`tbD04Lz2TiNwO<ET;ZA z2!kdi{8lV##3>{uylW&~A}O?I%#5u^M-QtC3DAD0dmc$C)tFMnEGPP2sf;B$S^y+! z-ZKDMKa4wmP4WPC-f(yXMOElv70k45ff5IE_PEOQRA-1*&m6*5MuAf1MGRkbM#p3@ z9Q(C=Q@@{WX#nSO!cC!7in_0LkF>m{pPAa}?Wiu5wE|Eguufp<98SV;@Q8@@SChTW zCw_m0@O2P+{|CE$S%!(4a=fc<?-C76BXegPpPo%!1hruz|4s6*?-W(xRhn+n`P4i^ zVP%6XH;t}!d~5fGFyUjzGUDGzJNHB6eV2Ou&AX8T`R-TZD3q^56hBYF^A34p_iOT~ z@7ouk^xJoY1J!GNYxi&-zp>VDW36umlaJ!yAj!iaL`Uxw*h|?XlvCbq4kwsqbNQz= zBh7U!9M*!-IQnOo_AYgvctY4o3mt4)BJ|g~t3IH~sA!Nc-JR*xg0RRz<AOV&CoMf| zS$!iFh8^BgLa4szDP73twR<O8LhLc{olMp#@ak9+?F%9l!lsE)Hl2;>r;kI}os;U( z*jS)sTNfz>RN;P~l_Xm#qlF5;uHXQNw3|bK)*%Qok;&g8p^v6-UXhxsxHRc42jt1F zqs85Bq?tK3X3?zVk|Q8we@=9s+eSm&@$zhpsP=!eg)N6Zh~#Ez$v!)AY=qDK;QBly zi=#w?xLOAZzY4Q6uGz2`5$vC-W-dMs6K(xyXlsglQlPU0naZhx#o%R2sg0QYXT)_A zQICCPz{ac8GSZH`bC`L%b~+00+cdpABKUcR{sWVyeLvHDZGQ-o%l$lDJYx5A6KhJS z+)qUl%L&+BKJQj^%sls%ZABaRCaqLl+of&o{C%*j`<RBYo#HV}8Z<K?z4=XGKZsOO zhk}Z2#l$M_A{uWn>X^LS=-C2*G0qI@g%m%?DDAY2;K+De<laxIR`S39%T#juh6ixd zGjOi~EOAuBp3Uwr%D^y2IiRk!w4%c13#yx_<9a7uQ@8(#3yY2q3kaR_eiuJWW^WK1 z2a&jhxWkRrITrO-)fEs(h>nRFjgcFnqmQps$mM8;<BP}e+;`x{q7>ULAd3o_&nI4R z6Jf=Xf00!D(it4yFVZ_t&M4)>0abvDCI<OxCvxfk8(*GNW%1mN$2gBJzlguI0v3D- zh;ZP%Z~Hypn3m;}mW{&;X%l~@Q%V~}W}a}i8^JruPmh5OkT86}k6}VYGh45<a`bm{ z9HLo`8mFyass5|+#I5@yO|vVN2}Q-b8k~0meN`MB_UKbyI90X_UFnL3@hMx5EcuTG z27J^pRDMEz7}e!Dw7P!C2)SHyU|jHTMav6~zAoll*f2gpapmx-IA}<P7{tIbUHe8z zcTOGG*e>N}m-~20d^KvgyAljx11v%VU-osoe?IOt1Ls(@=Or>%u!eYcE}E<?i~i-@ zci^d$_IjBx`mm+w{lI&511>Vs>}vP&((r!!J;JsN)b9JGW?&EPwR~yb`Kz>K0o?JD z5h*A${|Gx@CrC_Df(lN?(yE!!09mv2$Sb*EgYoN3aqX~vwxAue?MyJdNn-BLiQ2;h zFuFa3VLQietXilbtF{$0(Hcg8?i3Pc?rv}v?i^mqTU1qBJ0zN$fE38I?_D?=JE{4F zE)45$n>`!$*M9JV=%CY4!{t*_nB9T`KK_0pA~d9!@M4OQg~B?yaSMwOxl1ai0W?E0 zY{*J{E^VOBN+*GJlTC09ysb8P|233M@tQj!HAnMl#}`i$|CftMS;V-Wep(@MRlD7= zpX89^?~=e|(^jK_MA{_%6U0D>G9-M5T0$XSVHzp^*NzHWEGk{1AwyKI47Ca;CnM88 z|IdZ)%U_~D{?6Ykca)Gw%tL+d*T8$1_v?va5?PPf5y^GlywjpEI&fq3dE_O%liU?c zbkS@z-K!2@-dii)iB-lmRn`tNF|yUV_8tH5zV9XgWK9_{pkVV1Ko9@1p>xBE0erUK zl}O|Pk7}!sl;S$s^eqy(;pQ^7MJ7}lYXWNh*T?i^{Lu;%xcbp=>KDg(TWM=%_psMV zzVEevoAwwFhKZJiLbjYvBkJ>LgGz6woL19Rsvg*${EghJtiplY!;t}i6QDVFwSVKQ z>MoQn%Bz%6Rl#xD$0=F@{;?W9xUgsgu&hkf7EI~2ztDO&HtPo={)^Z$dY#SRce;De zt$-CWMt;-kH}zAOr0Cz@6qbV(12?q<Y1VA?Z}3Yk0z~d2;BpvncD}0yl}i~h{4kE1 zOlrgp$oK_6P)3FjGPd5<A`)Vu6f-c`uN$w!3Tb6r)S4r=ZrS5s20{o0h%3kCQe`uK zb@)5N(I~x7a3C1fPX*FchM?#O=R%2aMbbYY#Hq<1D~Sr4cmVOhNnAZ4m}???-tHxr zS0}SOh_SPe?(0wn^PY&h<+P2>kVrg*OEw=alXs-AR(zAxD4t^}V`WnGEF%yk-TUCg z!!*6gG9hD0{WtE&?S`8G9#ihmcpWfxXuactch*tqdW|u8GDs7RE$4U;9vic7q54r( zwDl|g%hX9vbnv>gcTN~eDUUr1nG)&lA)KR2058z~IOl!e@YDbT>%MRQ>`gtmTHVba zkjF)n>8;EfaVc!!*^9?5b&b(SPH`IqpZ$S;#WX98P!$Z9i3^tza6Wt?iUTUjYiq$g za}1F{e(5Dv2@p+m`AXd#ur9PWClT>05aI(N+a5FNuEs!5yIdeNIQ#DVPPF>*ce=&% zA+D{+=LQKU>XL}BG^_6FEGm41Q--j?Lw&AZFTpnjpi~c$453(5Pmq$r=|J;)=hRR= z>gxwm7g6wOmk;GkY3Vl07IvE0*r<;wEKu>+x<*r88qc|DL23Q48z<Wm4L^=GE`uwB z9a>V8|H`6bIB^6^n7?;r7sSms*zNfVj~8(;Te<`&oeon30WPIK&?Y>6^W;qm68Yay z=dJjH1j6F=#AzxZ+6c7%l?W0ZUiP`$_aDv`dAy_nuqzPwU8abwd1+6Jeot~9PX(Lv zy;?Q@UpMOwuL;_>f-~*__Yyf@49Kp?f0G^xvJgTz)-;StAEL%9&iR2T%>c~?5y=L+ z4!*0=j?PcZWwp#~|CmphmauX;u!g+!#|Vr*^2(OsZa~Sy<r{aasIF5oJi=yd*|O2M zpL-g${`l(JqQFcwDGkG=TB63Byjzne5RVL0UhV9|Kb!!25k_LS?{`27qzIVHKOW=l z++#{X97M@9@mOkWv*-;x->;(%@oU4&*a8^s88`XBH4xn_4yIjWxIpmAuNzf6GCvo( z*=uY~a_IB+#L$y12GRX(!j>ltG%N&cZnW~J=e$`(@#bt2@7h{)zSP(Lnkbs&15z$a zTLX9VG#hN!Ge!rt5fEGi(#?tcSQ78`b%$BiLEUy5i+XFcbsO4djew8D0yo7m&Ad)8 zL9Si>*LP+*uDf#*F#~0^A=2X;=Ho;|@9bP^KUUnrX(@9hzN@q-$s`oyYAf*M!XOME z1;k6{zy19*PZk<18RY7kz>5w*a>nrU74mWCcXbqGNPkYq>D|V7i9kWC<0Q&VLb9mb zoD<tj#4yTSGXh3k{~@<SU*a=6682~eKuthcI=C;1iri`>6*9G3RR7I3SI7wZNnQ_S zz}h$PlbBRJgyU`i)iPW?WZ$BNeoB^ij)iq9z&UIosBz`73nDswjf@HYk6R$dlt9In zZm+4ygAp`?Gg{Ew+|Z!9ZCoq-x1oZiQ%4#YYB-lPC^wNFrr|CoNBf{5{cD^svR`7y z;`pjTqu8w-J@|ygM0~w}A@?7H7_dt^I;-Md9%}Kt30x1rpfYosTEgP138fQV6U7HO zB4zLxRi5W+g;CeELr8ax^1eFj#NBx;+sJv>0}>4UZ+n2%2#|-}0pHBKcJ}$uPxF7V z9!JvvFg(DEu9pFpVNa1*|KPe;lk6?o*1&zP1Gi+KYx)kkQ`K+X=s5Tf<Z==+c7D|p zlZ;W5dyJ(k10AVBd>x62FpxaEYRmI4C#$a?)=1l=AcdheImo7B22&?PjTX!z<L^%A zV+NJ7-b`<-7X_t3Wf;ry!V2~ah`8$|7@aAkTF5b^ABL!N3VOksWt0JdCzSPn-_Tww zYr*DVHDOArW1t&(1pU6NrT9ZQI5{j*n%!Q)n*&!{PR#Q2rr8!Q1wB9HCYM)p=++7; z@XZ7UQ2+>t4QJ0Q8m;%<lWUPS!>%ea<9`S2z3pO9W+O5qiE`y=;9l*y*OIa%l2l|k zdgVI04g5u71pN(peH@10YV1&nPidrn+BjpvQJ&@4AtS7DJ(WBqBVtBU`XM#+D=44J zud&YIDH)5vK`Q?84}_s}Xq+g#Hs;j`G}6>A_h5<7_teyH>W{!{XA*CWNJrl1f#A;r zeJQ^e8K4g8QaT74Hw6c$EBuMmemQE76l)gMUF`pfNs}j|$aV_vkbPEIeJ9d*VvM?8 z2UK-FG&HgNZB`^NRNyuztwTb3he7mHJ3x(I>9w&H?ylZeWP_~HD$W;B_Jstt^lTo> zU6^)NbMh%FIS8+n=|#Ics9`MpNN=bVs_59J3t`#`4>62$(-}bJA1@a_T>g)H=%*xG zUBxbUnWrbTyQ6T34OmK&q*C-q4nsy!P57mpuEU1p@WWHu{=*LX-|JE;3=<-8bz*eY zpT7@322MZr|9e!_ek%@k7pXzLd$LRz&XT#8hdHTWnq~?eb+DQtUfamOyX71N*wp`` zYS|M<sYThE=gF;ST}E&ut3J6_mUuV_EMPy&1Ok|dMCRu=UeeKFjbT5f5~qtgL>9<= zwnQ8%@C#GHQ*8KJ|Lx2QVPmcVOZ8E6basTpko>J2Y~3W>zip&W;oyLT;y?_Gq5hT7 zaqs^1i+W;CE0hjS4KX-D?Fwb2-rfY+=7i5Q2$V<mArj8Xh&h0rFs)U&J-86(<`dqH z+v8Spl)FcKb)5y!Yk?{FXp?JACY}X?t?6I$;;$*dvLz$eaCVe4(tZ$uCi@c^uHj{p zo@umlkCup{6hFa_Za_A`6-^49g@EDj<I>;GO&nVr#k)tZb}0T%Deu6=Md^I~=<6cY zSLG$~WYimjtlERh^nkyh(YJwe-(Sy4>d8l(ky5=F*uq)TaqCo&)Q2XUPDoSEdvem( z2-$ULq`y#3;l?&?)7tZ>Yq25JzB`#`*@DR!7TeWkGs!xiCLTo$f~zOQvz^Ys$RTV4 zwXF!$>)QKZ522{Wsw3paDeTm=NcatWbBwThk&CN*Sbc`s{i7fH($WgXq2mt8EzN6V zTsG7<%f{(-H9};Igp!TfVUTx*k)gu_)1d=EZu}4VlbgsnwL>_tHZ){sn-{jUQKm4V zRoD5yng0~@(Q5#YnNg=S2yU!^!^wQ2vLc(#$q4R=Mrv;M+D6&9IYPyF0`YLw*84s( zbZ($>?Up@~Ji`fyZ5bjAl#!&=pOAOSN<@9AMa{nUT~NZ)U^?<fTUG^2NbqnC`MSmW z-e7(_v)-Mk0tMC`{tgN+E)lw_pH*n>g~6ky71VV+{=f2Q;+`OQvU9DcSU^Qk5;-ZD z9f~edByh}fsI55ln#l*PFts+|7)33vKz-&{Rk$-4Je?(#Kx4Pu{er5IT<-4u0}JbK zE@>6YwJK#jP1?Ixv%+BCW<*hVP0A8;yx(K5=*SPlxv9YC+l3w3F&V`RJ9^&k_0Dpv z`y=}L<pSvV_33I0A~<%Jcdp=kIwN#(Og!D>1?-8n0RA5rM?!w$`C1NtZ^9`sk4#4g zMNSs@HjRu@X%(8*`WIIAyLhCX!&J@r1KbE3_mEL$8M9L-hU}&ydY2a?Ztndrgdp9z z(B<f^x(pQoF4xJkO#cW@mwdUVZeX{>SX5>2?!UE679%FE3=mhPmGv#EGe7fTly{+! z;sl@#P__KpP7Z)=+E_4H<{GIBQYbN6p&MUK+%hDkex<rz^F0|H!t#Qp9n&EWwqK^C zN~SBZ)k^R>B8$UrYHH0Lo40tDX-J7P7N1d3v`^I^S8y#ZL)DCq--F~i&P1o1z6#By z;`1iq`H0v(Vg{;NBj;ySX*{mD<@#f-81jKW8r(M~EO2dj^_0`>jv*V0aRxjf!d!q{ z$@|CmE&2Mw*YNrs@ecq(eZp~YLCW_J&{5MW@`<nN4!3meRogX-;^$i2j&zCSXzBBP z73bj&cE}T!EEl*Qu%Ok5!|>4I6Hq^LQ{D$^965%b8L!_K`^-xGYz>QlD8n(WAmH^H zVEkZW<Yi`*S!naHVk@X9+0Tlb6{r-{nxE`58lhh-)3STsn%Gl_BJ*=^0uQg<u7d`P zG(+a55N<%Cf-7l9{$@}T))lg9I0ih8J>3ftO4g4!gZxSr`YcG*ClYvS=6Y>z?bp89 zHm`BlEQGp*rl|`lm&<Jrk~=sAc)bJTU=;dK^8k4U7ex|rHjc*K4-;B_rVrzZo_qSA zP2#`sn-^0{M?6J#FI5vhDEN^;It?QpF|o0pgf;~|coQr5i)0%DYsue|d<xN25hIe- z1t-5mOyq|s19qClqcxp59M{gUr5O}Q3ov>gIZ|6FB{Ls#)KY@3f;beAr4n=}`?$9t z?qAmpb6tbe;6f3kp4462)0k9Q=$3HmpiXJa>&Wh6IjBm%#9q?t%KJVL+`0Nvyk0`? zym<nMT42)~f+qd7)=t9$Df7?h_wP7ppuDBEPmN9D-2Kt)5xBz^zAVm?JtFD2BGGgd zrkL`y$AwJE<rC>W>{i^E$J9^GTpRpE?+s))ZR%|E4Am15?J|X+XBwq}vK$ZP6`EnI zGre5i;=8~6@x1O8<{lGdu4K%vOsQZKP8UT#lb_6|Z{YSib@`zb!tzn>{*tA>t!+_$ zTw{%?(w9z8#lw&Rt45WOQB5G}+1?qw0XQ{Y0SPGlwXM!JV5uZyQ-st@AB=4W88R`k zAJDi-6<#$~>GOp2erCp}!ZxCv`ojUcTp`-kDAQFR35-?mUzTmY3l6!!YnIRxbPgl| z1*JEjp!6SL&L*LYEwI=9B}lYHNL-K0f|;I~Y%<;Q{K>fnP~^(xl#rEdfYvsNv;GlK zlW2KxWeV4&K}X7{Qmig113mG`0z$&&3PThs!?|K*8HEwe;KW6!#zp&0?!p&CiPAn7 zAjY{%6!id$17D*}UAy~wM8mO(w{@pA;fV^vj7--iTr-2AiUs#nmM>wdx{YRExujU= z7;U1NQgJ1$pHDxFSSq(!AuJwnsBTw4d{Kx=7W8%ztFQ!a*z3JO?*wvphcQd{8zpG~ zFkYFX!(_9;6vK>f#c9^pk>S3Y$Q@6kkI^QH=fFjYk-NO$`{DZm`R5<B?J>o|P69s` zLrXp$e-XVUFYxF-E+wG$>N?_h?^9m2-KSg(H^SI(0J!=$mI2owT0R651YNk#W#d*Y zT}ft%zBOcoxprdE-28Jx<@eb!#9l(f)>2wq-!cN)?tF6;)gjAtpX38bW_tEeywd|b zLQq)KDg{h3N!}RUDJRC_h;KUQd%7kHEF;{^^3iG#GJ44uK1OMoRT@X}i7;YPApb@I zXRyFZ62NMb(NP)RO6PBQ1a++iJ~hebV*BOc5`1tE(6tikKRhsKW{St7bW$LM1kE|_ z{)OzzTzX8U2lN(b^mLySiL(gx`E2+2Hv9S9!T>_a`bw{)t9{Nvj6Q_acJ0XOxW)ev z+;2KFl_2d9(K-1m9n$gdq`P`QeN!-IJfYz(gUaUTlPQmBXK5rStU7HI*vIaUbuoDp zQm~vx+529F>43_`9WJd!6kSy1=K&)%jRm-Ei5?|ZeIAMMXw`u$arj5dk2uFPdft7P z)64JRznHtT@ixmBp>2U!1_i}8tk<=zQb3FvbnzkUc7q9kE@DEEAuvO!R>i5GurNfA zrNjym<yn*|v1?G)+#qpGj>J(Lu@MEy!Idk$XE|9dZT_S+f!1Wum?bvZ5FJl2rKf95 zbT=Y=SQQe*GSkn$S5PNMHNa(s)j>45+K(m<HfTC7xq*f=(=X}ANDp{Teab!Sw6NE2 zX=w4}hkN6mfx+Yj|BtsN-IDjMkG$tK*T+3lgU`!6{f!<idC``x{}^*X`O#|E#nt}d z-aeLS2gvF9K4SxZHy2mx+Qrl8@1#tS29sHMO(rLk%r&U_jP7g8d0*F-f3~>l<_a1D z1;Oh#PotNIB#D|<|1+0`tgekAPzwGAz>Wn#iZyS1?%lCxuF4QAHq;}mpY+l*k(JVO z(J(g(#esD}^R1dlO=W<UW2D_h7sMA;RRCP-fj*)D3XBpvre(p^A0jWx(z7sDN9JXN z(mJa}A%H)|EmKG*ClObqEZ*l%RLgNuiI7_%tAjv)cU2QhYvpb~c4w68X1Ei{j3N3q zlF5{SS~(;R$94%WnQa^RKs7U6lAAt?p<-q9#x`nY2!|KOD3O_1!CAJ`Jl@mTrkG1| z%*g2W`Uje+<==YjZ>pVrFiy<R3_zgC_U}Vl(~0zt{@i4?Wj-;hqHx^L2Cl|$u#b8X zz6Yz%1BzkUa6GPENvopxIb>kJxRce-RqXA+LkwsTL8Qn1kj5OE<zRDeQJuf{c}{3% zkG@W!M9(1(9-`<{!~60`R<IFFPXdh$TXx2p9zrY+i(erc7l~^5eumP(aPCKXYYqua zUhSxXO;ahEynhWPN~s{3s=FP!auio!EgU7QfbQM`IU^VfBePs(7%}$eT75TYz-G%g zVJ&j(g*Iq*A9gsDHV}sK1xkB-5!@1fgcjYx5xJ5WgqiBJ_IoSnj9|U<lTmE$4<6qt ztNBjt!zRJ6QNuw1gJ1^s{YbIw<)PH~G3W9qF-Dm{hA0U+-lOUM-;MLXQsnz-6+~IA zZus`r?rj4#Bb;4^3TbW21p5%-4JzDd*g~;9c!=5|*^st!758M+40V54L^pEyrp@w> z`pH)zpzQKIZ1qKkw@ca(`8eZGDxDMA*TjY}E1uqC4J@)ie+Zv`{pT*PBe7Qlj97Ir zXslqwx`6cB^^1MB!y&CbS*;6Z2mqet>})6SbWi)|3;z$F4_?4MHt=u}w`VwES8}m~ z-vo%I@TeT_M#IfhwNbHGYl`ybgvAARlgN!l`XSOrb<&f@8hVf&i`xfk^TkRkhrHUU z$N*f=?rBa1Tw(iLytcd4$6e%NCOEAj0to7}&PwK<f@@uLZ`10s&VwvM&>Hh^n^nj6 zKTx@KU{KX5+_a`nlFDeZ)1|uI`OjP3^6%5SrSA{i#sndL;B^24;O)i2rK=NAX3P%^ zPRc~9Y_0ge@vZ~QvQFO9b2bx0Vb{k=XDlwpQn1X6AV&lgM(SnLMS}<-a`%UGdFi1H zFE$+EoV})|k$a-JvvVr9g$w;P0xKy+QtcT9bE)=diPEU1wO;2{z>F3!xQvtPB6+IL zd9M|U@E5Uz5k?Wc#pjDX=8^>pJ6rh6%Sduet38h_Ul4h%^x(T)!B#si@+V=yYXLy| z6B(H#5K^wNnP;vv5PmFh<qZK9O&W<fOjHS*bK`DL2o<jIKP-Li1<7<1q$cWRooQ1{ z(6tpzPV;Lef{f@b31#!GPFh0Rr8w=3;wi*M(7Or`HQ%7M30ZN6qN{%)A)}|IJ-4?; zEnAdp(H6***7YS3>VDEvR!p{NBdDSqost~|{xwNWSFfxp$aMwl@Gex-x_f4vEFH1U zGmomvv<CvMF20uUF79HOl8CH02yru?_f7^l;IVZDv-LqC05gE)YYs3yEZWuq1w^7? zk+2n=<i0}V2|uW%4vdB|;E>#5Cl+2tM*|ir)pRq_m`7YiBRIBajY>43-!GgLce*f) zlPuY*(kqK3Fw!Au9xw(d@oIt9wXMVZgo(jMC_VGH-Wj{Nq++&A;DREbKMVE@|Lk(x z+_R|O{-KdC!4=}SFu&X;Ru(=Md*#U69AZ|}RST+7g!V6RmJ%^8&u}Q~DRai5qi3*Y zoodFz17>3*@4S7Tyz2lIh~f+D?}JyZ!VFFBe@5d@LN?0|0o!yK+f4f6sAH(p$|KeP z=Z0B4!wRj#&3LLFV^(7!)=4`-%_NrvY51im=bcUOoByh+u}OH`a*3yn2czWf_RE&b z)5zdHLj+s2Jqu#h)Q&IUWroxf#hkOTDTL`&d<rYbei=0aX+M2BO`D{TwWX=5N?v#M zx9IxXjVf3bG7$Ue5xDAg`AR(XKO|M_DEPR^d3!-&VWl|)G$LhUWC)~UWVk_zUy6S{ ztI{0cq!lj`1b5NE##ZMG-5*Zzqe3Bm%s9k|Vx{uXjOtZ~CSPb+1Ql&f+JG$Y7tX@m zvf6!yIJM3GBGrbdJsTx?iFUMn&Cx}!h8Z!dfK_v)F0^g=a=jM)X^wwSC|C22X0(6| z;E@5M#g9wek7t6NLnv7ANb<Gi0=Mg^`{u1UUQfyUZDJc+)fLsu%oZOe8(V}kPwnKw z2F!G651CyOuTGj&785~m%Yz=;#J?@kd;o`0<JS82-)B$KPX(}_$~1X?0n!mbZ-ds` z#QH$VW(kbjy{PD~XpHr1tqmlF?MxdD*q)Th*5r+aCM|0Z9h_Bl=;`^l9(ffD*)!^b z`(u5@WH=MV?_<B)@F|7atXTlFB0|WB@o{b-^{yEYB15mIw7i}M)y6Dtc1q?bU2WQA z1k0Rn{P0WUbOs~8O;X1}qPZ3XX@co563T(Nean1%2$0lg9bby+@Wlz#xXLPHGTHji zjEtZ_2l-D$`}rk$Dqn}f<On5*-N~Re;F6XR6qnMjg511Bv;m8vfVYc~i<7vEmo$+6 z-zl#iiB|UIGF6>Ox<~r_<ow(HnSM$iU@!vR%&i#Zh?NUHm*x>ZpPzgjWQ4iM)pYT| zNCV@SB$zBOaa)ugLhnF&p#Z6I7O1z0Q4~*$Y)BkfTi~F4hwQtI_z}ynTU&`#*XZBc z9O`)q_OMMT_BAW_2xV!(Njs^7%t>)9qcqCh!tr+y#JCo6nEhA*^@LVl0VRCJeH*cY z2avWP=Ll5`1Nk#D9)na2^d&Mf4FYllJ`*1oMch3nV57wuvfR~N9SboK>*X=6pW=rq zUsw!;{8YF^zT>DM5BWKq{dYMM>6fFBnQKWl<VAQsql+hi%{D7vN;`5MxdyB>sjoAT zLI#Nn3&*XEtug>{ziMkqX#r!e@G1VwEpEHUe-FAQn{E<6W1l~$&j;d9M=>hWMN49D z=2n}M+**2CkU~aOjUnk#Bobh@YkBXcCVDd29MX_31!~SHVVJ@LKlD23a->ssw2EL2 z<ck_^x1RA2z-iilcw|CTZXbyBt$|krcb=J;wwD2(llL3qofo2#_vdaU-#1;rj#|p+ z-J_dhc@=MPHuy(e#c%wezz`9n$C$2cE*4+D73A2~Z!Hiordh3DP1oPB+D2*HsIMS9 zsY(uI#FOrkhYV>HPMq+{QpBAZy%ka6C;NdISHXQTHZ|^-Pykn6!KI4+ZDxcCKks4t zI>Ie$_MFd$WNm{OF#d8?YQkwjNA1JNBuo@{(jtMn8Qc~G?jxt`)uD9<OJ+}i=<yZR z&Mg8?@-fB2>VVDd2!KWh9*#55H@TEu@3;^9j5hz!U;Zb~wW8cl^qj`&9JH62Bn*9H z%Tc0qmFga4sWEdJ$@4bWaS{Vg?Jc2S!ki2B1eyUe@PM_|P8)$YOm^m^)R2Le0YO0z zRO_JDrWd%Y)*p4yl3K0_?v!3daD|_X={Ev{BjA3BFz~_e`O*4kD8BNfZ#rs3I_)}S zFt0hU;hy8cmvoEM)47?Z)0DG?1?A?25lx^EBNDYVr47YUfJB`#ZNly*dMOEmk?2<^ zBYb(N&h76=_}wSye`GWlvAZ3}ok`2vN$%ZYIS?<6)MtB$f=DUQrmZ1^Y@RG)f9t&U zB|ltGMo^ZxB0AfPm+_QjWa;$Jh)kwxEpPFH8Nc$fuLq5}D?yX^XPd4TO}fR_6~uoj z99R<*aN6Ob8++NvN-N13>!J7@AT`U(z`ldwnNGbvXUW+c`<F|jV#)HMh(YeZCLQmi zjUG{X*z0fpFb?MKvY`rgb~qXk>>zGlBKPZ<09Qj(trg3t2WmR`kh80vV;5%`!|PLY zUF{Odjh`=gc6RY;9Z4e4Ng-`f^1jLUs~uW&7+wv``>C&j7M8HXNP@~(7FD{x<KNHx z*iFE!Yme-<C-6PN9KCX0-=yQhUiRRsxKQ-wEx1pbWvS()k@#^DbyhH?0Be|ij+5Uj zOvoZ(uRbpDVgY$g%!P~m>`m$L!YzEmQ!aCrKkw)`zY0HR<Qsw0_FZ}q`{XUN6r!)d zcG-)Km*t)#D-2p`UdMv&n=D54%sal-#F|T<h}6wVgtC7K+>AhBd>xG7-G0#J0j-TK z*2;>QOH*7n?fQL_JG{#(uupou#~j^ghk-~*uAT7?ux-|NgiI}Djx$qCpi<rVI>hSN z_}>C4AdEl9n-5ot88qnS%#yQH54muWU~85!iEl=sIM|v!-d4CVM#0GU%uh_LJla$- z8S8Zivo!d;L0O>u;q_4x{`AB#FOEN@PSaQ}h!hR3y8q}EhRI2%5+--4sreX<s8y_J zYxEY-ussc3??ish)IX#K(pU4hj<GdGi03#&o2L6rK@sG7K?#glo}d1%*1S=SsaA*o zH5IR*;iVh5Ql!o)2^cWn?<^#3v=ly+(Q@rqILfM@)S85f%Eyf><E0koDG0~uv9;aN zOvkv+hj5({mX$-49{Fxo&7>~C#}pz_ZtdMnHzhOoGn&MWh88=QklqAsj9m1|ckuPs zTs*CF1{!QjMW3n31mQRw!EG4P7Mf0H9xxj-^2IVYc5Aj}YH-(c+NCK#Bq}Z{o@4sC zeZp-hBQVX`W2QbZu&fzT#zbYQOuU(Rdafa#$@SXHx3a+v7%FBw9^>{m30|Y|RF)ew zS;bjo)U`6sxq^}K%yL+UUQdH;?pCzowU}!PQi?_vF{{{QK{7Pb`uz|XSvR@L9484M z<LgGuPlSj9!k9IV>afM*JRZBoA$N5NIAu+QgLNXIq=!p`F4c0UcYr@B2@9(Q_$xNE zg?|g$`F!>ep5KRLmGvDh_GW5dU`pY9D3tAnFZLsR&Yx{^#TYh0G*F*nHjT*1CM-r! zoFDcCnVG1plRb1mK9}JzzaKnmf=7GR8dCoL;R+zvHubX*`~h;!1b@Wke;I@I8F|}f zV^&%6Ig*+DB={s;rt{@Y`v+2}lCg2_0&KYJBN=OM+YdqGaHm>V{{!K^nv|bN7UO<% z%(LyTSHnwJFP@KQv;}M0;_%rqKdkXF57&QzZD&YyD~wNefKLJLlDQ$%bnhXu!V#u2 z75JxH|KHsVo`E|f9VICYYG;JXW`s0;#Rx+>6Q~f#ky#A*Kb2#K^gMgdXkRNc3xGht zdV458SD!PN64u{=cj$#9*qzt;<-f!Nt3q`t?lz4~CA1J>1{E{7TJzWz{Cqb@j_MI> zn*+}6X2*7-F<IGPFE-Kmd>C9T8HK{p<{l18EM*tqfLK&6hv~#NnILMY9MlED)EeJX zfY4AZlotVLHxX9tOem<XCt8w>{ur{Z&!|#km6cY2I*~r~-Ea34-}@up!gFp`t(h&p zQU;RSwfX9${V`j6_KkP;WJ#imXb<=^Z&aO02nh&#S9Ub_8>l<>E&ZQQjn;OG*xX{~ zP;;%Iy}ia)+-_=CQz6vWHm%eaQEz2b7Ljf~M+h^p6QM_Af?Wfw=KYqy!^q&JlncD3 z<AI}8?v2siSRrcS)ro~nr7*qE#wLysKjHLjx0x+Y<@poIMK?i(vpL4MabH8?s|s6K z%Z13)r0E=a;GTGOOSLm71?+6Ys<(b(VL2<Pjpwz`Aq=9x!+(ye>k0M?>u+XGIFnhw zVmv==Bd;~aQ6dKph{yLpatcJ40RuHD(GHw38>cJhV>ySjI3vS;o^{zNO2GZ@bro>j zi8DO>?Rx~uD&1u^Tw6rLY74FveyChbKdC9aBXg$n$>nkKn^@LUSc~2)lMLF8D3#bi zy<!=Ab*WCrPaYnDCboE4ywpPY%<FJBH#!~L)<@-cYh6w7t=HjNt5MGN1DK<`la>@5 zg7K-Mrvt5SS&tjgX!OaW<&vEzw@OyM$7yh|>q0OwwG>$4coFy=(kd-vU7N*(ylSA3 zI+rny_rc3Yd;8{}Eys+n)Di|v6VY`0YljTq0lbu%-}v{IlcldRVf|Tl9<m&q!oV9* zoOsmUJm6+i;BIwod<h(RPo3|*IqIo3u+%-uqAptP-m~f+sZ5aOmx-Kma&6T!meL!1 zUr*GWe4K2mk#Fw)6u~Ta^MvOZ#ew<#J1;T)XZJ5KkSz4kGW#^@)3#3b-0d)Jr&jq8 zzt{!%Iw(54g}okPj&HN#zFfi4v0_$BtpVZ-1H7>gBonINKuFP8f)y8KN*303GrrSH z#^ZwSXrmpo&CZLUx%KMqxxq2zwYAaw=vV&g06`;TM{T&*y09!iikw_nv8h?LsXsL1 z#Du(!gYJ9)LWtyqlmUszd>?y5#sqEGLLZSXh4*XN;=@+_Mt9`a7G%<I;1uNg^$cV? zTtZ@C*gl>HddgkakSOas=#`?sRDHW4fk&|zN+|i78L+iEu*D(f!WPa5Slb0OXnzY( zI_#Fn6}(QIiyf!07@hH1@0=tVE=^sYP4rRDqNf&`nK(#F%#MDLH<D@DPo?D5l__ez zjJSW{?e>d=*Xj<%3!v^DOu&{({E7v=py!v9gB`XsMe{pvjtz5X5yr<f(#SCJcH3{U zKeVCi!~d4irDgGK@oP6Onk5p=|8H_b)H&U8OJoG?vco%TvBTCZ?&7+$jccQX%0;mD z(~0SI2-C)L+%Ked$GT)M))Gp90(9H>>uAh6gNE{RwOXFnMu7P6K}w^vf|qu~qxrM; zXFv_belI`j2n941<M5Y6kD4$FsoC+jJV<BtD%IY$;<!ig|39MsDlY2p{r-nR1nKS; z29WOVE=lQ*p}VD1>F!2AI;1<LyE|m)?ymdwz8}Bu=YPThhcmPHzT&yo3L0`on5<n? zi|&gg-7V+F7Je7IoK;E^ev5>p8UhD}JSzv?8*j+SQtjD&@WqGEt{Y<{U?59t?q~al z&h?&i`}p-v$*YUcZ)f^zJ%KeI6O&uJ^!1x{`GuP_sFUGk<g{vbpoZt|yE~clO&Wfo z0jijX%OtP^S*{uOgi5=&IPuEsj1#tZUqW(NGe^3qT2!Q~W~R|%doJ~=m<4o57iIme z_wL8UzP46oS^YFb>uYK292uPqAGK$}-sk)O{G~_@2g&r=57#E{vbG-ZcT(W6905Xs z(mL5p`FJs1)PfR~FxPaW+MMANW{;h195D%j3ys>J=^m1^L}F6Nox79n>d+qbjGgW; zkKdkpMBN)|_MmZ_8t?{odg|K(x$h~gMW@c~y{jR_tPq9XrK4Smvlp<s!<;Qj&F1<B z$mJb*W0R`jrkHR<`7Ovb7;|UFQ9!oaCKB!*zZk;FP?F%!h0&h`6B+hBQHC-quoA+H zCneyD=vlM7#?6gc86BN%2rI~Oy$r5-<iL+_Cbr$6XjIzIOAYk$u4!1$f@1G$`08fH zP&-ne{J%?h-IFfgD-Dqfu|UyF^p<lcc?Nd+Iv}t6ZFXmCr5h3km5DdH%h+#Hx42;) zHX^)2Umf8X*U4}7^-_;uIAM-axb+$#>7jIo!8}<CQRHM3q&a&je!q=5y49`qI6wVk z#sP|i_V<a}TuZBwRyMER?q!LWO1LK0tJZ-T+s5ubmIh7q0J*siXzz!VZ?n=cH^5zx zla*JD*S7&RLacIKgjpmc6G0<)YN%6uzg2H87pU}Yrhrlh2u*y;C9@Rt6mvfYVt0eT zds$<y#Zo87;0f}NW%env6Y)&HG_7PRnbdcOuwwDsQ&eL6|B-gS#vfOG+4^-#hH0v= zL3;Btw>Ljr&(=AxQNh>_ttw<gP}eY9lQb8N0>g0}T5l6qYe(vrU?!75P?BqAF8j~c zq1-d@4(?!?z{@$vPk<^X2MDp1VP-lJVJE|g=xtxg_ua&&!&kTD6bmI~ib9Y|p{R@k z$-?vV9~_pxDrV^P+GOY)Rp7%n*-A~{8n66c$c=8(K<BJ?;X0eLxdWQuiD=kEw1T5X z-eWdNfml;5-_z2V3g<v6vL#i3o9EW$c<L^W`b6Jc-Q9VD*EM-nQ4*zPiDU3*FL%WX z(-IZOOnqQq{tyf!Pi@^qQ#AVShyE?q)(h8FYE-x0RhT3SKA3bq^FFETP3m$xc1QS4 z1~{ZZL^Y<6A2}}UHlJ3lt+mi;`)zbB`3|LtHaV(KQ}CuRsKYxHz;kD4HWPuw#glXK zC?KmX4ca9m&rFv14&iU7XI30Jp<{OAqnax}XfbvO@P}SrBhSf7w6)u=8(VU$3^@Xl zVXoOt4AMY_6^`nGDR%r;q~7*cC<9@#KP$BQwY+K+y=$9)9o{~BZF%^Q79~<Nn`_QV zZ9=dT;ZT0|C9?On#fIGH!du`0M*o_1B&oN0*{uAD1TVLf%}cW$jtv`?+V#vX<lI&{ ztIHHEZc&??oVndVBhe#d?=c9Ors?@uOWu}g!B5D7X`@u)xp9PT9H(9A$@`@z3reL> z(O%b2cz@FlIZt~rmK}X_r)=!qBzsCSo3Cg*!+kf|gCTKexGzM@+|Xv&qNCn}Cs4z> zmSN@YIU5!D<eMKe99_p}x+fH!I*?4%MRLe1v4`_(B<Gg*Rf??Y*w8%RDlf|A7meH) z&RtsJ8<p9sVN2T}OZ=6;Xet>ll}4Sd>o?ES1HYGyUpF;gELO#@cSs+%om;+MzyL<% z59=fcx3r@oK97jSa>@G#jz;9zIRB<V{h<MkIzxc9^M+u;UtfL^-X%&`9kmS%8)+wA zK~X8#9o}hg%FBATXP4Cl0+j}E-$uX^nW~?F_$1TU7``l_8H3oJ6;2rW6@AN0!^JU9 zQtzR8Qw_<~Ns*Ncw`)?a)`!0^FkK$*7t)I|fKw6Bs%~@?KV1MT11vA+n4Ehf4vCTc zJ9R{NeC&LZkENbNyz<ID@X|roq=5M^Fm5@0zxKC$zksQHzP|)KkKk**gyG?ZL;|Kg zCB7rrams0EnnEFc?c*}-x5<QS@!^+VW~u@d8EDgGP|S@@Yny*bPX3zXEn8Bq5)DmI zZ=LG8@`yBWX?ZlPF%OT4vy8@7MB6l7X2;ONa&bHAW+uiVFS9Unnua&n#>Sa77v|t4 z@FlApDHpW=5%TilgZ-nZ=vZ9bT<79bZ6Q1NI3=)9R=c4jMG^nS6pt<YB-M=vq!Gx1 zuj0m4f*LDRMFI%x6*f*8|8&1XJ4jo7=NZ|2DgjE_{};`XEZ-eoJr;6s$xn-!3Ojnd zf04y!qR&SHwt;DCGDUJ8MD~4Mp!Rb>YwEB=>MB#I5El_I;cjrNZ}WlUe7gU|7wKU% z)*bOHg@10ZL#P2I4U0Yf6eaAmF?;9U%e}T`nv*%R=95&40ys3a>vT~}2rTPCNVd;4 z0w%$$x?@*wc{v5jw?QRfAws*^{>$en>SfVz*#9~DYMDJkvl@X+NDI{A5@+sSS(|h~ ztg7CZPmT?1oK_%dW!|z%^l-c=bG}CPyyabc?oaOhf)C6BYFhwptT9KSwOJD3uQA32 zoxz|oOvFGROI8TQLp0OyG-pDAI1hf>yKFIRCg9Nv_c&WTG>V6PzLDuKt4%%+KhAH7 z()gI-nf7_3@S`ady_8Gv?+g`Z#_z8$+|b%(b^4VmT^V1$)If!3^_0{Xj?}SxBR_E! z`&0=liI8q7rOUdWv5!G%M&=st8D`_VxOof;Y?{>fdaS-&$|U~2cF=ozTY<{5s1ArJ zwJsNakQ0&19R8ze6coWETIAXg;MgdTk)kA@OPg9DU+d$SLmYBYruwyb5uRyW&rY?- zCk4a9{p(MkQ^Mglq08A%t^!?2uuRNOl}0&&wMM<yWb@`vI+UVS%jptnu$RY1KV%); zIP0nGGg$BoSdAjrkXxlGdmSyWMTOWVYurP@?@<2NaEBew^*KJ$ck3Pizn!qr8h-2^ ze!lsw<GYnrvAXP-i&%VtjuF>c5H_Wl`ih5Tlhd;|Zbm@w09;M>uWZ~I&OhS0!h;>p z@Pei;{aV0(GR*&xWE4#uLbAlKKMW&%nLtptVyH5aInY=3eUiA_BRR}o1xa(R-WZWJ zwbaB-@p9TP(oVXZMU|$@$&{PfE;2NLTVIJub|3t5cOY4g&T?*EasvEy7f~*W8Y5qt zBo6aMA|teLLX;t8h=%HxC1##(VG#~Zm)>oK_heK5;pD*ks!eE6Y<f8Nn_x{ICrVG< zJB1E?6l109Pu4;lr8beQZkR`d(=#?0m@BCVDr0!>4=vNaLDpU*>!QFOpO%+<$xa~E zhLpUWinmu(moM#i2N_-str~*@GP)#|tGT{|$nW}#Z)dG=deevae`!Z;t1}nadO1Xo z3e}M&1MtPOzw*^%uU|*<wcHT<I|bf(aR%_RDARF=TSP(68(D?9(dA1aVNOlM1L+XL zeUX0~_}v9ZB6!%i$Ul=?Jw3iYl})c+z$9M2l-dwL{zv|pyBUvvc#`{_;nT>YeTBrv zHLN&3n73X#sg^4>V^1W=uV6D*$+cD`2m@BUx=bxUGOIDlV!9eGB=4VR%Ovc^+@Gr8 zFr8tjsn5WVXAqtFn495wD^?5X!otr6)_vDh%>uN}JQSVpBDbp!A%=cb@4K2Kn|{B) zzhyzz`2jWC%JH_C#4Hz>@tC=Dz)SABErK)bHwI|<Vs*8UJJw3LS?PJ$qu%eKlS$Ej z>+TLc7c<~rd-f9UkKgG1&UfBFFln9fqvP0`BnlY%?Ht70#1p8gah5jv&h59|-5u9s zBn`Sy)qMH07nFZV+85Ul)fAm(ewEP+`k+{7?#HSwae!wG|NaQoK9Hf(4a!z*=ho2p zeNZCu?AE&EXi4N5J;p1m&!>5iiyAt~R&~SPEnJDb-x#O3m=jktAkm&cmNVf*wV%i` z7(~#r!ufF0A0gkl${@4&(b8;KUh(}M7OKF&PR_t6aJ;Um6PrOppO+?*u4=w_kzB*; zH11)G@n!;{<3p*Oo(d!)z(G>tB}5;)*yQxR*~*BtOihG>UFya3!}<3UC7&w2Y%SU< zDK6^^I<j;c<MW_6Gz3pY1_s)N20l>e;?UV9(6lXqZ8n8JcleX}zrq{J$80ats!;wK zJ9R9iLvbu?35=jn7yTl2_tXRaQ9I50CofsF$?h<BbrqDU8!`dM`iSCti+h@mmYVXz z^Kt%@29wQap`OPNYv@vxUtD^N(L$8bnI=j%It#qsW;*}AdKaRdCu#&rut5E0#Ty!H zo}G7zyOyzbp=<cX|2adT4f&x~#D;~1BqmHe(_&k4v%SZ9+mmFkks6QMBht*+NX;xk zK+`+7wUY5=gLJqu^G?t{!_|?Yv<{KA$BkRo-2-8j-%%B#OavMFN=StsbiO^4!kV8@ z-|4<#o}=|^x|@TM5+btcw$;y6+a=xDq0rhO>io+0W|X^g5O%eoU@D!HlkW!k<*A*n z-F57GO4!7|SF>cj#g+))I@VqZ8b1m6eA}=#)n3&XJ1eE%5nA_*&6)oheKa9$)y*7C z>cvNxZuRD<MRWj|Y^D@y*X`x^@ulfRkE>(%8IS>%S^1%AIKy{bZx3)l>j?UJ`~CBP z@XqhD@w!j1)tiMC|L2YbjB&z07!Jeua0dL2?zOyR??Y$MXc;QK!r&uJtBx%1VT{(u zD_w}+?je056H`lBnQPvd!p|1K424-Ox${2AbJ$!&;v?L;`e3Nhc&Rm<^UPiyHNiq% zMAPlYDxkC$F|7#gjThoUR+0k@SudqW{9h6w#bl@FWE-oco+PZy+N%knGuSwvttH{9 zbaa9e7cyBEt+ww`WgIpNZ}U=q_`HWKY=;(dJ3u_#<1|K>e9A0UGA!nYFv-;aW;wZW zX!lv#4%yQF`2Hyymq}2Bt1acFuEET_DO-``^mMw(fl-C-BaphKHV+2w+@MdTnfNVy zM-LvQl->L7eQ#j!F0;nLLSCEPtFR{CCxQeu<&Q8Np_KK)EV9Nq1-~Q`T_;|&3114} zj`ublOB)D8Sj{cV6jkX4|Ft(0_6}QLZ)O~pOn}9l`Ym!4re|8{S2(m2!_TKa1W=)r z$nP6Uo5$yR#(BLA7am@6`YlUFZ?uQFoCvf3bxnX{cZe}*NNQ=^Sz(}NQB<LCkt3Tr zR8OJ~n1|BYGjm8Nf~zv*2kCW5`Lv<s3IPU4NmNXePLhH2Fk#h(oAW0Gud7wxd*|{k zmv3{SF$)A2OLZ_QRVR}NnpGXpW(DWBxuoQ?80B0!INZOzXH5Y)%dCZkb|;HF|Kd*0 z1XniSjXn_pC(`!;%HM}%`9LS(-w>)KfE#cUtKjf{R#Qmj;jfyGh>L|U2&~kUG}g~s z?_IRYv^Na~n+6xwiOwIX7TJ~6D|~;=VBw+B_)%kAe-}Td(+uhlFQ-ZfO4&OuArr=A zVsZp};Ei@p;j%;}&bBdpi?=5XKbKjp&W*|L&L9A8`eO@Kj}_ik{X2cOV-@sTuXuB9 ziu;nr$w5d!Z^=^uUE!2}J|yH~JR?>*V5Dp=GIhrV>>d37IGofFY7tBZKYRpChr0Z- zPd0o@KI~?q?A#=k;m;4}whY7fZ`a~xfaAb@9Fp16rs~0|ji|~vYKrhya<)xj+CS@c z3)h*3H*x|;LqkJ!n}Eo;fxQ$$SDS|M`Yv-F**1Ol@)<s}KL&%6=AgCN(9Dx2v$Koo z#b08W1tbg6fdDPZBwzR?K0l3RHmnDf;V!MfB*#cHh6IsBo0yo6L>fXuN&p->Nk}1l zcJkVliy52pM+*aQ4he{z1J(cYqus<!H6AXtcG=c}QFQ{VOwTXV?uL4pmsS4bw<|lt zm2I*yfL<C-$c7(4;3<0Nn%ZOE^h4Fk2;hSp`Hn7?5WpN;3s=;TiQ%Krdf}<z?Rf|A ztT|>f+%}f-FVWDBSjDfdef>HDaZvF)mT)iQlg3CeXKh=fk}8jI1X53VfBQWD1S-%G zL%&~7hj?YVennnSL|fa^{BGE++TBYh3p5%cAtDSe-fCvqd2>Mcc%ojLl>0GL<)`~$ z;9mE3j0Hrn^7bnmjpNj5Gy`9nuy%T;xK`Ddo9&{@xr=ttq*JhyW2ex^9yl(C7N|St zYlA+sQ~z?;0f03DZ>h((Y=Vs(UCiX4h$tAEuzK2`PXpxH9cAs*a^~Kcr=jY3m@*;G zD0BX7dB5vks|Y&DH`2jX$?38#IKRp&(vEJ!UWNEry3lpjaRNe^KJnmQqzP|P#6D{q zXicZ$xj|BfEA>Z_g9+}p<O4bhprkCI>Ggl!RRs9Bo{ccjv@#_k93zL#XXUyM<gAW& z{1dovAs}u*2G7WMqR9VCod5G~v9F|$vZ64}lMej|lD}NlrT#3?srbD`>3fIh%L4)< zOxW;1A)QUIg(l1jK6*)ADDD+E!TZX=r$nLIW|whN3ch>%bDDurfpBgp`Mx`hWSobc zA2n)Ef?{13R?g~Hq{6_m>Qx`6+I}Pd_5!1FQ0Z&q-9OT|y_(_9fl4-BO?>2%pW<TL z8G1HHY-*cFmZe?|5>8p512rdE6U=sozfC&L90hW^*y|`G+4>_LB;TJ26@`D{37X)X zxQTT?_RVNWk}G_z)l%=H%j<`Ani8L!oZf&%ezNScs6AB5l{w!Kjg7s0em3uk`yDN) z?Q8j=q0f*;&=+C^iYy(M!oG@R|3$~T(oQr=IA$$_V5+jzQA$@B!Q<2n5^W_}+oP_n zi*{|R3m+K)E8K^M7T%w4OE|XiH{&roIT%pV<ih{gLXzG*@5$nh5Q5~wH+=f@rON1} z%h$9NC4cz5$o!VWUzPI;l^59Hf0<x<dvbeu>(oZZ{t-AWYhsYvK-(5|N|cpbU~gbd ztIHR-Ea<pVu)!>($=E-yAi%cGuxd4MtUS$@*U=fM70maY{G(}*8{ghzvSOl97br)< zO{l-k^Wd}QX5{gcvi<)k)%Bwp{BSc#;+U}geKoR;Z|#1P-`_DtdJCN^QDqlcp+@H` zYD$nKPi?Ii3{BgZkR+uT-O}(q7K;bj?)0Y-R;9%A=%ld!lJ>LEB*B6Sto+eZd3yJ7 zy<EYP_EGX8Vz0BE`%65Ys_q6U3%Hb9CqY-c^br=5U;G}!U-olp{hp&Qu5d2LiEjRW zs{i8H8AIscfzpR*(XFnMTa;poJ}lZK?{!KDG!Ni=KxXRo_4v(qhG-BZ9ST~EiSkSa z%`$E*IhgQ}NBs<`E!v*c8+585(9pw{I*;{K9CPvUK#Yj{-Tdl{S^6!jkvl#ZW-Z$E z`s(SFc0LjhH{Ku_SCo{pvm(lF`VdkJL`du+_fdQ>etK{Ifbr&FT{GR)QH_;M@$1WH z=FdsgW-SNH2v3i&D`ee!DL6#AupCu=9glG0vXxp#%lk1F`<B%X7#CJQH&;SB^p`dV zsfMXw6AhsMXb;RMl*c^K3%SU;7acj%JpS(D_RD|%8H%-ik8g-}kF(#;%EN;+6%EZ$ z>HB9S*mrHfobiyAOz4VFlykgDwWa3rTerZ|Ta~Gy=Gu`gn?aT<TIjzLD@cP?o0lk- zg`^*f!SYt`6xjBaaEt&Ic}_+ZhRS{&1o$$YoauY7wMlzDqaFhLp$jA2c2!RF_RS{F z{4Zf<yvYr$9wK=3Cae@Owu0dWpVfX3uh;yE2Rlrn?j_**S)|^qVDtlfc84zV$=n_w zR+y$Z#3V!m2NLp6fYj7DTuJ5fA6+4K7_8GAWoP*p@gJyOeM)3u=Np)t9h5>oGS25h zhm4%VK1UY+wjLVJiqi<5LF%ouqVnt$i^}P?f6T|_S%BxZ@J`rH8!FO}?W~<!xcXSS znd9@>dHh;uxc?*K`wPL@E`8aeL&-*mxUf%vF`1@%n1&4U0y8?YGXsHmETX0QKcUVh z8*=mIe}DQ$fCqgIX!o=AArmnqQTVlB)!Vt9a6_9tZIr%AR2-V1hs%-&;xM#&kySfa zm)V`4KLW!L&1Z6{Wa#U}c^>87N^H>oKZLu(qbS<nF3pJ3SDJe7@|U6<FF$3wr~Km; zl@pIh)<2&Jk5btX>n<ejVQB|!zb8#BP5b~V_RtHrqpWK<6Hd%t26a{nR`Q;9^fJ2Q z5~&?C$=?z6{OBK+CmQV*MrZJeTx^l%wf7w!ttAPfv0U|CCrh<I$VYBz)fFi!(i*lG zK0M+{0ZA*5U2mdqqmuyHMsRJ<A`-ENcw>)eWhYW@M|4)p=CU*mUq+k-Ss}1@LGpMF zJ9&dyQOcQmdP7(Sp!TLHr`;7h?@Dm%oFz_J!%4x2bchZqrWy^Y+Bc|Cg8C9UWK$Ql z>xVo9qd-qAz=5@q4eanqvyLGl80KmMu0^TTM~+9ZhUdZrOe^h%vB!^7WhO-W0QRcY zEp{m#;)p)k45)eGEK2)nszUNHkWLkxLYVwXOsF2*RL2e}B|tfzsLB?Qr?gXsV5_CK zrF;vvdVEUtmTe|48+drQ2)vpnlJDUY3}#FFb<-ezZFp>-w>}Z1at;2euFntxe&Ze8 z8_`yiwfS_qe0`(clFJdXBzv{GCV#m0O4RipQcpfUruw)hY2AKcMyl_{$>PvcEh!w? zz;F&*%Vuw|pY{iEy`7f4b5|It^M}&aowCM&<w#ME8S`Kso$3p&Mia<KH?`7~+rF9v z`3HX<W5`+Nz$L5mC+2MF&qq-CbW|^N5r{A5TcV6_$$22&g$5iG-lLDhT#nD)peFlx zA+N8`p)^3QAa$Gfpg^p<2P0$Ee8y{>SvV>jT-a_uxH9{0W_g;N&?eYTH`kSg1J^7= zVbCfA;^7e;-OwfN>_g(ejql-V3H8kb#`lf*^&!xDist7?d(+&OPsDYK4vlQkHG-<w zbB>v)z^hC$S~yKE1M==H?N+-q-`I2+C>*1!D^$L?`(B;+jQW1p1xxGN&_+qD)-?lH zpXhj$#~0lGE}QVXg@rCn!mA*1RP|+n+RG>VyAzSeG49&~-`fGfZjVdZK66;6?!hpv z^ECGbw}d>a+G;4TTZu-LriVIJ8KxH=@Y_=XGh*gKoOs+C{Ty8F&ZkDK^G5ZpY!5MQ z?_8vjHm!%`ASh{eX70>lX)#TgS*o9gqV~no?X`|O1-T7~Ox?XM__D8mD}H#jWttQF zK1T@k|A6gAd;j!kYperH`<>r+VloVhOZ;Etc=#zheWf{1=0)A%w8B9=sq>lK4oKBp zP(;z}ZU<fOql-`)rUmp6!th`}xbBPxFLf%+4}@}bm0viNKO_g8yH20l(Z9_g%d+z$ zBx%<u=ru1G)}5rmAezznCc%!H!9=)%&0B#@`Oz&=#Ac4_%L8SB|7#)yc#{k|K{+{! zX1{>KcxCD=-^yHfq85ZIy?2R0$F8z@0DN;7i!ngC@Y(x?q!I|M<0u7~icj9Nv;B{1 zMYXjOr2<W}w`BlySfON9Ji$LM*M0|8I>upu#2=q48|Z5C3r1TCs1;V%D;3tc9n))u zBPtmIr4oEG4YeV|D8d(9X-c1Beg)dE-`WPN?wBx2J7nso?{6J6`}~rRG)p?RKXUxg z2rA0ak|;s!{Ugo8Pn88MpY{*lx_$o4NZuukK~a9Aq|OfLx*BIL9gsP>|8LCt0Q8&| zli|5STO$ELoGgjpAMnEQqQ#jf_{3r<E^Wd{rEWvT<u~{E6l}*;O$b9gsX+&EqM6YQ zPl9;rdiwHq_;6r1S=Pm_N81-J=vrRr34BYU(Te@7fBn3c4UVh2&98zm%<k?}im3<f z!+B*Gs!?%eur>1+v%l^>BUW$-Jkz5Y#skW^OHrlMT=qsZ!r0Tp7e2TPO4gka<&`x- z{0!~eJT!IVZq2qI=k89=pFrFW@f%%ATz6tV4*@%SC@=1IU_rF6bDd#PQY>_FwY@)h zZmBB>Slp$zZ#K#a!_?&iOby7h!$98}W9n=9pukA}&9R%SJ$CL+L`3F@oh^aw-(!5f zD|xz0o!pj;d?=;UQ{9?ve6(&*)jRri)jVVS5h6M1^ZrCB<}ZQ2t5%R@%>g1pmUSTA z1|m1tt14Ae|Af_tGb!FV&d&10d$uek)Cj_rR($|75oI<MC)qT_0UNjnG?WvU)z#)~ z{e%wRvR4?$v>RkFcJF@feDxL$nwB0UWrF;mg;7s2piERGtykai!;cRz2$G#&FI-vb zJ3XiHZgbDh$`oX-+}FELKmX<O=k6si_lrCljO*Iu5Bi|PT&o7EKn_%N^Wvq$H>s)* zJe*`MN^zVY{y&<ms^K>W?nzB`(1e8`Lfm)2w4%1oG}eAmu{)wyAdfI0s^FtDsG4^2 zcF#ty+a~JPtIR(=@)tnraYPB);HIQc&EzfP1rYSZ6+u{`^>8k<Gr=CII~U!GYTR7Z zV-$ASACWQ>Cr<;I1PN_<_Qq<+2QK$VwG0RgJTp7qMZRDEgv`qWzct!ip#q<$q^n2v z-qog|L*6PxEOxd1Y=Q=Fi(%2^;jeB<FecQepPoV7Rf!v|vOtZp+`(UXf3~_k!I%*I zDodulVjZj&?RMkpn@xGW7F|=pPPi><^WLE4T~k95GLA4oHFQ>$o$>rJ)f|WcNhq+v z?jlhY@K?OuV+8s(0F=~;3hR$cLz`~=t<_?WXXn9CIpuln8iUv{e5|Ed?(b*2k-L~t zA(XxPJ$Biu%=|6$dp?Yq)y&kj3#1s!l!};mCA`%GSASxTxLp)MpZG5utf~;VEqLCC zXB^*<aj}H1?Aj$FwHp8JIu~2`O+rAhKQ;d30zK8NPnY|vPNVC{v}_<n>yg-m#S7=x znZfIuh)2^mDw1-9R6dKyV)nTBiH^L9myPzrM^&iE$>(8)4keeq3IOgavc!HIJ6d3n zDu&(vxK{F>$L^<vk|Ng>xw<TQcOMT_mn#yw1Wqh$b%!P)^!&~E3{yS497laLPH?!- z3$pcmnr4Pv%MAH(96wIkb6)w5J$H|~(RzXu<}%gLp`%T%?X?w`>WtMgf1*9fsH9y! zrV#AVELJD3wTOGYLj#b?U9*4c%>c^U-Gb|>KAil5ONB(gG!?X%??Dm7&f**UzoeBc zq8etr2Chv~Z?~uZ&O^bOOAvRA4XzaufTf?DZ^fb#2>PQk8|GJUq=|Z~qmM!nI@L2I z^T<1D2Zb1&v(x2$fiJcQ$qOm#Mfp^?U#vzZ6t~_5RH|G+r8>Oz+0VvwSFJ6pi$^%Z zZD!gZ2mw3M;b$hxdHT6v@3}!48rqoS-U<L*2?dmp&{$wmO%h;m6E&TS2b|l&G6oVh zwG;}1k&Kp9O3#>(Fq?+Fim;BHN&*YKzBj0@<?JC5P4T6Xv40M4u6`6R3G@Y;nX_PM zj^{O<r}P_r?Xw`BU|r5`1|$-K^L~rd_l5tFV6UeE70c1XkOX?G2wQsy8k$Ts8CFb8 zc<3U$?rKPE0TuK)r;QD9I%Ckn&qnIYpvmi$_r84Z^y#XvNawP0>ZVx28|a+t-vtIX zM%?c$$;f6~ffe-`$;>t-@M*8fmc7XuI_ODMqF;o_@O0(*T>k{NW3+xx;Q)+6n=44! z?j`x~04>Nb{gV=N-)TKXGR%TDUrx>R7lC|P-Ut#q%lZ-pFCT@kWA2?ttfiojh}Svk z;W!cX;;Qf;$c_ss&UjK@IL0v>mNm>DVvOntO-|+rvjF|=BPAXfibjM^rzjgUQ0OOM z&=^NdwuOfJ#qTYd;x(C$uEs+VnU{|PE}r>%<ygw83dxG^QgPOt?72Fol1n4Ri}SC+ zdH6)2l!^U@*X1ltZ)og8!8gbqZs&Z)hkv*0$#AZZ<5fFmE{S5qduq9gUko~pZf0Yn z-X4`q&V%YdJi*LtA8Tac>^kp!?Xq;%`Kd&iI<eOU<MPsbYvS}eCGRKwj&8)y*rp$x ze8Gzw$kdV4YCT_WXpQXFMlDY-@1&bK@P$`E1odv~uWmg)hKa<;2S(=-IlZWV7IW2r zW8Ir)WSdWqLh@uD2y1LpOR$QSdyudX(>mQ(J-ti+y|?@4T2yZ-VxQ;Bo<_FNbHK?K z<;-BL44D9VixWvxSLkMW;@O&+puRb3`pbjLb2_Y3VnNHHf_n-+uQm|t;LT9a&`(B+ zU+3e2<nJm2FdG0tvbru_%LR)LAPNJBmCo$Z9uZ1ef%K<bim;gM35&H9sBi$iLs<Z1 z!XfOo-2<*kvriA<EcjCq7;A28a<tBM?{c#{3DoDd>A0S}DRi1y>O#VsG70}Y+^Gj% zyk7a7rb6GKPW925nHYTCc_@&j_B6GVE!7p5CTdX8W_o~~fS#I9Tja5O#iqKtotR;e zl7&Dk*w5Vh?0PTGx#gpl4vs<%-?;bft^P-1x8D*s*Z+3P8f?Y{Bmex%<I1^)5O(}e zYvAtyWwSi&Sto;@OHP8;=3U5bpLc(j&rGJRqpRKn#5xMiu(E4f{8MKyYv$^UyG#+g zt@il52gQ&q8PN=r6~i6s-bpJG6bB;h@)kMn5$B5~n+5RP69CVh=8Sx?58!0mroQGx zSZ8<7kBU9SWwSVn-u&1OwCX@z7C9~aCi{3jsa9=JU{TCMxK#l0jj%C$a9^Ey&PvOw zF4_GoDLV&WiGApLDZMC5CQx|$idO$Vd0$T^NYUYo)YXMXL^KP|o19l^V6C0=BY_O= zJ$>_UxD;dw``ZVuf>U0{^z3VwyxUm`s{@s}NB#!`u5cy_+1o?7fK?KaRYS=}`{z4v zWerPpbaAUF=E`M_Y}EYd!lKK2sG{@(!#Jp$`@Zs&n~^8f7QT+*N4|{?a)T@^A;JJ0 zCB^B#Fs|M<(D}9*w@U9{W;@?LNzKe{TEIS+r7--sb}0k$F%3FQZe9oqG?^I)*bz58 z%M!n_Co{?Uz)!_dA0m_2oxuBaN+cZmyJ?V@)_!nJ9JT*x@RmrhnLY4;osDvp2?I$g zvh=*G8+yUomuo5y)V!u@^C?Q3`|Yo;eL}U87N2<-naH$9Qajy4c9LE^8Ev{V`w2gK z%3yNl+WETI*$h@F{X^xI1Kb~>P>mz?0lUA&(`|(9wJpgKVfII8w4XDI=cX_tP0xu* zP{*()ybC)dfvvmyHub4=td-zn&Vt8gypX4a^FFGd#~`Zoj4Pa$PDTR567g||C%mWT z<g*xdjrd238X=C^OS#V||EwA666vA1PjSyyJ}<{mAw2`WF>gYCrdW&C+lfgOHY)mA z6x&lN_`tkWc-j-`CGI1J!)q}Ed@%G5WmzOr?=ZsUP9N0kG&(`_)K=Wi0imBuf#TzB z-L{(fw$WFimWpd;jA>3ErQ&+h7Bzcrerqt*1v}iEUaeWcY)@xkrexqApvZ;_{_Mn( z!PYd|8&KZ+rj(t6A1Yoi%(2P9GW(EiC+{1zCohYOtFV_@TE?g7V(V^|eRyB{vFu52 zQY-D3t5b}6dNzUEov{3JMeE6T5h5WC2EzhevdFgFq9ddK<1H#zxi^#POzHjz4h*z* zy}$Uz*l}u-aN@}y)?bEx0->EHW*ef9ei&EXxuuWT;H_DdzM4sS*ZPdp7@jG?B>$KA zfw}Sf5l4zwMXXBF63ezbYd-5-LP*&LDw2?0ysiDeJ9k-!_20L`@1Ya#FKCsY&}6C% z2kq>b3d@FPP!gEdNr$OAwrc4lQ?x#nmt}k9<StUrRS)F~ncb{9MESk_fb1KV7_>_$ zDaDud@`uXnHW&Vw)Cp7i3a6vtHu4X?QjQ;ba}9v|6NyRU*V~l#FFoqX{H32SDQnxB zE<b&eX={);<JhYmhS1=NTKgyO6(GQk-}}>S?~kgz(E?81T3y9hFpITg0VN!j@9lxB zD}Co@%0fVyc1ChJi{Rz_AvnWISzShjTyoK`DOn)_@pM{Z!Zl^3Yln2iKWWS{LlbUW zY$6zr{yVeRL9x=oVC=zi`VX>@KeZc;`H2MotU2>8AFcgV_c&Z}*sDu)VC)3TV#!K3 zItqN=b09k*wVSy&8`eury&b|F?+s;QI?J}&9JD;g9&w|{!)Ci_4rNBTZ~8k4EvB$~ zYjOArJH}W>^i0x^cy9`+n(Y+1j6d<tBP!As_t2n=l$XlPB=<+ok~PJ^HT5p2hprdE zz?kjrj%0o~oHf$=B1a{LD7{b%(?KHF>GFkU2yXv(YVF6RtTr5arUWMD2pW-C5^A1( zCrCF^8Qe@?S%3g{b-7>e(y{JHt`y*!zPU=Xyh$n8sp!5>3LLFrQb7v97}NhA_swXs zy{hx0sY{Te&mfqq&<I(_s=(F(3ZeCbmVN_QSQs!RPAyy?a2pp`YtW%iTwS3S<jMPf zAMtRB<?I)O9J<%=JLo68ESw2cCz$bh$jp9{SCA4}ddMgYIh5sOwF@ZSz3x#D8*Cl~ zudS2Dt7=xYaX-`${>jm1bh8H^0CM=0>hy1U)iuI%=0(ozNkv;!sb+D}{`JtTkf7nO zoYg3|*O;^e$Q2_qpN~b-wC?Gp#7)#i6VkZXCmK84|GukgxLpi1Ow0QWrJiNJb#IMZ zOSt-U5It|1ZGqU8-&2X*j~4YiwSNNHBL9azw9$od!d0tTfNc$nyQAcx8RW$;hk#`+ zfN9g|9L+3HUyU*YAP>Ow<rnWa=l>aR8wd}-#qZ0=h<NLVs_-Pkv3jUlx~$D6mCF90 z36fdpbvRF06QFMK2)&s$W&iTN<vpXzZ9@?9J|<;l)$j4cS8SGC$DBKw{*IJytaQUa z&+9VbstKTz-ojr}4e>jCWZ!@^hE<P)bWi;jj=vUmKIOskYy~H&I5i^(X7)F4_zVqJ z7DOICQC%*fCtENp0P@-DpL;W)0PvqLz{R5}k0>WkOjt(;9)?pr!X|wbC}XGLotu1{ zIHG5;G9lHc(C8*TNiY!3Z}%Mpr6}d92>QzTJfo7J!vF2;j}QG1Lpab;HBQ+|s85-X z2~8symo_t-$%22`XRZHgd)$Ywg;7KCdlBGK(E-z)ob0NPe^P?K<jRxHQSF9Re9=1X zLh7Bx4==y~B91Q3NajQD)hsMRRD>{0CH{nrZG}ydp?mwfrimA`(|=1S1u1eeeHE1d z@PWt}nf==w@!b^EMyHfiH-l>TE+I(&EquSwc16pqsO$1~x*^*&e=Q+_?h{+<zeH+! zf8!T{Mf<IL;C5QeYkiMD`YR17R!Yf8&lSzlJ+fvE;$S5=hjiSu$#0dPBWYk<5DIDD zNvB`G$4deY5X=#n$$4U{eb5uh(#ZtVh|z}q)_7A)<O$~ZUDCLqqb*Rl(;n{h{w!g= z!^W7@<1B%Alf1<pWqDH{(Lmp7-CYbwdZW*(4doKR!kG@UK9%H5_o;SQGOtQ;X|7~c z{Ytmr*eF|NSlsNA`LbNCrj(13(?Q<p9ciE^B2;@EU)V4=j^D~;lSyL~pV{ZkAtvmT zSBB`iMA_-@P_%o0hIO`1)!~wPGeOc${5g}zFv{4nfNUjD<8OiwP5^B!rZVoB<}fE3 zbk&EY7_|HuY%7nc=x9FTVlgq0h8vU^&X{9Y8S=r1^c{PtIGD>?{FR|21N$ZdEBD0; z7cKWWy-N9)Ay?`_(`%j$Wa0mg!*f2$QNG7zmhATYoe9$Fdkdw&w0z26cO;KfLaPK3 zes<oa1zaHNu6CWO-S<-mDP~zl3#g=g*D#GH<$#Q-vh&c~#7niZL@J2R63D2I+^gB4 zXx!S^kcf$qAzh<<e&e5^QIa7OBJXe^>gsY(4SPK1Iai|K$kNAkcwtNZsNb`oGw;bk z=fqOzb)N%i0{W7dbco?Q=zUR`HU|K653zQQM2JxtlWXSLs>3UyLFus1$yBUlm}MBO z8gQ6yD-Y}X3A#-~qynJVH}6`qqmQLFi!zOkaqiyG?HRn#xvWYlyF>?<hyIk>rHX-_ z#N7!+(07>K5Eq(o#z@svMWB$A2I}7V%GIR7K{ft1>`E@P1?qNx=>x;GEMuPfox<8) zH#(mt7)HsNJ`fKiidWm8CfSkTa!VMdG2@b`sb2Lm+%qXT9>7VnbG~KgpifRr_dqeq zCmwTkqqULSBlOj2jh9z!td$?7o(`IZs3;1s7VKUehAa_{1=u3uKIZI)_)T_7SEKRk z4)E9nEnuZjd_5fe%|y?JSH+qb>PBErQ)f%_`pRBdk;Ys+h<Pp2s<;#D)Y_+4LpZa` z_E$bBzxD{BR;{8Ab3o_221M4qF`PRV5Zi?;o&z{Tfy3rE{Ts$~?#XE%a0S?vPQ|no z?QL<DNKfoBZ4gxN^q#r|&(srUC*-#A*`975>tnca#)qZzf?y;-L_OwWN@qdf=MuSd zzz4W1gN1z@4ugO|r!}4d5@M}p*<#c1g4|W8VMs>?bZnqpvRrZirn-gm<H-f{(sn{X zkh;iTZ&$=WE-smlK|2Scx|0P3VA+QK9GbMQFrpFp@Py;#ZXY$~1D_D=kj|`;0ZB+9 z_(y}V15+XgIYihIzxhkkTkZi|#~4CB<XPDm(!AQppuxrXXcYc6j7Nbl6y;sBw$j=H zHyG(+<7}ZN^5Xvlv;B9EbOmVOMB)_#B)K=nq_Rm#e}?@;G%O~kG+AU&U?8^`>us}D z0@cmtam4wxe5}#-a{DnFU4=WNg;#v7-h;|M5=#HqF!%YHY#D!4(|`GYMj)Gr)~}-X zpcb+C+CSLd4mY<9l;d9wc6FqR?}1+3#zEmjQmpm)r)w~J?%amtUINt<o-V8zhF*k3 zmQ+wi>JN#2`oaJ_cJt(HlC>IWt;57~8B#&=7Pr3?i@MsTF0~mn#q1apqX);W$X-_1 zH?{Sh-$WuYPwx>rgtq=lUjZYq|F)cixnF?x{R%L@0ZNh)7Z~sMriY7)A7I9A-7GhQ zyuTQ~##Hd)8wu*3UVRgYxW}UIFR^OLI%&MGmLQYdtyoy^+W*RoDON<xQx|@-rG(9q z(%91(hP%A7>r7HWl%4u&3U}(H23-Da>9LYmBIhpOE4X{e0&0`S#*!5hpW?{PwW9Br zNe^czyN|q1Jb=k~NPG7#ug;E4Q!o&IszG$gS#pRx#FihdI1>n#6m^>y8IkvICOp?p zSG%7#r>`V~hX_1iJ8gg{3$mt;F#w=?Vp0|k#zz~%u`q00_ph%owp<L}GW!m`Ap~qP zWve=~jC9T4X%u$wg~mV+T}d%~Ul25jGG~rB(T5KYygZN~M=!Z{o=_7&`)y_xKV+-d z$`Ff?6}9ix9yWv{P`G1lu;I*W^Gzt2XxyKML>|M9KxZ;)G0Eq!z5Pgbe1bl8EYwi> zYP>6Ab%|V%PfTeNVUQc%El&2u(L`iI3w3_PhARwuA#8i3Sl-|96*D^~&TMa<4yDHZ zRGzm-Y7kADv8ypeG~uJ{*!4(wlO_{mGbL&$HO|Q`5Q)J05p)TtcVXPB$PzbvMUF4U zb%14>*HzlhnH``wp0Vc!`=@?2EX!>;jzvMIFA3CC5g$K|MuDPVF=aE^jZ{Ry^{Trc z8u&@Yetr(QcfZuld{F$fX}!%)(kqpE@f7_-?S?6=fS7TtX}EBY@dEXd0D_Ik&R)Dp zbMv#WE@wRYuiq<6qr*a5w;?~9Lq#;ob!NtUd!nb<e!jSkrM89i@3B`V7jNVi%&%<b zjl(mq!@EW)x?=v>ayWQ}HMLR8eE$EOcE`^b*X8|Cy%OL=op<{R<O3TfC-%2}Q~$ta z{co7nMP`gaSX7WZD8&@mxhE*Ir?j|ldPGE{PBA5?fJ+@zNDGKmfHt^yFt)FbT|S0Z zo}NK6Dv%0J2tRCoN$<cgHc@~H_wUE<T5L%)(8N~aM;*JhJFc^f{{Z9R?A7MX!RB>4 z(5U%V5%mv6izcdXQ1aBGVu_KJ-=tGKzbWBpn>?-^;HpdV2>$lE{dqNSbA>kvkl@LX zLx-fv+;5#e3NII=aN^gTRvu9)xoN`{3$_Vb*nNDGa!!D*`Q=tTA(LD7eC?OpJrjWH z%bu-MwgHpsJ(NVnstTwKS>9+0-(|n@ji~fcwQN#Oa}&l=C(63RxYiwBJ{VMIg#1|^ zC(`?^%JB@@<bN~BO%2gq?kM-GoDZkm-yee>?nttHY7ZXhLMZ@+WK|n<Hq<F<;o(i+ zl2QXRTWT1ubo~}4*(ufH_x{O@DB|qXP`1gbM?&mBE9DMXRf+(eVHH7bmCdEDeEW=T zvHx)GGGl;7vTLcf8p)iAVk!|i^R!nIpu9ZU&P{os0jK@58H_75O|@ZxlxkXqUxu>Q zAk3km?hob33jK!~$`!e9E5OlR?skiEYnui#{kdv3hx0ZRhw1xh50&+WL+_kgx`q%N zb7T_LhW0G;muvMooJ*yaD>}|+JV^~Gl{(n^q1{i2b!zzo_sQkHa*x@YrJl?_|Lq3k zYybNj3|K_g>-24*=a0AOXvBSFKg}WQ-ZUx2%637k=%8-k-JdVeO|fK5mK6zzTEsbz z>mvx}k-ZpBbNg*+3{8Fs>4i!+h-D$p|144*y}J6>uq&p^Z4{M@RDfgoUp9YXlfyRJ z{a16(<u!g67r;DRY0qE1H^djG__%z6k$&5TYE*RcadM{5%a!y72dND}OKlRpV;wwX zJlwyap&|VL)v!{4k@fB~np$utL9&gR-!H2Oo8QeEqfp(oY<1TvvM09)tmtC0oW#mG z*(!c7GLL71%j<1mZij?59x2p2M|yBtYX}A>*@`1A%w-uutAb9wL1&|%r*JB>PU;TY z+e_U!m0=7DqhLrv^%X5m6ia*yq3FNrgO!^9CHs|suJoVuMo7D#K4VItZa%e3(B($h z-@mmw`J<Rn`ij`Mq&cCxb8AS_9aJ;v4zlLpEu=HBH9fCOVYTKOThn!Kj9({NS_>J& z=W^Ox;S?o$%%*}M)}5Q>c2txoDgqLGn)geK2r_^0!zeR0bB=1KuZ@*-hfr0;MJ4Xc zp@_$901os>5DWgVf=*envJntgCQ)-Hw+xwJ;qAKVe+si!kHwcxKmcODcv{<fQ_?ZL zQ?}U$h1Sl^%(_4R;=Rmjr(Y!z-ACy7qGM!!Ju6%OLs+2O3=Z<7%k9V=6ZcnqX<d@P zD^GC>?R;8*W{<jMjtyPD{|Ed!SK%`DT-pl7>!&6ij(w4DXjXDxzYUSp&@s4`FH-Uf z7q=d0%c*OR7e0*NTuz65-zeY{ro4OF%Y_KeSn0~)WH#4u>|>sn(<{NL2ebzm$3!6l zM0GDifTSA4Qiey6wYq}aK^7G)uFA8)C&kYBhv!4)SV|f0L>~40FGM#P8IrKLhgNdy z3z)&$D)Wd{9HdcyJX(>eIq`<iE)GTYk|ruTD>*JQ8CyCeKx8>}C9Md~v4pDY!0OxP zbq9FC$UkP5{u(Q*dN(LsTGe!04ic@5OOZr{Y<+QbG6q#Kv$RmZ0tnC&yzhaJlNzvy zT=0k;K3lJoSOnhxyF2R(YhK7@n|V6V-_eZf%l^XAGorC3iidH9ojV{(In>cn#LLGv z;d)&Vz$WMrE>DSi4}z5U_L6bg+K<J`e<<<GAQhH$qajdU57G(y6*5RA6&C}ZwJIHc zHgA!ef}-UK5+Zl^Cs5XY<0g;1`^n}KuYz^hsULQZ$M17%LQ~&wQ2PH*d-ptAood?A z!GH$+?mL=kaOkEXiwK*Syfvc_cERd!mr2;y(87hSVL*AnAN?s&1eNlF0#(5S`-gf5 zV}Goklk;cjs7@Rp>!q1LT7yVA3DtPTJU7a0<aP|Qzm)&<Y~UzVOGMMtpf-GVmAgEm zdQ|FSc^VWRe!ur8c)g?FefH=xm`s3Cca)8A@NmpVtzVHi4^t2SiOA?;QZm&i>J78F zOy1!Xd@?P*BJ88|?C+O%dw>D#A>i~HY?!g)TWXD45pbiixH7nABFwv{^#;j^n)w}s z7*OCA#LyO6k`!MBF+R;=f%V<lm{W#m0e67)9({h1J9lFnqV=^P`%gLqGb4a)#n2b& zGE5TGuw=|K%u>Yqb*Z|fv_h;y98Ufk&wH~U4&$2&VkM?2(eNPqfi_USrM4<6Tww=N zWYYP)g5R<|qs}c3?AA`w(Y(#b{W)-u(Su~u@9!?k9yo$E+E}&qtE3atgZzgj5pj}m zR8wTMb*4l=Zl<AS!>hqw-b5XZ+mv+(j*KhF2%N3_8ZOGp%!(<WyZ1d=Trjd?G{uk6 z{!R^R^VBqUZLxcG&ci)zrJX@svDq~AG(D6iK>_4t6*e%GLxYjYW2OzP1<1?^3e%}P zsQr2prBZGb9*H@cI1C(xwC#SpPxg_qDeecE*SBXBj{S)-f--pR04;p&*n9pN!Gf>a z;VbXv9)n8-X@}Oz=E4lFc~1c`MfkLt*=tbQ%~U3nrjB`AaNXf<h_l_bT*;_zc3EzS z@4(gwi!nd-Mdn0Lma#ROdLuP8IWVjNTFL*^d%!?f&`SnrwyIWH$(P%bXOl|awq^`y zkoWq(6JZdJCGD9$t};?VPk0QPfx0<*PHidIfiM$1fJWI|Em&I%nt%h_Wj=3qiAsx$ zsW0C$Iwyjj`tUcHY9^0~cPQ%_!f0SGAs+;JC55xQ4+;42G0L+T$d*NC-g0V66Xy!^ zq8)a$B$x2iteZ`t|IAG4xumZb8|-czs{U>0;@h}c9NflzYJ4f~C-~pIs0;1;{KqQ7 ztyV0h;Gy#=j0wp|X2X)-hw-fY6YS9BS?q_}DZhaG5<gt!RE-Oc-<a6jg~!1UP4ml_ z_e#4U-?>hL?MTR=GZ**miZOMUlT`%%^^cXH6SE^VMj#G7^MjE6<*m5H<bS9}5@74y z{#_KXXDBfAH@mrJ-syS~yS-y{V(GK$qe2iGzR>=uq$=?l*E5^Wtd_x~yFnMAe(ix- z(285F_q~;%mzFST{Cdle)%Cw--|C*4!DuIHq7b!wDwj=p&CE(AB-V5or>+kTTeVC) z`_aEC*!R;Rg5P6p8f0e25bNEEnwI;|PvXwbzjgZk=zNDF6Y7<W<sr^9i@_GJUu_U8 zQkO@Zt%rjztm4NB#|Zx_PMGq2X5a?~BfHzNkEZUP_j@sN=_N5_Z1F1=TB&pgdyUc; zgul@9{jl>bp2q!KQ&AC_3>D}I78cl(hRQEDSpAWBA+z5=vKP;vz-DF)6@ZI|_Fi?` z(TEB7_w4A$Zn~%+$*D3pj);l^vW#tVGjmT*{jgiNL?ab25O~QLz_n+2t+#>gS!g5R zLuDXL?VQg(CQQIy&#boiMgOhQ{DF!F49p%SE~Df%kYU*5aQeP)k&^c%Xq3&TIM~MH zv+S|Adb&yz9hhKvK#IiXzh4<EoF0AMqu<*)9@vDF-V%CAXM%?$c%yv8CVct@ZxoSH zzJ!i_73~*S5UO%N-+D!bng8wkahH5pANo`t+`kfnfWfUWptnEjm+xKXB@BKPap&Jl zOanE1T;=5JP<-+33=eX2*PObL)(bL@78apY&}?V#rc+QL%?5E6Or(9Up)=wD-NE%m z3f;h28swMBG(`%piC3i;3V1(+-3(*ZO2^8auT!>oVlCSFlbULFP<-e*8RZ6lLwV5X zdIdM~Tyv#`C73;QU@zJOId9j=wjQ=wdi>pj{t*DE@(4^F_@%{J?#!bs6Cj18{IWro z5o-TNFyUYzC3%E^wcrqH2Ao9*+IcDI8cm09=FUny^rLPjyLZy^EyUVe)VKxPAJIr3 zRbT|?UbpKwrm`m;=#BqhUY@@`lzb|_TG_xr3dnDrF>?&$IN4dFS36#z<edFUAyM8J z=k03IcNp&MXthE<o7aN5g2{7YWY$ufp;~=9l61a&QEf6O{{0H6AlD!Ce#$N7u%X=U zD}VbYh%EK}{NfZ<$R@s!5$3N+{Z6}<0^&DzW(Qr@m+Vyl@tAJC4>;-ZozZOqb`>-& zej%Id+Bx;j){z3`;B=^OWmk(QWbDBr8e-7@H6RbIzvb*4;{U_#x8ZhYE!4VR<Q{JE zdLuRau94~q#j5`lPL#1(DHiJz#nAAaQ$wZTWNyik-^|G>nBU)e$y(UYL2a_p+L6Nd z5d;L^V=YkBh(%&JP0?iKVoXdTymr<QBusp4kH8ZII8$KNo<9Bl{GRasM1Kh(KD3Wp zZ;3p2m95feAKpAK4Nv(|QofKU6SxOwVntvLCEU*+>Ock3Mq(x<h=F$yR{r>T4|e{M z_wAMw$+x73Bo&b1XY4d*Z?*pSFgMj$Rn(1%kwcnUQU^|FcehZko0NoLjFvf3%=zB0 zsQSD73SVwDM?B7_B0GVb9JRA8@Yr4~0h1GRWTu-mddfQf>@;3a7+7hB-fWOy(mWKV zyfFFROA>ixXHsXl?69T&|Cl<*=(@soYsYEWByDUqwrw;v8r!xTqp@vUjcuz*8rwE^ z@~xipo^!r2^1CDHe)d|=ea|_sITW1nqa<;#gE6Lf8wLLt(KM1fElnx)Ei=s+H@dBH z%<RZsmzY7Wx+dCqga&jYJO!!5`DLJi&4FJC23O$*7;V%Lvg~OW9a7mohi*x-hn6Mi zz4|zh0~YQ3q;-+$Oe-tfu7@fmB-1opApc4`k@nrpI~aBnXNpGHaMUT;=gV!vHPTMM z7{G)Y&*LT;9RoPIXnHGZIwfP$>Ml0x__crcq6)RyWa7ng!mcB~AI0uH(7gdU&S_tx zyH%F*lz$J`Mc8q)djc0JeBF2=3-Nd|^LQ;kdiWz96vI;N9Ktf)&O*=o_^T(T<v<DG zG(m7&t^QyUoK6jHvK}to{WBwNP%3s+4QJnq&XfCJ2mU``SUoT;9kopJUE^kK^!2rw zG4$U=2pv@(J3na~uykdT5{eYY{ia~VleL=%{c_sVx!ur>_b0P?<qsl%jmu#fO`-vY z4A19?n?pUyk9*Q*pwj$(w|hjdD;K~)0-m(7>x~3wS}q1D7CdBlY5#feFiVrTMT>w_ z+pW*YqZey+N4J;V9Ie1GM3Hgo>X0=B;a(&S-Xq1jD8qY)h<il+(u8gHut|#4LG~!< z46dHp4Gc9Gx03*|g96UhD&cO0c;T99f0k+R0ojD6;EHOYf+Ohm3u_`w2<6ZxxF+W^ zr0)@r8{UnjUxKxj(ON%g(JfR?J+_-n@XxmTCD<{W4~Kir*FuE0rTgp+g9HRs`|SN6 zJdXyU>oz5B(X{BivV3z+&VNMY_!->A_%XhHybDB>bm#RG``Qt19;4Z92uDJMb6<C8 zs@k*3`lr**LpQAB^hB6g+#KaIhG)TVe3RUfTCtHPxP_w^y*mqtO##d{kH=qbED4vF zht92+|5`NtD*9u&&294rgqQq2cf0vtSmS!-FEE>KdYkvI?XAeTWMS4y>qu<Pp&U zE#h4Jw<%vgUO(S_0Ng?Kny^j;mO@*%D*%rW;;|Qu0w*R%=@bB?T_NiTgap>x8za%U zv2Bfb1&qh}7BR29G?_OJ-Zh=&gf}(P%Hi>&C$3(0GTm(tc2+Kzh!#iQGH%f59G#7c zQjlSf^!35s&CPxNOu~VSGv(xMIs5=t_*9SR9}QjL?x#95blzB^v{|?3q03SFVpAB@ zW}KdAT7PccS0PAuInZ;n@=b2&ri(iDmp3QT-D}W$tCX|^DH#k4&gKSjtFO$>6Y=tg zxBLsp4bXh!*IFzla)2$9zQBirdZkkZmS$voI+I8zsuK%o{(@Z#VXDBKhR4~TDSKFe zuz}oVTG5I-{8S*acEB!HA$EPkwLLFkbgTx=v=>Ge+w`j`%@l@}B7D8U8>%1tdi}@U zTjJFN-8CS&EVtI}-(+Gz97o}@r~G+9x}BGpzmPrU5>~6iq|ra}_;eN@b?)iZ4NSQI zjiWp7Za7{eeZK%*m@xWl-$1O;=9+}hvfU7RycA3Swn`ANn4h%Vn6==a&{0=$sc$^8 zJ!6Ur2FeS7&{c`qfZHYD`zw08{szpj`7g&3K-MD+2<<U#eMu;3<z8GZN$ZqWd}T%o zq4+Y&TfG{b1sL~8wVE&gWjkI+zi7#K0Z$J?Kj%sI8Kln*9@-Yz_GM033-w6X<!I1Z z(hhIs<fE#((ipq#Rw4Z|aXWlUkX~&KRu(3>KgiD6Jt~5&t+!m=sPwu4ZZ;Y$Br8V^ z=gl0i0y});nP7Vq#VG5~xH>}ICNj5^!-9#0(RxvKPC1+eY5JdU*t^5n9wUK6I6aO8 z4uUG$s=bsFUXYMPFe1|3wBI4M_`P$V_SMBd9)Wkm<p=r4@wYLK8e%9>yp>B4MIvHt zII5Nxb&g}rQfkArFXI6ks*<dljq=LzuET|{JF(0f+&lI_8lEVJzb8ZX?*@R*GAOVD zQ%l}nq4REz+*~Jb^%ZplVfi^jU4QCsk94X|2G==<@d+2nFUJ`_IQw;TZv}iYi9eRQ zDL1>sZixf7e7;-TY;k9p$D@ddsqQ82hkYk)Tp<H|bo*S^&UATqD{OC5zrpP{{0L&+ zCuTbCGD5Xh)W0<(0r?DIJ)fOb-~(AQ;zY(kyIe(ySc-E1qm2~Gh@;hAfvuqhnWTjQ zb0qp{19kpSp(}8eRo0IG+u}w=vZ8@|I>&#)QMH~T-DcV2@|IBg1x`RC6<#iOU>glL zFrG6*`6fVPZ@?gD<`UJ@N0^^k%{HCn$LdoSKw9IV1;1<`E(AtG;Op@IAbVP)`TK24 z?2s%^?=*lFtda@xXce}G?zq*3xp*pbk=6UlDvU;Z7TulxX5q6A0=Oi%4uDnM9|xjJ z{3ugXGq(g<(KF@04a}Q?Npze!^V12`O=jv+eP4sqSnteYVh0goXpm5jy{qZ2gBNad zYq(XjEIW61P3dPWm88LCarNq@ii1oxm8Sna{x<8?U}8G=%k`PHbvw;NC5{MNNv!V% z2E#Wwtv+$VGzAHhryW<4$<K-Gh4=^`{MSQmZ!3e_K=C$D1SSI&fJO7Z?gOhVk%wc@ z%dOGtFZrUaNg{=yh2N-}LE{xV6rrGzo{k)1N_46OP%tkRnMTilkhxvVb-CpL`9ZD6 z3(dFZ*`^{mC1uU|j@h@J5VaH?LTo*0O|bT%gNv7@%e<+p6n+7$LPdNzn7#;7OD2qr z%}tgBv&+2sUi`CNJG@<AP}I$!Q#ps-HVD=TM-@7;6@4PB53RHf|2A2A@|Su6%cz?5 z%Sojvg-jiLTEC++Ol(FHvM&vcT0>8AnMGqoR6!OC9zRsV2qNr3)BLH3pMM0(E8oA= z*86q$9&q?$W@7}DI(%hYIQw~EO~Rqr4w6nFG8~j#qto=65k~aby~?PWpbQli(7EzP zX3HDBwxCk9431ZA@B%D<?j4Yqfa2YKBeKcN+k;(s9zJNBHm#bj&e=yd2#%vNf)bqO z45DvMQRI?kQ@<z^(&`}1jFLQAiOkXA(VDBG!iqrFZgiIb&d8g7*m8r-5mA5f1i3bY z=&+Kxc<QezDv5%44^$Nae=T<H@DsAUN!pLF$IEahVXefAxse=Z$g{0wvGXQoBGiEZ zVwkSBLYJ?RuV44OC1QO83oD_pE|Hi4sNi9c89Q%OsEIN*KNIUNqq14p$l_)l>ogWR zh5~!#c&kmPag|BgQHnNEU#2F);UtF>*3<92j*UUFv93sV4SgrIj!wM8(U4!gY`7@A zZtyE5yrG}unV!P^G}0Rudg-V7*+BrmMS#EBI|PC?cDsz<Xq9z*q<>#TGIn!Ytgt1x zTUzGf5U8j)(t`)hB>hOEaA&I-wbu5nis3hg`@3k7fVauG?7rA{dA1dUOqruo;{Bd^ z1E2yA8Q{L<gc*opsYue!s;%~YjsJrd=VR%AMubuh0lJDq%cGVai$oZUA(YhXByRUv zE&Kq?p4vPEcDA*dw-nOeXicr4g3<c9XGj8!euRH&!T-8neG>8=^I*EEBUqNnr$K_d zYZv<h#^2^;ni4!7Ln-j?_cxb(4w_lTf%NqK1>fLwH}lJ(02T<C9_LF`81$5Up8PX& zwqZm%0_<#v*6E$O2UyGawBh?kQi+X<Bgn9QFTwmSk&hE33O9iboB}2#hi&ZH<t{^% zK=;aelyokoCO9d`>qllQjUIP4#Zn*F+7!l!tk#bVKxMpcw%v-U1~`rmxB|));ULow zh$?vJTyyMCVyTQ(g)jpu2dCs|{)*$jT)V+m-)|{0M;Vzk3*BR+l~|=_Q5;BGQ1m$i z0K#qw%g&TU;}U6Rro#JO0#nWVGXsD;{sde-EalP2r0Dh=lRZFPP-6?b{Aw_7Y94YU zPLSMTLtWV4u8XKh2uNTe_6!d$#loXW^1cnQ5|hErdJXVo-jZpG|6K>*TX})RB+<@R z2oDbiPPeP)T@mqs=VEFKSU#zAIzb*DNR*{IMHfAY1u?cJDME7NDd=PZZnzBfIeq_w z*5_C@<Dt#Mq@Tcg)%!l=O;3OsxTY}-Hk1t9valw$pv0Op>x9o@RTAeKi9BLC2*rV+ z<rl%B#fo!A{JFiw^0(h*ZHLhp7;4CfqaN#)`pz&H8_iyt;!<A0+3R5@lZ_?&eS;7U zK*Dyi?39`zvZ5LrMeaSN-o5hy%jJ3Bx4#oBcI%Bnomn=2*Xk8QxZH=YbJm<~JMC#G z+R>}BwrlVKc-WqP&fN>@{$$2iiQ%uS?O*AOz{=<4gA~x5q(`00TPlrCe^2)`hq;fy z2BCZ^DKRfa?D2ezzFWW@^LjM*c@wqbOb1)(S``|45A^06TES`1`rmek-?ll+)FYTS zaVbUIbdNP{d(L`ljNQ(Qe?>naUD=rZW}P4IRL$_T)8AlPMX{P?2q-Hq4OP=ooxA0q zAMgho4);FZ;(-4$KZ-ohYXCD75G~$<<-l3EAg*=LAd*g;5A?q7aXGLGi!dh7EMoY2 zZBC@*@KU^P!vXRy0PtWbc*p|Q%WP82ZHO}o%O4Y2iVP7{B@y32&CZEwqO55fv&*Z+ z2(w$<o5Lm!*0R~>ooTUlHanjm>|xtm&hd?nfGH5@iM~3=*l%|OyafKyyb=|XM7epw z!X}O^my=|k+PQ6QOMhfYb>e=pnPm-rZ%?!HICi0S0~oc#UfSu{(h8YO@n4M@$$WW< zyS&AM1Kd;y1r&h*)4sfba;K*hFHe&%;z3hl(NGXLWRqcK_uI+#BiF&g*ZE&VYUTT8 z0FsaRFE7^vsw2Tbpgd93Q0CZovajZfLJBOXpObXpqFmYv(=BeFxm3UpmE+g>cFuoL z_{_KLIMESuyreDUKW7<c7j$-ch~K|HJaV)4NXio&vXEJ2Z1ZlFL($=PjXB^{TF1Bu z@7hBZ%>FUw4od1Jq}dir!!=Hsjvh)rc?`eYQ0DWId#=f$%>EF^yF>YNRytIp45<(& zPE8T8<1m%>_QkHg9jl~};ZPwbwMMz!gqce~7FT5fXE>ExX=t>^igCCLJe8Mli{eY} zBx8~kw;oHC{8zXnkEtYb?#yDuq1h4R5nP?O1B&+*m$}f-7Cw*o=a=0j_W<t5?GmTI zF}WZr5KGOp>j=Fo_<h|KmRp|M>P^!0d0;#>1OkBHHnH4x03sG4-cIx5RTh%AC7O{g zuY{M`fVcUUl`e{dIYp^_9GTdP4xTVA9UrHzc53Cr*)L$1baf2H*Uh+D>HP`w(B3&{ zbuB18i;ul`DQ))m2<s14!B{r)|NpXaU?q?+AVV{KP4Q<T9!*_f@1{@R_oI;{%G!gf zBn1pSit@2;Y06ItW-|Y~KWFk)nA|phTIcV!9WiHU_a^5+-mx;dX`o)N@L%kvx#X+7 zAL+-l`dE%%vFCf{(=ikk0uB58S1Fc1-v$N(VWeFV(DP_NnHXFyulHQqCgAIQYxl@F z>lK-k_$&qZep&(bbco5<YFx(G>}0ggTGp(h1l!D_=osc<*_RQL1jGe0)g7s?mCZrH zC?0H>LQ2P;J^BTkw3A+2T;Wss`?sVPHks+jDF=t7n;Yfl2dRJ8q1WV_b=baPWnm_g z%#<Kzi5t}F)xm#Z{r+dD6b-GsKZ9KZVIeI<QGcYQ)<u_%#V5&_J3}|=8D&fK<0BI^ zMZDpw*yoUd7`K*OX+P@rIS>3H9HD?e<-#a7@Z3wR*+65U|Hao|Ny|92;@`%4Ym;@S z{=7phK-y4Aosb!IGSJ5SZAhQ<r&Fo4f|NoBpLReob|Z}nL^@|9b<}zRDkg*$%xk9p zSvAVlIg;}w9=#_c9`?8u72|TM6T>T70@Zg6UYi{ae)ri5(9nxQa*G!8xA5nKRy9lu z7vk&OhzdmG`vQI`CShSXcnfsN2#6HS0}j<>0Pwx{Qlm0I>I}kSIX>Wpz-&{s*{VLo zJbL|n1Xu`{sTeahsHW2Va&D8mLUV016U{%O7p*D+DrA>Rz>--+K!5)F?(kAq51F8^ z8Mdu<j5c{g7HVXGDcFz*uv=mtp7Z?qI8ZqCGl6!A6~#lYB1A+mR7}&`xuE~2z=Oi} z9&~_)!BGPK!uzX#p`Jq6SA+>}iwTZha^l5HE`u_iHj+1FG9BDcAPzY%?GVAqke}?G zHN|MR2lc<fxFY@C3+H>AwIqS{Ym@zX@+iC8Z~G-=dpli4A9o2}zEA@xtbIxJa4E|h zLv&VIMOYk~nX!v=3n{$lnV-)cqqP96CAa1>-_1J9?G?7A6Tfh^X~60rCgXrbcxM8< z<Y&vx<jZ3l=y`R$m?!L$l~KcgHj}3hY+$sAwdvM)>A#D*OTxOx8t&kyW2J~`Z@0}q zpwq@YJ<7ybxZkN$gd_VjzA@;=3xJ~DN^)eFpLSZwkvqL&fbxwBeZ)jp+|dbE%>t$1 zh}4t;jRyYw^hz721i;Wx-|l8E;4OK&O<Mo@S;}_3M~7$N@^brkv*{l6{Nj~<ylSTq zriOZoo$dYRqCj!}P;o)p#8<$+U{#HhB=*n`g{M(h<fe(>XYbD$y17DzhabPuA@qEP zJy_Gd?fViOUvhQLS2qF&f`=o=fiFDU0YHT=6F+Di)WRyjZ2(wO4s0#%;2)KXr)7h8 zba4rNYi}}6(aFp;Gn?BBI69*c_ZR@>4a{j?d}OkdJ-&>E+|QydN6S9faLmtLO#=+m za0PKp;pKCCihhk^!Sw+h{)+qtm}M{t8Xoe_*<t-<>!D$!FHn<OYAU~(rPD;OnRdp| zIB>8|%V3hqXqThQ>jj2AE06bwKjkF6)8f08n=bNUVg1<6hwUe>hIgm6nKq#VRt@!a za8+_hSCm2U0yqm@CI?6`!sXw!RG-$~x+yEh!7GajGeSsnM;20f@|b_C^9zTNzA=6y zW;M1BxV5m!Ul*SLde{LzGqvEKEHbdWaA7dnZ+PZgeg9-{XiZw?XNP8-r!7p9P9(i) zO{{%|QTe%L2<E(ndz&4qu-xZB91?J}VIhYXWac8*vpd@Rce_R2ZTlGQY;;PyzOs*A z*QNcuJf}+v9z*M~MLY`kCbejw=lb;gMg4P<M@z}JNtvF;Ef3IX1Qk6?8@z7wc1`@g zC>yWmm-lq9UT((l>5?CqYRZAV6XC{B76sKG*wl1HBt^j(jCg4MUc#yhx|yUkdcE_9 zNBv6!p`QVFN&jYNlmNGI8~)y0Rz5R=SoNx(?fNWO?f>16b<i8rF9?l?-dr7=9PZJ@ zeJ{Ucge;UJd~;5aC#e9IY1h=8W)Zxj@Y*E!^BzIFbM;Px)p^Me12Mp>ke?LTDTI8y zU>5kjF+5KL?{dEw<d7DU;bF;mlaV2cIm;y~gP-LOZSZ2zmSC5Nyvr-hq#Lh*mgFJ) z8hUBL=PToRieYPpV9}hrke(`j%A9MV$@@34dd_{Ua<F2g9H~x*^vLA8gnCo|3%T;0 z#R*x{+2ROZf{a=2h!}PFly0ba{T>-?<vO#-V-)@MmH%F;T=wefa1%FYj$ksHfRCtz zh|xA;2%FKjTvf7isRGG)i(efHQgOUx70z|#*{#9Mu=d^s2GrbL6cM88uLuhmAd3jH zjrgfgA#n#>4vGE4^5&nu)Z}APdv#91OmP|Vmq-0x*z*a@WBM*G!ZMHpS$hBpYpmI= zft3J5E2T?RphcqI5XmZ~=m1s5RqMd3io=OE|5a9JJ=AKs1j0n>Ob5k(M%l2GLRV|Y zC(HWKY;Nr!Er5pWb478+fz{xrf<7f&2KwAhiJLWJr?9l0670ESl8hfPJzRRbv9o_Q zg`{o+G`@xfiuS6jo`aG^6mhUh90Fpe%v460k&;<Wku)8I8No40>zJuBRnT=wH{htI z^o>!q=Xzb*Mock}orz@?50UN$G}AL!6c)<13<IZWn_4-QxlY~;<`5w*Z_ISGpBs;} zo{(TN{!~91>SuE5N&gs*?*&r@4<x>eawut?WSI3hvfV*Ob^vBTpAY=14-esoE8^p- z46@MB7H$L8`a5Pxv$A>@>{^#)dedx^7SGR$()KRdA~c)MBDvBgBThhgw=Sg-{B0z{ z$N$UUwVo1!Wq>5>>fh~ZOrV*ux_3@*vX~FxjR5l=ytJsQL)dTB&EH!w1Kag~umS_Y zRiHg@!pk>BHaY{<?SN$+>hu&Gh+j%GR(w#eJ>>NFBy%no=Jx~>hDu}<tpa?%j~%0A zo$5ADlK<o5`&{ohy2Nd%d$v#eGssQ{eLN*_#i6SUsRd{<Kej8igVAZ9qR^sW?F5|c zN&v$YV5m=<l^0-nxz^hg0Eu4Tkl%%J9$r}l*fmLN*%)EC%cGMLPnW^mk8-10m_1d| z#e;n63ygsE$gJmG*n^wAxzA(j-G<KFMzqJ{h;<xZ#-N5sv4g7Marw;tp@;7#K~bio zfSMn(CIkiT`DYffB$VKl?(&Cii-ouofHPEOv$n`ScR^$^UWnJuGZK0D^>Pz+iUE=J z_%khYC*`byFlC(Uu;D@$HuJ8Jjk5Y?g}9-?t<!X9`)Cfk9XQezd>Og6X`yjtu>&_y zRUS%e#51U0U!?|o^{zA{io<_OJfq~VTq1=WgtFqG4x{~MII@zK-a`p58a)7}#riQc zI8<5255mJR=HE`g)uVU9q?E@0Xxp$}((zT&hKD_WMo+2(cyLk)$Nkt(wW4f~&`!;? zgcZaqY!~;lk-A9w=oEx_4UuybSXosVjm$;_Wg2s&$fMG%_+CN_wA(B4RKVhEb|hZG zNSj+-x07hDh~G0r4?00u&9z2sU=DZiuOhvy!@BI+(C?@UIatdXMa90Srge8@Mlfk- zYUm35s$W8w1x%W|&R=DX%g5)wG=XP~Wkv)2qlT3YR<nQQ^btSt#8haSMBs-hB*n(e zY=e3FGz!#S@Aw1KbW<SSX3u7;^ve<Ia>6A5yat%v^rPGSU8_2&cO?&wp8I@3+7{?f zbEo+qFb_#aT&!+`jCeNnslz-ap3pbQWxc|`n;kMTo?Jr<7kb^=_A-8qJWvd_H^T_u z(|;;hd+8R>^mnS_9&9ubB5Kv>J9q{(H*8N&)1Qn5#H03t+*l|tB0$rHB=D_T&1i|z zV&}c(qxCj|uryC-r|q_Ku323Y&q<GASXLR$(bTH^pTJ2?H;lJ<Eb(|m{WRzdq1;yo zl%Bw5p+qF{db`H1S6$DSI7oMpZ*rI)Gt2z*?_JT}iPxO;L}E&u_dDeq`*gkLpjOL? zt9LeEZO=~Jcy2X$4KLu$@Rh#5f!=R0+v^5>e+OJ$fNI+9E(E01?>s5&uIb`|KQf6} zO86@=2A8VhpZHi}O29Dc=Pn35%$KuxfO%!k_sSmt+tdSk8nE7bbUQD6j~MJtH6W>n zDpt<A7X9JU?=tB6G2IlHwO?EL_3`M&tCaai$D|o9ZF>3A&B_5#gJx|L|D*+UHE%z- z{_Fn`&>IE>&V4}BZ@vsaEHP)wg(nY!P{(*G?{jG*(}a<lTuB4daJbkw9s`w~px?5% z3{q;2X{WEMa4;zOMAS5iA{<T(Q;XiBM4;m1u3$pvswIB&HN-p5>{riwNRBvYXT`(m zH|As=-9!Vky7z9;-YaMO`$d9u$KIT|FTc^y0a21$C@U9v$DQ&I%y()-u;j<sLYMrU zKr)t@zt{+pmPCjGCQ~x9smVIpS&-8yyz-VG4bPVt`93ka(^wi!hsjW{a$30ak&h2) zI7WIMB4~Cp#k9c#1$87L`jykVG4`{hcdt*p!-FjYigjs{<<g$Ipe$pY#91;pIpc2C z;Kle^jbs>q&xDknuNE#>>qy#W{lawd7*B-{W%Z(ioW4!he=B=wy)Lh{cskLI@|B$y z@NoO&ksXF8HYRgJTYJL9>>9>%V_?1+4q<m1*fUJMC3>G<lcx^+rZ(X8?}c7D?br9m zD5?XoyIuj;=H|;SAdBj87k0P7H}~(8+$7@S1Y990U&klAx(YE*&XV<E&a@<{bVJTS zJTa^|%@+GozbZEbOZy@g>^ofLmg#IAkxDj#AS^5&0cNMG6%hMCaRY%p-eGsR%eg;C zoPc0iJP7YmAfzfM!1$%?tA1A@(1%i^83{`GlrJ$jsD=YH3;F30{%n*DAI6x5RgP<p zn5d*q#%Ae2o#IHwjUb_Cy)E2p%>L@)CsiFn)}NKC>*{5iF5?IJ3^TpH)d#a|%>Szr zwGUnkGnq1r7AsDDbVY6WSvje<yreM2v5ErMHsEmY0~eUL{{|zx-(f;l|5qZQUte?w z&3kUhjpHhdJ>C=GpYeV}3{@$Tf=2<SY(NQ`gMBmy>ZO+f=N$nrQM*&d+0m!w2CI@v zq$^8|Ev$^Dp`l_I{(Gg5^WY)9rcH)N!5`N@&e`9OaONy_qpP>=)>)579_T&H0+~lC z@q=zzgjLZ(BUI2;HMc9^&s}F+adWV6t<IRpTpY@(DWYf%5KA3Z+d+1<yV2(7xNHwb z(Yr{EUs%hU@u#*|Y_yw=&@fSr5Q?Za$Q96AI)p>GnDMl5bT#QEKlv>=|4@aA{Y5Bd z8!x=8Ky0XwgPgA{x|0~gW!ek(pc#;lY`i>-^GX-)p&<5%#NZRgh@*M3w%q!xk0h=T zjH7Yi)Qk)hw1_qZXN9c5V7?PRg-R+3NU~wwEj@af33soqRfbRHe5P{}MnU=MV3Bzv zaKtE3&WQC*+>EB|ZBXIW6kUJQsc`H?Q6LG1=dLt96Y=1sZ%Cxo)+A4Qu<7T`*GaH` z(1Iw|_6|zfV3LF7u-vPfI8vj<8ISTnkt>Il5IH0~fJwXg>XC4(+fVqW|FJNJFb+>| z7+5JcvpZB-4@S)_u!o&KKwBips-3uVFzI=aw{+^n(+-}WZ&m9x3^!TTwo6+#g}Vdp zxv)VnI!EDOFmg@pLxt8ZC@HDSul9nUOg9(^H%P^#TwHCpi7y3E`2kr@q~3vS@E|0Z zkam5R(rRT&@9U`6X3BqZ8y`hhJ*pLIpe%uQ>vPQq-vl<P5;XGJHk=ps$Ryoo67R{# zH?z$@CYUdl&;#XtdWXL~5C{mFgcVV4fp~&)r<eTm9o0W4#Z&i(^z$vl*BW5&{33}L z6^mj&wVQwlSn(|z9;n3)HBlS^lri$(zeMNOu>^n_t5X`lVFMiF?6dYz3OFE5)?N3r za5O+(LIlewKLq+=p-5qEuEGP|W9w3N!F$p_vjR*>o%Acc$3YM;({x|C-yYuF`PM2M zq?O<2&2^&Dl_%GX{P|utp1m49)amK4XW$43VI$5^JNAh$X?R$K<UD;_KqUU0Kf6c9 z#$v^rG;wG4jNdQC@8slsO>HUSEB1?WR)dadkyDV)pg+x-#$l-A#5q<C27W4~RQjwH zRU6%b6tdRXn7JDcLAIL0S`%wn5kNv6ka~UPsw<!2gsCaK)`x#64@l=o$t@k?rkcgh zMcqLZvMnczubb}V)7yiO93W5eqIYn7=?nlDz~t*Y=Gv~5!21=ZN)#dUYw}zy5ZsPU z!wik2Y5FMW2tQBhwjBrg8bokB$W^z=k+uR6Mv2rS(d~Ya{kJ{X9I<nIg#VTDn+iEN zImyu9ab{^V>5iyYjZI9F@2PLtf|=|ZPHe9g;gu(NSClMr?q80#5dE8Em`nA#lqOeh zMrnEMD&>B`=dmukHwFpeFX&&`n-kTz%`ErXT;fQ+Z=sI5$xHgW3%~5~#J9U$0k3wl zv?n5Z#77Uc(2+Sd2S>ld*Qd+upC9zN60I*k{ii@;&OfE7z^V{aibf7#0F(RKna0d_ zw{a!y24r8Sz?*rm9rLiSNm7&K%^t=R57teyr2})Q1s=l=p5O8I&Fv(4n?>hRKZg(c z7rMzgdS@A%!7f>lTBv<Xm)o!4X2MO~uxd8d17)=3(EDj?X~?j<MfxcD9-=&H^W8PE zoBWTa?yjm0F6(Xjjj!32wMd2K_Hv@InkC%SXkHY{F80vzgucJn)Ua^(a;Ed++QoRN zT1zeIs)5SZ&)8;;d}~l$=kh=`mivRxwEOXlE<FLLX~ZZ$_;Gz5bhS;opTUtht*gKb zG)1k}{BuURgN8b&#~{9$_FRzla<O<UDxir&6GIuQrp7tMZ~blt?nLG~-9o2RI>56Q zNa7K70-nSvo42OGB43Ix9?RMx^|Zm;#)JHaPB#r6W#toR8AHLYx1LdvLY+!*eqtY} z8jPSUaJ>5n5nZ$4<Gw7r5ld&++UY|4sg7nR$>eQ7fZ@z^*DeX(Tm}S5(r$brJKf%P zx5P^Uv@z5=J+vEQ6DE>#*HJC}_)6LM)DD%*B6N7<@I2Ev{hrx@<dSz<SxB2Kwqjdq zD1Iv({#&E8G{{D-cvd-tD;!2u^gmv)7*AirD1KO(NTvr!6Af{rPLXn|K&wL=Wg^~& z-zikII77tI$l>8kB+wkR{v0q7suY4ixg~I_e&ArSADH^;YzPFgeZHaQCd0t6vD}qP zLY2sV?!~4XL6aN<W1dxYteh^0#6j#SpPHr=$WqA8RzwaNsApzekS{Wa5Uu)xihErT z-(+2%y((f+ycI~`U>}YAnjEkQR$II|1y~ab)nzT_o-A9iQEcZpD&WPrxbXldLZ7)p zLoKx-lGf0`moG6-=^p5ir9L^O3yA(~#Uz$=hY@n$M9pS3V+fNptu2}9|HxFE*a~MD z%8u{z-aGVa>yE5-)_}`7Aa`Vd{n_m*G=Wo<Ds^m}paU~x4XW>>dU8c@b+ZQwIM!N( zZnnTj14AF&-D7}4tG5f}snIz$-?epTU3e<)c@7h)oqg}94$iZ?8^ago*bd}6Mt=<o z(CI2c%<-CaO;oFi;sh?Pp2bRJ`r7$%W(C5MC0+mt@WDPRAzY3qNf)lO-h%Fyks?y2 z;p{e11iXc(7-I7ob6N^n<@pBD$T|a={C|i!Gv-p$7?~XS^p#3@++^R~O9QS~;L=0E z*Ct-y9b;`vuX%eCB%8KQIyt47BHQ>uQM)sJ_4YCU!)a5I5ZPjviG!m132J-pJd2*P zsKn>>^IFb-UJ$3QNoh*HkA>waQbT4PG|r18#dYm^I2?Sp?J0p8o@oal8VHT?n?=(! zWNyOoN7;+?H)zja^w!7D&s3GvbxQ@Fx6wNQ={Lu(;AtNd0R9#M%kz_Yuf9;=?x8Pc zx!7lB(;;t}V?~}!uBxgqI0i=BV}kALmU4DLr}dd&#`i7^D6%Sav)zt~z6ynX>eOLj z!gvm-;6j)^O3It8V4+b_`?IBP9w%@RSDf&*Z$WU4_RU!}a)lyeR4|PJCvj@q)lHI> zBn!j$9|Rr;06||Y>BZ&vv3tzDJ_f}qWAq{xSHQ2JJ44JxxDSOZHH|jl29j)_1feX5 zfk{^%(b6|8Sr1j%DWQgzMO{DbwhkD_Y>;`h)YZf_d<)W=Q}x4uE=*3e;D@OlqH=$E zg~x&h7B1o5wT%JxJN$bSZWB?;bVieokw){EFXm)zTEbXXQrV+7Wa62Y^NYU82JP^7 zOI$p444L>%v~Ypo3(MI1qj3AjTnqYPAz`=SQXw5RlfAeYaz=|aQxu8Vkd%UPxT_@s z{<A$`v<v7x4b>gsUy>K#bqgSrphujX8Htcz2840|7=E508_|88N~U0m1I$Kk_tIlQ z_K&!9&7pwVg|m_lG$vc*9$ls_XVWGP{!)ri5oAcgtQ?9m%V0I~^q3iM!I4mNgI_{) z@CkCRZT9W}UzGkB_#gl<EPqQ(w-2lvz*2PA_mz;NPopyHUIzH_ZN^Qh1T4o%uA1F} zFLhx0QRE|jLnjOgO(HlQ`$e!KGM{0sFK~H8xehdcq=erTb#2)iLALthOR>C7v5!{a zeto=DdI#nt;4TY#qgeo2+#9}RG>k!L8~#L)0_yTO^~M1&RdhXIHbSXDU8oK9yN$Rz zwo?J5QUJdRjK3;B2hv90c6@-GtmfiTzh3e0SpjOQj-8sxERQNUmH)J5zpJqBobtwr zMaTMvNHv|TA8_)f=))M@ig)gH-l2sVvhmhw)z?Qv=jqw6V>~=K-t*M8xh7X^@;u`s zyh1F_Cn8UDdLhvd=*HYk;zsBJ=Nj-|`MpK%<b342zx;WN8f!a3v9Chzn(r;b&(w%e zpp_VcDud6bWRl9A@4W>4xGtd&1rm)Php_+R8V_6iqrKqP&h}NwSu6BxtBd51g2^k| zlVCguezW`N+0`w>-ant?eL=IW@L?Uip;r;iDrv!kqRBeSSw(bHDfZzKzyV+R7ncN- z2)Ejp)%C%qcEG6CxOGQr!bLJ9NeN$GYI>oohC)IwJ~9`+ltxb67JfPX)G(q{sbi)A zUXh2YQ<s-zvTR}0ahzJE@Ub~t+v`ezE>tMzkBeD87UW>4ufTUPuxFs9nq19+gB_-- z3M2D0y#~_s95B|N=+KSBRZz$=L?9TDog>E{Z~62k?SSNnRj$5b`SXfDgC&@Z2<w6R zFJ;K<3Yl=`29yb*sVE38DB<icUVMGa*Z`18^)f)=*V%1Y+9Yn+J_T6PQ6hG+A}+;( zOL;l9QUhn|Q>>0{p`YgGxnSc47|#5NWOVMa*>{u|A7{?YHKzrIhLA@3a%U13tqarw zq*zmSI)zjt47iHe(ju(nu{G^wM3Xegn&j$iqle^*ez2jrF04FwSELXT=b3NOFEASB zCY#0cLoUtsu%S=DgY)CiOABDs1LNb~gUwnm;EV2`JHZIxbv7+;v;H7v=3qJ6;r3q6 z-g}(dOHf$~`TCyG{$U;%NE=zX3B43be$3TyRzCOy0a{D44*;sJHgHd0hM1PKRud&8 z5?6T=tLQxzi{0-tPws*^aj;LB#f`jPpe~ik?hnY1bh4hfNwhNy2E%SZKY%96Pv1%g zdV7pR#H1>}#}}NoL{;BoAFAP<erkhA2dzim=hS_C{3xJT=TcBfeofU4_zud;Xo6v0 z`cMDRFnjAxL*w<+qhGcrjXXxghk)6)D_P?pb=tc0yLXFczQ@WAA|O0IJw>_MUEuxj zYo|ny5&&@Q=m{vlzu+za*`spNgcV*cE1_iUbv=?g_}G}RKw_=ESWe@DAJXH<7MmSn zum260db!}K2OwT{>w+s)gHN~EYjS4V9Vu;TBP1Jz>JZj78`F2VkMj(xx;j-7qbc5P z(qKwy4Bi=zWq<Zad<(2fF0zn;Eg{`)pd(P2%28uqLRdC69rYZa5|l404$Z`HwGIS= zHK|q8)1XE@?7Jw8kAs3qq68QysKzjLltF9v*;tb_Kz%S<#+cN3{~kqZ5;?{qSWJXe zu}TS?A4x7a9gU$biiC%bJ^E1J_k`BRntlf3se+Pce87OyX#O2-^23rO6#G>#N?I!m z161Ah$#&v(mg;q~r-JF#%o>d#d{(K?kQHnkj0t3YX~n!cRB~Q{Okt>r7V6VCh`oIm z1Vl#h?q)P_C=U~kjV9LSDMl7!E0>PlcJP#d0tMzVqz;@YTDbahL~DnOvHK_@7w)Zy zPc1KkJ-oFc><rO>85)~9{g=?f->dD2359Gk`v*<%2JQMOosGxgUlny!ep$aqnKePY zU}^&LIHe{?+GV)PwTxTkwEC>VurRvEJv}ro0nW_EPLR!=B97;&XNz?8u%FHOo}<sM zjo#K*pR7V#Y~377>puNCjo6^L3g$u4eDLXhnBz62i~hOkQT)2*WQMkK_gI5>JLjO8 z-;i9y6FU79Y4VzPRf4W%L8v6^vhkW{^$ElmpDZ<;P#LwlCg|E6tIn_uK<Jja3>e7{ zTBTCL-7T=Ol8a%CErNKzA&Z++&fEfGDfW|U;KuPY_VT%MJOH5jXZIL?gG=!^52r1> zruUs5ymr+jDDqBXd+(0Kcg7AYeR0_?W;^{KKy(gQ@2Tp#6MblknzihqTByknOig$a zBJCZ#rZsnMjIE?;TA3RUK_RtNxM@3T;|)ToWH1sx`|DRc(u4Ayru`xhx=;)6&oulv zG@#TvX4BwGN>8vxN<iFJ0-{CFJ4K@~ey_nd%_TvY45hlA#9bf$Dx^>`WK@mJBU+`8 zrdT?vv6zzC1qBc;1kFvs-42j$hZx6M?Twe~1wNPjRsXh3>m*$K;@sy8OLn$PBne;6 zTIaXO>5pHEYNNd`u(=`MC%?2OBjBcBrm8pX5ROk#1poczmZ7Z`1R~h-xEC1J#_#OI zTjnyhiX7m&<pyjk0I$={HlfQ~=;Z`@@b*vzXr(3O7p{?@L};X*p&mxJVcE8^6J9Lu zEc6C-p+?$PfG0RGwJ=tU6jfG~ISZNzK8zRTeQ!`p8S-mVgksaaDj^zZsePP!|AkgD z_f`&b5Lp<AnvU6EB!uJZ?L<I#D}<nxJY+xWl+YiX&c^ne1E)b?sQB~*$44DE+fp{P zV&zUF|0ixjdK-P0NUDK;6+9GH4bn;}-Y_o-YF2yx{dC~-`oOJI-*K5#$ka43As9F? zMLY5f4J;|Og?QT=CSqFcCwnlLaViLve=2~0A$5)|@BlYy%G~FoAd*`g2<gr~B15%b zc2`$z7cc05u@5<-3@xu;N`PshycPa^(5d??Mz0ZkCfLPYsHmn5%tGeFMo#!?`6vd4 zNx9fZ+XP-W4wDfN%bx8lFA!X7pEAJ8ZX5Zt1K_z^>oOt`2UMT+HXEz{Nh1J&Hh2D~ za+rLg=Gpd}<MG6|ipFFXMCB|mskCly8gM@yhwk*6P87#^cL5s+btA$)n6M%}Z?cvi zIO{h%IcJ8HFb|V!N9kR{U9@3YRE#A{RHNDTmY+mVa=31_p#aV?n}2ZO^|Njlab~s_ zT3)gOdhEjPy2r>0XC_lsKwZ@x$m<WB0c$=WHorXJ?}L_%n{5-;JEUA+G2XBA_kE4} zqUTkuLKk7tX+(=?&SsPOo^LvD<8?x5L7aX@qNW&kIe1lJ6^CaqfX7KHC$3`rvK^}4 zxK1xn^M5Wn<Exv*^J4E-7Xyxejn$Y-%@t9A)U&VG*wHZIsNdT^%2H{z0C|^3V0N~! zojzQk6hcbVtQ@Yaa{iZ3=y{Yx(|ObmiVhpQzum5YUyk2H2G|AEOMC`$x&<z`6u^ZV zF!?&K>e=t^*{$2{2~=H979C7}U0+8Yy|-$aM0&e+0q)o%0OA>Rk9o7M6Y&63Bpp^h zG*SwW1w|<y+Z;C;=G<&enz1;6?ZCz)sV*e5>Fz!LwbFcTqV#)ZQONw>(2AZ3ZOM1u zbh6T0mqB&n=T8E7C@+wZb>gICwo{D$LlH}L#?HqazZ_0}vW?|Y#+5S{L%5)<eT87X zDq!bJp_GP?5O<)T__RWj?9ORofNgbD!J<|^wkKF(HU!^UI=LtkE^-|{{0)vC`!#Ab zvux&RKKkbZ6XX=+l&?yNmg};9&md=9t#4A3?C@i;U?{1xMnk7C*0ASJ;e&6*emygX zOJx06*%eI{iUauX@IS6go`Zt?7Hxy_LOd^!Ek}9%{94GwiCg&9Hn+l#03LLAxKKVj zmJjfsA0h)4bEAtG^>shT>uJ2Lp1r2BUZCYPu4AfsH`NH(d|<P%>15|WC~6de497KU z{j5+l^5o{(6PDjOPIWu9`=_7w4z^YzmAQAZzvBvnpS~`ASF|%g&YPH}Rsf8B6A0z= z%42SXfQ7xN?IYUV6UIaegVgr}?D)4@^zC%a{fDH)eYc=flrD*MbNvSs{Mi321$|_@ z<|>Yoa;WsK9%SL)D}xk1s?>LXr2N+VZ2jU{WB4~90}F2&BkZR};(%|?(>COOMan<A z-8KM@eBX@$M3=nFO_A<Un(rO(a~Fb^4wp=_VRC1CEQAY{G4O|c)~?sMJY>Vezy@^o zWgB*mu#42|$^Y&^7MP#sY~|talU945cWs}4F+Fn}S=R56_(fOUvVm6)c8oB*uHDd8 z4<1(6IZ2j0h_7z;>$QtJx(n7f$gUhSTiPi&uOw!%Ujv?k%RXcA0`NM@SQLj|#G&JX zmD7<WmwHIEcp8L2edbN?(KUM$v8mK#=6+Tdzf?}9d0Thla2fC~s*-4u%B+)sNEoOD zP9+|+?LX5^1W-f*!Ii$UvuhZKo<#VTFr|~xG0>jVGsL14AKcDK+TvwM@(5<tu?LS@ z^FbfVJd_#@C8ugLTNdP21Dk!Spj#=u+a+y!s*5Jd8QmOr*JxesT;N|k_%z#5i54T> z5bkZCPFoa7;Qj@!2=@95kxE4vMv_i@zG#JiIlXML&VBE`)0RI(udy@J^kh$mZw(XV zc(~OFkI9gA2iNjZ#7*n7GAf0ymNa?D?OD7@VJpRP4Y5Jy_a<B-+uPTrgAW`?CI)>* zK`*|>O^GqIf7Qf5A^LUblH|oY(36&WHu~kicvKtTfK}|$ajG|#rv5y=@62*Ld5#`> zxAX9A6h_(t6Zq}Bt2xX0ZOqih_+7vlb@t}MQU-;aLJ3GBU4N0bRi3?V==b`DFi<tu z&I3rv+7(7H7gFEvAJ7f{HWZH4lZ2qstCHE^h9#K}y-710U57-t`wHPje**G=4LD$z z_u&P3QV4b%1B5yi<iT{3@yqShw?+m{zXfad#$SeAe|{_r$~v(-IlVo={9yFef!oG; z`#)-`L+Qnhx;Cvq7wSy0x&$N!=~%|<i3gVmX;k^M6ZXdxiF=WWSVv3l%T*lEKRi|< zKbrF{{(h$}-pyC!{g8QeP0Bn5l#5&J#zP(Q&GM)uDX0dOvp%b9?m&6B%hm(k9w6@H zYdT=L^2_D^ig*;%4zv<%xjoWS`x@+4t5XvAZrWggJl!7a^Kqj@qs&!q>z^&DG9341 zdKac=HlLC1<4Y#L$70MR)tN;-K2^zTCu<3OXL&oo7~P;BeCJ<?1m5v_Up6~M<oWaJ zgkdoUP-4r4g)R8CR_cQU%0RzR09O^!)G+*UW=0e}M#MO01k2dSP*XFRKpM5b<wu1E z?u0~HuV=5)^-#E<zh^L+a5@^AfB~JQ<`#_4KOg$7Q+%Y8aZ9AM(!gt3-un}=w7!BW zq-4b0USI)^3_XoB5}tJXQ1QxCPsPFp`|TZ}(4ep0AVEL_1HK@{fpSBifVhcbJPYoR zE>V7<+-G(Keii_D4?=U}2$i0B&<oA2xY?cgp%0e@y7bu~)k`9=vxEMim=OUn;Ckko zs(i9!a<tuFF}^HL=a0W=RKti<4Lq_lE;TiC^Byn~LVCM62f}s6LwHToKykEjeso^9 zV&Kb_?|LO|gPQ)nZ?9~lN<%nfo@cW%;J<obwy;WRoObNP9$taA+ecX?pvmX>o-{sV zxUl&$p5I+R2H@0OZVVC<rgd0fjLG#H=yWCP!bkWDy_}J&`TJp2TNV<ol+&^p{t@Vs z@kX|Od7G~O>RPwM;bJ?LV<wzV?T9$T{<6zSRSP(lv4NK7b|b;V3;Mx^O#m-d?D>kp z$0sHMU5Ase>fdMri@UMwjf)g6RaOz8frUT=pr3?*SdL<rPrm1E`XazadAtPJ>%jtT zA*&nW_0HQk15_kySRa$d%1y0>T*c{V##!oH<0r}qZ29%}LMpNpbPnE>b)R0U88-eG zN>>xy*VTlhn=E9)^6gChu4!gjG}+_y&w==NwJRT1D1gJhf68reRgyFEaZUO>uQ#&U zS^Ngn)O&{PK}*GNuj+U&_I?ZRRHytj7#n-2lH?&D#;Fao{@9ym^h*GZ%s>zTa3Vd> z0qWpeFM+L>6@>0Fo<I3Gb*um-wl)UqQ>d<@fN~kV*PEEvbBa*MxG!a-kH=XN>3ANh zMblMisIgSQ>IOhkvI<S?CQy8TLr`5Lfg;b&N#}Yh)$6tm!U|J#NXtr<N1C;|%*Hy6 z5IOBCjM^zUMr&MCmebhR+w|A4>?VP%wcLs*`$%JVps4Dsk&)n(HE}{7&q6Ry+m(PU ze}`Te<jPwj#g59IXF{=tf!0FOkNOFTzn`EYQf^6o?X2{zKMK6;xaY@xR!Q#i)AqN| zilL=MsM=6vd<Q8(>yyR@lMs;1xDYdxcTGTr^T|$tyQ|#U{p1gM*<V1|Jc?GVGiT~c zU9Vc)&?Ji48BL16^e@E_aOu4Ar;momoO2sI*(G*QwMQth2}Lro?<%!tr@kK_AAeuh zr=57HmD7N3*cqKyk<b1@`IMRu`~DB$(j;-kB_azas#Zxrmma*fCgK>qgr}x)ac-1v zw0tp6PknyRA$FHz7#=slB3rGoem&El-D?r4LTs%1KRw3ys?F(!f;<%ZTr=bqlL_xF zGgOY(Agx;do<*~5^q=6RnjE~II^H!ueyXFInxvV3_&;460YvREfT+#YA<@_#xxO|~ zT@3@fQg>RB&|@k@{{qc8b*3Es<6X;_p;onf$<JQ3!}}F;n%ga5rH!e)K#gX9fzkcs zwO_wlGf+npj>xtlSVxC^rB&q4J7s5C`39)*0AL6_Tw<$P`Y5~jJIa!{Kf{v-%+o`j zlgwI3`kQMUObGld=fA9FkVbGwu*%6x)znBuWNM%{{Ki>KD#PTf)?;ViIYAutq~%bp z`Q8QP10tE<?dJPM>Vnjws8l0!f0oJq@nMe};*rtJ<<Dk!%Wn6fi*^3vD-oh$9~IT3 zBt)@lKn`Y0Btk^9-Dq|<8BnF_`SD5$@Ka*DePn053TYh+?|wqhSrbP=liB)9O7@JQ zrC@TZ2W7S`lUdTmTHDNWa^_w?@yva^g+7hC4Ll;(T2=JM(aQ!RqfGEhydF0CX<m^r zlaFU+fB)VfWXvJ_JhFmg>Jw#d6J>4?P9jHT9pL38>f!Oz4f+JW(JSf^nd*DvGEPMM z4;H9;>Tf+;sU?t%r|fQG6bI3Z-_az#`0B;MzS0&G)9ZXmPTBG-5$~J+9+NDlUz`Z7 z%SSMX$yK~sT>1TzPRSS6_+)7!gM2|7HP;JE91YEVQH?e*+Pm(8vRx%+wHpp{E-VER z<0lwHNE8)pNvx`$>Uwo(W3)XblmH^;;soB!BiODPvH~%{--)m%B3}_dgQ;W=6*;Re ztO@*znVoT~W4M*sU)_UX?FOc2t~q@ZXY6FGzU`xzxc+lxM4Z$v>hld~uOj;+E&aeB zbU(OHlUo)4xxg{6&^cCp%c41Q+Die({^y8cJcX%8u)AH%-s`2*$DyC3-xEEfzN;JK zcw}lL96F>a8W>1qChfx(MIXz5^aJA|><?z$*l|PG$tS4!m?V=OR;22|)gON+k#3UE ztqY_!%oSL5m9z17SJ!)9Xl{wYtP{q1*@a0E_<A3CyHd8tl<UW7-b!K;hf9R?7{(#4 zat=iYb@CS$^ktOKsrp!p%jI+$#0P;MoWT=4q+v<fPmUW0Hpu#us~x}(=)OQF3)}|@ zi;ztRjfIZkI^xpVJ|*R;fhFScQe<=sh^%z;lfT|m4MwIUVwSkm#c`U;r#7Mn2w7cq zA@-=&;1X;QOW`!isHsV^b6A{R&bNH{5A}zVZTd*uZK1SxVsD6uEAPd{3oS5E$Gl3z zY8qPpLVvD_ociDZ??AN^tcuJ*D1>8|WkiTfHHBO?H=H+paxw{aboz4pfV98Nba7Hn z-41VJJa-!G*hhw>r6{G86q{<`_G)=>2cEgooJMa_*p#3B-hu1F@uytI9t!HDTa9nW zTlG7-=wxR|&MrC~<ovJ;Pm3<>B|dU2^XGlKrE{X4jdPgulKQ!tc+Ko&BZy`nq)J^B zxFy=edrKFP;lvh`vB5&t;Y%es#fZ9r`S{GBLa1K^>@~l)dM7BIecO;7S%06aYkf#Z zTkVBy>8TQPOf*W&8c~t3r#x146ZUK<RTNUTo~V#vF~m_az%})2uYbPYMu`}cWUX0I z+>41av3X*WNy|5}aBjUcWt@S(<=zS*qNO!iE)BMUYb3<UR0#!+wyYquiT6F~aj<~{ z?5-5pp2m5&{fZ4C<Gv1Et-eZIl=E}w+vwrVINy(;yX|d31XQbH=f8q+HrDL#=xCn! zr?pfdj&lWzUnZCY_iTqb5GpdQI7z7LV&$z%X2QtdC*k%F>Sy{I(?@Pdif0GNfKQ=r zd_1*@?JR?IY}aUQklb@2ghZkfLHN>w`|sx+GC1)s9??$7IZag6HP`Evj<$5y>+}~p z@q1?w-OZ7jdO!+-v}#dbZgJUUo6z^}E+2U+T+YN~j04Bz0|o1GkyL6ZeAo%aYU2QG z@xKq>{FdL0sZU_z3}v8@xTY$INZt%;mYJmq=~%o(`gxml@RanXVCid(Zk&Lh(De)Y zKf(D@V2ggL7ZVFt1m~|31#(ZqwAa&^7!6sRV8ze%6{5Cw2_VUM{LUZc1zY$EJJ9YW z+Rl@DUiGtD6!hct@8+Hp-1+7iK};e<l&Idv)rj;Eah@-8xzTR7Yd2}6&JPKhAStD@ z8#Gt9&>elk+dJ%oeU^wN)p|#lV1~Z%*00#?QgMc;^OnR>UyXLCN7)xduh?Ll+h$(O z9fY#5Q5r2|l7duLwEV|3h%*r*F$ZW8k(Dt-{PSrQ)$=!?8OOOAofjT2^O7ijJrOC@ zEL>8Z5=~e?nQ2#uXCdUuFCxV7B5dY;4v>mECf(gn)JkBk2&a>-B2yZAiq}ed@z8?{ zkxw3v1`A=npd|mIYSq8#)kt}zzSPpdvUaRVNjl;A)526{rt_qsMrNj4313G	WS$ zmo1N$rT+gh^%iV#w9&R8F2UX1-3d;R;F{op#t9w>?v~*08Z5Xp8VKIFySoNy+?}cK z%$$4YdHM%*S69`$_S#EK*w!-rZH!a5TE!c_)GlOKzzXg_YcO+ek2ZT%OA}p8?RQP1 zHw~MK=4l1Xug7gs6y{3&c-&ve^JOe8)F*47^@~f%Y+jyXAmdw^DwfgK+<#bUK2Aww zRj%~7tu(8>Pj;~sKWFIgO`nIGx^-u!>I@(rMm$>sQpK4%T9tjjlC{=}!P6&8QO)ip z%eC>AQ2X(Txp#We^P-y0FP4Zrjhf+;&1-5@Fa}BtXa538JZuE=TEP|0Y^Spj>vYO~ z>E90>WxmCQ2$Bwt3z{LU*qb#8_Pm}0*(J~geEDy{U_X$XU7*iZLl%XeM4vur7Skt~ zX`Q?o87%E{Ul7*XMl0zZlFD#;`R;BDZ|^A%!g9AR<<#Bg!X!k`t7=xTOxG}7@tGoa zXxYES{DrzOAS3!8l5*-QI=_0*r#F4m-sJDL#$TnOl87fcO<q~>dcYBUb$bSLE$6Dw z7<^}7q9@|pB!6*%_we6)^I7`#x(NnE(cT~M_@h%yUeqX>RaW))k}OfC0{Ks@5f@)B zw1_5`QeA5fv!*{l2r`q`B}L3YoHaRR;_(KCnoE@OptK!ATV^qco6>Vgk_J7gqdz(W z8W|gBh!Na`7vy2l6XAhtKCjFD<WY<4QA<Xaa_)l{W0oD*+R@uee(1$NQS(<mTV@V6 zri-$Yp^ueu_OA_x)WXVYKWkBP<P(nx+s{i`XFro}WbOjye69kJ)`wIsBukxP4MQ;# z1thdZAx2vclP^{If6`te>uAs5>55rtuDxPC+%VWb*TOT+P_%z6VBML%GpJp8jN_X1 zZq+Oqyd%-e>FN@Z#4^xp7vnB2Af^>X09yt1nE!F?PoL~e=+kb|2Z`f*VMm|cPJ)QM zN$?qZr<xQoLLx=+KQf1m_B5ju!%V?+kwzB8rEDFYJY6gA|E8*MoDK3<@0;aIaSq~v zKOf#ltX{#`%gM1bOwB*SzJcVKdi}Ki8n^pOGj#VqGM&pck6xcv*@}wAKE&Tk*{~pI zXzg{{%<I$y)4!Ro?tx<jci>eLboif@hn?Sk%dTWC{v^B|7n~Z$>>I~?m=|>S`YEQy zg1vgd1dIq@84UhGc4=&|8CY-yoPbz_9|d18KE}2>7Jggb23I=`FeMK#(K9hMk0?*K z$tIlt9qX@A@!M6i#h{+&i9M6V(0Poa{^HVQ`@gTgF@TCZNux2B?f(>j!zf+u|Df6w z1wu%JJm1*WZTQnY?Gas;OfbjBIx!7Qo(6J-q^c&;D#DYp*cNUU=;A|KM4&(KRPj{o zU|Snyd_5HaB9ip&;a7iQ7(Ftw?3b*;ZQ9~$MLvSI@_KM-^?5D~C<e;#QvXiI|GmGP z%paD7kEw*FHn94}1C{LNiAao!@eM(o{HC=L{`WAtY4;$L;rnjnux?)YC>?A`^~7Q3 zJk}H_T3OuUlse;x48%FElw^+ktir4;m<`@Zo5%Js;MVAvnPNRfYn5Xb1(zh;+#cVw z0L6~O7Q@{+;d<RKvGu9<OV(l$gTnOE&`Y$haidw^uC}l)<uEe51WhBZ00|^7bU~u% zM-7tUp~)|u3eD0^GE3vN<pvY21?6HmJ;aVR%+ZP{W#3i`CAO5j9&KS%-cQrQs0m@0 z78Kb>=BkqeK#Qo!Ze$nbk(&(aS1y?=a?-=n84!nN&IyUA-+9>gBHFfZn$$(|{JvBX z+Zu9uHmWgtm`5jde_E=q_mxl@ClqFRI5oAwg)c1>pR2}kqa|mB4SxaISi=<~c`NhK zpZg^&#Y@y61N!wfx(*M8%X6MXtc|4C^B?!;5>t<?xJ*gj#z`Sw+sf)&Zm&eJaP4bg z%i&jQ-YdJf%bM49yO-GjD7sI)lJp0=QI`yuTGB~tlhibLWe+dZ*5)5J90)Ou4N_CK zT}w>9t$1d6AgmoJp7cdChaZCIwiuT47?wRbl$L~Dm*>s>9-`LZurs&G3V2r+yw;j< z{t#s|zW}P#EUb~zr^-3Su(l1Nz2_C$aPK02$?R$2aDi_wFu=*{u>KE7;a7=aBB0wp z`y89*#_n`v2Z?R_RuUpA-s5-w!{;gWdCsnG0XztjU<!E1++GvCK1TO$hcW!9Swxf& z7;_GSH_=ALwA1`yXk~*_|Cb~&sRy|ii)zaAIehm#-Xb8*+8lnycAa?a4o{H+xkirj z`5U@L4E@F1cgU2!wYH=%n7o-WtObGWW^AlWIb6l$%Awj6=*LY15B|4veZ%qa4NfKL z&<z}k2f}a3S8Nd}l9{XZMCR--NE4$a%oTe6c7j_8F>zHt$_4|eu%1yJIKgZ*BO&uz zTs<D}(BUUIu=XL1lp$yvMbX^8KFCHe;V0tgHZ6ODwDg}kmG2(8*ASYab{_y^t5hIr zYS~OeOD7Ul7S1l$x1xLpyI3Rh>ggE+b?0?R^%^hPF^*aOO0oFB=xb*bmFif=y*q+) zDwevkBX7%0wOd81IklTdz^Fu9-D9X;`*_9M7IIP#KBjJ+Lfx!-yfrW~ri#}TH8G74 z*sS<I!7d|u0+Z<`4OclHSNmXbaQVm(UGE=Z&ETq*Dx;4?J*l-9LXf2b#Y`2r`U7#N zDg5~TC9z*quSBrPwZXyxX4;#Ay=mHG1phM+;gebxF0p|n2|7w0`ohU4kkQVvZZj=f zZW<@9g9Gl`67AYwyxyfVU51b_!1YXp?NB-4?m6@LKI;!+^m2k~BFfLVQ2Z9PpoQO< zaO(D0g_ikm{57WdLe)1K4qVtIVNCs?8LlycVz?Y!`NbQ7a9VoB1S`DOw&*pzf%T=} z!Ze`5VXwsex+P}BdlT?Q746&bI2$Gys=_>v;Cgsrd?eY$ZE<+s6F%J~zPmLN%3fJx zSYGe0uA-^x-@U^PQBoyRehL`WKmb`Jdp%+xL7J0xHtZ%9RNps@V|SeF&agONZqzaT zcgy~Ncu`!s-B~p*%ft3BjaFrduF-JZK(ah|D7PaIaMeYYOaK`k2~?dWV&VhF#vv|x zcD0JZ5x{i+VRAbEV`vMxZfYqPd~;)iN?X0m^Crz<QaSl91b!Pph*0Qails_D&lU7e zij9PxS!4~c+y=x1Aj3dMNLb$V!rjy7=WtypP|r((^t21=YAN+(l$94nzof5;4&Gw^ zTXMPV=X;0#x=YN`5`PC5FO9AKeqBb%Q=y2<qDu&}pn~NpJEGuxq=7nd2sOO{_h=QF znEpc8XRSjY<C|^WWMwAYCXV<_ubN;5-#SZcU_fsGf>c(UEG)z~3XERj*0m@#w14#7 z$GrGQXyu2YuNTNndL(z)d;*~lEUGrUx6o%kWL0vCG+_&*FaP(z?R;d{6dr4Helx;A zpcU3uG1c%ntjPID`jdot<ILk%B~|3F2<_D|<Y#c)o@@QaM)?a1`IQrYyL9UEk1^?z z4kHJhj%}*0HHiZw^~jX4=|Xm?*QFBj+cCY@<V172x>=1(Y*pLdh!}H87riY=mZ2ER z_}cKL)@-VrJU!5<Ex%lb9Z3_7GPRn27QyZONG36Dxx7Qpw8>FEVH0Tl(Ct==VKqR_ zx)X(tt>O}7Z5MVAJduUS{FLiVUQP;a0UsI~RU2x9jJ{-Gfaa1kNdy=Yc%1AIc&9b# zq3)u)O)HRrb{+X!&V<8E^G0#0Moh8Smk+Etb2Q!dAADu8zCY%W@=EN<ZT4_-AUXVz zgRifRU0dp3U;FsWk*4$c-G$5Z)7||@MV|11a_>)p4541}bd-oszUwkq=(#tOJL;3r z&54QgGs&&k^=;PAq$lp0`!!#(@GfHKPhV7B%`H<apNPrJMFgzK1D0}yPdgt>Ncs3p z44Ir$M`XpTKjoO*jgWU{{x3~)bz3#_NFudKgb-hd86rVHn<Kb4ppMUFoFM6^bbAE` zY-lPE&kTJ)suM^w`8|si6SFG(OrLB}c%ts3uq9!)Je>kSH-Q*C>gByX6)t<Q_+PIi z>4CVa^%Yc9PjdE(mrCNj;<MMdHV8p0<nLzWZx`tP)Uz66PX9-yMRd6MUV^+C>G_5D z7&i+yiu$%-n}!-irH8r*Ny#8~dZLcBpRZiXzu9pX0)NAa_rf8uAql_;hBs7@1tLZc zc%g<tmcN?)e6pPln}!UdPV}NuhA5KJY(*Bt6ANT1RQ$9N<cUI)9f|5?V*>z}EYxl> z#%;78sjej$xQBIhgInjjrPI@#`7MabF7+F!5VL#sEo**GT*8>J$Ut1o<wtM_=&Km( zPi&eY{DMX%rikV7oz57<FO`Q(d+#7y)eC4UrS4=Khtj{0`^#$6kGvnzW1O(Uh)m1X zQ*6YzX1+RQ<Ox`zEX04kcYM!Xvz-3}MK_pnM*A=F-9JL*V6-!EJEd!Dikg8i!nw-Z z1;JDB`g1E;R63%Hq*o=sKYpKZ75^OhCxoxc8z-CfjwZLT)ApvB%Dq`%Qs(D8_&eTW zcQ1fwX5_`OF^%;(s)^61Exg0CQ>c2kxlOw0Ux$p<AW-$-j$I_D^6@&dCKqy_7#>I) zonri4R~K(q*5L5FX}zvqjK~JXi!BOow+J?+-=o-W;cN-NNp64e6XTZ>{2qjxIp5B% zn~@slykIH;77{>r!kJrykI{Bz*xGWpU{(svkE#w+y>G#X1IMD!&db;l-PcpFIRB_M z%e}7gkl5h=?`{hV(oGUBj76o7EB2#(pUs^nanO^U^NCV-bM9(?>*83r?<x&qTC*a> z5!4vpD`hAid!eMD5XqY?W2rw$X>5%Y6A^>4y=JuSbEgQ@r2y-&evb{DHPJ41E{x*| z`Kwil)}2ro<*&KSuWOKs$+G<4tU?VBtdKVkyp<xIUV6GBhC*NLlh(eQuTlYRe=-#+ zBKQGMa8haGhmIEM+P{hqrzjrJI04?F?%sfN)P)}Uv#y;VgY=s-e8eaE$Vt{ijX4cD zIg;V8jkvaVa~?WW@8BwMg{4AV46~`D2qVnxGo=erZAiN+tPnws2I)T$k1ydarg5h( zdEG4$TU#Raje=4v^$buZDk?XaAh;BWs#dUimV45RP<TDgQN9_jj3}fc)0bLS0jI`a zT8a+RBbyWPzsky#MjNp1SUMixqRp>ZVCL<urQ6Xyc$b89cJv!J!C&RG<FK}u3IVoo zl+pnol2mS6V`X_bp+W)G{Gk5N&6rh6x3i+YzYwSHE9_Qp1UeSb9D~Y}Mgt-3_rBZs z)l35(K2m8lD`<BmuB8Gp=Y!};LcjneQtLj9ku~<iOc%yFf!coKt0c1l2`+yA555UF zyecw7B!akJR4W_Q)($n-uW1%%f!AB`iD6g@R1~;tD@?$N+CW(TeNIuu)#BTvO-I8F zm#?9)s%t2F%QL}(q_mfFPX3BVW!1~VKINQ6_nX|*ShSSLb}17d*k+o!;5F1LG2a2h z49`B3dW?|&%iJ=yc@{@qqxLA&4e-^Re=Tuxi*auW63!yBUPdVjhfC}aCtya$7oLW0 z`7pT32>;>w9(gKov4lEw!32Q(Afx7vP$PX3TXP(k>nWjcvwJS{A5y+V=LhI$Xds`B z)%<ok8q9^)x)MaL`5!R)E#?08b5LbVbr==u(Z|rC^6|+#4e&u9!zmDp4M0LrN1o?v z^z)oDKx(r9F?eDUeIDMWJPO%n)A)(;gWfmR>plAn$@y&`wRmDSxrsMKsXIL4uFtux zK__Q;XQwzP>yS$JxNtIPL+6|sb_VIvaJcq8xAKF}hI7@mqZ7kD?kr+0l;wO^l4O!} zj%!MhqlEOyw$4{|;2pM9WgjOOvUrJ5KPMO7$*IP=D0RR?@OGa|BoWx@Y(w)`&Q3ju z;rJJ_6SEDqY8*d?nR&0Q)Kv)_(HwFKq+`T{YVcD@I2PReJ7T+dxk!COSsfi7GHCjZ z+vqZBT?4)ztPQ*(u1Y2nbw!3*ma0lcgad~Op@BjL!H>fk1oPw38#TKRLn;x?9UnZo zWJF1p$EH^Ef8|}xekCV4T=<1C8H^*RVvJ=2<1`mknF)#z2&oe&!kRuB<&{2Sh<p)H zx3D!RNV!evY?B68pPxYU$ciLTat54DjAS+MpZ!sXHZxh*>RL=1tPch{n(NA7*m+E| zwKKm|1JtJR7PuOIQVYNIh*^#w&hQXs@H0iVF&$m!_u!io%<35oYMoz&)v^rLHeFiK z7n7~o%zBcU#wLqFeNs~{o2p8O;1j*9ta+2@kMu(5-nvMW)iWPkPr90i>ozk>sjK9e zNjBE#fMv|{CeGm&{Ps(0e(&=*p}QYO{bXjM_fZY&cNJtCr#@bWJ*v|8SdgZz(khB; zZY17UNEGyBbHs-1O)ujCrX~?~P_o>**!Y}fxFK;^^7hfKc>^o7NDW3eBp?n-d4%0Y z%7XM+5_J{p-{S5acLIZf5h~7Sd~;phaQ8Fp&Q%8B4+Y9UfUV4G>m4k<hZJqlu$Ij9 zYYQ&sol2^V4$@Wl-5GNfxr>+D^(_WKG$r4iCXplfHQld^AI~Ed>oAHEWR_RO4KpXQ zvC=Jv^8Ty<H}1dE!CB>-^~S>Lb$7AS9S_YR6?FO_jRTxJY$dS10Y2Ymo-N|TNYKUy z66dD#7aWEQ=^~B&8Qw0K{+s^;9<ncAd{+CsOpGi)qV$u-bQwmNb8n8o<swUgjFSV+ zDzS@Hj{%u@p*%$VXb6b)qzr{|Fo$n#4!03R-kdA_HM}a)5)g1+eal=%6f@ZAUpaET zYRBy>_t)SPJl5zooU=tO8(Z&_2g})7-|30T{6fM%IIqOK`E51zU`KUIgn5SXymMj! z>M0E|vJglfV=|r@KezXJDe@WlCoSm>7@HrBIP4szx9$;GXLvyD?(#~XqrC|s5$nbM zJ91!FD0hu5w}=oTttpTg`14oW^VAoH#GAyGuR%8j+Z)3`eO?PD^&!}&sHe!LMmB@y z%OLZ*7K7$5nD94H`+Mz%tSv6^MOvEFTloqGj3~m^4Shd-P|zM55+Unc+I^j3v0QhN zSDXc6$4sA5lk<sS$HLFL=a)cteRO5KR#@z5S}?-_?vL$0-<Pmio*aE?3wSv$`2G}h z*(8D+sloN8mHUd#-hU(LvovPhV~p;0N%xz9yHn=C=Ig`ruFo`bm~7U6jL<Ynbv}2i zh}-j5<3E&{L1h1og9@*;b0uVmoKbpMTnYu+VY6pyDT@B}+G9)&^D-)i&o3yrdxU%Z ziD-I1q^mPDlf3GqwIKrzONCsA2*G_$X)RWC>WERUA*rSUbS8nFA_E;h$`7|3r)xf| z7pT=Un9x-0^hRex;Y}TaRh6%6P@+2UYeH2g=S`3*T@x`fKso-OL0%ne#Fbi4bk9Qj z2xeZ-WQXA723U4^`zt<N!1v931z@H0>yA49M6RZ<XIyI=IXwuskAUnqiK~L_xn;!2 z)n?0{ST9cT61{;QHOQFmFJQ)cqOyKHhacLJ@4Y+4ad4y=`=?-nG>g8MQf7ALmijSf zh}*P;<1LSDRlOIA^-n~v{*yt*Cl>5QVj0<rToi;IX1wbn0}fZCS|Fl@UuoJzVbY!k z4Q+6R?)gv=G5FfaGL}nhn_x$(ZQ%D<WDstmxm`E8<_^vcGiDJvZ#GOLO$4JF4_k$- zXe)gjC9ZBnn~h+o*)m^O@&tkW;4HnqRT_3GgdhP#`Js{>t6-}`{o4UN{fx2X$%lZv zw~sLlpIo9pl?5fdOfQioxk#YdYv5bAhJXw=xj4@k7OdydKGeWC<0~l@GABFF%ic4g zpz$g%R&>4&pKpZ>w%mHBpqYxos9JiV<y0(nwR?ZOf;-Xi2Cb<v_pzaMVLWObiEuZH z`jef1%{=RC&j0s8YZV=_{|W9j8S{+1deG@a4F<gI&@hTkmlC^zJJruP)DFK5#J2#Q zr2uH}jibUjTSr}Xpsn}L%#Yf%kQ}2;QbAc5S*+B^I5Bu)I%V1jMds~GIQ!PbafET_ z`nZ^mq#o00?>dV<#&D!k?QdZU6G3}CP5Y-Y&<NDc4xAN4HDemZ4vFDybG<p)+ba~- z9>Fu;!9*~!JlK5-W;nI^79vm`$NG~RP9wuSqBIDD05t!j-0C6Feav8BOlM#iD2I#5 zK|B{=(KVmVuXewXg00qGkO3F{|G&>VaW>~13c|?h%NVq%(+?vwT2;M#Re*+@y{Rve zX<WdbFp4Od3#94)h>a_;A1q{(ZDOC-Q-N(blU;%PK&~05N(Mo60Q7x1qVygfK+Ot( zDt|kB<{q4`QTMN;Z*!MQB;RnSattjX8NS7z+vkM{q)v`>67^=X6J>lqvow$^EyT1j zXJDZXHZll)@snksXRcsdta7^~%1Q<s@2t0Bl<c3dF}GT;m}~J=cL{!1n1+=7RbX(f z&ac#E!Tw^t<w@00{0<ou!uUCxHcEMMPW!mIy~S7cUP44oOYWtNkv^^sE0ePwy+!=s zCLR=;%-|Vj&94xqEwjzV+QSQ!V<>wP3vugorPP|(n^cfU(vLhSt*$@NSPMGW_MlBk zXc%)fT~Tg~IHl<}*SoAPk(?f}9+-N)$1YqDlG_myVvYRqq=7tuDC=sir@f{)`@>EU zH;@GHIyV?8Rel6+0lF=cL-V;DTp{2f3)P7I!rG+`9m(b8CUDB(1R~3ByzdKID8=OP z&C!d;<CAQkBgovokw=FqisuK7>-rVkJn3}bC>6b@^V9keG9{H8^TnO*pMD93Wsp=2 znzF3NY5eLM)@TKCSZ`QZ?;TbTq<@V<r9yxXu_`U(kT^}x@ja7k<-Osn_fMHi#Mbm# zsn5ZTsds+xa3qI?Lp}MOoCx`!gG#5IMIJM=s4L&?;#9%v@s=y*C7Fv`H_y%EeW`WZ z=?ZSNiPYDlHZWpbUN82&O1(S@+tl*(5BkTj?xt}TPyf*&nkTrQr(d+~PT?1_oaL|2 z7E*NMH!b%gXo+zH_rTT|`KbnwW-Nb5B}5j<kG>vpjm=TJ@P1)>PjbK=dgGc$qV#sI zz!bhD!=#?U`~Kf;$p3+n;MC_=_&=rj*5B87SGmhk1>B`iC{D{`o~|RdAC&9<vnAcU z|1U*$y$v&O{z2cVIk>A?i7d#EK@b7SGUy*kHM>)XEVfF8V#6ObSEmop_c%kq7Yaj` zny~O;YA)j7qWj!c(czyK9o2B8+TfW(yUh8fLJZx&30OBfRpSc#OA%NkGwJaxY(DnK zU~t`$*=2c^dU=TvP>28nPe+ZcDaYe2N3}}~7aveQQOFtCViQ%0^JASMQbs=?kq#-2 zRw8(j){<ciN>B&4EPh=c12ROU`w6vk%@-DOdrQ2jj7^BHP$*L?mZbAL@HP3YgXu91 zrSS?)Ml8oHCb+k)`cywmR#M;XdcRA0z>km{tk6=b!{GaB)t@-~A-#5`Y#cdgZ$$Zd ziRAT}e4_(XdYf4mDTbCma*FvKOe$5i%rtTYbVO5<M5k)eVvbeRYNNV5C@4i+?Z+C( zL{0cT!$c+Qj2lK4>Ow6HwvA3io`;Y1I@&Rt8~g_u6>Vv2_V6lLEnYfEF1d=xg)hlC z5eev95j_aj9n;vN85CEy0=bcnDAd_Z(buD0|Es(ML@@)VBEZkMdoFQ%O6hKn*ZPNa zc<5`ibJYivj6l%W9_mk7XEO?}J5NK*P!-10zTCglL$mr4Wq`liyvKUAcblw7JHXR_ zBiEc4seASMUCyH*ovlj&JVEnToW=bkPrJCKbs#q{-n5)af3c#;sN*-Ble5nfJ|8cj ze8ayLZPqmaW04ophRY^7qY_-<0x`XfNrlgT6#Cga!zWU|GiUu!N#UOMmmdLdsN%v> z)uI}NdhH>zqmD-(*bC+P;A=kF)$buW?$7#^=jMD3XoQhMM)u#Tp%!!102$3hRGI!Y zAd_*41$N#4FX($p;(HEY!qrVXO4k3rUQXjR{Cyb87Kug00_tRZyJ2~FdsVm?0Vi`A zZ;h)td10LmJAL1<rnbS0Ny45KraIp8nR7u;r|<tm82s|^3VT>6-~09uv^!*8@PsT& z23?$&-us6a!%%M?G_cs7JW&jN3(e=CGy6^VZt1Q2m6(I!2>G8m?g?)@nS9w7UY2}@ z9;U3mKI-g_I@yLlkw!*6oSf#<guOhnEWW;R?%=8EEpG?r@BGmG2RKc>aBvd60=X$| zNF!tNda)w6&|pPfTU(d0;WjXo>4AcOB83m!iOAYjq&H~V7=LV<&6)l(mRS~EHNABu z2BY^PpAp0+hxY;=Jz}z08jBaUq^?<NqxFNaGn_g5Gxk@**2618w6n{|@W=O#x~?eN z`Md;-Oi;fL+_B>%m({z)LcGV|#u1d~zYqnj{XEvHTQ9=i(e}5*6~TVWPY3XN`iLL` zFXpi0&YJNyVENsTGX`GzQem+Yj;>hyE}5Z&SyOlWGPsUNc5kFI?2&e~&?*X`BkKIp zt}p0F-zEYS-ma(;0fpG<DdOFzoViA#1Z?q;#efP|#EVCmcqC@FEgQq%h+psQ?XQ|5 z(p&{+y({J%+Eldi+!4OFYVMR&A}1CvT2tuj^;Uy%9M<v;S7;6Nio-wGHT>-G36Yd6 z9u?VCGCZ6t=<P)%#?v$8hihHigUudCyS`7}E{ORBDoE3vv?<h&o$!(Ml51!U(Fb9w zwe&|je&GWjSrMO8@dX?muO+<5d=sDlKa}_e58LwyqV*h0q8ggeZ$g7X$%3a6I6)D* zHFB591buHoO5Y~3VQV#Y772fPNfBCL)_HzF8{YV}ZQRx!AR>2#Ua&bVmzZZ0*@Wa9 z!6lx!H+h191Lf}rkp28Z_@A@*Q=kwW{dWJNP+k`6)cnleJTnG$jFe)EyG(7UB9U6k zkvR2H)%)fwr*_b{j1<0{F?-NLP}3wGE3Ty$)m%+i4j6kKenURBPxtcL!0Q{*8yFRO z-Xw1Khz`%p<i(`8Ik!u6P4@8{C@jlns#?=84kAq5SQWyNuv_Fu_Zornz9Ga7>^Th2 z#P!O9BhKuRt#+10+#N9L8&DL*oE-`+Q$z~b-p33GxzXF??j-@^xKqrC&pogFlcfhP z`LEveuG@$5r}q|SG2wxQ;oiMZ@4CL{uVx%R=acRKyaNCssmeYPu(mZUp-}pzS;><^ z?Z<qjWzn1O{9`WPoWcG@yIftReE2Y$hnewUu2pHDeWbgPnbm14R6qsVP;mjB3KGn) zYCjTJZo?|#p@sM<SC+}HhAkADo8aS-=hy_EIR&H~`DaNWY#PCUFVS<|SfZkNN0?jJ zVEhZx`61QpxL|P7`Vvk1UEnpKQDoY{k@Qw@t%+OH!|Iw#b|!u_v^_?tTC>SGpPpNR zD@K3PdqaX|uU`HgE>$Z~!QaT(Y-Y8xpPTF)FbL>LQNK+cwZP1<^&C1dp|UhaB`~*p zZbculMs^ITBD6BaN#f_$jI`l5b;AHv6#~%+LnSc3jGLU-@_sToN5>Rs)cv9-R+RQ~ z(*NrYYI1JRu4F#vEE)C2Ur6gs+ovZY>J{|}7o3NWCm5LVDXrcQ8;612<HO$E;1D8C z#ln1h{R=(t;Xfi@`(H9rzNTZWNi&622n?(5_7cVFMQlmwr>`OC)RI}g_UMHfznUJW zf(Efd#t?xuP(__`OD231roi4f`Q(2udvPT2P@!u91|@cSEBd?2KAdtqZUM>I=9lPn znkF&)r1$jQBoHFt*{0@-7waJuo|j!rAvk`OxOjP@$HG*^q)J=|ug?5AGx;OPGv-RJ zT){vfg2Mci7jz9)&!C?Uk3}T8%y2fun%=+hc>6(Mix6367l;vjW25&0gP8zn{t{0p zXndShHS<RujvWsg+Txh%a685DSC64w2?n2w#O)KD(_MrG=+>nm2u&ry{E~7$h1fxg z57Ms*6IKML+9uyByxh@mX*7IF(6@v<T0zvivO*7xHa-9d#$?UO6Swelv$DyL{mnjS zUlHU}Jk3TLUb<lX#pb;Yp%TP!zDJvOD-z2L+HX=>6`1IMxIQV_0M6l`s-hJzDP@H~ z!5c3RVCo~D4q0DeZFsx9dT|(G*WY^H=YPlZ*EnA<BQKw`FSmp1W*~QcS8N#U{p3$b zd!siuvc)@t@DDVomOiY61Y~kXd$J0t`R(?3B&Fq_Nn{JjyA>I$yyFOA4QD}IfqEY) z1M7I6JWt^DqSKOMLpphjC#z-7l^!(`APU%dm<(XdcgXsoXYS0c3-}-7XeTbbK(*DG zz=`zR=ZPQlY{v6GeitH>_!KtxTJy8A3aROjK74Z~*iT4PuEig{X4a;)JQmWtbLZUl zPm9U_WkX@FWR36Pm{129EIl+k$u2bj!%nigkx%(+{FRp%C-FJIo%epeU=StQFb>D{ z`ivK|O%2q&c?Uv{&6(zEC(9>L6DFKI5{+I9hol=?<D8rz(1q_=THIm&>jOT5w|mN$ zx?q;|j=tQS?I=elTuu%_wcv5H<qr(q&AiD-t#%EA%<2-KK54juhsM<u)Fh^agc-cf z1Fv6Ur`B45A4cZ`Q7Frc9%rgT*17aLE$|n7AI}vV!ZZ-$TOU+dzSUJYjgIl8=r+jF zLHhJknpcd$lna0L59R+tf%5p`)6VKb{a(qyAh%YD_%g*=*LiJblIu0f(;1$JD<TWY zH|ev5jlo~K2D-Tt`MN|vzZZ*`*=PHD)G9^^)$?tc;N%-8{ZNsxkHDG}*bPYtQ3Ji^ ziA<95zIW-nrV45*MJ^0BA_+<NJikq}T9k?xF%Hj;`O-sl-$EG+VS1y#4pxOmt8v8f z#UL!{$rFA7WFyTv4#QOr1u5G0E<x;yg9QlU!kCYe9bI23zg*`rLkM7dZEuvZ9ZWtE zXp`tPg`I(RTGIv(k?9>YIKi8z$D3zs1GzcK)V)5H-p7}`vYHIEj{U>(j;Y1Jmaqr{ z_pZdkbG{09uwSer=M5^DuxnQ`l*x{C+Gobr#{ZuF3syN%Df%Ma*VXd(_%yUvL0p2% zY0cfl*a);EV&r>RzSpnwVr50m+@w2t29MCMH;aTl;z?zQT<=d}3R~3LN5(pwd{#u6 z9l}e_XbnR8V>l-%;^a#HnNgP_ZJ|Xt10S0%NKxl&omM6<1hF>CeYtsDfYWZrmjt1= z5M{*{=bQaxv(JaC)&c&2`(M{XcM$EXaS97lSW=eWDObm2H6>4V#HtRH+|rS>EEe4t zb)oI_<gZw7ymT&ASo4{kdpB#2@6%BEC+!e_RLC15f|fcWWT|?~;dS_ExwYE{5ef}q z3{*!?DJ&cimsX@t?ac%ixY^hg3Q=j3kDPSVN_BlRkcs;Y=mpZ7gXn`Z5wKD^%wi=) zi$+`0N7#l(G;|KY)%hz@MyN*sb(gYUK*CcuiIb-z4>=03HvEl;ylC1MHrJz~&-3qM z>;J=?ogUX$X`{*&aBviFiM(_ia{;n<acN+cm<g*u-OT-a_dYQpiDJ)}%;Uq)bpZY7 z^BBE-5Po@&w`@aK-CJt1Erg%}fCED9KBA9(-6)*8iHzxe9}9{Y5>Ffef0VWF8&%?2 z2b1@Gpl1M)z7ffRVN6e)8xzY^M0P}$Y~#MeI^zs}hE!crguP!nj4n9Y=EH>EP`XNO zzPgz`ZqGKYyD997wdoE%UP<~-#=5%bHXj-1XH*Zjh_fHKZ7?Q#TbikZ(rhq#fjXIb zfTVo%Tpw#0ahp6l8>nr}HZC~Xw9<92j^G@RaQ6sd>6XS@v8PcKqdj0tv6>+wSQ823 zQZl4;&GOaEt0u40Lbmi^%u}5e8+R<L=T9_=iVaV}l5Jwcx$7v7D_67BnSB$Ot0`c2 zUgO-m5!kzNo4omsS&30e%l-$XT+F8gEw0p^QF5;lv|bKJ9Ny&4APN%D7LHY2C?qWi zoB>;)nAse{IccYsUZIbKgjQBbQO)a(>}cQn-E{@|Sme4{hG2^=Mq*TKlCS@zR@s0e z@jR=MZ9wyqu?Nz1&|2GM+iDeCn&hv}VaLuo3LjqX096g{$tkrm8a3~i6uHh`#AEmD zJm>Z5SJlh;4J^KcAI*QYqFXWyG6J^d{6!XpR>oztFZ|A%2lJg!NEZuJWZ`U7nW_b` ziuxO-Bi__sN#^CG3}Vjp3_fIzImItnn~-AsPS9u|#ix?otOid(?fAKzyfFU|EuLvQ z$)xaOWQP0=eehrV7^R+UsrYMO0SwS$+*n+k;kUQpI`iC7Xb=>d*y4VzB;5;jtmaU} zftxP<60vU}X`%m@qdfVBn)m!s8Rab;L&wS=px@)Ud?j;&JI6d#C7ln_1g*uxb#oSf zFo7iZ9Q?pxlA<NPZwcFDUoIEGL&joQaSLFUjZQ$)DFcpT*26R3Mlq+G)yrm;7;zFZ zObDBnLR>MRUS6eNS}Ce+k~as~%PG3)p0HkI<i#9{(dEnVu4_HbsZ!;}dFg`|_cRq~ zseaR`aiIH+a^>i6|A_9G;)BbHW5DwvZ8bspke%+pu|<WV7v~p_QrD(1%Qc|*d9?ps zU2BN2cZ~2m2D-i0yMqDqHp0nvIODwP4~9Yfq@^*MJn@3TzmgGWcqYrz1=lb+xtK2j zlAa>@U<SEh;akMn2GjZqO-nt-%1U}nW8M%i+z8@+4~|~3PWAgp3g-2Pu9l;lZaS<{ z<r`95adUa9OD~Qb=it<NLisW@MH}Wb9IAA=<$!B_JvxRYHyy{$XkT)urthzvYIt}y zA?$zQ3pM{pq6k7XrNr`cZL75e(!WM8X@9A2K=LN}EUXraT$DGyQ(rKjD^=;WEWuZ| zKZFlcxWQ!^F@ff*xtW9J81=4yFfSX_z{}i)MNTn?rA+rk`sq`rgWr}1U1=4uNfFkW zag5{!ROiEyfWdX}LHlnSul07BhF0b8K<Dt8#9=!;=^d~EAV>H&H{E@GXs~i72PwMX zmCA9_Bh$o4=S>Scg5f28V*O4hMjKEz_gUVJro@jUVe93%)g;#W*OO?d)|r57d2&!h z_nGmJ&N&8XIQ)VAB+V$9CW)=}Em%v2eOGOQd18FZ9l5QC5tW^jT3MOcJi&qxt7N>p z(uRZ9yr`J8f0mfudYgD@`9m~>5y#ybw*HTFM`MJzNP*{F?B&Uq=L;4Iws^<)qxC{a z=;fG=Jd8+fXvpDzWhOYCiV6?hFZTDF0X5OLjil91b>BNqKnHqpOITMI{QE-B+MqM` z6<16%TbSYWla-Xo%or84J2@aH@b{Ui!G6h2<G4i|ku5Te%k%&0JB>-ZGMm0-nnG3m z49!WR+uc_Ob+zP_5Q~t?V{&sJ9I-sUOFLhOJ_EWTV?gYA^Zrtoi&>(*P)sz;os5N| zUv7~({F8F7^PZA#!j56=9cBq-bRQ=t?l*@d^7WF7T~VMj!Dh8nzOGZf;V;1f6b%g^ zrxZn+X5R@}(7$^jP2M(^UMNpY?BKql)&Mg&zJ;18J{&Eq;r^ub5S`)KO0!X1mqu%C z#T%ACtu)6xHH*6i8p8*FNie9BCflBuFlp#Gx-$18V$hIsSo4Q`HpMlaCQjmyXAXr{ z<mK)v4UeEH8F$Yi-ky9ZNc$EZw;nGhMDKTxJ@y@Usw+@sn&(`tm~gpF1x^owYR8PL zrisv>$jvO7=ueWk8c3<q>QP>}=K#NTOG>;OM#^XaZ**i=r1COCKX_J;9^e<#+SYAk zl%L~h(rH@5*uPB7=APFo@Tr5*T*O8sb+-)tv654WPE#u-OwQV>+ilm2`Q;dRh9(Ax zEqU()TR@BVj}pz2`fu&5UuEV<!*y@090G7o>T8~<S)lO#g%Nhl17~TN<+dgpfQe(F z?|;l8K&8?kOk4!nVhYB#4>G{iCyG@!RG+S){e#cSf>_qfWdnX)Opvy@In3@HmVoVE zoJb&;@xTJl^0NplRKQdHrP6&nnQCamBCa$@zfi=}52et1wsC(q6{x=+g0{tOL~GuE zuW1><C$3|6+TX|judviBs<T;EHe5${3K**r@eTZs`PkB?I$$~m^(N-FJagb&V^S?i z?Mxj60{7TP(nY^W)gSeZbcKK8)L2eyPQn8;B32G65@Pfk=G=;rI8yC0hDB(eUOz`# z?yvsG>Av1pDCRAH$(>FgZz(%&I<J!;C*mA)Q$45Dso_{UJx_*d?Y2ywjb!_h2A_N( zD)@LZu*>dv{XP5tsM`g<HLa3<6Y{&E89L9w+`B;C11uT)6NfL)Xb*9cNpH8w+dV#p zK()G&h7O?1Sfy9`)GG_yHtgd2Yb%l+Mt7bX*sj@Rcs^ksw)^}BTtPdMlJWj`;rFMM zQ;*(x{qj>No^z4{^RK8i(Qv4pV5co(J#)Rk9TyBk{p2#Qk3`VQzrv)a?+|W*!#%5i z@Cdi=Z-l+08L&r3i&|`u`X%TL2JK9!PnBm+HiAQTzH$w)3(FF+4fGH)D#Z)^{2k<8 z?d&CYNDlO>c&rQ#vE1(P>>Z+>9+NvXO|^yLle9DuWxuQ7O{8I`d2jH=nkw2E^Ag=# zA7(L<_CP}uR?lxf^m+V}j>KpIY3&s9)P*q9Lhv|SC(4&o25-&Plbf>>r+!{i0*UQN zGZiByGvDEdx$h6veLOVmCj(FN<)<IVNEPOV5EyFvX}d4Th*C7neDu-BE{Qvij?K6z zE0?+}pZN%03DTY(fp|run6amqiqI2tM3L8_$^~_G9UU{3rx<)PmYmwl_ibD0a}&9* z#Dn3}{JqpwtXeSV21qXWDaGjl=fF_X0I&td2ILOx95gX<#9_2__ER>Kf&N>6Jn=ey zzYV*oGq&9^K3UiOJ_mP{_*2qSSss?L0ZUe(P8txR$z41PpFZQxC``3J0T^%gFWK$X ziua`|*;L^RizYt5)E5j3H-gsM2>p!@glWMQ4vC-0DYhj1epEm;F7+%*QE(a3e@8^% zRmMnXYyZ>uXI&EYt!e8TH^3X`8i$Juu6Y$&kfX+}yl9Ap*^*GzXU$ur?smECSjwH; zc|o2PqVd06zQcNl(@3`KOpr~%zfUu@I2j<hlJaIK+v<|=>3#b192?MeH<&BV^mM|~ zcSV#e|4pVYT7Ft6nUw(*mtjkMSgaZSw&lJu3J~N2@9(u$+VvGW;bwVn;&jR(K&gC( zC7qbfnDm1WBQK?#s>kH$_SyyeUsSh8!r|te8156^CKp9n8Zobh?Sw!uJr84qOx>hC zwR5l{+2T)zf;o)gDvseM`Q|t(W_7iT1>I&xvXedHvzntCe^i@4HJZWtC@p&a`H1bD z9V@5>9czx0u7`%Y>}8aRjrlG=4GlNd$HM^+wxfgTyl#RHUPhwp0ls({O%GF;BhnfO zrruE4=`oR~ctC;b(80&^Ah<|iUiBWO?_N{BQ9o0YFT-t(@^y#jbq?qB00Uq{zB~V9 zQIb`G0Z%hBs!E$N%{B5Nc*`wpEl<zCJy3hh<x3Qz*s5SVHz5hYRm+aFDY34=+8?`8 zPeAyQM9d0J)-@bGci-j6`-ngHA--Oti+2X95wRFCC{WP}mJ^c)F%Xd-x_bJVb6Vu{ zdkwmNI@2T?9xz(ZKXwZ~_XDG?(`cIP%GufVe(?yuyHz~fC~<xRhJC;7;h*!BI!N%* zF50fYu|6`LoVYeav>CqD8{Jz8KfHpv2bg~|zKMs+OUBua!+j`$+P?Y;VvwZeJ+0o{ zVQp8h05&g;Hc!RZs|ozhm(Xt>HFkE309WnnDD(Gh)5O}<jVjEGiB(&E`xoTxG2GoL zjlv%2y|;%~BukgWQ~XRH8P5+$cg)|vXEtsx@Vz7S_^#yTjN^(oLK}F0#3T5w8tjY? z2V%4OIuEh56e1q-G0pkg))nxGub1%jGzY2)tz=g{K*5yjN1-jM$Dnc)sI?M11P@wQ zR_)a5Cj4IqZa|-ww%kw2fsg`Cn9xI#v3sAPdq%yeF67{rp5SmP>J4>vIp5_HzlQDV zYQUcaypCmFw;7hcbpkQ$a{4yx_v!=pw*q<T^grjNoqB2og<NmEty8gNv$T~}>VK{+ z(=JO=i-=XaR%0sO-bHwvVmo{@ou3c(S?-;~aC>hdW>99-5p8E5<&PwL{~l}lm6$u} z!~Dhr@ikW~?E!*$jl_?zk_BFE3B5|x?jy6Bm}J1JdwEK^2ay2ki}2NR6D0%GZeNWQ zw0vXT!LV^G6x(9ch99O8rU|EQrPrmGWAdtY#WLMAwTG`hYlK-)TyK+0Q0z$h%f_ik zP?F=OAg7;jjIv|f`QCeCL|1?a^(59DVTOh`T^Vo<QJB&xhfffkpuHR<+S0oC#;}CI zxQ^u)pql&zCPtf0X?4IHaJdWueGHd}e9uo<3av7`1ltHRfcTOofj*WM#sTFT{nVAi z?gTo3uDrw=uN+oniy{CsQh+q;^?NXX0kvRESNFbxtziLes5C;ZdcRo7cEfQ;P0cA+ zVq3zmJ2ywFHA)CO$z&Tp!i+!C4kmTJ0p-c4td!XnK>*^6T{OM$&fBPZCI7(a^S}14 zcg_rqsx=iAy`ruB|Ffi~_B#*XU56dIr6{Pv02HlOmNqKjO2K*8%-DR)K(>^r5Q;Jf zEV{g)=(@zP$!y;Qg(nSo1!Ss9x)q;*4rnf#xhl-)_oxXf4)Sc3A<4oDVROY~Nk8RZ z#hS&1)TPnEi_38pE#j*eEPWLVfMZPQzqA<jTtw^+_9^5$c<fmPnphcq|Mp}R%geyv ze5-wC?=cgM^p1m}!3~6(7$AQI8|Szi4nV4XKww6W=zo7`yEme|JpMrL`NvQ;@1P6o z?x0ZB&-4yv_UMc?bd96VU%x^Sey{ZBl7H?HE)Z*p^SO_|KaW3n6{kI=WmBg6@j8{b z*8z!*{ZaEB&y1ay;n%Nu3SKhjS8%A02s>+a3d@LC_5ael-`@Tee}*Gv%*%BK&0}|E znkY4EByNj10OsML+|IoF6P6{e&IEBFANY~r^qRQ6P1;A_M5#9>Pjk*zio9_BCvKJ_ zGRI|&-vAOG7hr<>&!7KriaM0U^j|0t<$8~!gBg)@Mv@$C+vQ9m?2QT=egcUeq|FaD zTpLgSSJRsstpFTzw0Ol^2@jIKVJ{<(yI&3fEl$S;`yN^K?O?YNi29oE0nIIro_f0) z_P=qZ=T8yU?9#KnOp45qNV8}Gy${tYebJZJPw(#j<Tba1)<<cmeRoz}g>D;4?J6D5 z6aGoSBu1v?6Klg~rm*l*1+$<z>WLhYF>MrlvqRC#btoGA;AHsChwYKm>tm2)E1*`) zJ|3WA@qdok?nAr2#vgL2jG<P9^PICrfEiLcw;?yorD9jT`C%`6WQ&kO!ojA^C!y}A zz+Ml+mh5clHa6N3UEBObC~pqai`|SGG8%R<b&8-fG=;O5)dZY67yD`Pmc%&WiFtm6 zOt50*!?14eHVXsOI?htJ1;Trt#0ETCnxTT0cci+m7f0vBD)oSho^ENS@ZlV1>@0x# zWy>c~J`Q+U*F?d(rqH+Jv^^H|ewQuudxxmJ8~SpqELY%<>G1+KKWf6@KO!}~d09H2 z*iSCKgB0D|3&H5A=W2=pSmB6(F`||Xny*a8QaneR{3ll4Mg)mijScgf?^|ky$Zg{- zSyFNO7{>9m8BEQeCYJeyp|mu>hC?5#Y0f;Mc5WGThgdxd8>Sbfm^G<@O=jMU#5BnZ z_%<|CNnW?%?hc9X4iP-ugF4?ihB3?fmwfMv2~IlhCH-P^R<<ry#u`!6`Q-U1`r!0` zHFZxjfo$zt#xowDNt`pug4*iHJ=}hZiWWYfCp^zpY;xXT+rZSVxAo;@=dE!jb572x zA}Hd;%xF}9Ce+xqZi4?98V*1wTIDF&3aG3HpnL{IJ8K@l<0uovd_Od}AnO~Js<D-z znPIAzF^$l4;!>qIc?G=OiRu@ZwCr@K?Cdd^Ven@yTH)0<{BYn8=1Ym8QJw5V6f%GS z>MK!E8BVVJl^z1^p^SfdBMNpj;lTqu(+2c#{IQec0=tNxQl$>WMe`4=tl#(Ccqe;d ztsG(-8)BbrFsv{3a&njw8o;*k%p|^<ES=V~*YNp}NN}+trJCmnGc;B1WiIvbK4!e& zHYtVKQm?Kfvpk~r+KhSmmV~r+6pM+X+0Rl16yI+EcjXht-75uPrL)sD*Xx%d4-p8u zDRhgSjxG~4F^hQv4RnQU9x={S7aL&AAv;yA^cfi;!&I#GvvVObDvU`v%UTPMT%2IO zZU+PML?H7b;pLj|VI(aXV5m>rO~(41O_Bsit;w-4#T(YcUK+nVcAw4>wDOW$qjy!< z4XcqEUzgWi;kPzOx7Etkd8GBf`0!JS=RW|7yE95WieuzjYdgnP<PxkzvIdHQzWkfJ zEm7mvfS#C79|Azs7s4>Q^5Ox0h$e^80!L>Q+GE7X<*;2M;zgcMvD*h2eJgj(SA4Ff zIBm3w(d-CT6|?;LN0S=|eniD7@$-l{N6=;KrNUV95Azv8iS&!~kOo3P`^TsloUc|G zp|1z1PKGwxi^L?+!V(r73=^a#%(xY@e|Y84Ljt=|tZ~RKu3UWI_qh2qg9v}q)PbB# z+nWJ}hqR6^PgIlwFd?*--$+~PwQv~YCqDbhWgPsc%>QQne}z=9Ppz50Hpl#CZB>n% zmO3z!VpZTGm*Fl&YXiN_dU6k6X=hhp=|upbS_>}Y#7-|&prv}!_isxm`#`wVw3U!4 zA0ZdvnX)ezeW8IxdL4D0lnH-}Pujgn?)|C6Mf=llfQSJ^&nG818%vnSRW_uCvm>HM z4gP$$7E(_)G&g))4{R1Fz!#c<|Nde)E%cg6Vi%?tQVGVPGob@m!Bcxv&{;yK_s54L zhSNP9-}~?h(PsCE1zf`*eBt6L=>j1XxA#4Ve+5Y=p;F*5R}o0U>1ARYJIf`f*Bz<P zbHu@cz#*`EdqSr7@#$?9U5vSj@6FKUF)rh;0f>xxN>1p{&Q{*Q8OA_9+s9E25}}o{ zqZ1L`{(tQYN~LSsW*5QMeF5B3C32Nj3|WPDT}=QEl!&Kj&j%Rl=Ldi+2`KWsAb;DU z^LE3qj8HUF(e{_g{D9xZrmp&=<c1#qwR_KHmvW&o^HGuyA@z%qxjca}e)BtP7u|(> z_Y$*@2Y{`Z#K$XE6v(%F`t^JezWpBq6Hw@Rk$rhWHoTKWT}t^;f$k%zD!(dC<hdO7 zS%p7(Y=~_zW1LR+<&oHW>p4Xv`iZ;KiTiylCsrD6N%{>(fe$kM9i{@6SRNp0yI%j# zC;~LmBZWb-i1QmerXV2h@v##+Eq~WE^4caU^Q$8w`<ZEE!g4d3stfBQhC;gKXx_>E zXTHSCtjL3JpisG+Z7p%o3ql}4wT^}gHWZwa7j<M@ZlUybE3?47Yif}u_YUZmF#;iB zL+^iVACntf$XenFAZ;TkhRAL8QfNqS@h~^(&mQfC;`L9P$3}d<MQW`hPruas!Omsc z^q$8@R2B?EB<d@C5Aa=p>;T^@^dhp?d9p7!Z{PA0b+;&y>~THi={0>a&Fyk?l*_Qk znPS{JuA~@!i^qqC0HXRvk_OFz{(?-~Uuw=2+1vpXf3XC*)OHC27ygTN_+Pb)k<^ZE zNvpXCdGxbzHJn&Kd+A5GnceEglE~BR<n2AX%Upk&r$Z)y0iy}<lXZ4i@p40LM~9dc zASBU4YUL2ldJY3J_C1MU*hA1@Cog#~*5DJ*a^qk3k^hra-eQISX#(~jTR*Dj$ORrq z6g>xgq^)+(%`+;-dosPAp1{Q2A6D9|3?<<Q>yY$~7$ec^{zNaWKq!v^S3n}TT2mH- zT>9cd+%i?u%BUIrQSr|dgDpRN2(uzj4B>B<hIa?9G)hkYNOKW!jPEYsm!T#SZ37*i ziWiRpG01Tjaa72r?*Ey>@{@ZrX#my57r4Qkohxz<rP-%^LhYN$4xxl2^n{y<$_x?T zDo<lrPD)nYHVMy<<f~1L{3tm+#>SsJ-V|=3pS=P1*X;<{Vj>r)HIES$m#U|fQ`N)z zg3+*4K8#doOK~-)JBgZdFp=6e_d$q+C=#cvtK%JW9vsq@Qho6Z<g30(j~YC^H_7R7 z^fqAK1?1yTheW{DMRl~zl_<!u<9Er|;!=#aA|~ra4bOpz4L*1!-rOQj+*g<n0U>Vy z+tD})PXd9OtQA=-s`%G)@fhGTi+N)=U^krs_AQ<$W%zSjxWL1>h<ADBkv3hkMaGTm zwKG8oIkP3Ls3@dC9TxbciKxk+ko*My)W00s#mvUf>eJrdc=5lp8k=mX*g$*9)IOV7 z`Rmr8)6^f(E|u9O%pBQ8JNCWJ1$GcGDwCO<deqEiy<C}bAu=CDtT1J2=d4r)+hbR_ zA23LVR{;(Vz<z;E0jTxeKHMH7E?rJoIIB2c69%}E45QY=nbSu9KUBSCP@TcHwTrvE zI|Kp*cXx;2?(PsQSa7%Ct|1Tz?!n!I1`Te(Ex3N2ee3LVZWXoQ$118|b@w}a&M}_R z*we@@SKjFN5up&2VIp70`BO^&<+E-Wbx}UwMeQ77dC(>XR#b}(z~sX04Q?+H7gM_X z7zm<Y{8vrW{v5K*%9#gc#Ft>DJJrfBTmtfApPEZ|UT@!A{sSq28`Dreef_&~;ToJ7 zE#9~U^?q4|wb4=28v6HNdZfyisPqhJL8*0d4iHNB=p(Pdq?bU3;pk|t7j!{6@Ap-I zLr^cXIY5S^zOKMlouWx>qjj#oqSB0qCsIqRCJs+E<?|3?G3wL3+`y-|8;3+ESLe3S z^)-R--W8^LCM^<_M@VA2FZX<{0`qC*slRUHrRFOK3@=aYyc?E=4dao(rT`!t4ZJQf zM;sAQwWIKRng>t{<<)0Yd&G)o%fuQeOs?-zdLw%XLZXTaaAzIDcPi3q?9(<`-Z89o zQ3t#v9hVyKKj**FKHlSB@>DZSs!R!@`_I@=+D3B|+fYlzRd$!j)4U*K-Rm2t{tALZ zT(el)9>ZcTPf|2>_t%8#o^w(MnHBBc5-(Q_ODZDC&u1#&UK9OzPIlr6WlmQmxlhah zMsMY&!8fUQ4|U80IDS*DGj-i<R4o*q9K)@jHRG+RGQy;Q6i<6T3LRYzB(7|Wyiz`I zB93ed75!9Fv@gUe;PIP9%L$FJev-F3Ww)9)O#EaV%kV?)L^I$|2yW){b|-uC`Q*YA zCR>j#XFR1`@0We8K`znF-o?q7Ak3c)s&9-Do&Cv>a`r5Bf^=e#W$U914SSp_%z3!k z#=d7nv(d%j-9LKW{pD!*J&<k*aqO3Yjin7?h=cCFZ_pgl*3xa*cro+_P?A7}<wdxb z-qIei)Dg3!gKkA`i<Fq_N>Nr|)y<HtB`uWj`hS*JoY_z&RN1x}(Huj~uN=5H!Sa7x z{@|zN$1@0P(b7~KsS5@uU;I`dEoGq>fk}g<5?i2DN~GCu{b(${32+lf?&sbtkpbLz zpkplC#4U$*BZp2t^-o<fZC)gU9(C&(^3q$O@V@du+>hZSm*+c%zb@8mFFs0L6o#3Z zD9S0hsQ%yjbrkI=Q7w(>qA|^*X5gkTkv!d?|DK}m&AtK9pQi!ZnG^A99+MNBAEBK3 z88lK3FhAeFW0FJ3<u-uMRmOmr5YMEP3c@4oTo}CNr#a!4t48*^tvNa}ainKZr0QQ5 z4Rs~E##M--e3XYvU{O4Ji<f>g7oho;`*YD6b!uQM8(uOEsF8uI-}GE~4J?;WPqHr$ zk;ezK8{BtSg!k25s-1puA_5ZrT0yRC#i)QisvOKwpb>p+1drx#{Pvyj@RCJ?dx`S$ z!M3*8b_@g=Uj%<bbSQMN#jwwm6aFpW{Iz-QIIn%~^3ye3cLSPV7w5Ht)gvV5C};uZ zD9Ska;PDVr%bKpMbVu|m$$CME3~%&&>!7&wKZP~#<X9Du7lHXP&T*@wEhzC3P%XcJ zp5YnhNoZf(bVZYK@coaUF6BOpzl6-xIDOl%3_6jlk_b&Q;va}#Rxz?SbIh*ZkH<pl zSRGpj+%u9XPT0lH(XadOtsroy)5LCvNsV8!TUip;H$?7rY#?M=_CQ`8LseCo*p|`l z2v>P<k!7zMK?SH`bv8X6(5G<eB{_T^h8eW2CzL0342?1y7thF^9!tlOsb&xX{S8CW zHtcck9B4tc+Oq*ko0K9~#18g-Yg}D=OKAoM1|QO`S?r=`UrDbsEJtV9DF+W&xorm5 z0u&TxI25rt-C19<)&KLv{u@%tcKtR}IlEIe&Cui5&#!qf^Sxganb#OkuVSCBG4EsW z!BZ*`w2c0-nA*HrZpqK{m8XsHF&t(>wV-EU*x;^dv(m*lTbQN<CEg!zK}}D*18EKi zo0JFJGR5HGa(rgm>=mrO)Y}_Npavf>8d-EoAk&^VH0=JF<!U#B<sqO@)ErPMw6+RE zQlw<mg>sV&7TiC$>s`{;Upp#hQDhTGvMqkKEXoy-g!hUv5`5$Hk_0Nlm1)eEE0_}i zl!3=haHCDym35=6NpXOUyiO)(BcMsi@=lm+!^sy$$tefM%-vm07s~6re#yn_#>5Xa zInaNgCFD^frTRl>I?Kn;VtloN@$&ZHTNp4>lvS(J_}^$6L=ou=$g25Q1G*11=xNM6 zu9F`;-%&69#c%OCb0HTl!cX6DV{(;!!NV(@BdS3P-qC8LJ6hn~W>XWRS?=m$SF<Te z^{u#3V1Bf>fklY7v4XVVJKY9mue_PZduyM`yreEa!Yj1(fN!U-9<a)~G`47CaLL_G z`$uTe><wYnsVsIZ$X{bt?fs_vaQSdxg8>DphuO_59k54$e-5at`T^#_%M(;2V9<<s zZuhZf^N84zz9iMP@a4jg;z{4qLCeO!GtNIvG1wqqA>A2T7M+cU&^04Pgcp6G+UJJm z;~VONI+K1A#?Omj0pqcXA=<Ml(+P#Vj%BP+?0xHIoWtPwMT_jN=A#tb18%yFTwA%M zfDh7=;6GmkuI@myC+mHc_Q5<EK`aeVBC`%OJQmiBOMV2$uSQ&K%cPo)mu|aS2!&T5 zM@&vdN2lQ>w)y_kKvrX(og{%TkyWG;q3ZRGwE$6;chl?=zGT}-obn-zWpSSyFy)Ku z$tKe8ief}QsmRHB`-?rjkWRm-W}E?xD9IZ7Ad0>|#_y$qvUx?SZ|R9D^5%-9$A1Hz z{}*;=+=U8bW{Kpo8$ygD71h;=w*02+1=#N=uRehY?*Wcc^s@_md|(&akwQ>TvNAE| zoZTqV#M|VoTIl1$U#Z#prx7|kNfh=`d;om`(4hKsn{oFdbo@Y6G95@XX3FVs`o@oE z|M4k)!=G$u{I@aw@B<v%EyQqA*|yOPXH8XF`niA?RAgg^QhS~9nnPkKgH+arvND73 zNr9zy+SI97eGKqV*l~r3dZ$oTBG?C?|ER@VKMJp_rTQYshjt{92Fsn!*b|zR+>*8Y z!k<EEr;DZl9|!xz!~xbMj_$>HVT9jKmj#Xn$)Sk8ru&>9!l;3XK}8u%OG+ODUehOD z|GX-kfgheuh_4Qjl6Q496=zVs{z{$AC}F_T%+kjFcr|2oY|hC<9EQ%JdGOV(Ft%o) zulYB{#=Gia<93?I3z^o}Gw?f_jYrno5iJXH(bVuDQyLKI9H}a$baW7QL%>*8CKL0V zmgYqmf!|A@<p{0HKhDarz4g49caT#bvVFNt;o)3$s@3O-bR<M#tE~;NijuU51gNO} zlFq$EATB$tO7`!_`2Om4omtt!5=72BeJXfVqS6g$+bCiQC71V$TZAx~BhZFyz*1c0 z+;graSTGQlDNZdpzl{~kQYwlAL$S7$vs;Gs4pfNqIS&`-PmkfC7gu!cp_pYhOH)&0 z6%^9tOFo@Vxu9pjg^3+yl8zT*zWKmEGC{fp&i+)*qA<%k>6jVG6oe|buvQnFC<aQ; z&sT=d-=Wi}B>d$vt?!b}{YsU*KgeH!F4YI3tuZ6~90?6zdJ{8uE{_V2<ulwT=k@~f zr~jfB^Wk*jUX<*%%C_~it7dzQjkYEyT+h~%MFPnBeFH#;bc=Q%!s~7<W`qALj8G_j z%faXV&Cojf^Nx2{t=|~gQf1o=^{AFssQCOu!SbU?AWs(d!Rh{f^0Rv-BU8iXgvOnn zf^fTZrHI9S6#Y-nPr!EU{$B09+TiA%drnQNkW^lWFNXy%I896a#Yzr2X2cAhg<*!e zB_D6`p05~mdVvmjiPl0$aV_KnCLjtqzN1i8{AE)(D4w&?T4*taD|WYFZ1DcuR>zj6 zs(G;e(g0|dyOjP(d1HO2jDPmF@SGlWm2foq6)vxHHEOHiqRJ3-LIzX6XeAZ6hTaOd zZ28|wlEGJIfzDAKc|h^)>!ZjO=#m}}xQ+hhh`l8sHl3kUHD_xn;m*Psva$Hyugy5r zPmD3jLP+_HC7yc|i=<e?28<ev)X|uU@8|vfl`akl;!v=3M`t<yUE*&8UeK2kKzxOt zoVQQ#nJ1eX+e{KdG807{9usGxG<NxiNwI^1H-VqlG#?`PvTj{Y?4LY{*G~fRBICdv zCu0s5l$U^dkmP%7E9j%RJ#7x|nUQCwrdsJT5M;S^Jny|%M--1*suiqc6fp<;7lsJO zctu8`h<%gFi@rwGp%hf2Uy&Zz(_UY<?>M*M%T-pWiAU8D#9$)xGWk2%>>e`&P&fVk z_VDy)C>deK2BWfa^VU;N_%!0j)dSb=J>TvU!~K!A1u-~TJ;q1b>zdemnNoiHXX>9) z`h4G9w`Py4$CUU{)5A$DTOZ`e#pW6uhpo8W-K4kq+1xY;<O!|}5T0IQ<$D#ne2eK@ zGwU;=7%Vs}=jz?A`fZc8?Mt|PQuJ>uIcRLW{ZGW@S!-{fvHR6zAA70iwmfF~yYf+K z*6g1yasU6bZpm{C4zF~yJK2FALrm!HC5?Kpxd&N*htmBE^gTe?YRjZd8ozJ%lfK^r z5k2rLrRMtv5(mLIawM?xp*p`Z<Wrg@|Dyb4?-y`Lf?-a6_6JUH8u(jTGC_*Y09ik; zgpbzvZ5^<3oI<j*3>|EAdrP-4YMGf_v7Kj&wP&cp;`L{N69{WyD|PNdvB4VPo}{P7 zvJhQn{<S8|rcTx!m!&+tq{3{=7^Xs2Iv(VoUVFE6qz#yW50|(v`=~Elf(RE)q!R-D z-m!l(2BGMp*nnH!fx5>U)u1%y3qTvRjM?V|#M}lIg8x#A%vnt(?C^(Z6>|DXmf-!C zM%k=D<cg}Gm~^=CN&Gg9a&#SuSC7HaTg6!jnqmf`p%$uA!57J!-_98c<WqvBpb>f8 zTxtQ>e;1&I_9TeV9n-^^CH7eIBa$=ACI>}VCFJbeHuAhI-+IeQ+lq_f_O2K-P;K`D z2F(Ds;9Cm0XfxpW+Z{@<Nc?(t2RWK_xsw6TE}+e%47h;udO{pwXQHc-BvMjb4s0L{ z{1J_b+u-zeFSQzj$#@HJRaQ;brX97%zmpZAg$yuNo1CrD@-4pU^b+-RN!Zy4v<S$z zI0ND)((%ztjoT&2@5KRU&b3YnrByz&!u;Y_xFwrrNRisZZVl;Qq{uh}?bb^JOo{{f z@kzMqNk-V|#~{YJ)ht{g0i)oHDxU`2MAFj;3hjNasL%S3S%Q$-5;G+@w$q-D!}P|i z@_zMBSoc@jz==QAzFV+na2FxN6(-7XgNOh(mx>E&hm{xMdjQ+Jd<&#?V8DOb?93W7 zmNDlsenV&F46l{OMn@E@p3D7esX-=I5`SD<T_y3^nxvmFE*EEDq2?kwk)JHPgkd^Y zpfI#;sk^EQ%h3sxxuAh5cXLSFE)2$h+lKKsNd2inJ(iABD@SeN04*GhN4q;PumRB^ zDDw60JP7oSN1j0g5A5_c+T{-HhT6AHdj3CC67yyWAH39NiQ1G_ZjI5PJ55+XzyE)j zkGGILhlq-XGjen%sih}#!jteDnm5PZHG!}9_y9!Z;%xi{-+JmqTnol^R~lN52!j^- zTp@;Pk+$tEJw9tC?AEnM5`eLHy#k%FS3i(#thYt1uJwY6H6C6`ptdH(*Dt~C+Y1`a z>hqIuRQ_>sFC3*ETO2r#VDc>TLrK9%%95^I2-0Lk31iN}uX=mZz`?ADbZY=04Dmc) z-_-@+b2k?>BG8E&5srT6IH$GfI46~lz!TmV<|2|!GD|{m<cv(h`)a!}PAfIv=fRJ2 zwpM5vB+xb3;iJ&d5KMqLp=oVxlLzbnl@ryHmX6mCHEik!=|`^jzSXs!Z$;%|%LrIC zMQ9Kwh>CxUt#$S_{wA=W_RQYug9jfXz;qyN-H_2Z0e$K5)>gMz^(2A1`vxa3Bjo*- zrVO2!&q;_0zXhF%IT%aEA)-{!px&vqfo3-|IK42%1V}+oV_@hu<!pU>Qn}E5k!FBK z$-y4dR!ccrE?C;tMYkSTloIYBB+BT*QY_O8`fnAnj<%i!WP2Ur^d-@B59D<6P>(K1 zFW7p92CJ;-n(KH5t7M5Jv1&T8wo3h>?p>>*OBS+X7{}r)@X;9V73EJ-*IaiR#~* z(<g<Ns<kzCvDW5qZ!`%<t$ycrb21=BGFiD|);C30RGThnnYdySq4qC|NbNr9AAj_} znFutrRD{SHfNE+|kMOm43o<;mS=x{ih-H<p4D)sQsEo-8i|1(cjNdFTQ7*3zI5|-Q z({eQngR;tJ?dlq0{l!Q4MHzHfed0#;-fT1B`{UK@bAn%l5NRk~uc4T|!`;N$LUN(N z7mG&(&>=-9%tZqF06sRng(ZZ&{gbhUcW9Te1&X1srDiZx&4iess&lw+O?3xsDZf0` zocyFNf0>Iz=H2YumSl7A$Qw->_O<ZfJBGiu$5D@CG1mY6`0a(9>+=6su3&%lk&3}u zKiQg??3G*izF^VyB7Iw$Kl14%^>U8!Y70gkFQZdmGs|qNTk+hikO|r)_4@r8XaLz^ za%D>%Wf%MUf;f}eJK(GXp~j$09=`#S0$8HE&^$3sBR7S){NFGgU&6whefL1q*tq(c z&Cbz-;-laa&!Fh{C?)KF)U!^s@8894>E#l62TD+*f#~LFtiV@o=Wd45J8Flot|7EA zhz65eu7@TPyhW_Kddi77-!cVU#<Yd*T!QuW#Aje|gF{U7BCsDhrTuW!%IHD<r9ZBM zWlpW7A_mpM``)jru}Ce-@M~Q|{!fuOus$B7qoCPVuExt62dJSGdOF=q4Xn0E+-SG* zLWel*rKbXg0sU&~)?S)7*BJ=OfzsSh!qFIKo0nO23w@NI{}eWy9b$R;2c3ELcq=Yb z*m1H|zQ>c#3Rk-r-Wq_J57D6YoS>cv^QWDp_a%*<@W8O2^w}_UagW81N?(w@L6-$u zuKO2XkO1@Mle_GHT!3XLkl|n5^VW48?<++~P;aNxY2DlIVvwH>7*2Ok0$iic+$ksf zgwF6aqC;!Hqd-=a$EuAXb?X@oIynA=-~92aK~lvLGka|+49|dA2@_h=IEo=(5t&?9 z-8<r5xzi&tMYSrFYN!=!Z<DF><zZc^W^u{ozF$JTS=HZac9s?Pr&{a4=7gzy-m5sB ztVQ?OJ1v;qsF|99NtW!dge}^&JRbePTJf#h*Or@Mt)tH%2X61H+omcGfw_2QSsYZL zvdPYmiiji6=?Sh~pyAqq0xb3;560DgGP&lE)s7HAA#KnLisPCx{{Es-W|x_1u{pWj z{=XWV*W8UVBYt*QEFrNmaz{Y?$jy5Xu9_D&sP{(;I{*$X6d-m6Y>f*tce5PD<Dcn~ zpt9tUG}Zq6C8;JFrS#F2RVHGv@{amw9%A7ukP<|)Lj5myxJRO>?-6XHnyIWjuW4(^ zJL0O%rZr{uIUnyVv$Sz2#6ijGH_j1$x+61Z%8En6zH2Yj9EPQEYsOh064FOUW4*o~ zjm=T6+fC@iH0UjU^3H9PO)<g8kK&mhF?LXI4^Z&-ixuDtQ^wCX7R%f8k7w3j)WVj- z|4iS*M6*cWBg3{PZF5U>iSl!TzM6l^0Zt-<b5I5|HBgzp^6-nuC2B+PVK~O1hL-Kz zBM~yuynIy^lzz!?WW}#WHNfF}E(Cx<jDFT~Nt7*nj9MCTl)l+mP1RvkUnk_%VA&vL zKf_QG898rGZM{X<`NOw-vehQUdA4bY$?2C=Zc(#@bo{*-^VA<Fh_tGD3)huw#NPuQ zj5f3D77C9&p+3@@WGijOd2CfWCUyAF{9{-MQV6%Je0UY!J9VN*jV_83o<W2+tc+8+ zC!)8LU+<CCor}FF>Okpe?av2U2p|c4Pl+BGKt(+S-s5l$DVE9Ke80U$`x!iuFc~6U zyo{i$*Sq#Z!rfch0H@eB*s+n-_0m}9sH-m0rQc+i!*$GLfUq@gl;@!-;K|4jJMwGt zI#YDb7$czi{xkQ*i>SF*xty)N-y>W)V7rL$qH$iwIy;3?Dhmti?kBRI2oP(h%s=?5 znh#-_mSnT8<nC_$ZNSRxty@?Ief-;>eFXJWy-tov<Q<^P4+jdX08h9D(qW(Xcs>4{ z%232AFyypzzb2-}H^<0?1qR!&&J-FJdJK)#$O5Q30}}R64YvfmYJdU)rkU(Hiu9tX zf@5rFvgYQWboM{ozt^gg*WR6{Jv%?b0S!Ayli`|j2tQF+9(9i@xDCx_nS0QvjKRn0 z5~B9KAqF$_9q_mK-O0N81-G?`k77j;%TlAh0Y;448LA<C*oph@7MFMXUn(jSNk~4g zi4<R)gPdiMhj$y2ytGGW<xh&2#UU<23R@*z)#hX`T=Iu&hPV;OLXd(C;meJ^y*pEE z_6K1;-j6wEBFsDxa_dMAtqeNPgUYdgZz8H}jB)7`==J7c{}u<V4-u%(j-py}(qiU5 zy~B>z^T$ibAlla#8UiS()Pjo{2T*2h+?*wmgK5l5?C}x@&|^YpA3hMJ-)`u+T1ux} zpED1<V}i~728eHFHj!L+M~wTHHq9X{?EAD+Hlp=<AzK7R8%}h3w$Pe?)$d#HDLgdF zW=MLkxMEOvQ3HY7!;^pNXcHMfZG~5C21nP13QXxw?8W4UM>^0SWVzx>Fk7UoL!g_d z`KE0bRD*OjEB(KASul2wXo+tJ(SFrM_t9j~ua3Z@jijoTnt_|KGX;JZmqc#ykpe`1 z(dQ4c8X<IMMnxSYt+@prslbs-R>dR=4tt8#PKgg-hPz2UGujO_Gks1~<_imKV`GIh zi6iDwrU58HbMhLtDE(Q3RT-L2nx&@)^mdwz`jX+J{2vp}ZqA3SQ>qi_^Mq(0Pnv@k zJB}<j<j<iNF(DX_72YAV{L#f|x}{yy(b4HABTsf0FrhAL)O5FJJT}jVX6qawW2Ix~ zp4-{s)=$$)c<3}Dtg#`lyZrWGvbJ&b<>oIreV3bUYV}Flq^At+dkXcuH^GJum}keI z1-%u0{N<)QdUu7QXWgPf9esNShyo>xONiZH8zUVx6`2Oj(&QFB&RKFv1wQnB_duCR zin^fq(w(4~=}7g@&(&dAoCx=`Kg56L3-#rH)U{vyo{?VnNPRqs<~6m&6JhbRaNyJD z8-lVBG_fHV<*yD&;svjkTk3(#+*xj|gZk4G!s|JvoG!))8oMj6-VZW)M`PlBa|V-= zg|LagU;gJXznO$xE*~<6gH2w_cGbKo=!m@pZpV6S3z28Zm+i@&u4nlRaF4tSty>+m z_Fi1c?t#mbCR+K?jtm8|xN*D}Wh;9ch$QWa!NlEG@IHR<c768aW#}DHoSrz2_d)>; zEEGTO3yPk0Ctk&vHr(DdhK?0{mY#XWFlwu|e}U+0#!MwkXLB=b^WF(LQgB@U=K#X= zKim&a{7FM7DdEz_wy2)oh_f~rj!p$_0%F}>j$Gr{yi!{km)kNc*SHga$FkXKSfnhc z!CPdBTA-3-q6-7b5}d`Iw41tEFJVB)dF^LF8(Da4!J04^kPZ8BW4v5qO02IniV^yI z34O>|4jbezTdvxlRuGFxFcpZ1dAB`W(~oQ}2a|4w#3e<~uI3U|B}j);GnBfJx@7We zIminnLp`<*g|L-j5ERmwc8;<)6c8qd;qgA+CMDBVIepRZ*6<-Rc%||1WSg37Rsuw~ zBi<Ch-jn|;BKX=>8d{@i*l0!yc3eZBISYyD%;EV0F0(2ir>^kvTfj=m>!JV+=*!YB z)w~>-ZZwQ2j41eBMTwyfR^f(mRc#opC<IQtbKQ6v#OWK-hM9+Z{oV5NS@Mv+vh%wy z3SzG*U+?O_EiOKg3<2tAQba_`iG6eob~IQS$}B0r$pVUaeUyIGhv@6}+$>c+vu_km z%`e=p#QhGNZ|Al=)^T=Nomn1bKOMG(X=@3j0Rq0bkIoSvoYQRp*SbM+%|<N?;SGSX z1|Nv!1zBN~+AO2IYmtji-!NmaL^p_XHde=heK|x5@WCQTSXj6-s$QnX@wFzlEsl&U zzivVMc&m-~>P6=Nzbc$h*5T)w#;>-)8~#)BR^8kan^jc|EG!HOD)b<k@%368+_ejz zP8fEN7FuSp8`3Ec*#^b4L}x;Id-SoBz@*PpVCuvSW@|vo!V<T>Q@XBM=3$>L?(9G9 zV1Q;kUPGJS+QP~Geo?TH03)?tl(M0)W}aio4hi+i7EcvF`enX*uCi-3AHDT?P356! z6z2i8YiYr6kLShjerB@kIYx%EcDd^<h5{qE*7FZD=9z{m2T{ffY^<Sw&_g;aTecS5 zPksq`xv*YkMu1-O@y~fxciI@xJ+ooS&wX>xs_QnxoO_E&2u1v9IsGLqm(e`<=X1(L z#<@@uXH5lBkO%Egx?=w!UQ~)MIH7MBYBu*ARt2n(S11{NZ@EMZ&D01&776-IBzvzL zi3-QtmXMTVpRe`%jDo#-T$|{pm?DhOZM_P9Bf^vL(!|%qC`j7dOaA^{{P@TTO7Dvu z#D4^SkY=#FMwS+;_D6c3p5g<w=<S<o`*J|zYL01ZFB0VY@^r^0I5FvpyJBAihxIj8 zp(J#-^@CxbFMS<^nQHhEy&xz4MmcH+8IIFT<gPQc$$d{=mA`6$;5J!VKsw{>dLz7s zwyh$4^V)CP69aX>j|w*+2I3JN@-rXbSHK?naErQoLwXD(yWV^)RWCgYMbwE?4FsNp z9ceE}d~}yiFtf6SiDvjvF|+-0I@mKQeuZ+izkpKw-TsiF!Pc@PJ?SB-k-iO9p7Sx3 zTEA?jxdGV~?&Ksx9ZJ4sOHsF_P{ZtiaWnAu^*K4gbPRr_9gkEuH6$N<J{8XSTkzkZ z?|ONhb{*;!)nj%iOa$pHeoHE`@|rV)`K<NZgMRx%#D$&gGPjn$$k9A!fc6h)mngL8 zfY%0uAg||SLS3SlP$512N}Tc2ygk3a&HNYzSeOG3Ht%@Y@m>&7g6{iDHVqJCpp^hP ztv|dHESwYeC-AIXO+6uu7EaYjv6IpcFie>3ry;vcT3<IpU;3u1TqRH5?09(0FEsy= zv+2ljB_WxWTWG09KQB$mM&)dGVh9$Y&&)yXI@Aed?4r)dhP(eYMsc<0@WIo#Y>jFp z-!Cs-n_x9GWqAKgW5|ETt~#F`{fhf&9A~a6>h@^;jF6w5U#p3ZqpN5Cue(LweR;9V z=(BRthP0(3tGA9JTGM%(7b}Y~6^n6Ebv(UFg6q2>uXpEqSgGEc%8LlJG`7K#P;oRh zD(&d&!;A9jZv!FyI|QelBhB_>*(?Hw;R>X_=S#8CIl_3VVWC6%Xu9YfkRRB*=+%4W z4~P<)a;(5T&FgI@pjdyMSEzwc3$21P2@A~{4yJ?bpUFZtuMeV=sN|?5x$4(0kTi~L zUqBV#$wj+rmCe-NT4ewYgby_l9bO4LYeF-95=0UI0u_Lq%Zz71ru+LcllVC_yq@XJ z8uzg%A@hB<4)%_xn=&E8bxx-N{h`0h(m1jo;PT(N=xS}_WwKf&b6%CrhptHVntt}_ z$L(vZa$oE<MNV*yo_?uFWs#s6EZ_Ek;!I-jHOsB!A&{zXPS=IEeC}9z++h0Szt1QF zQ&Zl%GNnL8K;3iqm0KeK-Qw!U^LCT8d-7w_xL@l;Mlz&Rb;Cm}A|1MCa`7zP54Q*l zk5s`ZhI$eqfgyizNqV8a7(u+a=F-FCu*f=$K;bbgjBl5=Hr(Znk$-H}R(}v5gvJqJ zcYE~mV*OA#P*o91z#Cr!;O3yquu6KF&ca~a5u9Fq;k>@dUwEZ67t|z9=!RqZg|0}B z73Ki8R6JmHP#|K=%|HMm@U%}R$?GhHd;W#Y%9$sHZfM#<kiKNz<BL-jJ2ggj<Eq~~ z>8$^$kN@7J+d%6M*JAZfo3yEP&S%HAIfvOEP@v4onOLXw2WfLox~8Y&IIm9wqYsdh z%>E}6Lj~wmdh+wBJIDqZ>7rTXu*({h+YwT#K0q9aC7R|)Y-RkT`m`xru3~S2=bz6d zDWH)TJ-2}~sxbE3T#oFr2TjUMW{(}I0TF7|AOuuyoWe@Rm2KtUa`qnmugH4HGw?m; zvWmskxg5|NQ`HO-?VDH6bVkABX%u<vMAu`%&($9%9I-z;4}F`;uC_{}Oazrh6?<C$ z>Uk!6p0o<NZho?ST9lX}k61dJ-~7}cdPIq7ds6iU;(^tpz*1KI8*O{>Wp<CBiJXW9 zk{kn7)n=y-=3b{J+|8^p3PEvZ)T8yup94Xr1-}cd9uo{52q7?_!7Pd{3#3pboTefg z-y|mBH;&>|8C6nn5x{|oOP>164PghJXi4twf8HqbRgQj}YVG>sMW9i;WR*EpPLzFx zM`WKvsz=^rX;2Jb;h`X{(S}6Kf^jJ~T6Nohs`c$<f#K}IhJd4AHE~0Ofd@oV@#36P zk?*6V3R$wCxA@aO<-s%1bGDfV=opZ&D!3n#Ac<e~(dbFvLf${%+U}LJ_Q^Vl6V}c+ z%pL|c_Q?d`(K6K4MB2Wi@;Brv6B>nToYTvN)T6?Mo`^KzMA%k`49CV7bRsLN=jG(D z#XB6I+bFqKcluGSEc}4NRJQ*6WwBy1t~$l6MYVUc-X<jedZa-D?wKi2Q=hW0<ty41 zTYJPHMI26jOQfMrcL~Ehfq||#3v1-Ran8Y3z27$u9yE$FWiiH5gE~bto7@Y5%t%wh z-^L|@$Iu-eJ|YiM9g-D2Of1+^m{yKqHeTsA&iHN3GEKEXD%rfXpePEauJn4pM?l<w zNh?=NC$<GsiwTUPnn&+lKg5F8E|C5t<kO4zQ3(sv{b;3ni)8kv<~t*ZMKe%3vj6fP zdQI9_L*osE;;z-7MLwN>Nqzr;9ltbn&y&y5F`rr&5BSH$d%}BpO22GE-^Zk1eYy`@ zdwr3-II0H9m5p~S7}{o3F*JxtoWY(-1MX9G74n4a=Te&NzbN#;5U^EZ`y4Wk{1e5? zB)X(ZXWz;yGMbt#mO=Gk*HXS8&Gr3<h8O3bKMUJ$ZBz@qRS!0B#2}Vne}=tRAdC>M zAQ@I%71}5En-!+uqgP<Z!YX08LwUyLf4xnCI23WBB_K6khbn0CMw$~*ckVxMdL2<y zkd<E7E}{J-7aNr>VY_<yfj&rA2W3QJxxWE#*to0LFb7ukN)Vk$*E@d12lCFTID<x- zikRdDqhI@P4OGKQWGC9XR;U*R*F3&xdbdX1^!cZ(XiZb4{rt}NZEo0sy#dz8N<V(% z5^O!%2c;fn6;Zy|3*uNjR7rJF3L{5INVc?Ti#u~a*TpwZ3pCSXRy2oft5a_6QhB<g z97#Td3cNo5Y;%j|=?$AqqpmReW>%^*v2BCL$v;gG3;iX97Y(IXtk)@#7s>3-3c)1m z3ib=B9V3Kdarxe_sUclhj2oXjraoTsz1~Xg$yYP-viRVZPa2Ph)m@`U+Glpx*XLT* z=Va~3(tK+{)qA0dn}Sd3V=~t<G%QYgZj7B<Iax0pl|8_iUJ0`QVC!3hb#=vvm^tMs zYzvT)U7mu9+(-%H*Eat$K`gn(a?z2{6*CMX2u~IQBQU<psu+tviuOVZZZhLY>z#78 zg;#`)BjAWh62;ZrxDq3V|Nd1rhJRXVE`IsHMeK_^Xi?h<J$awNT!z=kmQo5}pLUwl zLa=96#rI1AnlM<OfXnvLP4a9%@@bb5SauomM20%NBa95Fsw9&Ll1own2sPB31D^m^ z7tI?TvxgfS%p9lp;11RdiEdA4c>(wR{4<DU*fSy5)hFeZRf@5HGm3lonl_oAHHJg) zEVwbl(4pVO;h~i1YF%1ZTK=^UFr!(j&eOH`=Wqe`s9E672ygU*15R)qz-<oxqjqU& zv&Ic-oSSm$gc6UnJXF#b{zkqznSi~K;XtKT^c0**E%Pr>7ujZ1UhbkGnPtgQ$=_63 zy^A-#(xpy+3fq!oXS_-wGT*+%(fp*e^?t|&rSq+oT1h1?zyG(`+Y-fl$+@zPMcJiF zn6#j{kS{4Z#G%XS=~2y1!=6om_fz<E4(atF7Q{BKa$6>vMx*?;!vX;YUl8S}Y0kK7 z@_zBrld_w5DrO2?-oFr;KE<UcD-#E*L26x#96e84(<^x}rXo^YBq-`j4$Z5d)FU3E z^qiBNaF~=wXmo30j8s=uyV$Hrv<VH1mlb&O+oXlT2u3Fk&;s+=mVf|_?_)7K*=G_E zDIJi1XF^^NGV_djC8u|Cr)p6(Bis($_(QwUnHC7$zBREc>k>)Yp|m4eRED4;ZMslT zmLHgeAb4^)N#ZcO4Y%4P!s3hLRP!w#Q2_t$pFiMB5<flTr;|xVTtEQfVW!-3w1$0E zk@>Bmwb8Y8z|GR%H=Fe}4<BFc<Mdw|Z~wael@o4L*++#Ox@!EO!J#hmpj&$R!)~(b zY8D{lR+z@vQEowOMoXlwE-=M}*V&oBsrCpSscde&u?^islop&duVbTnT2vkRX0>&0 z*xMtMZ@HYW4{j@Va2pHK6nILr7$U1nbOFy;e>X{Y4*(C9DBtqV2p#{;B5&`Fh(I(Z zo2;qodfy-KsV|JkIb*K6@LoWe{}OsiUf^|`2ml_rjuw`-Hw2hv*RHQw<-UyU9yTk- zSG<JDwm^b*2{CtoOYD~M-!MV{>=LLv(@co~^rTI^IT5#t^qe?n^JIDzksJbMbON}U z4_}0njSSU0{Z($B2s=R5HE7fL-bX*J>W`w6Z(QM2El0jdIo7zjdJA_Z@0TZL6be&I zk8u`-k8kQ5V*@_1bK##d33BAZG(wAS)|Pvn97KP<`01r^rdXGS$+Kq>*c(<`QW>NZ zj@%uyDh~x#nY^86(QeV*m4^gaX7CXW4FSRg@O!pwWB*6A3k95t{)n#Nu%HBxP(K&o z;}F@;c5r|(so}OLDe@}X4t<<HOG<YEE+)PKV?%g49jv}fDl1DwTiA5jsIA(KdM&$x z<e-mT+Rp4OuSDp>uCVp%<bDTN-+Z5l<N1<*7Cpp#65wf3wIn2+OaCDS@s@|itk>PY zW|B53MC1M73Q}WuO9J$Fc9`%8HwzTHd7?9U4<=kLY&ZFeo_EZ_O9Px)AOj=i@ezPo zdmyiu>P;$NPMHS=_$*Z^fDnz);DW|$I2e$eA@Humpr|+O5Jgc1NeI!X^*GH9xXb3P z%4kiN^JDm<jP@7r%8?8EWXsZHQ~j>TBHfYPpDTmDpL-YXeE9fA=DH?a*Z@3;4j)ln zE94Vo5sOAU$YyN6oY-@oiBBU}g_O%CVKG;O7**MSzDyy&nur7$P8X+W(+~Vsj;Oi@ zD6~=A>q{!Zf2c~D&PHHr`YQ)tQ72VNgRYNULgIsPu013VZ`Tqa(+16Adtx>;Rkh*5 zO;yb*Q1vqWORDKpydl^Pg1(>KNX6S4s{#eH-&5rCIiyxvRBTU^p5kP-M?VB@%Trtr zGC!ep>_(`+i|MEnKP**SkGl#ST3#VZ9eHi6I9UimnVBXWYwHbOa}M=GCYM%;gJ|D- zNg1tn%J)5y1YZ;@c6(d2G7eLyNfHZ|w7V{6wtpM0+{1!I!i6K)<eyf^^|fLR0NLo! z%+02tP$=mQk~!JBC0j-WC9OzTG<M_Fsnrsv1%xaOD+O@SI{Suw_(5P6#&<iq=+BLs zSmvw>G5z4AfrsCjyxkY_m43OTUCQPG!pF_3;N(h1DymSBq?I5CP5kCt)RYst@!s8c z<fm+?g%cn{a{(p(S%(z4U$9I<R5aB0wv4&dOpMu$hi8nOt7~36dD6WGdlJ_s(iI_N z4n71Xsf%QY%{%cDAQ*B5RHFYXoviD^OhqZw7p3^|?pEV@W>nBhRS}BeOy=~A73aew zLBdzw(}7#7$gAR6Y5u;@Gjj@Z9<b!0aZj?@K?!_Y3YK;uIF7lTITF`3i5-xH%YJ79 zxRYn(SONG~iU5#^Ey7E)yw=Z6M1Aw;`rKV~YwCdV3>EMy3lZ4K2IJ_OdHjPP-cyCR z+30Th_Rw{Jyzk3Z0bpWrJre;EMFNP*<k=099VA)x@dy5kRUr`E)k)tIo+J(k>B>is zmNe?(Cz*kgyA~x2jw>Lh2SohEtDNhyq%c;!GY6jw0K;E%Sxlp?_6m!*zY-YSsyyUm zcXO0L!SXxGD~ToIcoa5Jr`X?M|B{zoSuS^QSnkMXA7osmI3qn2Dw_M@j!IAPM;cZ5 z0~7N1H;HPsc5qQ0Y=sV9W)*Q0@R{rchabz8dk@XK51Bl6I@LFIoOSdMNWTK=9F2eg z$k6Mz|1JsCO48U$*ek!AhX=e}JdZpRnPggFE%;h>OtO?{qE*!eNXglZK2uupDA@<Z z+Oy{EzU5Fo7rr!vMk=9iQZhGMh3bCV4rC&QJe4`MB0ri%>YOj!i*XfxT7eCeu1D!` z>YD>%2<b6Fh(^^=+fcOv8{dfibJk;25kbo5Q_PW`PZ&;BISh?i9N2O?{wN9LDt?x_ z`{@$oji0iEHtbPbW{l_yi&uk;wAi2+OH$*)EsLv;S)fc$y0sk~d2n2tgA92g#<u7Y z)PW7=(}Sez6`WpW%{zw*c*n{YBF-S@m2Shz13Ed>{M=P*<9Z)-^oZ~%U;lt~M2eEh zB8{sq15bh05XGugkJ}76b<|8aC^oH>QY7#AuJ+#Cyv=vjQ|*#lF!fE+4b3usuVfb; zZIWJ1wPP{Eyymr5bo^uEJ8pW0*Xbw=NR^5d(n}HJyzyn^vdZe8a+|oz6;D%=`WHb2 zig=8TZ_LgF_r)NQr!C>E11z&v_YbW6>)>x4$d>6^VlxQXv^ITPwKkK%N1FnqoGeo@ zjKJ}$Jh^d6baE3J6Z?%RGFoU{oa4$BN4pL`_Aosv9x9s$PVf@eyn=tN>I$}$&@&c8 z?UfjE4h+Fb05r(^acE1MI$JFlt(yAA;WG1fIvaYLm?XgOjgI$Y4C83>wu{~M6+_4R zCuEd}FAFW(>iZsSfn0dRZ@`Kmm*Jf=k;=ISGI$1L2cRI5Ivz#30E@iCw?BalTj-PG z(>~@!h{W-PGKOvSAMcQ^ADb#yo?kT{+PMELmu2i9cl*r$sJgv7;`Z?l`xkm+7=}Fq zGy_8kV5+XceJ})KE`hD41sEa!@JGfCBJORozg$9{T#KvWNy%aby|prhOrl8<UG=o^ zCU0osHw61<2gF<n`OAZdgR0+%J{XK+lD@u@w`U=@lo;QY4@wh$>8CXwEUX4~i9cMl z(bd_x;2dets&z1>I1wS1cKn2^tAVJ*!;;B&<xp>+59z-4AYLewSMER$s%@0D2o_e( zt=uNeF%Td~A-!H56Q4Ni@s@lR{iqM7)7+o6Of<2E>VrxrZ<hY>8nHunUvOFNPE}%< zgPFc9(L)uM9giH5yj&W-sR!=gQ|8@Ll^(5*S*c4bV~fS2h@T;zQT=lCsyH0<KZ!QB z%^iY&ulYP1Y*lSj%#riXyhhS|I%ZbtlKl!r*#1lSx4lWXH@r6{Oe&!C`G>VK*(@_L znR3sw0$UZ}Hmt6`5%v?kJjWc_{>LDRoS&y7fqRz3sxWRCdtoD`p6wydtXr@mboafB zQFw|_0foZ;0B({c0SsWa{)DY?yOZ}@UPLfAi;b(H>d}2~xNm$S;1J9sX8v=TU{((T z$IDasVoS4y8E`-Ch}-x%WfOxQcmI5>`mlZXK>d~BnnUDK>oMGKV4P%=baEd*6ES=Y z->?mem)t;rg~b&=-6qX^E90Xh>P*VjIY4+oCq4WBv)g>f?H(1e`tz7<wmp5u8;8x9 zC{;vPG6#-d)78i#yDpn>p~|^pUOq9P*#3T05VPCoV>tu2>{Y`Br;c=ZS@XJwpQ0OX z!Iy>GVwC>PU&`;3vb&%7zbxR^U_;%3cbxFcejZvy(aMHtyV+NBe-c{$$x!~kz(4=` zpWdQzRX>hDUgI9g!k>l$T=Z}gL1#jlN%iK){!S(thq#00fEPblooXZ<g`n^Ibj?_2 zJvowKl-T9}FG2eB5~`K5JANyYSD96nB!hoq^KVk!uuE#5TnbG_qb4wUfDx*A=0->a zFnIv;thtw0t$sG;1qrgKME4)U1wBIcF@m|Y&j*_ep$b{?c{KLVHu4cUNYipMg<=e= z6)t^zPji|kS{>dAkLQ@Tn?k!6Y(8M@FEp5&yZP>&OZo!H@*4Fd22a>ABN1GQ<&y$z z^_?Eqk*tE%?Nl3k<oY@itaD7By6Im%>Wmo7V6sMZ%Mh5<k^iaWb~^!V9yo|G0svgx zdiE{WUfA@I3yxzn-TZWhnt&a#Eo=W^{A&?5<b|vYlN}fB7hwVm>gi6*4B;jnZ1w?) zpfuz-gKm@$Xh`;s++837SZ#neBB0Df>Qxp@*EUA!8q1`mf0ictG?Y;otPPM&)m5&g z)+yv5_bvf|fyAEHvqm{7Z6r~HtzfUC@0Oz~WFdaMwMrE?QP6S_d&?bbXn?Zr>_*zw ziP>pvVc)@JxZ<xfp`Wj^UDJRvbgwhA_s!5>WU88@c2JAOp7qGSp9->D&rqz1yQWRR zg2gDQ<0DwKw5QMT2BmS6%e=-Wqfpt+tZ^osrbPr%Nf2fuF2c62?rlbNCF=bjH4)~7 z%#SKpAWRC^4K#EI=dY$Oo2I>e9(hRF2Or$@?G~(A`#e<b+@!enFL1m+UbWhk#+@~( zrkg{|>h+(VVu8W|>_NXXij=f<Aq12832skwf0~Qazo^o@F4Rn|Bj%q)aO4y9mKqL+ z3Gle6vpzy^8K!Lm^xUjEILTU?K?$+;B|Saz@1iue)&g4`oidJd$YMj3nZqym8bw+@ zjQ+C9w`&M%I-GJ)ZEvG{GvdwnEpe(7T)>UIUVUp@2uxawP8^FWl>i=<t`>T=ty9M* z|DJR)vXPIMLRy8f>D9olidx^BKAF_FiWO#=(ZqdYM$lvZC`86Mt!w>T;^O*{#e?Fk z&q`tAj6dnKl^!yi1ysXf{g~x=Z{6TV66LIG_gHzx>hgiOk%^;XT~kmaTV1>4!yQ{3 zJbIMZEtD^tQh3!MKk;!IgUL~YxJvH+bL&k;EN<>7fp5j2Jh86+(1Vz>3rh|bsUilM zzS35%z~<DKx!!+N^MC5f<PJY6?<+Vk8#c(<9wRyV_)9>R2=_=x+DvQ=!G}+6XX-?i zB!A;Fr`=7-{ez<WRruYx$JBuUFNo!W@M;Pf_CxKzq_XiKka+F>Hg8=|h5v)Cm~h_e z7df?M8$TlV7|Hg3=^|Z>7-SAKRyAVxK?ODBbZTn#QE3Mh@`l<HFiz)qByew}g6zHM zMf|A(E~1YCD>neuM;j2Mao*&+oO~Da4vC|3NP%$~9n|C!gQ)h)+%zPF3I_q3P0H;7 z={wWZME}vygY_UheTwGkfvRf*i;r(b;BL>%_t|#5{P#&OJMIdB(_`|j1m?6}??MEE zC5$_vl}3;5l(CUo=c_2FuJ7y9L5`zpr*Ln;Q)FIlkv4v6nq2&tf}hc^?hrkw&t9&j zJz<I|6ehXF1jI@BvjFF>rw|`rFxOBknzpSn$zV*b`gF+%bn7$E>#zTYSXHxPl2Nm8 z0P>`UlfgOAK(vYT!K2YkBo?^BkV7pB4mh;bG+B-^Q>WJ1YwwmNUt;o@dBlv_A;Ho8 zgXpLqA7mm8=H>torUIy{Zud}kM-Z0}VEnVcf<6RuQJe2#n{Q!-r#Y%Eb7*n0X{IcJ zwl>)Dz<VqK*aLtnb$Z2_!le_!nI%h&s95%P37?!Z2o53*E<%B=<gF{KnAjJ37w>o$ z1)KpoITMA`V+_*ckYJ@PR&6OO@i1(LSY_)06t2d@zutP&XEmYH->)6?sA!?AycuHW zt~JN!>84NLT>zj?DsEkan3Xwj-SqMA$@^7@c+qlC*2YnszmvuA;+cN$3r~L40=M3e z4yi{9YZ8G^EkU=SW0<zDB#p3cr!bxPV@P|v<DxGPar{Gplm)9<IKQy}lp<*-O1yEF zN8#_V3gpz`j~GTqy{E^R0k;`f0WT7l&)7+QkD!qa9Dc<gJ|8FiS@LU<$5ynuJ|zE% zm{s`5Q?dvovVW$Ij$B#*eSG)#?cIMokvOm=b5zS~gG}$R_#&Ev6TYxEe<2{2Auxxw zugO|3f45@CXzIk1En82BMh>`fj7CQ4dHLI5y!obde}wSmkcdHE5zAb^Qr^54DsE7I z&)Tu~a*0d7>yv-lG*)k?YGC{~S~=M8Ct*_Y9~WK^_isjNKH_P8E+0!tyf%fB{jBTz zGlj|=HG<}l<WO*M5aetQuR>obV~Re*M*t<n%j@y8wHM7$>PyTE6_ug)$MsHInx8ps zr_V3>o8Vi3bhw2;!KTprcN~2y_yS`^Qx5XQl0PXLD3WS4GZQfd@}3FCm*2J;<=0w* zW{F);N3$M6zTi7^v;+e-E^TI^z^=jWIlrl1n3e1_7MAi?yf8dwsM?~RsP13lb@i#& z7Ack%En1qyrVrmsGTiKA1Oy;kiq+7H*)JU_2FDjqpz=%ahMOR_GhguVg!+lPx+-7Y zNAB+v_<Dx7{lI)g(Z_OhFwu*PJ`kuq`RpXqs6Y={7hJs;_V5U;|H~l8X4B_hpXNk3 zuJi)NL<qcwS}P&ZO#-rGjm684mrH}I`y%HCEgDOnW*lp4oP6}*b$^Q2-{?CconP+m z5Pe<a#~$gSmTeLbGZ4&+>xsoFbYkjZCj^3}pDc-#z)DQYC7sc(mR;|pecodp`JN6i z?OW!_{oAL%{7OH#+Fsey)rP@NY3ZDo{?f=4w10Xx68+<2#ua>vFC<}f2sDWBpcmGF znBT<Qyu|Xk{YHg90*@3X#t_1W_;$u-7qMq61edjN_=0Car;@?mL$N;2z6mjxR>v@x zYwbzgk~Hu$dabrLPCgp_CqJ1Bkl6K@Pp_PCA;lmAVg5c$YKX0MNpzvk^;d(Q9@c9i zi{UGa;_!MB^2H><p*@<NSQ7W@D(THt?ABlF=v#97wJ!X<z5&?I_4FehNS%=jw2LLT zByE<>UF7izG|p^uJX|A-$eYU~vw-}qh<y6>jv=z+?RV9*nTiT_Uq{u%aTM-?)NIiC zVH(h}Uzt(mkD|+HC#xA14A}b9zOIyVQi2ggXDbymvMjcSdN<5lmy<Inqo+xsL0lW0 zy~4$%KV0KKfx@5t+qZW~iPF%sPUgU^kOkrzbLU3%l`_w6Z!aBC8ULQwi7sJTlJ;|H z<P?30WHl>eI46)pkcyIQVPBayozMC7P>HA@%M!Tv`kWV@`B*74xEyXLUg#$Zk3NBA zz!1@0)QuV*YN|40U5TA(|0T$_DT=#E&ZvX#v9FmX;12qL$2lth#4IgcimFxgbm#SF zvlnhRKJ4j3+T~x$U33xC1Qmp5NdD-lpZwF8Sa+j~h75kih|~~clJv}oq2+ctk@jA5 z8_`r6S!P72rd%?ZpQh4bHdP)MLm*%FhyvVX_HRRfq*`XA;_4V1pGRMJ-9;ZTynYYh z#M(JC{);a$A@cV&^^-+mj&o_)(7Nw6*U#X+DFjXhEcZ64hQ=`4#$xZ5cFBe|>TV_6 zkKL2=(dcKbuWeP!TStEz9|tA6YVwoyUY~r*>lF!hf0i7h{=_SprkOaDY=o0)3lkFR zSvT5@kO;;;s7K1f7|2L8wj@E8HPCB!yE7th73x(=eY<)#Hu;C|)6|;-PuPAvBk8## zbG&*o_*X^POhshmJeRMf7o2$z72s7mVr>0rdZUokCBr^m(W|M?UH&xK(MYMxv9r7L ztwQfl(%lP&-A(JuXBCuN5w<7bnwS;7`HOjT9L!2m5Zhaf$d4HnhZeL!+LVIuV4@)R zDu=E3U8<o;9>h4eH!D1B!H)dJr}6cr@onpEKXf02OGiGN4GDjRl2~(PIjZe%TN31H z#DFq*{}gK$C!?msiOg_F8Hqo=%XRuh;`J#=NT5`ZkM7k^*7Yg#@{YjEC%&yc*a`ha zfl~~E68p>dQ=>>MaV%`Au%WFO%BJ;XXldPz>gtP#p}PsBPaYvP_0+N97-Y;**3oAh zt|5@S17U#_<ihXCNWi-gq}V#K*7$(9Yj+5JUoX50?Oe{H-{QyYr^Q;-SwwE^8cwF1 zOc7&;aF*`0L+x-@d^Qd;4?$$)PJVn1{G7g9pT%u;Ah{a}xC`3+XFv0m@pcdG_<=bk zIYue0clz0H?TrvW)yi7n?S2+3mW*w351(JNf~&hC$mZL5eYXDBnJOI${jE=5DH}S2 zGLwQK^-&#CClIl~U(}n24P{{~GprnfN#866${smKTy)Gcd*?+tL**x(PgzLS0_;a_ zq5(6+p^({!yOIg{@6xajycafP_UH-T<IH-@rF$LI8CDWlWp4{6IEf@dLUZ;}2Cz4w zqf0e;c*L=Un<!}5s)h{|)6#Ga+u`=HL8%iie}OF^%w8JLl!{>W@>8$R3!CLHGEVm8 z%J1Z7!OgsXSn1?&jIE@zHJ)YPAiPszXuyLLn<5G;>)e2aVEQl&e`gjs1|q#bzej_7 zb7a^i(a<RNPbPJVJ95-aQ*Dgd<tGNX+D3+ADzuftYbzh`=Klo2U8_Lw;hk`EusBUf z2!90ItJWI#_kBb@=$(J#rCnR1T3*Jw(ab7}#e?8thjDy+pPog7x14y3TUU~SkW0I- z=MQB<7<S~TdP3Kucf2Ze3U;Zl0zHxj$+ngjqOb4!G`F$rti(wXgB(rEUqXEDuZITB zOT1$Nn5P1%pLi~*4I$iwYTjs~-$u)Yn`Qj=veI=z{}h+CDh3IuF(a82qS?(!Y*HCW z^OMfX19nvx%eh|a@mO5_T1s(|<+xSee^s50gRNwK;-3E&aunC9j?S8q=epkHk<;}( zA!=hRJ=qCrFMq6-R%CNCJ^Bqp0{Xzq=EMJE>KmgfeZ#%eWMi^z+ctK#-AtI=&bDi+ z$+k7w&4kIeIoUP!KL2ypI_v$izqZ%zxu5&Gek52s+YN_S;}^l)){O`R#H#QI!mH_t zN1@`R0T=WxFh8(-{_{qiKWEPOc22PYmGdRknqNvy&A9K0!YYpFuGlKK9msX=>E2!- zc(p!MZ2s?9_d1tvtrT|2jfy(Wi<oyFD{$A9iZhWAh^ve)1XOsT{n@Q^a?V2qB>NUm zduYg8y%t_qQEyN1V0Y$k;b!r(7&PNU``q!M&4O@AUp+ZE`=RqliwX4zfG@vWU`*z9 z+Bdy<<F|H=vHclx;x;`wG8D1XpG#ov+eyQsV2_#zE}lk=v3s}Qfh8dc##2xZ(oMj> zQNT28KigGNX@HYmPROe#eWVv9RnI0#GRX#Q8k=2SUUx&9>1u{0Jjur)m&M7GsUS4q zsYeWLyDXc1&vzRhAdp}m0=%;c@z(~lPq%>Bh8DqOW_Q)n$IHp(AISw!cXCyq%#~Z{ zBg}v*%{>KSu+8#^E`UqjO$MXG7^`SY#%P}&>0*QL*)F~eThj|d-}kF{>E~3d-nYBk zdV39D`H_;(5IVPKvKa!YD&BrxtmN=VN6V_O*rMGj3I9}6zaK64i(yjZl#8RSbpwPa zmXDE=B>?8YPvs4cgd*&WLxH`e8+xa%SVa>*p6ixF{09DV?@MMvkBMcAWpAf_?#*WS zCIX|?Q2(}k?9D`}2}|1N6VpOn!s?QSEWc&A0~S^z*s!xm7dY0BE5E@6$*6iuGk0+* zWg8E~vc?J>`7kJHP6p;03uA{&4C+z-p0<GdoK^yKuFtxg7*nhQr(}a>b(QL4N7igO z6W-GuVUWn=uzmZ}F9n5pTO&nIHLb!_bttM>0eE{DQ{~0llLf^%G+K=&-iZ;eN)tUP zyiy1z?sRb#qZ~GOwU+^LE~VdSgUxPD$<76g^g3d}v<fj}t^@T6mycHmVnS95j7t=M zrpL#Jz*E5ZMDzMCIP26y?ftBdIh&r&mh%A9?pLo9UXj`)8#`M?S)0X=7ZISQ`*0hm zmC^K!WRiFhF}r)&@t=-Z6$sDn9o^W(sHrhawmJU$b(gn}jrls8a54`)m})g00O{eS z5n9Rk7?+ATa(MJmHoll=p(GtTplpB(3;T?Xid0o*Mn{2UEHv15s{XGzF+}#dnzug9 z?I%&ax=#bIIws=;2nqfSLcz-P)UlwE9qius?ze9v#u<{TgNE>pKDMg))@Pr&Ti7Zq z?v9>qoUBoqZKs9X*+$^yD!2<kl6rzF_FD4MwF_j5q;K!iPVOr6d~<Gy_Saa&hwO=V zCX1iqej)H-T6Yf~P8c3MzC@tfm{BbIL6H720Bhyin?b@C7s>@vVVMaq@76FU<4)0| zKG2JH;o=OGB|Pm>zD>scIx`AVCn(|;n4FdmUX)2Lb(g|JhL>hxI-?lfST~)TYM`ZU zZ$euCD{KcsHzw;V1ff0Ii35|<DPvw<W)++Mzq<);AM{mV3xcVlg*dYlg49*rvwK6u zDB2=!e1MR_CtY-Fc_v8uttwF0-vrN+!7NLXk7xd5xZnONI2J-VM!E@lyRSnIcp@AG z5{^~k=^Sej!ict;<JnrW++62$d8BQIIcZt1DwA_c@Jr{&S2ifUUr|;(x03uGiGTlC z%J}=0Jusfq&5Esinu}Wr991rxUslIx+AA_8>(`Kx)1cX)U7N>@(B0!jd`_y?^AY*) zT6kEM0*etir>~x=EV%iM@JLctY4UDag~?v$RryL#AjFFLdLdLLn3B<W->5F?yGv^2 zzg_0>ZeSRP;S6_jCC+=}Y)WLf<u!x#VSr1+^bu};lu}3#d_@ec;3P6lNC1uH8vwxo z+yJ0CFosyUk?z==^{)8AiIf}R+Z*98!O3as_N(!;C?0w^=3HEb(%PIRY9S>X4~*H} z-7AIkFQn_LEdMVNlIIK52S<`OXj*1|{^1O_r>*$jMvIt4X`)K^O_Xe{h+%!5E_4I% zec$N1U`dC%cwkiNswcivlqq42Em)1E;V4znmmbMO(L6s}Y~A(Khw?XEEID(}LzCV1 z>)DD2iM+pa4OcV8bXoi1G<9*rYb@zSt6+|C4VoAg!a~<mZ+Z-uRWO16XfH8AV+Lmu zo#W%Tf_c-O!>*<uOsLeZVy379&}3eZAItMT49v#LXqAvFXbZ@T9);z9B5z`4Q)7QZ zc9p1$INRDA3xZ(OFKCi_i13K8wfTPcm#|UPSM{%I0NL{)VN%MHLpfb7#E%F@g^UMr z!{gOkur6b%*>yzt&7N>A)9}aX4JOz};Xj)_8mNY52*chEp{XUxu5CZ3BPqL!3_1Mf z@)<o3?ZCCQx;TVgfUjYOiGnUx4n>*DK?S=&CazqH093FRapo{^&%M)w<jvx`!ZgN# z>RNw&e*dxMwy&jBRX}<~$9!Y=s*dWQdj&K@EX86Za>$QND$5sWrr2mznKV!NF;_n} zjVJjmAFA8iH)#8(>xqW2J%{143+bPT95&&7Hns|r7{(}_li@uD1b{;Z217s2_7xS6 z^|8{Zye#1LcbuH4+2=opLSP^g4<GB=^EH#_yM*-ox~?mE-n+b{HfvtPYVvcC52kHR zFJBPTnN%8yJsj2%V)8<?!TW-Cv9H5X-=m2rY6hG#ggzgF|IQjyHb+{kq#BN-`9Q`J zq}!G4C5Un=hIQylgpMzJ)U&hwhr#&)H2@P21FXvBCa4RndVP&Ge1h<Bp(2#kEG}Ci z<xHFDWyDWAk`@y5OCmVJhq!y5T;GU%bEWiQ7w2TnNp4HKF>%94vrO2PO|RKWrQ=_W zm7k~+=4*mDHj+;v=ch2z!>3Ncx5*rAP92@)LCN!ek%u|Rhe45pGCv?};mZdJE+SNs zWjjpHBAYx)O7StD`0y@iI8QzWWW%l$o}*W=duX$Y+}ZRcR@ZPRCOAOS+gsetJ?dxo zFfy!KT|wH*?oVw!RuQ8OmYs|E>A%4#j$g6I9W=+_+4R#x3lpZ`mYX>503&Xh-^2xp zkCj%Jjy<;=Cdmx{TPfaMVd%gXgz9_rfFGoska<;$0fpY$Dg^>bccYXcHWYT8FDN^# zuuoTU);=cSceK>1MuS?HYkQ|4@Xg2eD92JL&lf&n`(d=o=(%4OBL1q3os)g%H;a|o zuCh^5{XLL63zaT|u}Y^@54DR7SI$AZzO|>40K90+j+xB#0c+heowI<sdYm52oRNnX zq|nRv&7`{ax&Eoi!PCrmilkoaia;v;5S|QunR$B<3v*1+<w~ZU{pF?e=B@%GL^`vY z74ct!M4H`}5-vREoKLJLRqas|KemtlprN5`EQns`U)9ePkQCX+ALMc>nHqI(C9xX7 zTOj-xM|#VL`zO+~HG1R+g_=4tzXk}UCQb=v4tajx9szT4ivMf+-K4{=&D2nn>_5Yz zokzc{EGr`aofZL6*p~sI(DnfpSl7|M`HBQKN_jJmtZOw5>1;n7vwZ<3r++Mt%cHnq zzu?Qd>fDr<8%tNDmVO*_VNJE35x)81-asiJNyii1fj00iF7wx@@8F=;v+j^QO&^8` zfwCKoj~e?XRtb^QCEcGi{}Srj<L44XwbQWIGfcYL!nRC%eX;rSp66|uxlEq)go8qG zT(uFRhr<yPHiSNo9r|rk<<;yc;xf6C_WSvQ^kF9jIyR(8Ni__Ocby!=?6`?EZ|uUN zhqWoGqNvae`qC+|JO-3Xm<s6N2g!TD5xwn0PG2#ZS<TYFkC0fsRGnri1hLy&>%4Zo zkiNYA2l@Oj@B`Le!R1m4R);ZipKONEHDj<-V`Tf)uQ3@Qv<t<iQO+093$&>4m#m8> zx^<zE!t@EeDR~1RQ^&yl3()ea0@AXP*MY4ppmR2k&GiE*7=fJr3k?9W*k5k=PpZEE zm%Dl{Ou4#>(VOW(NO7D0o6~8Yq;y%w?1HV@zb7lZ>oT7NQuwea$U1I?^alkwjBg## ztUf}LV~U36B1<cQBq}hJL$vef4<PN6ASQiaIPDyuqOV*OTR1v*(xm#sroVGk!k zK*@HS%5mF8*2iO!k4u~%A`|74=tWxketfHOw?hB28_YL8)Mp^-SVt1h?*^Xk#x<$& zh4)HjACR%*nxTQhy$TUwk@Lwod!)+z_5soK52L9$m<P6{m4RkkW~%;+gcq{?OUI}= z=!1=kPcH6V`zZ}KIBMcA#+mW`Eif@!VH#h(;ZtE;Uwn4Vh)Ly$hSx`eFiHouj<lnU z=KoABU2PGLZI=EJ7Z>R_=h-*Mx|nyhEC|mKD7Igz=o=T&5hSfnt81{th6UJ(NgL{d zD~0Orbp0i=#ge19REUbMGkha;vbKrF4BCH=_`OJFE(}9>{tVI6t1Rw2v_X@%7ztO0 z5eC=emoc&2u&X2Go_)IB!SY_2H`Hi~Dk##i&Qf09l#yn4DN}Cj5&zjD3HT)sA|3&z zPfZ}=?C~l!(X$_i?nhC#^lLa9-5yM#+%GNvc`tO2A2(R7iCq+C1hH0D_KTcHZGrn` zpV=T$2eEy5Iv!5VIJ7c&b*lRqtzw@>WA#E%O;Ul8@!|E!7+3Td>kIiAqA9`GLLdd^ zJ8Kk>c;x?XDB|H6<=Gm^%fnW4h<iRqG7f13Kgt}QKIjBjTlJ~OJ323lm|k(fRPOiz zzS}r$f)3N=MfmM6fTIKY!aavfHi6o@Yn}giKp=YT;^Fhs<(Tmo#j75LDXv)v`Oxc9 zLghjaxH;Q`BA6Q}p!rNt827Tv8280Uq8h=oZ8qa)H?<oWeHi_u0`^B%7Ooi$Ki331 zNK4l@ZhjqiP-yIyb%Gn-<Vh-n{qV=HX3dNZw4Nba;;DW5s0Q_q)!@6we*OKVGv1s< zotiSUnM1bGgxp)h><ZD5v1Qr5*I)VH1%?y~X7Re`DOPo<S2xX{cA#H?uM*niI<Ka# zC3%Hj*7%|AfuxzdWU9#S)7v@d1NV#`;2I*#KXO5u+~uWmbB_P}Rv6&5?$l+oC`An# zLVvahOcej~Z~4U&%Blp<ZPRoeCVv~6AsqKVGiltGPum+Yxh^N|!<ed+sy7?+l|TMR zU9ziCsL5gYE%5Ky@NA$RO%8t;OxPC%;sNIb$BHD!)*RlP$s&wWsXT@&<TlW)0f2cE z$4h6on;I{~kt>piN8Y3tSU?CHFMFuLx6yYiB-SO-qIC-}+fTDSxStI_bKeikKFrj0 z&QqG?L|6~|F#YkhwD2TxQZ#If=xi?*5-NRrLU_G^e%KRvc!Ce`2e4^uH9J0{5Q){H z^6K!)HU@~Q@Obsq_!)(SqI_sfKNWOsBf9P<e8^RBFi!^6ppCmP`_Om4?3UCG!NMku z!YR0nN#$z`T@y)e!kDdi_t4keVik8V<|R?K?+g`GeamVF->0+wAuk&ck0yjMF4#BN z?*n5^Z)BdsO`DR7;9I$scI(3}?-`?5J}dTGFYN89VpQB|!&?zQ^bS6(@^A-&aV~C} zmDHNSw7mi^4~!;}R=(^fQyeJMurBny>k_MpLs)X)5#uFNBgr#GLv;rBqqDKwF)$Zm zj$C8z*y%taR4^Ld*BNc!R_CDY1Ig)hwV*xyzyqq!gHQTK$m1=ay_3~vl`l51!uj9N zk-yK^|3&ri16p9h?b>E07tdcR=aKXInQ0Lgw(<mXm2!W=k<8q(pEo)0RvS9p?J&}> zQyP0K6aZFos(vPS;0)Ch{=jx1#Qw`8AaBKzm%R-q+=T|ClOLX&UwrnpIwVULu=A3c zUm{MZ?@?8p+6*)^rqmjbIPD#9zWS3AG^iE_x?<elK5adLxfLADd;;BGb5gi1*~pM# zp}dZullUFNc<4)KC^lE9pD%zXp_djIXMv*}>FF`TB$-AN)9w8kf*ffAmDGrOUWW)W zpo&ohYIz_V&lYC>Wfn1z`*@t&?XxoamFqN6?E?Z_?0CrJ9LukQ>nr#V=R^TM;hkNn z(AUmlR|iaMiWLf*6;=rVCYxjRT+TbAj}<Pteowt~lRW+1QZA1cN^H|`kA-C#NaWKe z#<6l;vwIp)5n(Pu>P2sS^2-ewd^2WmdN{i#!p5(`LTGEjv=l=}Fu|7hDUPy4xl^Iq zE5U-0s2cM%(Mc8^PDQ}>6(`|E38laPwTUwj`^TpPv>jkQ<p+pNWEy#)xI?^*VDF^l zA@)K~K#k{eBBD3r*$sl_i&7=?>tK+^>&Q7F$W@%=*3*%^yoe+`FgC!`l1-6VlOV=v z7qH2>rr5d@&*@Vna8ySj9O0Hnv*Tya+xJU(8F7ad%4HF?!m#$UIHuD1eTx<r>L<zD zt~z1^Xt8yfwzUCl|4<OG%VqZ4C23`({~z@;c0P~yw;Qh95v;&_;Pb-`{cnS^q$u5m zL<SFXP4rw+tfV5tBE<<F<n>5<@2IhfMs~LPMF7Re3GpzRsM_08{I?G=%$YCZk;to3 z$9yAFN!T4Q*F3*n4fVENLgk7aP&AvAn_J~?-afTBF<hN?wiUDH0`*p-a62o)-^2qr zgtXV+qr3aP1(w>+^?WyeA@Qf8z_nipA3T3Lm}&4b@LL^yzk}@jzz^_HY44@phgQ>G zR+SH3q^H8?(uXp&LV+aE99kCR_j>!~K&N@<qy_3vBMouTCzMDwJ5~18Lk~`&e5p?m z7A<;fPS7*P3HgVC-ay9y&cLd5y8f;+Yc^HliihrvV+Y#;Tg>gOQmc}wGye!B%5;VM zeK};ReL-t|mBHEq`mavF_56n?DVlY|?KgB{)M4zOzYx5GSQUa7Gg^PyxNEXg%0Os~ zMQ;g>elIbtv4gUUK6^xHdwlvqIQGx)97rv>#$Uf@BT2=;@*}3UDE(}VD%C$Gu8>CE zukRi1hd0H^A89{B#mI2-18YsEW*Q_#HrPqipU!tCwK`9_3zXmGJv0~)0)j@Rns8&| zG|A{Fs%M5MMr|D-kuIfQLX<t_CbqvZ-Y*0j^CL;+Wm8FT-}lU#slHg#7p(Nn|2Wo% z<}}wXL8#majzJnTrj8rGJ<Z=y^Nw$HZ=RGg{%Q{CGi|CVt**{l$A}JZ>}!(B@zM3W z(*OA(6q60LW=27qQpUBa`t3U`v>6;q_<$NEJW{hZtvztvw#pgzQ2cv001h#w_iebB zCtOpbCbeKC+^b~y#580x;>W4t_1Zcb<F*OjzFO+>HoHO)TDdV$t*3-Bnrc(lj$Yr! zyW8UBBh%hNao5pk%_m5kiGo8{a22S7SeQXqg=K?M=!2DF9n6d^`L==LzfAjtsdbpz z%`$U<b9jf`-4bT+Ieq^HvAG=ejp42CW<>8z`~IB8l(}b#5=dZiL|Y(?bTTF?Iz_qu z_`*dN&)7Sd>-)h*+s>dy867IlYtEhU5J?ZAFe${SQD;50n1?il-nw+IPe?+AAO4eD zR~Uv~=Ca*>`}q2`&T^>MejP&GL4rt9|5=i{g3GbFOT?};(k6di)C|^FYXttO=zcKG zP9grEVlXQgnxqU(oHF;psP5#qqM1n=fvN%nWw)xZTJCAP@F<NjA0r7(mOlvHf&*lu zN7Uks*-;2C3X#ZC?5k3ACWT+<AHmISTbsX|gpPNrremJo<81*H*Xq-PeWCq|r1LSO z1mB=ektVRs{x5zc6c+$7qmJ~34TTk5uY*{I1F|fJkG8n(oVGT5q(qKrzf}YRSf7uk zkVXB9pYD=;Kd?MLAUwS!+B+Z(%nR`_<#FfrqZ%BN_JqFGvna^JRF!0?5H|IwG&d=} zy-}Zx>-;x&iv$2;r(|;vLliGs>mN4y))^!iaE!;ns6b1CYsNzMot3~IW4YbpXfS3U zCEUUpVG^`)uEo^UFTlASpFkI{N~ap{5&@(#E4E(-F_)AoVzGmiDX*91Iern87YC_u zm{}H#_OO$C$ukmCE2spe?OLH1q{?|TE3g-cJ5xhOFn;@m^!EJeVNiCgn!HE<o}kj0 zR^K?w&twrm%1h2XzXf-94L!W_vF=J!NR~&-TsvREIFMHr-AD)-L?=7@g^2PG6O-)a z{oT2|9A>0eB<+Jk+ZQr>K)-tx%qW*FHgrwexaDXY0Pv}|`<9F|AcpUSVi08{lB>=b z*OXm3>;O-iPAd$rz0%bLKk&6*&40@|viI`0u*g%a-$#=3xA0RG_Wt}`efRPiD7q)a z#OB$JQEk#c<Nt^rJ7iTY?jI?cMQk?<u3?<WC)I45<Kgw7t5cuIS@)m$ghzW`<yO9k zpG-4W?VhBUlmi7Hsn9<hTc+=`s<n`Em!7j{>OLVKQ9EHJ?K1h<T5o`SM&7|R?2O~n z4va(kNKb3!1={J;or1?jly}!ra=cTlRLXACqu)QR9)=de>Y=2~gXE(*T!uT)`3r>3 zijI6=P(tzPx13g)Gwp*X<kAQBRYJYJ3l@_TOPb|)f!pf2u<yw4EuU2+a?r4Eb{U=5 z;P~EsV)66!1JCs)XH<Lu=r^oqE1TkYIhQens0z2eOcTZ1x&nqZYO@L0Qlt0Thl4TP zzrJcsUC7PH4-a{!g!-HDvS2sM!yVrDBf!ul5b<|&ueNskg@EDYD#UV;ttZ7oB^)V8 z4L<+kvi6#RT){!gC3ZwBb`we!edXw%@XI-}pI4-@NyLHGZtK(f<hSwp3H#n<?T^cd zq7UNjs?49*mKzT`OUwT`IPl+Z5Thk94S;}<PC=mQ#+C=(ie9AH#^x!8(Xfs7tW_Jz zt7KPJ{>%PM4MbtmXp+8Zp=eG?;fT`M%)e`_HDPWAEKN?pK!CuN9ugji+I0KH60xo& zx0<=N8qZ35v4f9d{;b@CuzS9rDQezuv|)n4!D^~;_m)TA6-UEu7H?M5p5bdxXk)@s z6q^odr8mvVL`wM~`rnlW8*3g}ndJ_dtOS90_DPz97lwmH*n_f!_9DsiOu27HnHFEk zFWHrg8!%{(`6^G{Q3fIRp$Dww@rgD+KW!2NogVx9q5CVG1Dl+H2l(!grcy7@?@VFR zH@`VB{M5`XQvZsH<rF``M)IkH`5?eh=jQ)j6eg%fla{FQY{;zYIF~s@V(y_l1bLAS z#rE_2eR!j2XyO2Seja=?NE=NWV0ksCiY(eiDY{(N&Ie$D^G0Z2g=s#25NS;fCC=(e z=xyJU{{d&G)MnK#%v4oTb#@j57)h6(;>`o|$?cI8A)&d{ioGyIU50>EC1RiY-1cmH zx>{2NI=3<?FWu2Eh=G_y%vx*x_1Npxs}gAu^Fo^8I9|0LxbpHI=}|>fNQpt&IqHTc zI~NzgojN@=!ve3H1`vrf5GI&KN}A6R#pbA$&2GqLu`QD5re;0$S9^o)a9=|gtdO$^ zM)bN|(VOvtjW@T8ptIu}?4ljvU&U?kJGA9Rvq!hqqgUPlux%=0d0cVbG!XaEBQ^?t zHPTXvQuB$A#uA@lN)4xz&JAoX<l{j@AKAv6Ax@eVN3XG{S1cYUth+GL9iY_l{Da85 zw2Qoy+TN_-MNav5KxudCJaixnHucUSYJf+$u)qK@Ni^%~zizjTIb`7Vy+*9m9i%w? zp@dKQZ3m>TnL#Ab?Hbw-;Te$73)J1`0cDjgfP3{8Ni!gFB)`yYz1ssvQ6>2bh6|L| z;6SFC<IQbN5!X2tJr<!T6eHn`iDf*m2GS?iHrLdbG>~;h{0p_dv4<+6A%k(z$_U!e z%#f+l#_Dbi)i)UidJMF+hoD)<58u*BLTU$sZS*Dy`c>t1=CPeiXkckMAHOoifrlg% zg~rwIPB}nC1?j8DH7JF+Q&Fg>k(&YeUXQsPHNSW6E>uvzNV4XC14%F>OQ@4YRnfUo z!y%E5AZEzF<6!mu;~l9xWHK$y9sK02<KxDb917y*_+VAEvqy$)7st&*yIL#^mZe1i zl>xjnwTO<B30AMa^xf_!peAkRl%aG^yiI@LkHzM=V-`N&0SIe;os)osVi!#e#0@9R zDq>n;;$){cUx`1p^qj`>L^ja^&<X%beSyl2S6D3_XZf-iy)Vk4dlWXqkCz{vJ>#+o z?-sX+Adn;_9@`I>z>K7sgf&JaiozQf%+?$_058eNm#zC3t9p2A3qwU!4X8>=PoH5N zPo8dV<)E~g)wpmp+rbiY2)erT>_IUJoTB|GDZ8-4Lw2#jZB%)?Lj}9R{38c-O23^_ z+g+JcCXVbzxor&-=c)U?g$e`lT40Nj^x6fOC)FX1-#W;8e@S^y{Lx|0t6Kb;+vpG` z@w_V$4N~zbXCb__fG}!encON3<5YzZ_6)gkoGbCz-{TU&CS55sx@B>Ij%#&;`uqa@ znOmZp<vxQs>>yW1EaAH~i2_D4UJh+J*LQsm`4TfiX*8;MapoQq2BC|79%iS!&9H%A z8VX?*hhv)V#^aH^i!*xRdH`U(QLw&3ZemjO)*vajwHFukgAlUJSDtRT4K&)o){ty# zSQp`sc1cw+y@DA)%QSv-jOXd5#Meu4_cA1s@5vL^&HKsJ3|XLJ`Kvrs!;}4sy(+I# z3DMc9xiZ*#@-nH2T5FOwoCF-afaMJA8ULeY$sHNY5(*{T<o>hQJz51&QNF?<+E@!o z7wNUpP`+tIOQewzBW2Jxr2ghlOT8Rkk66#|w9&VmhP^Qi%p>4C_^wKBOX#~~HoO}m zoycl7OL~TJwkiieyi#1ZrS@?F2If&}U>>z~(9p##lIjk_c^48rIx-|9O~D9<i%5Bf zHp^htJnU4T<5sQL&XAT)YxeLD5)>#E;w$$32)fyWiynmjFCFL1!BC{n0PaswNK$i| z53v!@xaNM6JwkcfiJ4Cy`GMW9m;$op)e7SuA4rr8@3J=0`ZX3?42dBy8L7Z%7ra>T zBFWd;CyT*TRdC9k1Vs?1r}ugL3*QhR{d~KN-`#^dpJBgvP}%I{!C6j+*Tp~wq<O)h zG-R?6OR||$Y4PJt#Tj>ZdVl(E5`eu)-ao3r_8*nSX}QAdfG4bhkaM{91k{gM=cB3s z=4J{Ec0vLJ8=H~O-sw@uWpn-WKQg>1NV8GDqF<(*LR=8_i1uxHBJd`=ov_yJZ*>kV zqgy<XVIm(@Hud28j^WX#-fKSB9JCWQXHxBG85{A*I)BC?!u}}-3n$55QWI;Z6^Kq- zUi|Vti^1YlZ$|3p7x9&ACbO8kVP2-D*0hy}&A>oPa1EevG7hZV(xdI(>c#~0iIPO< zCl+)*u<a<e4LYNYO(+48X0?;~>bO)Kja892sLDcBg=ThVCr}OhX(v%FwLDxh3^`f% zg3~-JA(!YC!L^RbH%R_2!LTxnD#H#dn=KutV(iMF33o2Pl7BY_QxtFaMR;8-b};0z zoJwYCm`Z46mE7+>dH*l((3YR#-6Ub54LGADzW%mQUSU<~=~Zs`?nj@Z$!+t;YJi!K zjeZ{@BO(C4gI&UeMMsT{0D9jS6gg#iwcI#_`l8zxMc6Et2;}%-CrPop5Mfc{3pnJT zDQjkl8$#+ztE^mF!1@`oV+VGm7Hb#@m`$X5Fp+!WIM;SOI{U}-FON2_NdbPEoOrK& zZbF=tZxRQY5D9a)`pguA{|I^UGSM~WDJkaB;X@!Fc7t~ZWp6&-kpPd&^chA?HG1}7 zHItb~Tfh5$R$2+wI7trtvAe$v-eEc22-n%M3~}1XuBcvvT}z!3O=Y))sJ2$zi#bbd zUY%Njn#G|C&O>2HR~^RT0Xl@Dc1U1_u5O39n|Dc-l#ZmDOoo}&C({*)VB%evmidwM z3rtwaXD}!fK`zIxMweipzo2;l4^>?Ew|5XP^fV%=bn?&-tK%%LFQX`A+-8YkW2z41 z^}N0CEcW`!IALZTb3wW0wDg+HlnR(`Wy;MBD$R!M<M!OX=@K<Ed?GaKhEaOpll@g& zWwxwDs$^~5+u3Pi)PAtxBZ(-Usgt9N4sU1`;ee42lv_463lcD4R)Qo)ck#;|xZSF# zNmAnk1e9sT<@@(SzMuVjlDRtgC&Any^8YPAd4k$nOiY(Vn~Fh~d+@+vJ7Qu*x-BqH zfj%b#!h%fE5~!umfaKf9{}c>md_u)tU48dpy2}{`i83uWXYAi2M%ayJhtLvwk+_nb zl3k5T&8;$xosuuR)F)L-^Txe2z!PO_1GixR{?_j-p45xZqh_*81NZr0hIzsyn={$? zNgx_30F1W8OYtfoI7~unmH=#<RnTKodGu3L&YryOJN4#Gc$(OXS*H4uON7Vz)EJ8U z`K76tC+RqxPBZ55-+pH3=ETXdQ<~(nbIR<szzz<Tn~(=;Wap=Zs!5eMhWh6@`$s8? zihtgd>~ja4pWKi#0GPGH|Ij^w;OQStiYx`2XnkXxj9r5=7SWIj8K|3Z@`n5ZqqBVr zdGU@4_KW-3F|fYA{XKnVRkP>IX@E!fUN>Hr=cRP=^Bj1L)Ia~}gcxX@y|}{;2w==r zw+nY{ou2&6QiWhp2UYiWOyCd}Jw#=2sN8oHCbi-Tb`D@wpX`C4?iXN>y*I}Gi5N*C zk6vAN>=XS*D!5QtbGT|0^STDvA~VSy#^4vZ`SN$~dD2KX7d~t|U2I9se<XdeV(`@8 z2AsXaIxi)N%u*r~twKFg>Sx7C>oER)Nm<|AhJ#KnB-1y-;6L~UeU4ifcX||`H6da; z@k?%CDo|GqGO!e?%z;~zDWbGI7u32Yl|vm3M4bX)$Q!n&3q2;fL1gNmG`g)&{ew6h z{At*l$}bCKebc|-E@Lv@oxTy|83kFPREl9*4S9~ineDAGm^n{>$6oX&)j<tSA{+%| zTnN|8l@H-dPIAWG6h8M*x4Za0?w^RI(Q2PVsW3^d2+EoS--$ghSz%ASSxpxXa4z;! zZ*DP$f!tSsDW>Vhf*=o#&Oy>2J@&wwJ3;r<AG(LND^gjvHP8C$Rz!Wvl>}Xl25Eyd zhOxbT88fAFN#Y|s?}zK|8q?c}d$sT#$}p4+?(~Pl#0*C1CYhsWWR`OCOnpm~W1IA6 z?!%giIe)yi6zrFPiR2IJT7V(uo^s*kg_84olWO>gVmrrryqIBBlxk}mk`4l;sai8B z7bPA6N;Tl2y!P~@vtXMHUxpk49SG_KyW5I>64TOIo-)%mI~7f>laQ8y_^i~xcpoaw z162>jC!LnZRI!wc5vcX7MUGsJF5Q^-1W`-XURdd#?M2@DL#mrZAo{xIbHN5CM454l z@I3fg@3LwMfi7t#TFIO4{RbI@c3GUBakvW7hV7qFQD0)Q+m_gZi0T10#8;4cTRtUa zEZB&;Q3iwS6o~ns=(ic$lN^h2JzuC<R@w)w_uGK#IVMOZ8~*0dO7t;oIPH;QkV(N8 zWICQ*3|9T-r~Gz^G6UqgtrBz?4{{NP0?)w>M=7-fgp1}zfM_j74@>FuZ_@vh+YoAI ze(VqH`_ZG=sXqzV&sQJ!6#bK>XrzpCs*75}&=cS>^8liaMBk*YzxO78JWpZ2lG3YA z(fwg{2JYO#L}-O%z@=`RWb5T*W_$f7KE^f~29QxdJVfS+(t1B<-wh)r103<1B>>v~ zHQU{QcG*&bvlaPatG&q%>QFkKAfJ#&FQt|;yScPih<|czID{mdLcm>m8njs7!Fagh zd@wb^#Ge9UXITK<`EnJouQD1-q|qiuV_jE7VgZ6|B~1XNL7dj98`EOSQSaCo(-Dy< zY9^;N`U!_y$MISEcb$5Ffe_u1bR~qvVJZjg0a3vk*0xm886ay^QBxfM=G7Wj@2R5d z0_c^_9O_H3rzz1ne~&<<GZ;w|Az^VYQjrg_i;!ZDK`nI3nwXgXnPLYp=MtPqb4_MR zJ5H+y!DP8fMR|W#^zSdv7RPSthKciH0iFrM!vAHqzfFB8UvCAJdVP?9T~yk;gZjnx zab1*tIl|i!lhVRaUauO*p^_M9sF!k#X(Jva{nXG5uN&-t>d=@Bvd0XJ`V{(wXIk;= zggspMY!b9nw{hmt$hU+zNULIlzkb8bM3_E)0~^HeF9cwB>GqEPtu3TTt^M-G#6mFF zmdx!{$-m>NkL)TXUr`tA>RTkfa?9v2;*(02$e{nW?u7H+p9$f#WJdTMePitX%P zTCBXh=VXJ)O$BZ}Clc7wiZC`GH6-F^H9Lvs*63NpIeVZA0_#6_m7}_^uk3TJjI;4_ z<R6T42w2Eq=~vhhuoA;&aBSe;?XXWezXkC_^ovA^4sknsFI_OYr`CUd{qydf<);-i zb(0L^<v9r1x;6OV)4n4nK?U)ZqVPZ~85giNbOB>a`1w6!^3haOYb)DXRe4%kCI3wc zrv@IOLREBkQ7}OWRLVH|VeRCbM=i;p5NUAF3ySS0dl6{YhF^?)s>k<0_3*&W##Y(# zhm=2%qVk;#rxXGK#Wp2BT_>uw4d6(lczNX(wPAGaJwyFKPLYrLL?JU?p$#e6pZxjy z9$(Fw{9Ps6I|lM{ksR)xumjwqPB#k-S>~v{eCrgwJ)+se>BiaQgHa(BB37YW8kt-( z`R%kbEWcFtAsg5|{QSp#WAWkLDUtC|g=Ei8f*D-Bv>|fwl63>jHiznB#85LE%#LIv zVGL2yG|P?_0>qk>l(xm}Zl26Kw$2Ii8qMr!qp80J{4&xXDl@qRMy2@a&g8}7-l0Vq z%e0^Zw6e#eszqSB^v|JAWDz<ehXa?AxK{D-8)MKuZx*D=cwVa6zKs!>dE#~$>FQV7 zYg501h<;=4PwWdEO8N$n$^Tg54c$S<kv%@J8aSje1E<(p5DUK;?Ugt(-1CIOP5C@w z2I7=5Vhe8uL7A0W=X|(q*aL~h5)=~~woW=s1S0=or$IMGUXvZKf&h{DQ+?Sk31gcr zI!Nk4-6)v3!5dZQ`)&%)IVd*|u-GLU8>c+HllcvA5Nl!=5CX1}C_Ap9(T1C4#3Hgy z(Ab{l@c{BX?qTJ11=aY>CVQ{3=>N$mSfT6RhmZDHd&)m;A{9C6xqC@vHZV=%{=_Eb z^~Amu<#-eQkbV#N*!os3!k-@R4ceX=D2}vHN|h7+Ehv$RHHLX9rLvtC>=SORPqDc{ z3Akofc()S$Z`1dmIRTNKTNyJ`bOm;Wo@mMyM0*wlfxSvDPLFfcJnrS1Z?C8RD%(H8 zH`}6Gs`Q>MT+W+8i}Q$tWlvH%QU9Tf03aQ*w5xLj6}G)`=;#v+n;i<VO-4CXT`UHf z!bznUGyG;z4OTB~DnyV~5UaFL1QL$>R%C$<CI$m-O2h9aH1$Zk!R2;ZF=z3>%2|c) zbAt3dg=5Go{3qoGG2K6@iHLyR7A_8bh^u*t`tDV2pRQy&lc+i^K8(Du1v}5G+_yf} z%{&gT^OdS!78ZxdgHLR09Wl_|Biz_Xa^WnaU7^6h88_`k7*fZ?-*)he*fTaG6?(Yj zzyi+0Hs^2x@Z*h}{Q9`TjUJqO^2gOmr<jsPxYA375l##?VI-oMOQd3@tq4#sOC_1I z@+H$vXiEp2QLNPB&M?=<a(LQtpG%u!jg2T*bw|&?<hN<F1D9-^jC%qjdKDrVn6@p= z%-9kK|1JR52q-_FZ~<ZJ?7Y3YI#73QV7E%Ka^kNS3x?<DTP?VsR4_63pVy$lH3%+L zG{cXNYWgR;4k0`Z*sCsg5bFV45Zj8JvXjubO|#<n=nfeS%Y*Ilj~b2HCwX&vP!3fY z9vTqU_uLb!1lH~dMpYQi;g8|YU`k^eKoBnMo5;fVXMBgkl1@YZZsdGg0jBsZ7*;U@ zdjCB>PDR)-WE5AT0^f-@SeBpFUr;(|9B$b^@7wg?!A}^G40x>3Aw|Xi3J+iRNPoXy z$<DSp$r}sd@_RSYgC&WCp>VVuR<lv=kG0|<t9xBLwN2J<0>B76cb9p~zhSORy4r_G zh}41Nz-u5w8?dDSiZ=e#GZW%G_teOJFK?|Zxw_mGpi8l<Q?cu3JdiWqyqe*Gq*WD^ zG~bb5)iMs3)Pei6zS_rceS!P^9183e`p+xSo_IR}E$WZTmFH6V4#ZK_(8`*_*!FKq z1Wf!-80Aznl?(YR8C)^*mVf>P*9Uzd7#iMd&B+w6_s|U?Ik5HpL_BA9HB3?*gs|NB z!!a?|SiM4cM!{NL<`uUrjr<CD!pLk(N7&JF*X+E;R3UXay#bSxg`<ENCEKtjS}uN( zM9D~C<<s{ulN*J-G=M$`tnl1s_F|N8ExNqCH=T|s6w|x@sje`-s#d~WnIzsV@g`8U z#Gw3h40%gXvns5!o#NzCZBt9sX@u<AA~Te7n?Xp5+R9%Azd_`jTUBUCCh&a1A5%J` zgoi<qy$VQS=map0<r?MPG^;WF6b^-7s_}GAP7PYZ<<%oU@NlSc7}rcOD^%&NYM0L# z4SN+`zA3nUi~svjypk=2E-m$!r+>9UNMqE6x-M4idp>RcKCYhbEs9@Bk2Sd;AcXv1 zIb^`Uj1@W|&XR~livBAE1_i2)_U0!?T(CcjoyzLA$`sxE3oo#hvPO%3WWH^v7FK!Y zqK}qW8{-SpKvC#LFd|($(@RT;rOSP}IwiQiU^)50Yw5J54t`DFpL75eCvHtW(_A94 zd!0vxkw@d++|oX1CQ!HY--AS==CZB{GN%#=KVXj#0FBuiPQ}Rcr}sPT*Jm}%HxXa- z!G}G{^GTdqyj|ZuS@vW26zhy?@zg~&87k9FK}g(e9FuZ%DSaH;W2$s$=__+zLsV(U zgX%7YukbA55nkV}u9BsWx^YwH>5?UTFs3LBKUrf__b|brH??L_$RJMrkF34c?Kvch zj3YmoYC;Q+3P;-fJx@D%6cL>|@S8bQElMc5)^H-w10bRzRcQVxqv`Q6W1O+@7HNI4 z1@E2bOiaKgFF#}a;oZ}hZB&fhkG;_|qA28;_GWNu`3K{*0J}_AZF4`2S-RI*P@}nV z7{kf$gt{1#XR0{eXcl<N*)*8*r@%t=lXQEosC4Z}ZC-W*K`8)60rUtt%y*@MjG!t# zNL`%Q$}B}F)0NYD?!Z@;3k7xF`xX3`eQXt#X&~t%#&zHx$87rhPn(!iHtZrdDlspr zz|Z31C&QrvtO!P`E0;w%lpO3<`joZ2*ON2_TC&`yABnh&?J3nHwOk)^Iu;lvYP9TB z4KR9Kr{zA9R8%;Epruo1x5(a3%5_ia!nI4CZ;4Pwi|l$)3g${wODewilc5#6gRv&t zyOzAA8KrOM0s`(zSee_u=B(WE2}?Zr5fEJ{``mPi2O^*$51J*ka^Bk)Xx3I}{#^*# z2fR_90Alnm->{X{AufW(T;;#kF?prWBVoCiCI9wL+!OfeDg!1f$xq_iJll&b)?d+5 zFGbY+Me@5kiYH!|Pkr#PJG4jLw14xoQUAPdk>l9w2Bb~Q|0T7T#Z_9RT`F_ImfHBv z2Y<gG)00=|?jHPVXr{e5or9xmOkT}Yw93r)9^2V5^l(u^e@Fy~=iY8@5boIYyVwN3 zYL>-CQOfN$ELlA1O^t26jD3t$*Vbv4$3Z~q?JRh0pc)IYvC9O4Ev6@7tu2)C{u=yf zPs4dzz;U}|l<Ky3r-S^LCSQtKwg7!u>Jo)R5(FCb{bQ{A)K|{#>b{@G{j4_vUZlHL zLD)Wo>em^$EHWu$r1wb9XC&21Q$ZeuWG_KWOI4%Ktb=j;XS}F=HiUF@k?!mf-rF5! zPNy`(G-yfBMX(_B)<O9BkRjzH59Io%k`uR7q0x#Yi@S6c%N}5Ddz(Xn?x5LJjtbEH zX}JfqyRTGx$H>FWQ(@ph0Vb=`xUQm4O@;kH7pqe9E^0tP!r#XOe8mHST_Jx9XdI}E zhjcY;^Urk_ZmHXpItz{q9q0oYX^;OW6`6Z_tvqJU$s0(83b6Few9dy7_%kgo-bVY5 zZx=1xOU4%?C|u_I5r5+pFi7G*vbBL3Ec*jK895o-rm(^77cT!ke<e0gyge72LzR@E zpcIfX(dErNo7gQ3czkzjl<(ASc7j~j4>C`lRR3wjb^H~2di&1uLtisLoK3@#E$y!P z3IYSlt<%EQ1MJ4sw{VRCu!&$_C2!woQPIJT&E4?=q7Egd*}Urb3hu}zSQ>?cj056= zU;Vggv>?bu1b0Dscpi+;=|F1!w`4v%sAB~I?BF^9D|HwFhifhJvcgF8;imAVMTC&* z#Aec93(M)68TD*0*1)V=iRZdX`4Vh~bo1n9jw2NrCImBMvwy`JRjFQnpVaVD<F92z zf|;+aqW-$G0~}<GVqulT^7&wNPQhh@;2qM}nSfynWh=I-fvt}Wm3Q!}f%0U1K(IT- z&(5yo;;|wNd5bQ<862%%&NVoHnn8yHG47M<-kucl5t)-;tWlHJPZtI%H8;_^5x=~K zS#Q>5iDu6MA_IW_51XMWV@zQ%jrATd6)fP)k70Jq4a_@OAdpi=EteySCZnUe9;2~2 z7`*{PBF~89Q%qN%ctMd765?GEQgc;RXC0k(V>A<Ft9NOj`-@#3HVX3Zj8#1TLsclX zp2gb%wMPKyn!SaNc36LNL%1<Q!X|u+=|5zoCD?m-<a?Z3MP`AQKeG3e|6q$|{(fdx zD9)3QwQpe~Bs^Blo6bW6s5}eRKQK&Fa9#%a<50lgQI@ZI#gwlWpd2YdT!2)GD<MVO zoX0Eo3N6C+qC>(bUSvpMytAFGE*7mt{3zGeDZtwem%J`;K~2_0?p|5~YE<Rg+J5H( z%l5x4!0Wc#Ej%#-Te*<+b9<*MkN^Iv{@?g^fyvdEk93G=pS#O206o)xMt{Ge9DaRF zrKL?i<U?Vwbe}lnIf>D+1geO8{3Y*RsAn$X>)*B0XC`4QX~c;WdU(Z|4l)xgG+~P? zAXe`?VEVpP%g-LZa2)!@+-yVm`Gj_N^?j$_<d0q>Tu<sBWiMDk*R!osF61tq3)0sw z!K$p#TpBKQ{9q$=;A)ffg6VqsnV8Xw=KEHu6sCY#Cevp;JfN*%SJ93EZMV;gkHyT4 z;pB*UdA{B18G5f@GF_R}Um&lhN1U_xDK*1fDO^FPrgC3c_>-y1st=S@7>Jn1dS8>A z!=B;FJ2V*fd0ON5l)@*w4%-#Q)Jn@<t0)50{Z{OO*;!DmUGp>}W3pIB2Se<F2U4Tb zY5dIAUC+Q(NvpcP*$q*z534bdF!Y3^r}}S_y9e)=|D3%<Q&5xz0-Kua%_SR<Vty-@ zjWVZ(1ZLn=pMfKsw?(8&x~Zl5#@b9{&-KZ9(@@s$2_o-d=U7)g{}p<^UiAv~KuDm% zY**@(BUm@)AbwlX@G*Y(7@fdf)AH)kX!kF(Qu4NwlgoFV&@KooHhG4e5H8|NR<nsi zG)}T~b^9;=A6iI{b6y0h5R1U)2a?Rw7_r$)HV16|5TO)4Wlj}_^zx^H4PnQRCOpAW zdVfCbx>6tuV#em}FEcsJb#=uO$WD1#N@QD+eMh@h>}OyUawUjXe~ZljIePy`8`YLS z?T7DswwE{loV`ji>XFHV+>7@8>S*9F6z=8~j%*|xabafdAvTH+_I<p6Y8_7S=+=f= zf(j5T45ZML{I3l4;Dr6*5Xv(k;_Tt-Ul7q)h0^R9khu_5%gt^VN2kJ`F_zISg)jKf zfZ3fR#}v#w^e}G#*$^94c`Jt#RwEM?y7=eG>k|}ZTE;gOp^#Ke(%4^eqnsRcI9P=< zTbfwzVrg`=OAXleJ$1<uv3T-Wqd3lKksrZ4DQA^$?d8<AW?#Y-G)pM1KW3BMOlpP! ztMl3qhPbQn>9Z(R1>Hap!@X_7+ogzQ_)p2nfx*c^69SS!)xl<PoDY0?Ae)vC^xHl2 z`);zci*$Q8w82<&0v13|+j+9NSU{O-MVaXH3+0Y+b|$0BNTvPeWr267+o}^-8|KSb z$;>Ekl6X7kKUw3Y+VYhI2><I_++zS(sfwyxvh4mvqrNoC5+RQzkuDB6|J$yssxo}V z*3Ym^wtyhR1~|A>hfDgcUfQiK+U(rz%ZsbU-D)7pa>?PC3X^k79E$9Gs!{453`m^U zXE7XK@g8?S)ryL}_9@v`_zZP{$+bBdpW%C(Pqj6UTD-S?S%Up$Lg(WIW)4f;HkKA6 zA0F7Ia?SjGA{<-jlVf*}<-}ZU5W+I7G_cDHsepGYS4xpBw$|^j-`G;^h(<OA(e_E_ z8ozSK3{_k|st`Ain1*AZE5^{#dzl%5sOetbA$~kwTg4OBP_`g9H7j*>E587-jcaXy z+962<*kZbw^A$RoIe6|9;fiG5jWy~Fgs%!g3Bmdr@sTER0uu@{3%EV^OQvwji`m{$ zcTdDXCC50iZ|TzxZMf*07_cNgoI>gB?_Dm)=Xm-3xVz`I{J5sI4|vMGyLXt_M78&p zS9f&C6mkuiQdGg3{}w@qLzA|-F6HEeSrdieHg9XX8#(J8eWuveq6>iD^w9`4us(M3 z4>FV-E??8h=PcA{l*a1@zn`B6{FHNJY9i&fm++$6@j88c54mnLD`rDVxwqbVF9?kS z!VG+)?73rS=#D-aepAUZ`pK22nVsJ(!TV!~kgym$g}|z^^MI<As(VCzuR{n)amwsg z6c(L)nj^3A1zCy_vVMRokbAWgWUJ9oQkj=l*st|Fpa~+Kpo~^^h2t2pZ?-^TlA9vJ zgXCsM_dUXWHnoBqAaAAC1T%m@*@w?SROo`EB$49F#hs5JRE7llAwQyt?tp1vXLs6m zrXy~^%;<q%xlMVR)*WCI+zh0Xk+t@SLQWADrsLKkm{4q9nCRh1v8g$%Tx8QJV-f32 zRZs4+NA~wdXljbv+zgIW*0jObs!EZ?Ff>Gm6}J2KnIDl^q&O*viWoe5BD5Vcys@Qr zaVdG#enwarhf-(_T}^FhveyaiHl0xn%Rr!rf*+)rCOr(_Tnxoymb}dedt6$#^M7wC z)jh__=9Nk3;>!fajvlnoHI`PoopVFXh;aUko|xWV>h-PPr8$=6y2x80GcYy?KQnkV zKBLpS70JwhL9eMx5dy2+O#T;+k$bmx8EMi@rf>2iiYb@ZChz1_hz^@n6jFrBF@hDl z={BNe=CD%FR!2>R%A;qiNJtPXuZna_<NXTjK=sn)HLq$=5>3Y&41=CepUl$Y$i;q7 z19(<x`pLwk;I$yX50w{3Ia)#yX(7XoSg(DuEl4}_kQMt>QcU;v9)5$RKoq?dI}*}I zUp}T<7Kb0%m41FtH!w=ZNMIAhM56GgF#OXUQdDs*o{oZp8_{HA1%;VO1yjvzrTKNC z7?5{QV|=y)S(z^r%VY)9_f32Dtm6@gPk_{b3sG3)^R(6LD}F8+9l64pn%oZ@tdnZd zb$0W>8LZiga7257W<Qn<l*uX0@FAYF1saD5pm73Af+ZOvK$H-Q2(JpVcweU>+21Z> zhWZ?s-xY?Axv1?~Q_jzm{U4cEfJTAm!T)I*6J86^SH=^T(beA6NuDjtV6WG%R8XF! zup(AON|7pD^MlK#+}!B@>SVFB7`6IUsT<M`s-ZwgyS)>fjgzU^XVxrJMz6mV87r=r zz*s}256k*4+U7aSeBoim{Gv0C|Jl2@DX<@b6SfaAG-{!`$Q~%LLuhIshilb_%UNL4 zLouq;AR@K6bfm?cDC|4HBvtJW^3d`zWcp?`pW5J;K{T6|Cz2f=0Wr-5>CtS>F!BXq z{@7DTRJTD+lD+R9?#a<<;<Kwl6jLK;l!-Ov%Vly8=2hjx-?n0>Ep#WRm{?|c>xT%t z+!90+|J4Q25A6@vkNCWs8-BquK0dM!0E6F?jh@puuZI)wx>3@n)L)|l1GAE90L5$X zd&+*NQ`Do!%(!AGUlv>CdlD}ezGhQ=g$?FI{VYbQb#|m)r+RrKHuT8_algJ{5|(4_ zbVS6^U+P_%6uNOKiM4Xol78lToQy`pS1tRZ%mlcc*sb$g70z*zkUaqGbiglN0lF3I zK}=w`z-=P(De9m`(LPIVGxidMnN!5yn<P7L!Onh??Uxb(k**XAlz;LU17*MyfBFUC zRqV^?KQBhYl@Gw%rQ8W=Jr`BjT`}@$Ufr-88&rl9`AiIC!PZYh7LF|r*xDW6#j%Co zVj?msXUZJlws(iDY|1!Q7p2Qat(?vX8wEkUfTXIi#{jMw75ok6mDHtesogj5)GgA( zgT1r!xCBQtJ-9;a@UHhTM<+ptVoqu489k8>v*K%2kg-vSO2o9SmQn{cpgEI40eg!d z--9G$7%B;B8}0k>+_KED=@@x%-Y-x)KQf)S%7lag>M4UR8CI_?;znH85JctP8$|=5 zmGMx5)GIObpV0n)<@R%4U*^iGAcEO`i30#<sJJQ**O_z4@X=2QTF9gb`YRbldtes= z#0^Y+U?uE=wXex>D9L}BcWuB_|E){@%5N_?*D<)sH_4?F-y<~^p4Vvu>{i(FVDIsM zf-h|5_b4b#u-n%R&H?o71<})myds!XbXVkJPvq|&YCOOaJay6L$YCLfrBX?JsQf>s z-a4qOFK*YSyIZ;&De3O+?rso~ZlpoFrBgbjrMr~|X$h5vFWsE=JM*6Bd1st){7-T3 zz1I4y`@Sy6ELN#<9%WrQIqX#yCaei&YC+DFrv-T`r80h2MF{_Qeo$}5i6tfDQV8?! zi83&fV~APrymVg&yuxE+C{(--Qz`Zqs%q>D7|%dhzBcu-<#gT@!{!zYrO7+ml=r89 z@L%pof3jQf<Dv9$!Zf_GFj4=6m-1jWWM=_q8sF4b9$(*5imHRqxZ7D&A<ho1Ij*#i zj<i8uw45sCJG`zR&^su0yK-Oq673GNU=a0Dbq*n&+Me!3Zv^R)GXb7|M&cKHe^HuL zA_k0MNxB4!#YlMUx4pb!BhHU9B*_hR^{JpS2p;~uHCG_?&A9u)QhXR9bZLzdb!V!E zwu-9omKJHhSlO6N-1_H{A$<yliNHCLmICMklB;QYXhLtdz&XBQR$@v_{Kn_ae-v)= zE-q$AKGvPgsu)i>RxhP1;`VM%u`s+PT<+g^FWle**9@nkc1|X~uBI8jOvO7XIZi_d zZ9Je|%}TeKdSUplAPY2`J1H}rqxh{U<eBzH=8pI?dDe~O@gcDsF<+u$u4uF;&xAXz zmj+EsT2iFG@}~C^&q29msH1@vsn^UPCIX-c5e``!E`v<2PBQPwX>{(%AC|dHc6qZN z+Mw3Y2dpAV4I=U1H4FznL<{v63JcS}K7H8+3GnG@M#NhkMi^-~#s3N#;9?;733281 zNKB#UHR105ZO1$|fz0)K1;6aFW71IY>k;v%<z$IrrTqzyHG8(24Pgd6x*Kf`ug*K_ z`pr=Rn-f@@?oTc)F}fKtjqA>10f7y3M`qkd-(cPcTnj(Fj8uHWUWD)CGN4ac*KnCT zvaGNFw!B;c@>JDDamPoqO9U_XsO$FvH-IDL89zyP2VXYosYtXKS~AuTBBR^{e;pO? zOz$_}h@^8c6yi(hy<TadmCQQNXvMLPG;7o0%0LlwqY$R-36+Vzp*u1!Nia19LmLZV zGB|0~C)_VE<4)5s*PNQb=@%%jM!k9<UeH{jxFq%VN)QrAH++AI0WNvwt~5p<u7>Wy zy!|aTyUekiMn<%Y9d+|?8xGjD^;+cQmTIbHL7gYtkAWNlMV4ytwc(2{#f}saGe=f= za_D})4AE1+5|zy^6?KpCL5E6A-N0(Sguce!^#9M+;I-*nbyXAjSL<-AT5S2Lu1j^r z_4f^`7@<1ldQ9*d)N|i|pZ8;<Fi<KOD0+`r53x)RP3I@~1gbnd@Ia~wfmCy+q^Spl z_VCBoNPSv3SdH2CHGjAs&gaWZur(`@$6#iOmR3e_-YQl`RE2O5?bOvXB_uG4k*Np0 zunzZcQ{CKQd3zz~@qL(2x2AtLQ3~4A@>)d)3^8MfC2+V5_O-L3;->N+Eey2(7O`D5 zhA4o&*hYnv!?*HsJTX~38P)cda9YWFR=@^Qz4(j%bvA8h_tI|S9d_S<02Al(GRN9l zg{qw9sVD{V>F;O#Vw<I9PS>sC0<kc!)ENqMF*5V}oH5F?vppU^SdB<U8g0Wc+GH3X z?c*v%^4|=%l-lG1xWbyWDyGOLqH)GkRYStU6>|gTjQQ$epEv|_1I@>!Y*4EI5}AsX zpZZKKT9XgtW@LoJAK1=siEK&faR*6k_hXy)EaXf*#gHnpL{xtL4k15T|An@t2j8iO z8~ICL7he{KMeaOZBDkJq8#Rpl7fzndP)<%MIKSMSc>nj?#a|xCXFHG;_bBIS3c8ap z>#BNNciz^9>)?#^aYkM%nVNyA!!%QR)&??_ohem8J5p0ScA+&{xFX(SSfLAh$n*4K zxBjP$BQ}&nti%uY5A3gyn~y#h_Ms^Ys`d1y0+%o}Ji-44h3%i|#IlFE4>S^eTB4B! z%f@m(qZKHyYh%7vf$L_6<l~d##x#4+2z&ojAOFug^KuuM1&k$_zi5!c{Dm`;ZlxWM zS&7ZaICSv4I1FzGiNv+6e9xRIENpcXH}yPyQW6hu<NK?jdzJ@1&pw2S7EM8lP{J#C zIE~goi#@p~Na5lTM4R+zJN?17e#dV9Kp4gJ2SaP6+>h(U>5`aKvy0E-W5Z@owHVIx zQ(cw4+tt65E>VwP>|zrOh{#Dfghi-&dxzma!%*AE3r?1@n<hQ~3r>0oe%S(ILx!Dh zGLKHCw#OIKI50Is%gq$r_c9_%HtRd<{Y%DDJDaB(;p+%-WJL{d_-2TD`R75=y1~2c z*Wh$o3&Nj?Dx!%q=Mvov_@TVl$;6@Hs_%NjFRvWFJp{1h7M!R@dd|k-5qj*baiw3( z?9;HJw%!qE*(zlldwcuz{gnc-&52Z8@JqpsS62Cl6VJ-4w>JkvXV#$90tET+CjU1| z=(SF*U4J6&YaLAfz>rViHby1G(ce3<LA=f;nDOc}3jec8jWCJC`e*%o<HhWW&+jzx zbpsllnbM_kigMD|JpiKDQAtYrRkBY=VdjJYP`=(PH99~+>vx(w{a}0foAF@_pSPVb z^(m^e#ju^A;(OrB_LYgb<>Oc+*U97e^CJVr=5KEwrK=SHckAlu&7aZ0SnsoMV%?)| zj0#0w(YK2F7jCRSIB-jJT1La}@DZXW+yip4inGSFO)FN-n-|`H;usFs(ds6=o<6$& z-}1c}`9QYiNYwa>N;Qf)QY!xu%2S^nIjSs%a8Ysf<J@-cs1Qqps&#ZqTxpXmkZg>% zZKXUzFu^E9>gwW47IPadhW;=F_P04&MTEn-A{!$t!R-Cw6uTDpFt}BC^6?nUbEC_K z7h%?wBSLG))Jv0#!lMvPdA&>6Dfdn*07E{t^JTs8?ZQKKCX1LMWWmaqa{267>5_|> zxmEcnK}u1bF!COM_8>ZiI0MH*LluzC9AY=asjVxPEL<1E3J#UPq!6xJlxAmFD&B3| z!m6$7{~-Upi?$WjS3{wJ64=>&9}$3of#`3$-)Bh@W6~JN(HxhbQ|jI|OR?AsboV#e zeN09nve=iTr^DC}?h(_7=49<iWsV@aYKV?MytDOZ<JUW#dk*iUnbh_JW>Nn%cKkF3 zd&nI4`x)#D@8OV;BZRrlS!Ssbq2ey4qL>A~HSuXsH{&mhWWqY6m@dxwxs)xK&1BIM z&L7GzIh;b^P&HU^LvF)Xgy;TRIK0g2lXzQaX~B7;qNTXAET!=qQHp8AAGoSONfK=1 zyL}{X%EeN^%aQ`_;_Y2AyE|AZ-T%<x#KL%cM~R4)3yWgER!y=bpWuHN_EuoMXr;x^ zuxN@gJw@W^=!tb~n?+B?jTidk5C@{P?<aEgY9r+hcEhnK*-_Vr@#~gl1boR`xOT4h zy5OJ~r5{pkbwb3ibn@=ZkZ7KE*n?&TjekJP%!}J0Sz#%uy}q^Lm?VRY8XD29u2OF5 zGnkn%II<@*yopd~uw%IUL_74LNt<5;bCiDjv6h-!6^|rONGJU_@yLY>{leHRit%{h zC|BMDt$<IWx8*8DB(;TCH+g?LT<wfoY*kD2Qk(o{7uEAF__78`Jv`7sKqJJ-X{Z0) z#kD_P7fLUd<b4_6<t;x!m-!j;Mo)Nkz>_qvZ4H)4U97Q8Na_n<V=X$ClH@D^>gVIM zSn|`qg6Lk~u=hOHrt9k{{%3n|TNH(j#6ec^_LIdK88Z%oy9`(6d1%T+Ni<<HwX-xC z6w!-)7hH@gJEWrQA0p^H$@TCm`k~g&Kyd~5M4h7cNOGjv&9Kb23fuT(26$leDuQQJ zpIQ2<gI716W8dY+##c6>%{y8Ml6h34^YQr@X<{JYWfI~6;UKuB1H4CFT&HM$NpHjb zAD&Y`TgQ@x$ktcjgOW-nU@o97vL-I;@u_^=nu!;+B;x;sr^Y&Jaz=0@=OgfR1mQnU zsCgY@;h7$+cvHw8<<>tP!J+AeG!pO-^?jiHBo6ICTw(++LrA*UCHRO3h!zeBPY&nd zt!8#!-^3-`O#51t>*a^)v!HJl_$pF7e-1uFz#))Fp@5F^V3TrrZ<!$oV}5d?`Tjkw zX9i;maRk9gdS`EcCOnmXbNWhoNfo^g$~n&Q4lNPAPvS>%+)>LrG0QbhuG@mFxJrh< zi}OA(4f!Kr^U_O~#A76?GIuisEA^RHTJJ@rUoXd-Xfi33ZL}}FYB`1&eXb0@@kFF? z*)@C|k~fw#brVUdNJy$Yp#0|Wz6?XQmo^%*t@iVyhwa?&SWSI6@7rIKs33X)kj5GT zchZm-k>O6vU#YlH&*)V3DFieE($&ogKZn*$%XSEVSE~faj!@<)=mBix`<Y>UDN31b zN~KvAmZ9kapjJjPs-DF&P_-#m%Rpgl01O^8n$4Bu0rnW=FwqxXVOdF}p=mFL%`W=Y zHP|D@92H5NqHIseV9N22U>^BHW#`{?w3m0EVcZf(p$ZA~o0y7=_My8oe)RYfbCyDo zEyi3}6REC>gKF3D*?nf({(XGB@t>r+Vx-!5ANw?2!QwDuBK@VH`wtMFc{w)m_5m@F zI>?pR`DR2-Bd$zZL><56m%{Z&gr9{eIC8??OmKrchz5UyD{ZIp&tuA_+?NuXuv3p{ zZ*PT7@Q9!K&w(aw&^>8)^ScBp%%$<^&2`QEd{DdodKW<HkYh*Ko<kClKbfOo#Yw2@ zl%<>n(=neBUJ;Le1(?m*9L^q15p`va^wJ1mM>~v78*_Id5OsF@!P}dfs=G5v!VH6e zKIQwLaGPRn{J11->_Z)&zBBSvq|Xdz??V23*|i}Gt9nz+nwKT8Oq^BIaT-rQ{DSjm z82R)x^22hf_H5m#5JS|WGDfR(vT*0b*kHLhya+r$`|tIsD{Sj$l%LzqOvu$?&{zIe zy@Gl46}q@h3;i`N*kb+?H$RN#&X~V$HJJdRi{NC>7{_mDpX=TLABM;ImG4<?XJ=aZ z`RX2LZkt6kVG3M3EsDe-&uQ?-u3X5)fVgHDGqQcs>DUe#PTeiEvzH-_Zq;z=qVbOA zElfB|tJj$O6UQii#JjkiEcHq00bWH$9z)t=uPE!RT|{aruQtALK(YD|a*1)KIFZ9L zb-*-!|K{c}wqiNTc30w=<Js8frJJnC?l4QnnFM|)`HrG>4P<{k@ZV#df?}Asubb+( zUbT+aPevw#^>xKYwG*f;GWD!hynNyCTc@CSFK$p632UK=OSx3YVpgY6aS}SGp>k8h z1m$!A3lqsg@pq2(DT}IFWB#u{wUG2wU-~T$!aJhENGWXt<$*|MgbYK&lo7e~iS`B} zq|Y~xlsM~;Z(nZ6w@!90ND0Gj@Trr3Iao1&X%52Uf6$ZU#pHKWV5PVg>{uLGAl_$` zAh{2)w+>IW8rVSZ*`nFgl=}_4Iy5IdzpEOtK(b3oGJ-DOQgQyGX?Hf>@ch3uz-s+$ z6p4J$GAfS0g?Z~^S2oiU;bB-CHmCUTF<aul6u(4Aw@gQ;+|4ok!RJg6MUgbv+7xfe zZsN-O0z2Mp&GD2czObWd=_YTr$f=DBNYLjKg2&gjq;rW0W0(LN8Cbe5RtP#N0Bn({ zhV1SATd7EAlu6LZ@(|s_P>PO6K$(Pw?6|VsK8;j8j2Pcnwc_b5gMNfJ9V2^Vj2~Hd z7wy*?MGMzD1=q7ut9_A<m9%0SA8434w5IP0S5E@7i!HP*0!qywuiq(kweuy*oA)TC zxoH77Q4}(}Ht^J0l{jj@8pr*chPY0DkYfNL8Rty~V`C)rK*r%xMa|HJs(1YpW1T59 z5gJrNY~n-?UA8Eu%wmYp4IBuHh)c+qj{IqfU6lGl$P_;6ls_g1|GIW(KWBB^ZvS)S zC>z0<H-oK1NlaTWO3_0QVamO}LL<Y)FSmJ%I=3g84yQ*DzAYZtQ!N!@@E-R>6eRFS z=3IN}f}RbZ>M}BhN8@50e7&QDL<T`mjGSEKG??K27=rxgUf}cwArlkcF@{DtJK9b* z#j+94q&lW;^^n-siKMAXs<}y}u_<h273(a8c|*bG&FpG+gTO-|^k|*y>;`%3RmHY? z7EFoVxFOQ}TvG?-a9xc*_hkf=d_ih#;q3U=G?h($w0~5YppllA%iQxzKj!f*#pJuB z20uvq0$hSH&U8-zl8D83bu<l)&{!?Wl;YH8MG79=58ksomA24$4z|$_T`ZC9mf~Yk z6&7zlP6HlZ9oESS^5o$?>drrQc~fDAm5pI%a5GUSKkz$KoaK69G5CW)4b7F`ug|E* zv&jL*roW>CLpAsP^6WkHe9q{`*Z2nZHdfw*>3zgx@%n2X-Pt{upBHwy5A;_A(yc@O ziJV8$Evv^()?^kOpu+?Z<zPB*T+gobzUh;Jk&H{tq@YMg@Q8eqjcaDRSW*G_l9Q3` zy1JfkZbR{qs&ATVm>OFGg^J#CN{HZUYR^o<!)@=krjZTq7Q<Z2Y?b0aHV!B?HHE5b zg<JSg=Q}t#Wa@8gE!tXvj=|hhM;NhX<Xz5%a9tgir(nC^qV`l&5~ju=bGI4;&RwBO z8N!v-{gYMUqrGVS%_T<$j&9=llix*juAWy%NF($gR_197{xr{F1MM{V`1$vrZx;`_ zs#0E=$_QFz2{D`?%Y5yFxZf1`1xHNHb|-MiMrSHYR$Y>tmyhO1zaYAe#x<=RLDW8{ zB5g}(9=Dfr&Edtuv*USrl!G?a@Nw_}DVb(|?(ettNE@Q9M8)F_L0=X1ln?X|8xJr0 zE8h6N><-_|XFvZ>`L5ngKYL4kaZkKXu9C|>Ia~VEZ`hw1{AWXhr9=ss<HXTifDG>M zKLm=r-GMYc^wVZouJ5ru1?S#4E!hd`%~M8Z!!``?2i>yp_Hi5$a>jB~JZ@F^Ce<(} zjr2tr+8>d};skrD_?~~+87&yw>MprEC+~bk_Vx?y?itzIlB!R<z$n839{@h$eLvXL zMGZG*R_t1aoWKw1VjA$p_VM-Ympv$dk>T!ps0nv>duUPMon#zaIwYSiA~+n1k-#?j zr=w+3Kv0ZRi-uD*7$h~dC|vCbh{AzEmw{QP{iQ0&hJE3or(_969>LAIy7F8TTqY*u zHpRT+kY{QR2lDyfud^Pij_(6r;Al*~{emHOjIB&7p2xM%kA3c#M*Nq>cYOae;c0lF z)YxXvK=(N}HvCO!%(;y~MsLJ6))s|)R!B?YQWTYPXXOt+op|Vq2nx*9ny(@)>2s-P zkKg|}A7T|R;N{Q-kTv69!F6daj=s|*{JIjh2&c7s>?!i)aT67`ehhiAr{OPBh3#h_ z|HL~mnS7<?+5+P@zwg}8^<ASI8{2BC4UYwGQKM<#+XedU_jE6yQoJ>|bqn#WPod?{ zMW{umPr-z^jL+24feQHSCihNTJ*4~XH#P+?VZTc5n|2Lw&TLimc_9sUN9DWS--I&p z1N_aa4r-$%=v<Ge^c2|aC4`cAT7ttZ_EQLD4t2na{XZqLV4Z4!YN4tw($kCfYK<v4 z!*+2=WoJt+_l(A*jdx^Z3h6mhcVtA|siALNV3m?l#9(q%l;OF7t65sE`u555Kf-Gi zh_|Qg1wj9d!Bo;^0BKp@m$<7n*XY-C#2vtW_wwch@t+gkDg(mlvI2oIH4)`kCEjBL zwcH5hA6-KLFO`}3YaaLbfa&E_SKn1bdchgj6}6M=<%XpA-?V!5WKx+su0vyC1VB;U zs)s@U#P@-5!z&_256HHVWpbx^t^LgM9}#F@pEi0!bO_te9Tsoj3w6<ciu`FFuDexI z_!s_bof>ci2bBtoNu*1`$ZyP^X>4vHg?I*0g~;H==xtuP?@7_6>!yb*2ma8yWEV28 zmiwK~u`F+}H&(GjwCIeY<>w^Tcesmjb3?q`J-D@Qd5zuL6uPlC*c}wHwmI<baE<~b z=D<?grQF;V?!-eCKTJ?KWkICCO~qN!toTYgEyEspc8R6Y(p$;2``9<c^0E0W!AX=Z zKOyL^NNjSKCIY_l@B<TFptpWuq`+#%g-|h(iL2tt_l{VA=590844Z;hwt9Q;)PW6C zv^AQStNwI_d%qO~u78p*E^zGFs^+EZYs`6<zz;i1)#%s2;u)s9=T(<ok>Lkdiu9D% z<8Y0{Q$!l?S&fcMSO%Ul^&j+*1W6vptp7Y91hc2SvyZoXXPc?PtMy9>LV&&2=4Gh) zIh}yFDdnqWbQ~>VwL;UB+LV~BnOD{+i>OBZ|J-ogMPaJVoB!NbuP-Mpta9Om>tb{B zO`yO)suMq$kZv}mF*N|!Z(uo;)tu~k)Wt#YZsq*(RepkbWgYENn00k&Fs#u<cc*+L z=X${MUARocV4TI>9oAQK*~&APn8ke#FZa(Pf<<@d`A@E5U;=@AGcR`x;oQEFC1UO2 zl2!#Uzl1tIxV{O;eg4`#CB>c6?t1Hws)AqCO)~AB#c`?GQrPs~EMg$uf%ZRy^Yk34 ztue07X8#>1s1iVpN~c9dg}=}I;HKa}{XG+!lh36MJhMYNe@{*45W7bS1*%NSLKe9z z?2<-)O-F?T;&iPjnfXq*y%TPF>Brvzm$7$;p%?#Mh%j*#6%XA$-to)i$k#bB|IQmz z)$!~j+CcchNU0Vp#?2WrqSV!N%b0^THAb|m6n;ZVNKvz`4pkd56}O^!$T@BMReZ|K zP_rs{Vp~qcI<_*3DWL@E^4mN2tIY~=1cqZ4F;c})YmLIDw2FDE4RC?{e0u@8fVXu~ zIW_U*_XNkSdG7UoyW@VUmt#q&vc@!?!g(rtw#|1NM(w@B-e-`Fpg&r=zC|30w3F(i z3|W^-6Q^WezZhy$E-ZVM77VIF)Mr|VZC&E`hEW$x2p5lvB7t7?H$osZFU!&w*%EDW zhln{87g{p4%B^0KQEI;OhQ0#9soK2xEt*2JNCh0_PP$EfryahEd9?J!nQOt}e}XqV zxd510IDk*hz>3m*x${YfZ$Flk`0G>skg-9&hQ*bFX6D%~<Qck-G#1*!QhH9mKDDkc z`Sb*gE~PF;&lFzn<cgQ;Bfg}5tr(jkM=F=tI=}on^4iG<p;SqDPw4G0<?E^Qr2$hz ze${N<5!dxBx_rAjv!WK=eqnU4gVPINE@gkop`?x^+&}q*`3%V|&hg!_(YM9ytPVs_ zqzR9>pH~Cy*KLeM<UyGE_c#Vh`Uar`KdahhFIzH-^fHFa?X1G=ZSYN8ixImgnmB(? z!YrRzy4EqV|D=O|3#TnYW))B(B0h{QSS>+Z5_C4VU2pQ{FVT<$71wuL*p^nw<`#vn z?-E_jaRAb{1%FO=`q%Ju5>&sg@Z2wrLx!}W$RRV1pdzDO9WlwZzkwUTM5+4)C8V_U zo|14?xAE^Aa?h3?H9ez4RPo8<Or5MqKKi)b5Q6ENkQyeLxAiRgc*J?7S-Pm*&2gp% z5}tw;ekR$b?nh;kY>_OrgIk*#0WVX(qbP{}V@Zn!6t{O}&~E6Gbbm`&*~EDrY4vI2 zLf8y4lZt=Sgqzq1d0a$Ubi`WJ<m@st&G4A^BGGa!cJ#dPi~ryk+uQvq$PDdL>HFq> zMM_2$vw-2v634aqw6=)_r~Ykotl0m@6fB1vVVFRpBDG_64H__fTOFjT+ZyeZ{E%sw zXYUek?G)y5`(}JH6O<0Hd;L_vYEKmIwd$^Y8Wq(tx`NQ_k@MJbMnTApI@c{}`ky<3 z@LzkA`+vCEL8;hh*a_g%#>6<cvkPAnTKUx?G5iJZ)-6_%uGqAUN87jzqC;P*^I0D! zu&dhIlLptFp%oj2sb>yN<l_1O^W3id7tpehsCYEJol5(Uk{G401FvLY*=dsOv$1JW zJDepy_q%c8vY0VKhm#eIs>8LUI1J;AGlk%UTm2I|ItENka63e_O$%8LgPOlH&2Fq2 z!2qD2dM;_nd)NL=WPGt{$UPPr-Q0E}TrLT;{=`uXez5v};Rw9O3``exz#`YRI_=`w zj1|<Ro+wKY{}5qBgDiP`^NZ);;_E%UgN;=A^^kO+Bl&0TrVBRW>o3=M(GjWEmBo}- zEM~>Rqi}F=CMI-2Jq&Zj%j}#v>2i6RIQk#F{-YW^1u#+`-qTrd;Mx8-M6ng>7g7@@ z1#j>1BL1IQJB2-A+!4}#&V!B2Bur$Ta<k4{E()ZzdRAJdO9AQ0Nz0Myw2<H6X6HS{ zX$K${51iEEt@vV!4WohivW5(dIn(oF2Ifmip<Wj2hSsHwR57Q5@C})!VG*$>*lXF^ z#O%y7EC3o&$eAmo4m750(_++Pgga@NII0x$ujkxuH+O4mZzA$(QwgMCF!1TJ0PWf) z!a6YQc!j$W7=KK=X@j1#@2;J$mWJZ|XCFT?^`<kNA40af*24ggF_?h@)|dVrmV?xS zy+YOQ>04Vn)RsnLGU;+cV(52Q7dYV0S_JJ~LwN<b53uW?qPqijr|>M3xKNV<$3M`A z`xy{kpUu*O?^#aw&`Qt%+Q`-u|H3k*24en6Yu^tYkW);Jr0Q!wmusC7i0tdFeI5NL zb^I)HbD>GhbZg>pqtEh#vR0!7Z64?*MCLyYJtYSGEpqf&bZo45b;WjdNv)~1AW?Df z@r`2t2*wYw^SC>MR#TVU%H<ITCJ0*hay-QQs)!p0;!U4=d;8I&26`Z>ea^MB9WV`P znYQZ-NB6{SbEC>PgzkHILDnsl!d=W%oTEmSVxDP*Bq|2e8JV1ull!__H)!M&s{=H@ z*`Gyko<g@@pr3Eg_5+{9gZyHrqokE4|F2jCR11u<TJSxZs9K2+DY`%R4*T8U_i7>g zPsgD>?;-)jwxN`;wqE8eB4T?9&C|-8!$ac5vyutpQ16}aB>n(x1*uU9a_IGdrCVJ6 z{{?!~8^gq-#(oj@=COgo8`AsAWs5Gu6j2;IdyO#rm*5}=L~OT`x`R}JW(J7dW=H7# zT;MmH0T)Pi!;|MR22p3^UEjMD=mfrf4!;=G)^QG<EahMowj0AN3*Nmlyr2R=;SVYW zz0!+a|JV|mW5AFH)BQl$XXp_cN*yjmd}Zd;6S$OcbLIoxBsfvd1#%gw#DFidCM;@1 z2c-Ds)Y`Rgm(6D~_qs3LS#|aTv&FLu=TL?KvHN2Nkaurw0jmK}Ud+nG#A|716t%Tg z4JsfOU_!dN*H>H?E2oEPEZhPA!@`iwIYnM`<6dC<0_8Nk@{>1=rKceEtDmoOfKPa5 z4_#UU2V)^C(tT3W*YKnw4{BD7vQj8wDYkU&#l%g2_!&l%4G#-z1qNLrXKhiTo$Ytv z^(Dw?NeqXH>*y~@fUrX0y{t@c5Oz}$wA-*I@u7TnOL=;CpFKt_WsXOqr^2p)buIJh z4AYzg@4FN2#*w{y*#64f+0XxQw6+{1tdV~1oSnjV`MqL4-g5&+6bGxi0W)GGV0JxZ zPx-R+6$8u7t5TGO`ph)sdxO8nb?l$JT{qs*4dc+ZGytdO?=y;$w4jc;TvBp@)|kU< z>QE#ixa;)aVM)fRymXhm)tx(`zy6N5WT=Ddl2-Nb$oh5E!H)(r70Y&6sEj^k=Kf8Y z?eF{uZiQv8op{d~Vo-W_t--CY#i^|^Up<?3K!`$F>rQ7n%!PybmGYbUygJ3YlKG4c zPOagixYw|HKz%N}i@HLjfg$zA29<BC+|3UB!O?PQJ+tg7=(xGK$oB9ap^Dsk=)TzC z%5KkReSx)6*uQq$sDl!I&ZqsPI~g*|>DHuRJYIOUN?f%O$)BBC&kP;1q$@*?C&T}5 z&$l}@65ZSTZjxo-u&OkGp7Z4<|6(tzzq4Tf_0Ke3@FTS68l8hDEvH`PM5Zdcvn}+_ z<boqO2GJJzxZnqRN4zcjtKP4KTf00A!a<jKBl3d|GlZ3nDdxI*@;5g_>zymo*wez; zxWezAHe4Em=VCd0pUQ90sKgSU6w()<m6R;88=9oLT2wl^BE^IluFfD5#G1qRZ)RV5 z-r=vQK*Sweq~|sqL3lv}l(L({d%H){Bl<Kq72J`eB?&^0w=FbT5~Qsxm@oL^rg|i@ z_1r_p#yj}F6LQm;4$Iy$W2J?u@0=w4j+}eak{zI2(u?8crE3BAl_u3Cvg4mnPcP6O znW4I&Pmgn-euwl&C0>aIT7K{gCApdbntKzPl@+>`4Z77|SkvwA41RADlQ-TEmVAB| zn<;(9dCQ~dg~ly=mqPIU?ri^EL^{61$JXrq7W}CjddN?Vn?c0&$J_8k#DRA5Js%3| zZl(!N7E?|~9F_EKZrvD*uZjhA{q#rAgO6ALzZ_K8osMI`FZ9K~gvP^Ijdd_}AJZ;( z%4Qv<x)WA@Q3gUnj~`t@|4?LQZP{|D3+&LBBLYh)s$Rni%JQn^Q2DRNpo3u)SOx3g zW#P?ypzv7J`~{MA@B6X*-C~4(mES=aVtZfWcR&{<$VbiB?QPUiqqI>JZ^}!_5xTZ6 z11%F(?787~wNwV9Gb^(_<P9;jchHh{z>{WRdQUkPjmJWk+g_*lU8hm9tM1=pT28=m zJVXc2_QD01g$w>#g%v6bLRT0SmBRTov4XWaSTKuCsx9({^Yf7J+=JO8obh6&byBpM z%zvMregNX%Lmace6||B6tt*Pn-z6?C=x+Amf<4j0NYCo}41hX^kf}o%`P+z7{B6ST zQc4UfcdkBE%H4E=hAK;Qcs<Ev)Fj;ues=neJ*lU{#Ix(Yk}ZZk_#sHm+3*++^V4JY zL)AgCn#xn%6RWck_^|#V(<Gyp-EbnL^(nF((a4ZCEFnRkngB$5`dP5lxx;oZyveDE z>c;}v8xetFa`GKjHAq;I{6a=%bitX0X%}VC3)+VB*lO}W02wL@q%_{@zsIi=3gJj= zcfpOp)Hg7nELvYaQVQs0x!@^_-VNt>GM}qK!L^^XsMQ#BuEE|o#mURFOi0j>8~qR% zbC$_%X(6DlBd%+s{q;rV^p+?tTM&y)5buYT;U!KUD7Ib;LcFA#yQI5%WET#=z%5G` zjB~&b9T1>E47f1}%{;O(sk<*aS6yS=XL3TRmJzaq9Vg2}VoA``EZxQQ2(B9OS8|p? z&H?-E#6nPMpB1|>`0)DSOKWUFpIdNw^KI~tmy<9K4Sx|pw<5W6v-!ywH4WvKi?f^q zNIkSIE!pAke9b#*(xIqrecvoPi)Zh2r@CAmll~!{5FA)UKfRMa3>z|M|M{lJU+(3F z>>juqc1XiMu}ZOzZ!P>l5R4hdb;AyKl@6*Aa=BWqqSY|XE$S2rWrHj9*4>+G<D=Fi z+XEBKr;YeK8Xn@I&NZ$rJv|OD+~;9}&ECP9Y?Xt&aV>SlzGqvq?heJSmWZ{L;WKAo ztNbvG<)q{+TG-wt9{j-g^(3!#45=FU0uBoK_#&{se@p1?=|lHd7ffp#i1sWDgF5J` zvR`lK8G_v^DO^wv<U4^cBY;-G|8-a`o5>Lm3yoOUmnkJF5Y9!oJX(`rYLXK^>+D>( z=JLe~l~^0|<?C(uCX~0I?8~W0SnqQ@_)HT0SHtUscZt^1RRE-mz-L9t=q26R_z~;i zrz(W32g0eW$_akuPtu3mM;eszKlo+avhhQ@BpSadd~XbOY5vecP<Q|3;sS+l%1tqG z&>SwH?pUIkSm>i_jpRTWc}sTnUxNnM{|z*}BOrL+#IP58q7BWoX~2Xusc9|uvjj(K z-H_g~WhRFN+ybU{1xVcd<@v9NFnt@Hky%>8&G$r0e}cVLbzj6#@0A}$`WtAn4m6nq zu!#o|CEMiM!FbtBlRTjK={$dDLnxLasQBrC>~s%FY+vUmnoftgrWBuHmaSG-=?+o3 zr_Iy}WHZJ!?AGdFp+w;ww+jn13nR^(G$>nG0A>Qh-4j7M3{?!3D#!I#AEIWX{hCMv zgAvyHLMI+c4fXu|?Gz$CSFA&x9ol5-vWz0x-wP{m0E(kNTQ(2KrCrdz(w)^Wp!mCo zb$3wPmqxE`&>I*Gva;cxou+gJ0MtB<@s_#2$ohr|6~)da((*DEsVQ<ug!_(@4zyl4 zR8Y8;Lo#~Yrv)64INIO65Ea#jW{3<_t_NXrT&9&kLNTJ^ChdS!{Se=mx&ry@&%u@* zJ~xT<WIC=vL#3?YWOC<8U#STJ0NvF&)}x$T0SfIWa`o<C*|}G+-!BfQ#qQ1CAOi$I zPWA!|UOxC=r18Z=f%-J>c_9iY^z_ma;wOgm7p+{QXlD=^Og(}WE}xHaD%=ych-;=J zt!rRmtS-Sx-l?*cN=a>PgZp4)l)6`IDgS}4&d}~j8EJRfbZg7#pi6w`iO1bxg2X9% zu@KiHDw`Gea`&ASFf!cW*jk0{?-6;sed_Iyy+&koqMC-sOPGoy6~u#iYsIEWqTKl( z;$U@^dUKO@Ws@H0jshWZd-v`;CJyf_82vonM!7v4Khde1UH*Ob#;_Y6tl7#;tW-yZ zmA2ohkzKII;vvqGHR(E8ph^F<ltk>2ZJtKW^fB!=MI9g+FT~qEZ@k8Jw+|sIxw(y; z*9VvI{{pjF2|NqX*EJPo@ViE70-n4&;S+NIk+dp(ee~p^+B(ZsvZ+6GRN7p;M^w|u z8*evh#`_q`+b2;aHOyDp8Zzu%(6^4pO)tePr(7)OgA#QLqaApWopz)^JV_%z&*I^> zea)$hg~_#k_VE!+NykSJW)tLvbh;Bv4P-$!>efpms$hFB>4U!v<D-vJ>}X+n+U#)r za6O4%0-sorodt1uU0=20Lqhe_Mr7dA2dGwYC#eO;lD1Y3c2o2GGw?sj`D5glEM-8^ zn|F#WEkMb7wl(`&|5|)&_NwywoS0V5puPv<-i_UM3q6ks$2qR@H(s1dd7S5>2K7PP z-H+%;_x1Nm<OE?IBl4*<Dl#Us_Be}<zYJk}yClE2MBE3+`}(Q+1}Cz)Kgo9-S*=h| zb7veS{`*Jjcg?f-GxhlV|B0_mB}#&~tFz8lQBQpK@@Q)QJBEfCV|4wDG3^0K?)R4Y zA~b%F*>^ukcJf>}F*eqzfhe;K5_T&L;|ajqK2Vz+Ii)o{l$9tJt!1rHs5z<wU#iXt zh<zdfXgVPDxjFIqF6QakKNkF>qHs!%)zpx~@~=pA;1pt2k19G!Z<4=a$@$RqeJ+5p zk{qVxNaXBG%ddtX4dwWbFd|R&&oOBkS>_Xo7xJwMzp&&19H=Dl@<!|F%?cUqd&vb5 z^YU%~=DxW~``{D)!!f*!*U|S&sRrTvI&13Ny%VxlzCvf-YU^@1oqBA~jA&jy4wgwU zS^Tx;G%$<(_ndon7#`B}Z~rIG>;o|{Gyq2P>2df6gZl%}RIe}XdxHT{)Z<c2y!@E_ z#F*fZW{w=Dk`+SjU(%f7=MWVafs~HzyN_A8MsxKLZh^5RLHaeNqe`LJN0{yWY!O>^ z^2-AIebM=6l(jE|fk?RDNA_a!<!S%v=FB#u{6r41QL=z1j;~tQsAj47fxa+;04Rg$ zw!6KDQBv#AB6Vx&Qs0u{Xg1zspPb@!`+Ztj>t|(GK=e9%qw^DBHVGr{h6MO{^*{y& z)*=%doyX%-ekskNM8OBY$jA0X6VuVUx){#0IUIV2iL*qRi();!(F>WDMl|2V84$qP z3GBNMQLe|H)Chz(zZPQ3kvr1KvQ3C!pQ;kr7$H?U>hDyvg!D-i&B1|V$kn01_&C#_ ze&|1)x9!i<;a~&bpqLYHCCMu4(U0ihj0a!H(Sq01BLNVc2mhfex+z!JDNV6q@9jPD zwdj<B+=80MYD}JkAj84e38v8VqM3VgVx&kcKLunv{j4pE{qibIM;Ev_rxJHpYP}VE z1lb_m28#MdQV}7p?;wQKMVPlHAXy0MJlfPSHccv!C$5ae-RZ`kBV<>2y`m@$e!!ir zCfr}Nk)K0sbB`>-m8mdPDGkrV0FEEKH$79c&}p6^&C0=$h7s)lxwES#YY68M<cbEK zyBFSWZ;?RIgf+LOMD9_fasG48wn=$Br0idWR(MCTL;{fcR(H9uU}+5>qxUVyRE>zO zNwsBHsG>G~2jjXS=NgMu7mt)3$$G_FwsV_LZIxq4qsU=el&i%$9*1TNY0qCU3Ry^E zkfkatF>?UJ3qCQ84(*X+AN#^$F#vnyi|>tbD5a_BsB=xxVGE+>cVsEwMv9005WTS5 zvo}x6uSK`7Pr(Pz*X(-*m`EG`JN#v>Eh^7zu46A(40FKcvAQC`mt($wx9glN4zXCX zNN#>yHl48b@7n%sm&E?pjhIHfaLK+l=Fs!$E3JNx_t~siPgof2z`ek_HzeY&8E3R2 zX^flnzzv;%;Hm$-Q;g+*cL4j57l4KHm2dT%YeGht0@9qrr2D!$3IaZ5Y<7iVypMY- z=yI06E`w;;bB28&NGt<NCnrkKo;nwF`Tz|g&NZ-sjd%lR;`J{Hd-^wWiI`!2b?3Lw zqA&Yd7p`KOPxtKL;P>fi&>zI|4-9YoDz>r0By!*yi9vh5hJJR#AvTdF6d`dGkq$ny zAjGqYoogyB7sbR^G9Duv#;20`0JXMnD9L8V8JT~Vw20IkkX|s9YbBbSq_{3x<h6j{ zWA@T6D{OiX<R$g=27C+*fCQ4>&`5#-xx;j{6nV*T{e*0IR1GL7@=B$rZ#Zhfaf)|% z90T0#<`?YLy`3$<jKNHdF6gCn;N=7tG&j6A_vAO{P{AKUgro%9V3T7bdgLFqvr2dM zCGlHMs@DWz>SZt5t3uF`KC4v5cpGL%8>>@A>&e-JSn7e`jLO&fFNRK_#$7w-j5r zI6bJN7-$pGij<5G#qVQr<9h}X{msImMAhTij|f2;)Gnx=TkERE2%?+FxM-mzxLF(# z^m8KV?n!WL86~$YYQ8hY^!H9Y`W(Xrpa`G?^<CoW>B|_Ro}NZarBv9h<yC+W>&L+( zC&_xmR;)W-u7MYOYsPd5M>zc}Aj^`w59#O}q#)ONdt$Z3r@m$chV&jKZ*io>7aghn z4UE#mmLHg_yp<T;8S{)$|NSX2jn9l{_x4(3zdNq)<x;DMk2TmXM8VWp^3~6ckSia* z6%9F@OS4y*Q~oi6;MObW>m@tuz|G1w{DbZ0&`_M2;m8olG?bugl#s57b@+*IJUUZv z+_a|{<T3#lpADG(OscIMd7vkE_aTFdNYpGQK7R_-tJx{_?=)ccK15HuOB%#3TYCQS zAhkN=QO+ou*S6j<oF4c`164h@#bR=jW0=)0m;m`fAX;rzTi(@P`fCeRvI_ad`ZqU! zPvE4N(t;*sy=m$*B$12Iw3ph@NQUQdU`~7clff-fGf$)FzMo18){&=$$1RP+xBHM* zavecN#R2sc_Km<y4pJn6^HYqiGbxQS*w-AimO@2TRQ=WY<BKmDS)BVIbk(Hd;jR?m z4Tx7PXshor3;wlND@}w2#;O&_1D;!V0F}g>WQj$meN~cq2V5SKUmE9Om+FRJ?8@N! zumb32^P4{U%tULa7A7AE95B3!(#JE?@c?5Y3XE=Kfc!q#^rnqObM4!bG_?TWF+L<` z89cKy)hyh{M-h+Rw=kx8xf}tv`I`l=Ij66euQRW&&##OaV!NHUL(Ijk-(+^zTpgZ9 zgVi7BDL^of;J_tArH1z_F#_gmhT($ZgUY`j6?J6G8<*W?*9|x(+MX4M#^#4SS0e~T zE40oo7GAAj)|xwf>wmXq1X*H53H8R0SN)71fy41p^vn6tPpNI>F`)VTznyV4E6y?Q z!$>9`Z#a~lN^EERc+=S1aLiBYWs6|6O-qtPyJn>Mj_5~m``-D!ZP~~Rl9^zs@UaP- zB-BFabX4WuX4HWd75jNN`JV$OAS6$IEqJAW1>h~nASPJF+dD}@n;2_36+&aBxhf7l z#}2LNC8Mv~8PEH}>L*$_ELt4c@?=fYKU(PyM?=0|X-_1C0F+9#X&Y}+X~jdS59Tej zD`Fa7=F{uS<Jk@GN1hYHXXuK)Lekv5U#HD~^S*eWU7nu3V*m8KnX19~DUp&+BSi=G zFA-6OfJrf<bEDhu2Ug%W8zZz~X1tJpBV-FVh*voPdmBX4x47DIZ0sr`?kW<JNKui1 zdG24JPNAzHDnjG?gw@^pmbFF|F)sNMvRy*ztwf~%x4%1CTdB4#I%;u6z|TKt@7gG( zHVUV^yMa+5`u0@a<-Izahb;N=PhIL=bs2ercQop=NA&G)2pTN5X>3o4%V=h7b3g8i z7&0lBvuKW_<1>9sk&dO{Iq{t3;MNIN@s3!VIS52o7hu@L-9&!0+);TNv$NiV{)fF1 zg+8ZpH1Iw!)X)%b<#(Qng@9+r#bMO|dQ_v6*nSKtlgi9Ev8_Y$et+PO947n~3hD#) zzUN29`v>&l>E4vyASK_1sFOUzvu5qsRQ-}UID9B^8@8{^-<GzUl&vQj?0$h;es8fN zOia$qOzER)MqHFMeo0Ts?9B&a+d%X{kB|=j(Q4xm<s*{uf>&dkn%=KSoptkf$RC~_ zf;`e=(xY$3FR1BLDG|YT(!dz6RXYo{LHAS&7iTONbq@Q$eMDNimH+~BB_s6X-JJt* zs4^VOr85aXnx)!@(@XMB*0@~Je^)jRXfi1V=!|(fWc>Ul(W0r%(m>OU!8C|#=j$OM zY@sDSnN^(%M-d@CF;{$p*<c|1tx4%+etPdw=ogn<%j(c{4^`kr+|BFDR`birmVEDH z#{SR95cQ6HcKjwPR)r!Rss@Sj%D5vpQm8h_(zLy*_rSVGYu_U&A1UCdLOfX~5w!Lb z+tn8BmS|o>W=j@vFiS=OO-n5r6SKn0yCNZBICU;V+in!EvlC?cv0TNd3=Jhcg>Yto z%!6AYdIzp7eu`rAvswi@i2^r&s$Ol|qK-LjO@s$GBct=?z3h49911gg+;%`TIR?DE z9?IgW`O*>xCi$4`#!|*zS;WG+Q@ymtj-N=?b6}+F=FIB>gWoIQ7Ca`tQu^N_0JCd3 z+gv<)huBm6Y45YpN$@?%K~p&h>1vb0_q|8Msbpf5e?Bmx(9_#kRwS`I#jH5u^GuU$ zu~|3wMW&F+8ic)?D_+kL<bdR+@AY>S%&24Efu-$|*VP@$Y4fkkX3%_Yc`h+sbli$K zPnNm#5`4*+M*(5dpNg8K4S~z=S%(MROp769@43f=W1>Pz3?|fqW7{yiy;Q$<tGrzB ztf+}4KVRVvPwIi-vgP!2pAO(Ere<W7mJf7jDlkL(N5Y5OIZOkR<e0aT%oxe^&oNF+ z<jtHu(l^uI$3fLVF?VpDb5PeDAmusUJ4WD|yQ!P!m9-0x9tRfxdSUELa!^t>;Ny)x z-H@rT>ywK=F^R4`dI30IwBCm3Slp`}oQ}0&BPBPV=xW9NRxtZ0C8>tNsi`f>)T31V z5Jt6FE)vV<%1ACsyZTF7L{<Gn`>Ab7cP6h6uQTp;uKAW4no9DEJX&$Q<8L1reTz6K z$Nz{W(%-Tcqk<7<R<XQ0X%opmr@6Rm{o+6Iur<?O?kjvX_N)rg10lyg<DAW1mkC;F zmTjA4gO%i{7`e%oGuFaPy`fiY8+emR_6aU1eUT?h+}=iA)D2b6Y9~;lx;j+kxTh%4 z<0H~^K1+JN2z@#WF86s(IW(sb+K-8fho;7#GKCd?Gn_>$(?&3J?afk(RjaB7n#R&{ za_yJy#u-JaP|^1B?^`&OK4+!lL%VdEc%+$2K|w*AfBEjy>t^#RR<l@{p%X)4OFfES zgtX&^qnP{fqHO^?AULxVQ&J<74v!XfvD&X5lKv(rdfBzQ{f*T<Y5T)*CF-p=y813@ zo!d>9=G~Zh=`f?o5%Ql)d{eU@8TMm(=}Q%~{bih{zR9flKzwzkar5?EJhwSocUit5 zSn3EwPJ$kD?>0@eS)N0C<juFUW{uUGhVf8p|J=o(Y5Q4UvAqp39Z6sXx#V!Pry_Fw zLw3F(P^n~RQ)r(!kg^!)2~J!S8=@ey%o|ggEP(~}pO~|aO!4eRd;vSVe@TS)cp7*m z#c)S8&ZW>lKg0KB5qUjse41_DNbCCkMv_%62@5ATqEY-0I9otAC;gml;`cW}vg~XN zH^iez=*=eA2J>ejq4L#dX)qjnE(k8Zy#=TH`DwJRp5Yrm>5-)M?{fb-DfXYXUMW^z zAGZ|p#lZew?Lp|H7F3_vbhpFJw;+k|Pns!;Iq2WQsCvZG%*z{x{G+r`>f>p}97VQ1 zWVH!|@VJ8a%gmqJ35t$pMCaF{hZS|woS~P<yn11Wd0pPWG&?)#0#S`Fe5s{&*4dn+ z6#WH#@d~HD>W9lw$mF|Un%sX?x0JOYxETb+%}yVe%DpAaZ{YF(vs?2$cw&~-&|Y`N z-uxG8>f}p9e8j;$WffE`Yd?D%ZOox??gpa)r%3Oh)^LsTTG@9+R6fjk;jOM0+l<Y{ zV@q=1vEO>ZjTgPiA5(UVVr8kFZJA17oqQZg@Midc^ZxYh>`#o@9h}*VSb5}AXPk|d zKGwHL(O`dt1<>tV>(X>gexCSE-#)Ew_UGlRlb)8eX2xLL#6(UHjRo4I`&gy=*x-AA z2&cf)mK)VB5VgR>grCtj6tAx{=j8?DBk9TNU(Wo342E=B6>QkcC%ny;#-$MGnVAv! zICnhMLALmF2kPS{?JQWHS|t{lg%hl;VDXD{&cCN73LTDZGAKpaoJ)L7PhUGG3fw7p z@ta>dOoe>^p@i5BTA^hpP;EyN#<~)<AySSC@MSD8!P85$tnNp^PXW2M1N5T9r`fwM z1g-}d*)-kK;FAQ}7*E0e$*)ur6^h3zOv6!_)}XTYdVxCJ>D@k0qYyubkn(N3n&|cs zTf902FRzs<LtDrd)w!2Jb8{Yd{Yz=Wz4@FG;X+4eh=DN<fq5s5CPSGzf10bXISg+v zO8z=Q$g9-kbfouIbC=W)R`I83Uqab8f9y($HqY6*vc9cdx=(;*c&n$}=Q6|c7I*Pa zSsW*QoJKzsc^S;3T6|&+v)jLaX`qnL=SmsxmQL5<tryo4pMRoKl3n?&sSgUDb}>je z_(%B#%Wg!r#{h+b?Z!|^^66LGsd>lTQz7ma?l^&g7Y`cx*toMukRG_2r9t-ay-C~u z`8WReVy)7%-<%##G_k&6Osc0MDX+}ox4G{zqf`FAe!rhJ`NdVHSzab1({kz#*v7c6 zYTTUv)<M}c%ZKXe#hh&piui^51Ejb|C>zVu3g@Q4@d5ImPVYU`&lRi;hGvLm4do1X z^X}RjMV{emMuoLRnNimp*5azWlMjFSOJ$X7H6AXa-w5{*w3LXWTQ437=Z+DKbB}#& zARuF?_=7(chB%~FkRt3S?QvT-Wu^r+53cH;AjpfOE+7Cw1Rnn9f|t+zlbL&K6d)C8 zUnb9cI`gtEC;0mBwdgYV1@i!Ns|dXJX0<V{HL{aGW{ri=Q8osMFOR;OtNK}P?q}+! z&K;?|Evqx}_xab5DN;2kHPPnEWZGM{elP9$k(s<SB+=41B`z!5^kCM=|4c5?H|PJo z+r7Tugu3Oc95xsU32;rJQfXyM&fP+*tr33`08d}?ae^*>>oSd~0KH#3orC%0WR@<9 z25Ib6B$E1%F>+FT`eio9dUpLMyB-@Y=a5@V=~W8#lVkNRpZ;^Pm$2>E+gG`pL;U*# zDqfOebxV&m1KLB@$h{^w8xO`<c<YO$cp}ctsCI7#oGgV84V!Pg`g0hCWea07#)Dw` zaANcW>AMKjplyni%adnO;zwXwnJa;${^mx$)thmd&pNYlgTVdz@izL*83bOM=TguB zX5Cw*Q_ABX282d|wd$v8rC%lt>D5~|8;M+6>7yfBObXD;i_iLpfeP?<lQ=nleEvxv zeruGx`V9@?n{JSkn{nK|z)=o=?<sS$Y$EO{G^6-IA^fvVn@Ns*mxm>EgFLQ1-QBwg zTAajIW}*(mD2KM_CBEp>_5PZ=!cLPFIv(4qD_41>FKjjs#4@AH9qe`lUZ#D^9liI& zW9Z3$2mYl-T~JxbFUmNF(e1<a;n2$_9W<|fGy#e5dm^@)9AFCaWn!(V!TMf_;~SHJ z)69z-W#=C_(Kj_|)<qe79qSlOXl85QNBb=#xdk%?9linmi@XLk&LFJ}dX$geb`^}! zz6JZV8{t0ycuJ2GL-D{vMy;O5K5Ko~)hl_*=Q=nD?^x2ijpFk{tXZglyxsC`hff}f z<PnxzWUDLnam)^wwtxO)yuD%C0z#n2gr{qx*u*v9P*O-#!AYxx{v!>Q6uC_L>5EZ* z!M14Er~@Nn;7+PmN_ir9mHJuPCPlJGU}U2#^%FFre9euKc1ebR1<1YrB`;afC(!5i zOQ(RW<leSd4H!Uv<}ht(T?+?3Q|{-5JNncPvpcBZFkDy0(HyjG0Tnmfcq)Um_bF0| zyJOD{ccjrGR8^Wc7q50Ysk^+urKeBCz7AEa^yaUFLP7$Yrb?V7DR03F%HYS*guURO zt)&za%vNSv^Cx`|#6d??H*06$-GFYW8OC^MpCtctBNxY8F{yOC+QD($NOihTgdkw} zMt+Ua3i8SK^t$=O45tgib~)GSNJB+|F=j%R-cBGBJF3I?r3phT4m_wy-z!OyrteHW zdRswC7k8YqBas}R%BQ>C2l_}b+{*uHudVH|n{nRV+aZWO=WSOL;ypgzZHKfkQX6a( zUOr>8KAFApoq$(7>E*E(d!rZegfg((D^guAcU+X>|1k9yTyb{Mwr1hM-7UCVaCdii zcL)%II|K;sF2S{M3-0a~EVx5(cj)&!x9{m5qy9mSz4v<8ob#D;1@E<8JrfiTr&t`r zNVli0`QW|x@f%j4Mb`gS<mrHEp@yY=qpOsUxA%ZbNjgy>tEB!t(yU_<!%Cwj;Baf9 zV-lhgIOJY0g{dNspF7p%+}GSL$7^v6lk4+n<xfZ9C3AMY1;-jN3;G2M*293b<G=$c zT1}Pd4|LkI#ff9R&@~HV?G^1D4);U6ZDjxNY<X5%FY{JI+ZU2_gUcHvgHdS~0U!MT z4b9zNlC9lQOza(8eOo#@l>eAb^@v@wBjKR?qQ6&j*`V^vF9JpygN5%@xb9hYJs^Hq zv~MvSL$!PA1n~Sdq6kqBTqEv#_V$?OkTzRYr*ib#WA+H9Ld(HW;7-BQe(6Vk4;Tdl zV~Q@1xV?A3S4mWCLbfGF209!*hXS96Z^00wEBNQvkSO=6RjF7KdS)qw98`YqOz-t^ zwoT55xaos16My;I=5gX{)};o~XOn1(KHOpDFa>=>#u37SJ`;wo8JWFF)XQ5GB~XFI z1)nhSbOzWcVMzzcIV&0cSqF^o2Wdv3UADF4LCEVS#B^@*wGCX6))r<8{jRsa0~du$ z8nu$*@Ry_1grK1mWE<@o_GIw<zzY~95?G_H74)VihDJM6%$K^%qsG6gWl~HEcy4v6 z`5S>A?Jhs*r)|N7SqS%KD3MYJ*LJ3Bt)y_@Mc7gl+&x+VS~Wz&mj3CY^7cv~xK|{4 z3;5uTw+$?bk)o*^A)MDh@}*#>PunwUNP777QFZuSQwPP?p#QA9d&s$E!+Pj(c&ITv ztnuQ5<>P||Olf}0sg1LpP^T-cMcxE4kr-?y%4SdHp(*@wca`*}k9RM?l%slpfAAXp zcog{EDQ&OUFR}dr`m2%tAR|-$U*hn|0XBwcEP*k@;{Dij`;VnI>VQzg^3Samq+f8j ziaHm!#}Kq(GxBfPMQTg(UyyUHk-)2>PL628KJ+e&D==-VRBzipb51#!>zxdV%nN%Y zn~6^Q0y=bge!9UrI42gq?wncuco{4>xDks>-=0(sGAPOP^!pi^W#-D+0*=Pu-%tHe zIk8U;N<SxoDkKtQ;7QkLj_+X7$9^tvqdnMa51j@>eLu|G>}Rei&?9c0{+S^&JX=;2 z8tEIKmw82fn7mnlkVSL1kzG(Xf$wm@X<Bo|bk0FBlhTvv;>G-ZZyOEa>R^5yW@7zC z;y+r%nahqe;HO)NxXhakL;AU#q@I!X+hY_!`TN}c*p9-rs4-SQyT~8=QM5|c<r20y zf9U#gw|NX4ZKda3)O5Iq&!F0O?hB_UVK*WCr;&BD=;X6%d}#qZGnT2kLtFq<iIwY4 z_uFH@Xm^*(-3QmhmGO(%VUbk0dL2Y~zZAvpz}}G3K*!`NQBP(waGq<Bj1(E!n~K16 zE87|yk+MEUW7U4$%AB8OR}P1d-V6&KE@aLf5`_E}o-ffy3z<AyLRWN1gLE27=ZCCc zelnzjdrNz!Y`TKmHc;g!AKN`pgo(^hQD}kM?vLY(J>d_Dt9vGZxY{+LB4@7WP!I~U zb52g}Ag`wG5Pw3yf_+QA35H<2S|$tB-VxrZ8f@R{+@{ZNhBSi-tc8^uYWHX&#lfs( zK3wzco*Q`N862qdwMxkM4HXsAM-Bsw_@_@Wzc+_9si-4n#^ohEE)s>7e?*b!MA^DY zZ;-dGiZU@H@GPBd!}&cmyG!F?+7d1}qEo^9-e?s0*xN5RxHPg!cyO_u*q15kC+-6~ zV0%RRC?liZ9HLzW2BgYHDidwcmv9Q-%U+BdH;TZJSd|2P{P*XdA3uN?UOu!;B_meo z2ss?oACvGn^W<4iY-JgNAp__H2l|p7&)3HLp>@aJe~-j@BWX2CRBReC?#i8W>N1Y3 zN)@6EhA&H=UL2on<jQAI$swu>Knk7%(lpaooe=N0NK2$50fFqW&5fT<PB5|@%nUS5 z<CJNIzp4XOiLGzwKCa>8&yYrv39LnJi0O^NY;<TqgIoHN8)Ql^A(K>>XQK-(!)~kq z7(I}SzJvloD1w|7wq{~E{V(@k+q*~hV*ncSmF0A<Wxl{dWxt_;%Gp^|^fRD&J~+|c z3q^da13hDVSet;aR~0|uEZtM1C-PMxKl*V6f~P8<@tbBuH{+!)shhKum#;|cTf%pj zr0aL6L>lFgUpFT5czg^|>Rp`XxZE`Yid>n`a3U}tL?Eq8s;Fqt59g3M*y3BygGMcj zR!K71??DSiB?7^JCd<l@NNmX`Duz)-=?a?MUcZIgx`qG#Ekhy<KoG_SM;R+FvR+y| zcCL;Z6x6VzAoWvq?5Vc@=w(0PVHbVhz<iNI`n~jg#6#T`kZWTOg}FCm+yFB^lrUdH z>THmex*zZz*9KA#`FDX`Gph%;Z1$ig)o%}3H*e}JFThqFAR8KecYiB}cc@AvV#~0} zp|sygLHrs+{d7Hs*}*it8e0ut@kGrc8_xvCgI#pGovJ<AMIeAT7{&s3F(XT;r9BJ8 z`!@wByx);rE;g`F5J2@v?JSASr;~)h>MFj|OaAv;j+uuvo|UC+eT&5PBl_{f=KOnF z006MwlmX~{kMD-?G*4>ja^)<Zq0i!0F)LFwtmSZ8>`ObpNf$?fx1V%h_0+d$d9|N} zcsni*V6OsZO(S@Fp;*;kBXRrwk(~`?qnH104mXBt$xKD~qvu8yiU=VwGh&7}96omu zNyOhWkei$LAZ)tfL8rY5T;W4P0kQnT{fE4&s=#;X4C1c}{(QR*b;`N+ic@;*XxLYY zNTP`%D`T>avV?~p<Lsx~WP_{CdjM9f+e^IlAp*SF4>dF(A)7_(fGN!;MW>;gUx`@~ zUS*-Zyb|GQwhx8b>y_LD3B7{gB%jUXOaZbV>+x%JtVr{7gj8`I+jUjsQ>Wc^PDo?z z8p)Fhw<)X|l!RS4FDT?Gx`m;$!6-~i3%^(&7WDc_4-GwcLYS^3Z6R8P)3!>+MNp4) zoo(X`-$-q=Dne6^B_=D^(HazMUa+8f`b4#iur4=?h)8=FQiYC4IJA})T8xhrT3nJW z^EpXJKwbfBA`c&XU{_KLnUyygv0Pf0Y_oz9K;Hmdsd}WefqHe)jGn(3m+~3mCGvHo z4sc83N5=xT!rKco$rYZ$;!{f&Ut51}N4G6}dEjO`)kvx<y_5N(@v*3!tnR;uOmj`n zS+CcQ@xF5O3)8qaf;;iz4(REGRKtRykC;U?l;zad=|O=_CT*rO>MZem%d~sI1cr`% zqQ7_wK+9!q;4!1g4woDa0J*D0=+NRR4(8Sl_ADG=mqd_)hfvuthC#B|P>Q2iHS}B` z@#$YW+`Tz`1GmVnLk51l1*WxaGies;<ltRUdk;^7QfnB`PouAQW21v>j1u3T834N* z7Tk+QnxJp0sF8_Eua2;2*v<f<;PooOophn-V4(#wE>eNv2S$LuoSUo29WYb$VeGH_ zB<J3jO-;$XKpE&_+<-becwoLn(-Cz!cbBQkZ5Od6<q}ujp@xure7zNmXk?Jx%Rwqn zq#ns33MZl+hd~?rG3upjR&azM#2K~DPGH<9)~t3V{{`L33noWEGzABHxUXYlS)ysR zkW2}$nz^Gpm%iGX5?4QL98p%}e~Oxy3(!F0d>N?ONt3ZkmwWoU!0s}HQ9L8u#xKU= z1j5@(S0|(4To<U@)Qt#fBZ+v!Yimnv5s377j}iRlUVB}6)>{5lWCRWWsWK6|sb0Z? z9OJOgx>VyOY`LFe?8fEm1}0hs<JB8k^}=8yUs)seTma{Qsd&C^<H7JEX49~>I$EWa zZ#x}`VMK#?%hd$#<jPxySC-gSmwK+7F$uZ9EY!$I+R4E*CqVpl-DPJOb=IE2T-N&y z|BcK&AoqGuzW(D?85rOvw(jhI=DO1|PhAE>z{)Hx*$VnA09(Sj_stL7<L-BctNBuZ zG<7sM$eKGraQwEnJP(aTQ@xtp`{7Vv(LI+sj14+r_nU>|kN>w7f4%NgpT;uc?<e~X zh#XT~3xoKMGhrR^CqUrSR+MO*pzdC}LOHO)GI*DB<p1~jqgp8@cPl6eAW(hJA5r*X zJ_gCpSa+BzXMef@aleP;;}t}FU-lC!aa=yJifQ7PTY`@pA0!7W?6=o}i3=LV>CU#n zI_}bcD>=FwdIsHb|M@|Q%;I9}-sBA~on}ZH?<9&PD=;EIo0c(lVQ68S_R?ouaUx3X z$&D>Z_2;?PMru)KEAtx5!F-d7;!bC^b=AQ;Nk}-Bc}IV*Ocs+wS53r_g#U}jTV0PP z!W5|@FP~n;v@@v)<V4yqDfNeXf?porLD+*W{-`)OY!wxvj#L{k-jbLOf}bZ53+^Gi zXn|_%dNcwnNHklDiz*5QYl!;%>@;v+E|Iy9pe(Y6ocnA{kUN}#N$$eW2F)Pw80fvl zWa2_vh=xLCM6ZKMe8=o(JI^o)iJBi@{CdweTGH?E^Np07tVWezv9%o~QRMqIklNfJ zY~$~T-{gbmHkqi?txQ6Pi%uk=dhBqpV!F7Le!H8qAN<v}4<Y+!5?Q$?)Xg)D`o-Wv ztpzp#U44BY8{l;AED(<2)|74d4G@!x>%s^(d|E$`<luG)iWOIS#v75e&35M@9V6jR z-Cr!}0e3n5@ZzUvI^yi1F#oJj&N9yWMo@UX#Gv#FJ;Ik{iQcu>#0Dc7L}~@_<iYEP zk=jlpMqMV4JKA&_8=Zwfk)dvsn0aF_WrU17ImND`L)(S;?23fAV!X)9r>{to%wHD- zh7FC>Y(v>!Gyv@K8;K=X5dn%UkN_D0HqKOf21G$D?A_vm!W{7J^KLuPf96g>G4o}w z*fNi~M)749>cLv{r;F}{NtAe1!_H*Y7?*Zvloq-_SrBZRts%{#Cw`YQ=40<<m13z@ zz}Qzn8nyBjvmyw2)Pc7C8bKIJv$nR4K_wvL#gSS8+HkHp3rn3Ovy12QOpniTZj>SL z=O?gHq?XLVb~eh~ZdJ4PQtw$BN9!pHRr{iT(8SU-SVddqxD;-3dw`OlJ26bbiH}$2 zJJO`(LgxTU`jUpXn%>z9HbvT|uJ6a9Ev0N98J*|e_Hn62u-%Z!>SO5@vQ}0b_uAwF zhnxJe2T~a8h)PN*r6fz0DTy%I^SjRuX~5^_dtPsILmmGOM13b#wEL&+I?t!KTlSTY z7g8ku=Zx(sF0byeIF7b?Y9sx^w<GlRi|)d^?swd?fH&@)ivSUaYWV<FZ3B*)JJUOD zkwW2a>4{9AKPkwY_*L}Ioe&FyF#lPXh8?b#YJho@;i-m&cB2cEArOp(lg&l8&j*i# z3Qr$7D;3wQOOPcM;LbDke^2!bDZH8D+u&2rk57vB`S7L3>A!Y5X5Oj>Q>pxyObul< zt*|=f=L*H=-i87BCPAQuC1KLOBL4{gVyRU%KYwUpbSd*ugO$kL+<ciJn?P_72e7xW zB{4(Im<1EDvi3kGN#ny*qhA=l#L*)EE!5l!{1dR4m`%BrJMznwa<FCAO|)8i+C{4D zc_Z3S(G@E{DVY`rWPj_2#)8I2JTXK)TR1EMTx{nBj|79jk^>eCn_hM>c@^)E87_84 z!gRP;J|8gvQci{u#>?Bm6CSAzlP>c&wg{Blj-tmJ{I8a4gCZrH-8veits2dqh<D^b zHOHb4&tn>@E4jb73I5z#3AsA9^0~Y55sXE#s35Skc1*W03y?>#jFW*_6Qw2Kue5R? z&aE1MF<R|+S}A`AM^&qm6}P1Js@yOSIHXB=dVz@J-|?qvD#j8jM?7h!Bgk!vkF+AW zrSQ^9r5|t1zp@SJt<=S&YS#t}?Pon`IBjeLpj02IMySM8)>}PdjYL>jtNxp6tE6(a z+k+0wI1+m{9`q%<gt}u6><l}XVZrpUI1;7j<)eusXVv0A!Z&u_YUwV9;DZz=?bOG4 z_JsLU{{qj4)YAp|`lXuDjZUi7l@cDIA=uH%2(<*H;vKq@LKz+Q4LDhs_|nD9{7hc# z1K1QwysQGS7{Y9Q;@%Rtj~G`&PE}8ymq^Xv-p1Hq&ifiV;DcoL0M^^h5}K!M6PEXN z`YUy!Pt__JK)0ReN{Oh8?zPjm(CF`icD;Ssab7x$E%Hz5lu`cmq?Z%@)gl8&H4}FJ z?y>^iGk?hHve0vs<&$(Rwj*oLFJs_j)gI!u2=wzuRnL1hNdeT}xx`vOTwJO0PCYse z21yo{{4`uk#+S}d+ro&6yodvkvQLJ3<ZV7-d%aMni#X?dc*aQI(hea}{z6)+w|WOH zXxBK;G`vD(Wlzf{ybmB%TJJuC?>p?&l&h8@<1LR0dKiNB40^sgB=|lMA8)=(y`H%g zw0lUsEn4#4Z>eBt2>TU01F80PAK(y;7<Uu_)q+`fsuJl7$ca^OjX-Dj&H96@|6}a! zlM7J2r~*(8uO6h0(l#5YpTumEehx28DA%EQ_=~pQM3`Bp0d}wJhl|n8Zi;}1)ay4m zARXN`(Qglvr)5h|CThD3is9H@U7wUb^~!?M0W_|gdsLl|KMDK2a59?y0uT(??xj5g z=wJoP2qjxzp#iU`@#mIcKX82>4}bAvqkL<-yw3;d<IIJYo*YPGyY)5aWn}LUU)gee zLE2aT=bZ*$V^v$zp)%*E8lF5UQ3hljbbA`xAAMO9i)lNseBH2I4Q-@hH7F|?h@%TB zWas9nQAh;HbQ!)p%H&gc<)EVO$P{!@Tp`Xlzj<HziG_usqvolOC6+_fIE&?ep~gZ% z&SR0C0Tc>=$luQXckrGI&(VV)l4vNwR~l`a;bOKkr<U<r%zZz&?)S;vz{TmKOi_^3 zGM)~@#rnziG>da5;#EGq%Ss_9I&-A6D&<=Vh7_SCSpYK=7{N%2Gu>u9K2bA9gs}sp zJNENL4XdR$5WG2zO2sypM&)gp!ZW_tX&CO+ogZb4jHP1ACiwQKz>9gFR0nq8>X)|& zziU!kVl-V?qD%kt$J;Aem3d2(*x|ghe-*)a?~$?JTKq{j8Ip^N%`QJm&q$1kdCOcp z1GyF#HyQU(qm$(RDBZ>j-#A&L-DmlX`1J_}+=w=cQe_t<DnOn1($L$ZLLsGF=3If6 zWu&?F_3}KCLu0|Qkna~778+at1H9^`WYDzB6SE~<O%)X#XG^8qE}yYBbXf(i<3IfO zpBM#nTP=2HzECr+>-+cquZ~^4V0-AnC)k&NV=dZRElKL9KqZmWhAiJ+){@1=M*PL8 z3cz47%!czy6FbIB`RS7Vdyjw~`<#xSdC(3&|6WvTaAaQDmZ?6mF%%r)w>u^_r}hgV z-28Y*?k8Iqq<TLk0v@tb<tyb}H2p9m{S=Oh@+$*H%P6i7HTH@kV+Fx^<;<iP`^aJH zq?25fgFku*<L8jGedMavK|Hpq=-UJPpR_GB-sH#T)f0EkPgn5UR(oCTQOP(vu|C~g zX~=z>JovLj0}b~#ZNxom?hL-fZ9PGg0%CHE$JLpP&RTjnQAlrZ_li9hChs4!iI!Hx z`8tr?k!3p@I7Bt4#I9OT^hz%gP9b%IRRI0VUEydMT)S)v4A06vp^;ITjAi)zBa`P= z6&D_3`mxvVbbh#{0dq|x@ux#K%aU%z=V2#rghlHqwz)q(oMd|UVBUL0xnAqZ2ym*- zA|akzneydtjg;C`*Gx05#c)!`1m7FRB9!WJo?XGN%Ch@=;CrgT^DgrA&VFpErd;Su zjfg~zm}L7Jf;uvS>jFdAN9v^g!sg>runMR!zPp8=U03`wMo&3AVgJ3bCPQt>NYaf; zX2>{T!AXPQkwH0YZ%t9oY$00obgZ2}3}`C_E|u4P`TDe)5daehVAIV$Fc$zD_AS<! z0c8W9RMX!wN9j4~B#p&-Q}GGqN25s|CKsH=|6QQ(URDe-?h?G%7{x@TerD(m{*97* z5Kq}68b^Pk4%Bw96Jco_k}tW0NdxbIZ%rJFTq2l~nKU04SGwF(E-t1?((#Z`NSu|I z!8<emik-&x0;Xfs1w4*;IvRoJ$Dr8Q64LI2TZ801gG+~%L#uKq{iV34nmjgmwkg9z zVssi08;0I3@sm9r+aqP41T5)9u_m$!Ouszwp3k)|JxIsY`D-*~z%juV0V!%e8ch)y z{VFY5feu3BILX2k^Zls?g6PR-hRa}~>ZM^TaRahwI?@ag2yP7H9PGzll~-xlM7=#Q zJ*y7n>I6*i#XBfqrQg_S3(oIrPQ-vXAw-=5sP-!rNK5mRh^k(46?E-4tw1dMVC(b| z<W2+tyGv0ldR9!XCO%_Jf7tme(wABm`Z9~lwNp*Ud4aYp)sf4OsJb`oHDy@mw|l!K z?HX)%`W>ZgJCTp*lgK>j0;JvPcC}Qd1`KqP@4}I=Cj1lH(gi&GMLqXD8={c5w;yt6 zYmlB^A06%V^d&IeTGJ#;4-bqp*uVifZx4UwuU)k0r1cy@mzS#1^KE4O@P~hGl09rr zW*~}gCF$OEZ8Q>N6GiWK3K;VW>x>f{dRMJk2atc7J?d+H&q*er(#McA6Y*8we6*81 zT1r7P;_O+BiH|BLALTQZMuA;!U<dy)1Zz9d8g(R-UjR>v-&Owi6%jlJo5ol&+k7)R z1>ZB-g9?Vw4z0ceb=nT~yzFRrQKe|i&)U*;pc#@5raB?dDuZkQ`vfblQ4_}}9CqV^ zcRQGS@Gf{e771b?lT@PP^djXb`C0Kw60lzoeXj2&X!0~|U`|&xBm3jnoeeRnPvIY< zSt8EwBltj_eGTA(1U3Qf?JY6LYht*+DEq!<^Yq#!|K(Ns)s9eaOjChiQxd2XBe8vD zPz`m-cZcE?%io>6^9)p^R2nHitJZ#*slxGgMsH~Qp=%5{Ld?&<iX<vP_vUG^5^Hy( z)7#y?Jo~+q83}Peoj%dcpI5}oW6sR1qa17)?vyGIpq`v!t+pq}Fq}Yb)da^CRmuwF zt)-`E2OoM<LTIbkJ1nRmKi6Rwqvqr{b^luIg|bKb!M*=DCIQ6!8al)P=v-qR^*x9T zKC8ZfPp}x!7f%m!M+2TSUiT5f03x>&(ZG|mp-ZWwOX+owaE{df^V^lQ-e!RG^(p@B zFQC?xN=>#{$mh2cr|ieQ?t7HapsQV(+R|p$#wct83&NUZ-1V;XRq)%fb-i%_na|75 z?*Y00b|8)SXzkhf#AujYE1=e^i@s1t+$MmmBHuvTL0hdC|DRkIR+(XtPHuQ9@+k`2 zl9FCq`jd!yLwGc6ov*5>?#|ec?>rL7>>5TQMqAg>;7yv=7Rok{IKY+OP#^uTv4%P3 zWW8jlz_sKgB(v_%jibT98L5iH#SV&c9xdA$^VJ*N(LSev$r-IvvCVzGjFu{>+U^_u zsZ1=W^7ETIbz%rm$13(YBJ^jDL`zRW0c<{GxTJ|%L|VGt)_4C?IIe3(gp)TbzI->@ zi_69Q{?-yKv=PjS&6wU{E5-#^6wTDcAs#%lFhKP9*1M-)m?Fg+H!XiPaeP-7ED!Oi z5?cgBwI!?D%Nn)~f`#%;H60fS0onK>n}lM?Cm_SZn{rykd1dQtwf*H-k1^Y}4;1(1 zf&7*!@yHWI*~`d?A-qiP{~CXEPMkpM_P30-?XPqPs^{0U$#0lzMb#iJZJgM`(ABfo znl8Qkf1L*MhqHIuc4$!lLMrP56#JbJ1R-lXq(POvXaUX<!h&H@h<He*q85^X>+NeL z=6XBLXRY=a1_W@FI=C|K47oN+KAkq<M4uNZq_+EvEs{n_@^m2jxYmaEhx%4A4ot6+ zli$E7gF_@oQ>F#i*%EG~hXJZcQ8Egb!y~Mw*{US9g6M%P9-0_&wh3$l#P4;fIy;cO z!K!lCz|!e+;==T$jaq}j<Niv@py55>@K}EHi(EGZqmlxjZl&IDssDE2z=afFFEF%| zZ7f;qdfT0auQVg31vj*o<$O`^WDXd2p{3N$%b=jMLF&oHf!31D!VD1PmS1IO^`f9x z_(y)W>|%n))R17yL{XR8i}-|q5L=&srwGt3W#tCb*+?m}*mS65XvzIJ%bm#=#JzX= zR)YA53t1NpIDOJXVQvAu2GCt)2(2H;w3lg=t$KE@R#o#~n~7H1)%Z9vsKVLt4;KHZ zGEi45gX6Ci@au=p5IRVmrnT%6SMV4&EKFlqTB8#&n@PHcl^P@7(E<6tJc$8NB;$T^ z5XBWrHw`OP16P}w6Fg678?gLb0rC0=jt4ohf<Y)B%*JQP7MAp0*Baz?8-Mip>E;;I zDu6U#w!dBM0Cm{H<Y(p=NbO8&U;jaKqZsRKcu<9Zs9m))^_%vfT<@nBb$*-X*<Vv- z0c}x;V-KX3#I9bVb<NUO=Ymfa+E^^cYW|Pm{DK&Hehx7<E>JFq%*TrqiB38HBl>f1 zq6vF3ei<0@-3jPN%TsCoTh#W1zce8*`QmV!-1De)r`x_m?je}(k#4FyT}wj~)O4SD zx{r9BRs;NZ`D^QghDL!^D)fB=5jt9pZDmThZ4N8Z2nd0HOI?}qvjHLPe@6ZQL9_~8 z=s)}#Q}Fh*>4Hg=Hf>_u%4#FuHMo++hP24xR3ba*feUG@kYel&3i#%b$rYmVe@=fq zKbVlbEu;UK>;J8#rg?u~M=E3{{MGyc<q8*<wm5u=JDfzuE-8*&_mfsrK&;dtHAoxM z1RbAlEn13>LWs~5{Xjgr)ouj3+%k}Jm+JIu!QdtssNSM*5tC@~Q0lPCCiD^2+~M6H zQ%hG54GhA9v7_}z5BWo)f3OVh@e0$d_o;SWW^zM`R1={1E}Q?oi9^P=5hp%aj(o|1 zYrqQXE49@X#kjX}{2ga6dxGDSNuwfGVZRq1)mDDU=wiHrca=1fK=e<W(-+NgJPoXL zdt36vct^N}W0Ta>@QV!!uggGBdqkH96mMHm5zJz0vyPN*PBFGR9&L8SCQyqXnP;*8 zVJFWQP7lXdK%7oV+-tdP(Q6Iq>&J7Q6r*Q2LfyJ0@^Fpj7aH7b4QbMpiIJ$SsX`ZS zQTF{1vhssk|F<<gT`L*HFFbh2OYLC3gO$`cBa5iVR#YC?O`Q&kYeMZ+R*IQ;ucO+- z=OYy3!Wzo?0x(n>>VFs+O9O~jTwLlmZ%E8|f90O$DEXtieA<2A7|<S%XKOlxN%Kdf zc=1Qf((2|d_X6}y&4W-sjBpZQPTK&!1>YifCiNrF8~~5<+B?9@!m5Yt5G!@K8ifBs z1boSZd$f452ylnvi$oCWq~PdEqJuaCi=i*?xny|dAut=rz$2CuD%&~Am<rjS(k-j7 zWT$!uVSbN{Hjpfgvds>oN<3U(3j6)^qYkxt{f5}k<xk~s%4c%LO#$<9sz~RW2^dwN zw_07`I_rY!VQ!}=*Dp?y+HcTT&(x{`$;#5taIbZquJ^NxevF!usM^vxl(uM~vy@>! zP|{~eA0;e2e14{Wekvn&ISQ}Ig@hj<(;@=kQQPEvAO3rwZ=dy+U!T=JZ;wx(<xbIF zHN4zo_unV%CTEtf6YPH01LZeqPHd4_2}d6z${!tl%EdjZmpBZ4RJLv1#1FN4gy(g_ z9DC5N*I!tcoHTC6$2<tGL+r2^&a6Fv^iAAK9@^(!n5~0e@{H?j$>S3$;t|LLqAzQ! z{pT0`PgG-g1u2?4PB{rc@AK;^{^%~v0I;!IYmZx58>p<BgsyqzJY5lf9&3j;I&x|V z?jGHqMP>&Fiv!l!LDJJRe$%~k-*^`f&yem8=o3~x(dNJD9FnELiyfn^zA~ffjg>=A z4?4i;{lB8w{nB8q6qf1XP(aNaa-(Q5ldH_wylhaE`r5a^X?8Zt&W@t8?_)RYk)2S$ z`2|k#*Ba^Z$X<`eI&_>lZ@aUy>Mh$`LC3>y{YXCUN=*T@B!VwtkoN;@-j=$NJ29LZ z&4jP)lsSZbj_yQoAW4izyNFGhDK)}!eql4@hy<TARE%Z0$shcIC_*FbwL4E+74(my zx|LNS@T!_-@wrjT3FB1nYhiG@K?GK;6Cp61XkI3omOT2Vb@jhz++LfB8fs!{st`F| zJ~z*q9`C^`)F2Q})D8b8G$n1KQ)MS8aHTB&;~X8iUs^qF{51py6W%<A=O<5}G{%R~ z_@c&c)4<&(1w^qPQvw=eq{0v*lc^R^F{~Y$-!Ox{sLU=o@>0S0gO0W0X^Glcq|gdd z=aJg;ju&r0c}&lrLSLRUsAA~c^A|^vhRKW~rB!)^6Lk>O_xBX~;?29~$0YT&Ub6E` zw1=&(z{K*vW-G6VqjN)eQ_tJ<>o;lexcuuDq!R;p8)Qk`RtViFC&71=h-VB($a=hM zK!fF#jYZiH(X|=;PDM}n<L0OlpbbZOwS;bXe@3bu3>_tJN3fbMwQd3G9FOU4pUcQ4 z{0P|-Q40z`JE*d+kms_f{W*kS<n+1B);(1Q*-pM6)BMxgq<ySmvX6xH@s_IVl)pM> z>NobcdYs=JHSR3=yE%*k%Su!LM!=*ZhnM{eNuW)&Vflq*>xZZhUO(hFg+!S)8zy6v z;c~mwYFyoXcJd4@XQHAm)5=ebnwUedyY{-yvGnq5Pb!p0(!<H58$eVo{NcV_X<FvR z&p<U^1KY|)yl9C%5ZdjInOKzhpI*n<<|A`}WZ=IBWmz**<8}ClsVnpnyn-k)O|E#2 z5#YYr!D?XKVzmd%3b+kzU)*4`ZqAp{^g^-PY)4bNaYlYwY#2P@qzwKtHu3n+L`4zz zi+F4v(?B(PtD06ZLR%|>`{EP-#T4<M>$wrnRbvm$x3j!m`{Hiop_yC+GcUJE+CS;@ zkYala*fvoNT!?b;;=azRMcXGQM=98@?G!EzH#_RQr%|Y>O?~dM(O)@YCP-+K=nQ`; zjHTCd?$~e+^Df}cSh22jG?VE_|8V-pSvvWJhqsq6?2F#><rUlh75e_5?y^PF=L{R$ z1W(J*+bi=#fD*CT{f>Cmyon*~8NQ-}%cWhx`Iqt6X*)?kOyK2j?Kdm*?Z&X&+{aV< z&9lr{!ENL+D<~a6ZmN-X`z8Z`CRUWY<3C;zpT^UG6pG2T^5u%iVj``=-vs1xCES#f zM6UFKIk+EbrKog(%Bf}hO2@kSe|P0s&70v?bOgs92r7`L(Vh7i3duW#Sh%Ijj7ddV z0>gJ<W(fZ7KhF%!!mclbroW}(QtIpPSl2a%pF^{nrJ`GQesj#TkCc7;u&HiF$;EAX z2YCR^%cr9ur<DW0Sy<!}R&C{jq|SP&Br|G)NT+4`Xsl9jjP+zkD!>UWNnpVU$mLS8 zz2*mIEFb@YMl~+Vs|8t~Vvz2XR!e<+K|Lc(E&bkhJ!CF!-<MGajhw=IF@f@HK!%Yr zQq$t?(86&3YWKm&W=R#O*;dC&`a}^51dH^x4|S$&G(gA6V&$My7z&?X&@=Q(1Fk}` zQYNW#knBvck|gnRs;5aZ6Yje@0+oppMx=oZ*rWClp$mnpOn=1S8fwGO-DlUUJ()7< zCd%)((m|+iX)M*5fs3~UbKI%Fj4hitH@ABJ`c8$1?hogXbH)ppK_j#s(J1VuoR&$m z4MYTLEbhRGpI*^9exUhyhVXZzY0ZmqV-3Jt0sS;5WXIf_Dt>>5?_SE*;{fT-Ae8=R zpTbuv&#WDXkc!6Jfa2LixS%rew~@-FRt#;67Ew|UXV^Ey#wJ?K!n9PNY3YBQ7SGTw z53!)hAi)Dc$WtSOtvIDixUk1vOjGle6yKjXypc;%6A{vE=f+TT-R0jhtb!-5kFyv> ztg&ao$5iadC0a^7?Y$r$f2pTqAS{52Rb$Nlswtp&jY?YENdhg*Mhx#FH%NYRI|X+^ zA9iiBgS9TJ0(kQI%8HmC^3;C7^3r^<)Q=pXEz+Z}>UZ>u)HjG1Yn<4B4yhZ{52LSO zo1Y7R$f?IM=DV6dx%;MPuB;@PlerJr%2si`Oka=4X2%fP<|RG&DY$Y9GQ3Nw&5-=Z zn6A1NJKgT0%4o%ym<ld72L-$&T)o9y0TJFidJ?t;T)-zxv$-N!Qz>`-_b)vd)1n`7 zedRM|lG?+u|4Gfs`#<)n$HnbuKVTdIvOOdI&k@^E#-kn{Wz18~#Up<Uc&Lr^a1L&N zwF43iIg3LRO;7T%xvD>xdwCah&V5oAjz8oU;o!8vaLjAwCu&UDBJG3digQPQGiG%P zG<hcGJlys&B|=ikdXD@=HokTs-Z91wQET_))@iy+(~EmZ69kaIofb?_iG57UpVz$N z)DuNc?1sEFV=XQ>Y&t4bXlUw%+JLuSu=t<hjzNU7xh|q>Tamqe(L=M1-wpC;+-B1I zne>kJ^h||4<i_M>OZI);>&?%fE5{)e%c_&hhFK6l4Ub)>b`jYQJaBO}q^0)&Z%mC5 z`|B}oq_Ka#?@j9UEuJxUy|Jm9YpLR&a}zy7*S|QIa)btX>q{rbmG+gACHJF1y6XT0 z?BrHE-Yl~aKh((*J|)c3Rn1C8%_vBk<q^@ekc%A)`7aNr;0sNcq1+GDjB2&K0|s`o z<3edleN@@sfDpV%@mB{Ie<da<;D*i0nzm}TN<xP>3K77gRJ6AQf_n_J&BLI46ABxU zn(86X7MEF<y}nwiE+RmUB2bL-n=)_H8>sI5IBu*dlIhngUo<qq*O8qkWNY#@nbqih zY)M>t9NPiv^?o%3y-~s*CKofF_VsJ;1Qk`LJ=7@)jeD`Ra*{3bsF6=cnYn`EU5VoM z;)PhpHJEPZ^om5K5bdc@{EbTP-{;JQvwIG%f>b%p3<kH`q^)k%C1*#(ktp&~5l^|U z8WDsfoiSqB5U8Jed4v(vYI!hJ8rE?rHYxGFeBY*99}G-HpG#P+8}q7kX%rjmAUwo* zM6$y<D$y=SP+b5v&Hd#kAJ1rh;bG)3ybCE3>9%$1E}yX5CvITzjfcYeyI^gl_s}o8 z;ppq<2e4YA6akGVF$`J6az?bk$Pef4itk?&RFR)s-iuH3pj7`#ZFWXI9S|0fcG3K2 zrt-l2d&U;1nF`p&Pe<AAw?NGSpGv=fZL!l3<*jn&e7{Z`rl?l?eapC#ng%`lUAc&T zztj*o!vIGd*L(x@f>zj3{a3E+GK3of7}QAu;6-TVuBa>NfpWbn#{3J%yro4T@m9My zhQLiE$Hsy8^NJbO-v<`6w9HXIa4!@_=SYNL*D&-fA~#`OcpxWxJ2L2zZBTTs98Ic3 znTob(!uj`)aYTHfD~%O2AOA=}K1#u58vo0{y$!!VojzqL`>H0v2kwa~g8?qXIOZx* zi0M8aK&*6th9((E0R3)O#kJPyDC#iE?w?}zzeD!7mDQnh7VEeJtveXg#jY#9-N_Bs zIEJBk{TJBVMh7k`q=2`S)6#Bs-#fV<u+M_Y9(b7OER66s|26~*_&r!FDvp$-b!I<6 zBbTIzIz~$w>kBai#nwj9ze2q7VCgP(LWs}5#uDgg<iPNUc)kjaDgQj&?(fPDd6yB{ zW&EtTn=(WvXoh5aF$;m^A}6%@)T35I`5GjU)RRUY#)F>Q{WX02%T<7$0r_8@{<Rg# zziX780lABd;)&9z5v0P@{;!`py$*l6?Ez?dqu@+`91MqQ2&o!I1aP4_xKkO6pMQ^^ zKau(Io_J;TK?8WP<L<BS1j;et<&K%dH#PrCNsf*b&QTCn|CwMoOmC?E-;*jVsm}gx z&|u(;Z1bddj_bax85v6+4#OG|Ep>-oJwe&_w5Jo8*`OZT={I&pJV&GKY<)=S1uKUR zXzkm6>wI2(%AL%QjiPSt|8?&S3Qml|FU*p?Z-IQg;Y&-)8e9Mw<ls`Kg9CD=xG@#) zuo8_|jqKQqxwg<3ls=FIM#I-Yrwl-5VK4yIbYxjfd&ar<74*u^<#;qD@V1zsI7)wk zz|~RrP9D%8oIFVlRMBHdR)v(1ge8^kGmyiO{VuP56%Wo(;uOJNpmX44AP4EoUS`Y9 zq1RFZtJ1w#*X4{DDNq`UkT_q_Q_NnnR9prw1mz8xExN-cHORUbQT_xCA<vcKmug&W z!Z$`^wK63My-hWQotontW76hJ<kpPLR_0qp*uY#^#}jk)7CkrCf><vOqd>H(U<m(6 zWdvWUw?!iZH4@@NR1|;@Q3miU?d^9>LV3vbjH&#dv7Vt^b1=12JHEGc8fu{XR>1mQ ziH)&;&E8Us?vu&i#xJF5L--oeOr@Ejip@KfYST05@MnnlcD_^sSf{@BdjR!=;mXRH z(BrraUlIYc{V!#}|80tT?~GeYu1i9d%O<CibTbrkb(R){uf2i-zMB4mqjYv!Q8B?_ z+@SO3n*U{esoGi08O39zbZwm~;4Tx;aIQTrfDi4$we?~?A)KEl`^6ILC!jBb5uk;Q z-Fk(<%Yx+FVM@`ODw*Dg*9>R_SALb`<s^3C`%D(~^p3LEbw*kfMvAH|mge7YzzjHm zdR|DnCSFs$6*FX%t={z_QcjL%rGabRQVB54s7<h<PB~>&>7ywI(Jq)ASqIL~OdF7V zycL?drGek`E&lrxj0O&r*(FH^K2pn1<SsL@z6t_U&pygKcE{FkZ_|U}$AnA^nhHn4 z&Q{TE%jI43oj6ju&F=o}UuxJ;j9X)n0j_~QFF3isEp|T_g$+Giz^J=cgLDh88hDqc z($lS75NLW?Hc3^8iDXRQcC=vu3-$fD@*aOXV8p@Vg_T@0{M_Xdw>N8^I2;G;R#Hw# zhS^1%M#VEM*q$ROuA4g!{3(5^MG0%HOeB|npmm!TyHTYN#XZ~Jz&A*vY~m$R2MAh8 zA8#>azz$hPcC+$0)dda}^ru&5+k;H~cN+X0=+967{ChTD|C3YN#}Hhhn-vHSN<e=Z zg{jXHkNd8b91^3E0zHox^Us|vDhfd4H?%6f+C)8WL+w<-0ih2dCmO7)kNx}L`g(F} zK|>_|x!);(vkzk5C+^pCY4Ki?x>Em$;d*?Bp_WFNG}gsN=+id#%8Li^jwk#0XwZ~C z-nf`5F@(lqD)>Nj)_%^yaV9L#SspX(x|%|$SZuElbo}S}zqdlin`BTWEPQwB&_YVV z&7-%pMnqWTkVqvIlyo`=cr#c4GxKJ&ZYDcU`CFJYV7K?}jvHt9HQIVXovj!re~5wt zvDc9kUZ7SCRi|(htOF7BC1+jHKPRTsEVYN$EgJxB5f4zXa&ik%WB1roaa0}H8Z<RS zr@m`w!M3J6s`Ii4=`wptw1WH6cDDEF`LE$FH(-oE2`4BBC7vxvHqLqe=*H2*;h<J| zb2E{Vq)s1*VrzRvIwV)xOBgt!lq!bsl*4q*3};dOO8}uWaNSPO1E%u-?y%?LizQT% zk~g>b*b#;$RkI)iyBExzUceRP#Mo+AUaE$PSd+j3PG$ZPm_y+flxZLfUV#}^_#nTi zVLYVCLEB4OGQ)bm8J`xGqQ3S*{KoC=nc(nPOF^KvoSm3B!SD_2UJaiJO<J&}NXdU; z8_N<64GAok=P@VVg%(PIgL^MAmW6PXpDgCqE}@UAVi{4*IE3)YKBe~;(N291V@?H$ zJ8O?5y3%kS5-jmvEb|Cl)d*ZCWAv;XKu;xXa1T3r@)!_)7rEW_0LJyfweBz_{X!X! zw0+=6fa6vHe3<%ICv_5HwL2dkYeJY49ip9oF8goTKLbAumm)H@h8G|=rkVM(-rRQl zRgywwHAf%1c!tkO<2(JN?{8`>x?jbv&WZQWQSM(EJ$u7l=ZlD2;}jXqV^O6}G|2)f z5aw{~9AX|<)DuYqC;`bQF${Iq_D6S1o^NvuDH5G>oU`U9cf8v?M(8{a*vT)>r7^7y zvagfu1!1W9DP}Cp;i+07e%e@``<HJyfi#*CaTvZ>bNagyMTM%-HF8%F6JNmnP^W|C ztY?7pWtb+BCnK#$H@4NoDcP)oKqNI6vQn_gSl(Rb-HD7WTS_%~q*gnXO;Yyuh-@@z z7<l*8a&lEk^ub?-`J%dc`Y+C-e-KBr;T6to0JN|l&MqdKM#q;8`MI_W^VpyzJ_rg} zDDWFpB;Y^^@DshiQBDlMe;3?e!JqPpen@YWZ2YbCe8dKL$}s|NVn!lxOFF*PkOi+N ze*t&xad2~?QjdEsn3O-&bS}5Sirp?5{)GQrl%s8pAl8Jj1*CsF>moOFr1ul4qpOjX zf&~L(OF)$?hcsXF!=))W<vp``k5f#OlPaKl)TV-(X<0_c3MUYXXNOD@xx7u$I~$SK zt8YgsCEfUrQY?3X^kl98xz{Ug?LD`JK)B^sFn;?|?(UG?+>8CoEonQ`sr3YQ7lbR@ zaVOvUa1;iRFPw0uDgCb8=_`9bUSq*xoahITS3O1Cydo;-8(nrZGfUFlao2T4n)&Os z{v-ry$D)yIK<S{=CgoiSlP{Y9s0I|1|0a3!)U4N3m_JOLyDk?OP7O+Jj*gwSn&EI! zShRQab+GV_iK~2`vgLe1(|B|ik&xQASGrOp(PMrIreS{Id3GS>x&w#GN@$<HpsAZ3 z5<=kCF9s4*?Pv*aRo@O1e-%kYPr(xcE@o4f=jC^_*f>?gtB{!lQC?{cJq@~Ous7Lu z-&6(aEh6@7xbLH5;Q)!GiNrCySI#0I7GeUW&+!(EDY+@tF)XVFlz$Li@vh1#mHDOI zu&s%FaXO`F6QoE=i755wXu@BMR@t-RijqX;cJuq0=$0YG#b#HHYR-(GGaYO5tz2Q; zR^1-8jj)sgv2*aLj~mjp?ZD~ygfs6rNp5bKMf(dnZu!)RF(-}+Zi-F&*vpsSqIGrc zpy#29TF-Nh-q*J-g)UK}5#}a&WZru;c^CF!p1<V+D(A!tT%V_%#|(pfA(mo8N63bE zAeiy5T)vtV+r2oUPlvMGcLYo7&q+)_K1=S>T!Z_jUXG>_=Jn9n-zOClrKe>AUW4|G zKX6AItR)`K^H$GbBM$)-&cZp(STpd5cNGFYCue^-P3+}^azrC{JIJ+n04#6ar_%6* zZEl>m@^d^X$5s(!|E%m5^res#o9g^E``@KXPaE(^_ITfAzD^RJPSF4&au=h8FDDy) z0+vj1u!o}N_83tl(gi(7p9*JI7Nv4d!u$B9%*UOvt>23Q9<!Y4+1a+z)L;z?3rLGO znwK=tSJP^)JMmM~jATs>x}ayEk!~OI&m&67uv)~qPfg9zUf-jMk!m%6M$tFkTnk_Z z9g8rYqJkl{4_e3zC%&wG##F8pz>U8>&E7j^F94?AbH{?TG^wwMZZK(Dm;r6)ZST!! zLmVQNj~jxgNy7vD?E{@Ia!%z+an6!K4LCmDV#S;(i^)SOpgow`ekM~>W|m&p=R>Bk z>x^EQsckr@wLz-;%lMtQ|2*BJ#vPOZYJML;c<qQiW9Ow%|6@ekY!!b!rMr6A#0<Dm zn0Q@1%h(EbN*^~yRr$CJE#eM#$ZbIAmgERsJaU8ss9Ro-fsdzH(Ix*3A(ebtngCRp zdMSNB9yG~QRK=`-dQDg(CM)=OX<sFg8m}mXfR(4wgDgSg6umJG4W4)yVAZI4pm%me z8tDfYQyn#`o^jckLI5;kUk`THnsYei#zm*(6fnBE7eR-b@k<}qdu67&wE3m&l<9Sc zy^gk55Te|Vf0yBAK3O~K`u}YufN)sAM-agDSnW=J8T<6DI0<Xs(Ol0^MxUIDv(EST z4OvKkoMkZQi<}`bMZn1~*VX4e`OU*-Cvo7E|DPP{s>WKtgwNW6N4GWXqe4O4gI%LO zJ0$kM(4Yv)Diu1}^l_Iz-@*w|LMH#5sMp3-AdE%1L@N6L8^S~(FR|-e_|f@c&%^M= zA7qCqEO{jp7M5gAsc9<us1~Z(B@#ehuaEqx!Xw$|OY7=8nr3p@wunIbkBD}yrVd3N zxwh10PEf8M!C_1<Tt-&hfV3P{(?e3xWrmDEfr5jIqg_Cm&PKBpujHLIEXD0537^dS zpAibVSb3QKTXYd@d2*9Cl7ZPH9ZjZLcIuJ4kW67S8W=Ri^*-Z&q((<DuqN~Bk8L7% zgzeRs@Dh`Y&Kv7;paQ5urHV~wW=B!PG8h6yoYdTS^tR8vpRQ9&vL(=pXMgArGQmDO zN5?dRC|5u}z7lnB=y%@Yuc3SnJCuE{?WXQrWhs`?xFyALK!&nJPdAX8IGd|%SKXDD zh{;os3yU>Gc$B0As|<GCNMyY=>OYM(%bIfYUF5kRsACnN0xpANW`&$E#(okawN5|f zt7|GC280y`m)sA5t*sc<gew-*Wy!V^a2PM}Vpx6fBc`U=(cm5+cO<cc&m0nhU;j_) z1lZQRye#*N^R$cbUe$e(l?ORuB7Wqfgp45iW(3vD$eFhx0ztn2G@omhfWkYc52=%3 zQrYwMK}KegODPwr@i#O`s;`<Rox~}{e^Vr?F`TG~1s?v=Sy|$Dc0|ij`l-xawWTlB zs9s=1zWK4`)gV+NepxCCmDM|<9D2lZKs0cy9R%rXYLu4hSeIWD`MAff3m3R~DtJ3b zOuOua=^rg%CsZ0koyr6aVO{3Gi$VQ$BIL0W#Q`t$Rn|ms+&+eIkg9FhZuE}UQEsO4 zzTZMuU=_n99e(o<;^!F<@DAVj+qc$^$RPja@O4qVir%1`<>5RBv_Dv({U1Z4+fTf% zA()?6RF{y4FS2Ew%4n0)>oNQh0MK4^(|BLwHT?czSDYl<pdC0`<LMC=vaJid6)>cB zHQv6@lvBlNmoM*ofpVYaM0sRtn{jk)0HV_PWR>vZY_Y2%PnU&cD{O@l<6E_se#M7@ z4U1ZtX$ii9bk)SJu4Mh4Y|%bq0>m%}VE|<fVugzf;EzL^P?dZB2Btg)`Q4aF-Nd<o z%pZC1Ra~?$F}yo+fG%@Iw=jh=_=39Uw3*cHBY$-zxW7@oW)BSNy`VD@>7drd<4+Aj ziez$wL!!1<Ud5?T+?cTa&;%N|+~=7AG0gwE9koBi?d$$uneBtUhe6n3;^t+ukgo2z zVAJrXV;bq+pW0ADktm0?p1#B0;$?Bv19<He{)!#K2-$A$XiRulU~m(~U+j~6EI&y+ znPz=|z^qC#U&~WgOMR?IqOLwmh`3-}?ps1^awh}`ERMwhuC1O{&q$Q1I?uQ}pJzEN zN<O;=63+sfLrzTtBVAE8ue!7^5Uk7C_Z{Kb+Zib$P*SK|{qEmhXZ#;r5S{w?wb)-0 zXA=_`Pz9HoHU*R$rbQ^{499&s`J=qzJF|c`V#T;UCpt{^pUUo!I(d!{%k)X>jYGR4 zZp<83_UC>#H@jaXy!-6?1m6=FwxlP|@dZnKe|K3R-)AH_HwoPA8qN~*+?eN<CVU<6 zNj4{ElL?}fmqHg(ysE-FWNJb1aTcv>poorA(zhs+jrMN|wS!U4)&i!q;Q{onl)gDg zJ6rV4^R0QD>Q0)uBF28+unP6_wMPYdObq&VK(~dR-3^o26r_1yjT;bt6?wgdS0(n^ zxa{udU7KZFIN?raF;eOBl>|stUjDIe3nOmDsRwp7Dvqbz+CJa>9M4`YJ>Qq@PY`^j z<4o^lsZ$AJvX)>Q_2I;?Sm~QRXpOqaUyd)3-cPzmHad$1cuNRSK9934A_UVp6waqU zqIic^FmlO=s2B~ACSfo!VgN4|;I}&NenlMZ{-}8MeZ^~-5w(qRA>XaH3>s%oa82Xg z(4t_~gjm$Ctf<uttr$}!uZT2vZI5v*{*UMGP?(0piinu+Y1g|AVfle!PrT@Jh1$qf zlwudXbhLGHSWm{q^6e0J*`Vml{T7~&cMu_pxSYLcqZ?_%Z~C_;t9~v=jyRMENCh^o zg|oxHZUoO_M_B&k*`s2riGHTJZIxGQ!_aXTjfCB)DM*=2)3`X=ag2qFT_xp+*jQE? z8i`I4YC??lZXg{jR?4&jQjM8*D8W%GwbRnl(FO=9yXKL<h$B%+={7p@J?|2CChf-n z*1$fD1^$o^IabL6*+z%>Gw|#H{po;R{i>mqoK&Izbro8}?jTxCyT`)K!LrhkS4ep> zEkFcLm3uO6YMWryWs<FbQ*6kM7)q~64+tvDMq$i5Vs5rZ0a>`TV%A!qQw~LBm?O{) zd5aaYHuL8ANEo~NC&4c%%?9x(NbS@<cW$<l{~)}ki%YEbC+T;bw>#v}x;|%1<rt<} z71NIf3&L-=&)+y8Uf|_}h5bL-5Jlv6sM)zH*xe(ULM2^2CfoUhoi5nd8ymB}-oZSz zHz$YrU_>Tbs_3p1Dd?HS&7KwTJA|vRP)bJKg}EgKVt0`l6V=@K%_o@d`Q2j=u?nkN zyvD-(ajGi(-%s|mY14qcmq+189coaebN;C`b%Q^22W{0=Z=iwnCre(XOH~ACgeQ@` zU@vM}cI!jH^|ZE6#eA}RP3E{fY?O@&V2>JGV|8_sImipGnHTMBbN@AdRvb{ypHE4D zyodA#yig4kU4)h>dZy&TvSvUbmSYnelkUJmyVn0h)Hw!p7O&AdPc|n_wr$(CZQFKD zuF1AJ*~V0p?Is(O?w)h+Irn>C`tQAec-LCb0yBqXs8oH^DJS!0Gfa&hQZV(o35`g> z@lqfYBBpc}N<<Fd6I|{~%FQTV45hmGEi71pvj+Y!EI60`(3xfB=MUvMgf*=8YO}<a zt0mu$7Pgq~ezm5#C}Z?Xwl*sbUH4(2qaWniW&05`Mo?{%rE64^p-&OPFit&Lx;R*9 zpL*7U)TO3-I7QvkWJsZSGtp!U);CuLAAg|JHHF$L38I7*C|an*y=>wX23k;Bw2kj` zTMruQLpz#c__@fwJ~o&|(a;!qb4H8+5w0Paj!j~1-67j86p%BZDiJt;KfkcRs9Jh% zzElR&0#gf>9&fRmyIFJw|B|<B0v~5uetq(!d$}v6nL^*`9#jySWvJT^bD=ql7_3jO z))}^WMYcmXvB58OFQ;97z))UB>blC^9hhHH0HB!jD?nEE75dp5F&&ZLT)(mhv57bZ zVJB*?r5@y_76b*f3h>zNl|U9wcNPN@Nv;3|aPQvhh5Y4cCN_dkaW0~P$&82;@yr|1 zi2RvywEU#s1v)7l{fjqU5$;MX8sAOa-*>)DIkA+!F5jKM5D|%zfxccVo`IGf3H6Hg zYlEm-QXwB_*^q3HK&U^Vw}`L$o?Q?fOXU{X__)(|w3<S!j->b%`L7mQUjk@ni|bu% zYu{#15=!1;g%qhQ+kWAmiK<EMQQPM3GI*bS1Xh;UuOeU2_KcOwO9Odxpgp*w>)WZ` zM4kdLD|(tc!#xQLLq0``%NVu9_r)L7JgR22nm}#TJ*cB717My9oj@jgsI%7hGwpPN zzGr!`({Q2={MGy&5r}S*ZU-pbZhD9+5Sm<$VY3<y2$*mj%o3|VS1FEZ=uE@~<}{*X znp24%4cNjKXRj?d3h&h^Y0K4M{mu|tSg}-60&Z-Oc8rsgqDZaR@1Q-@!&~3t^A}P3 zuDL-b6=sH`4GY-7>PK#c1zfuKB!W;Mc!Q#T<zSjSDVd(h$efgjHHa{JqtYUr^APqi zfEs_b@=}l8^COG;wFQSwS-?1#@snW5Mfywtvg>yGA;x+JZr{b#jJ^?3L&h;7zTDlN z3}kmvCcO6_ALxg%2W~o2pH_3!P%)ofK@wu+0!*N3Fh?RtG<|*XnF|J@G!0?L_peME z6!nCksh13&SYH3*K|Kmo`_16mh`w5a=y+;TiY8`c(1_T=Q%7BkM0t4(g2qQ%I|glU zj=V~PRNt{Ag@~LdQ;;SQqB+<}S<eeUtra#uuJvQzv;#4r$Q`uC9^v}~6d)W|OC4Ha z2u~glRz+m@EDwox&nZsUlA-|XXJjb0FM-a6`e6-IfK&DWSuY(OC}m^u09p1{YVaX~ zGtXh~Zm=npYioZ>EnlSkaddSR@L9k?c-p2LVYBu0qziY!JHjP9ZR<=w=JpVYQKVF~ zP=-&56@6<?nu@BZF$z<;30mR^@8}iZd9HMM2~}ZaNbDU(O?TAq_d99BLfYnD80%i| zx*yroPLB6%W~O0~-##NOWd_v&UpgepM0QQw<DV6CRj=14!txCC=tiXQ;en<?$)7UH z^)LeI;PWQ$AmEc>f}^ei5y^2CxrB{8QH*OQ8hu3yzOzw(MV9`Y@m0Y1`i=u!Q-jjI z$z#b+O(`cw<>KO>o73JwrTbIz<p%t4Gyy0h+<!z;90Y}mLo)1$Cu94)?<9t37DWf^ zs~^mKawt~VnKkruiMrh@aeG}b)=0ol>~#x$cTHsO<#di;lmelK4oN>r+QK+HXBGuB zzs3ZC1+-LynA0;jnvs1Ie~&AIZfTW1$c_z)iOJ~nU|fHS;`b+gZI);V5Oi~m?mU;F zHlt$Jup{nL-+PMaPr;}iyE*(0&;qV5c3OrpaR4gF;SAz9;L-##y*?g5ghXUpE15WZ z&6WrK!J0k)rPJYe@BBTU*gr;Hx6jbh9)pjgbNJ~4WpwoEGqS+Re)k}E%$b346|4=M zZQ?HdjH6Gds>f9!2m73iOu4%TsjpRVGzrtJ2D$7DrkeV5mnZ_1<LV&Ld5WL+Jr6G# z|1z2IT;-B*Cms>7c7QdLV9TJBiB8%KB@iY81wuDKr0gHB#pg*eXQ{<BCcqWp>@$*s zRtD&X)4O-<CIE78Sdd#@De6H%De+6>l}1AOaVP;IC8Mn%(t)%__PC(V`_SEh#ZdFx z+RFE{qw2sUrO-N@J@JGzS2U_hH)?xu9yR^Awz@a$j$4)^D+X41&~)n^DO}ZyGcMS? zsDbG-2}8J<J(`%dMkQr%f4B1ZN-#$ClxJe39*5M>Gf|ihl0OyZPAJ{&$n!Z5dB1gP z#eG=6;PctAxN{b-t(UEB5drt?w|Aas4~M}#0mX|eqc2z_P>s@nG9F{!5*CzN+$g_j zKJ@Exrr`9&iJHsVJM8E)D?Sm3ul)ysdLg6EmHS=!iD$bg(b?l{Tdwy|Zk>w52vUQ@ zu~r%$_f>L>r#?u%cFHnZRVjAq2W9+qf7LiuVjQQ1(;)xhN3LR_f_%g47l6EU{s+fC zBS;uF)&5wU`({W95+_9(b?T^t7V!?xf==H{G?U^_05z#yMLAS<s8F~P2?JFLuD_<x zOhm4C`OQqZviH%8x<PNuJLu-}_N`}G7rwcruDO?*UN@QQAX>1^LMb_8?JPRiDdzF! ztfu{px&Edr)LYB(B{lXj?vtG!6)UqqH;Cq%HnB}f9e2c?NrWdKv+S~Eors^k#Ift% z>z5*3BMEU%R<fOF_y8yQiXl<0GibX+vDzik8_ec~xz`hSTsH?afK>W)iTw1py<ai9 zW)~z~YONeZ^XsBCV@*6ZbldvCcP-sMfNhk9RTrpXpJDWb1SCC3KVK+rf!P0qK|sk{ za}435(wZTV5$%lAAX1w{>_2QIsH+}ZqfRW-ldH(ykW<e~^i<fdHwiB&^C}!w7F(p0 z!oIRrK<xWx|KLOWe))hKy<A7R-34svC_eQG0$lw$IU-7iu3%1Z+g5OcDiNlmje)$R zZ(KAm-*XUex_yebfezFQAmykaV!Z4(we}T2SQgj)u-x;k$23S)L{~&l;{Ss;vi$8k z>%Pc#IW<-LBy44U(RQ`-9yCxgV{&>5J2&_$+KCjk)jQhd731|9FWXzx=(F+x$<Gja z1L&C*QMQz#R7;|s&5U)8pf4Y}8IyzrivAlV-t{qnviNk4!#^2yeG;ce6-t4PX^rmA zi1z*&gJqe_h3s$5Px!=tL#RVsNt^w2ZGpvzEoh~*rJ@xx4fWeTn4WM?fwzZt=N{r| z7u?zmL48?qlBRsP1le;wsd$YOGm{%SFdOUH2<kY!JQ;0c4rXzc%IhlF)=_Bn3JCdQ zBLWr7pzzYlUzV4p2m}BYJ<>LsfLE-RUJn>OYi5l;+iswg*3Z9F;uCfjhHPx+va@2B zBO1O(IjKLsCi9|`-T!SLB&i%UsZ2&Y&yQe`&crBUlF@C^?yvnuii#`s<q;tU)Bs#d zJBCdtNsv0rVM5X}CZ1R;HEzJ2G<1Z+H=`7^`UeI(SUony5t{=E8ylz(p(ek++~dx- z!@EE_XVqLGwSr36iSKWC#S{FbLY>m{g?dU8c#7!dh3Lt5M&Y=K4Ve&{hRyYY%j!|= z9EwX5;wGKb2=<`{9`6SZ!O`v90{0QBK0bg6Cb`#B=<ya~b)5s9XB~YMh}EgQIeue_ zV^8YC{|z;8pAhDDWF{{<9v)u_+W*JOLHI|dc`Q$_3(E=IY4U8(tVa3&Kcze1i++|r zy%dp!E_27td|&hYBCjl;?QB`%G<Ios!Gi%go)br6+Z*u}zCVo-doLVvcoh;T#Psow zzj$!c3a5jcrzPod(Kzt$50JKD14U{-`dhv(-lp>V=!asNU%tY!{#Q8%x|**&5D&r0 zQqd39g-=L~zTFokwQ^~=wLHl&WZU<1&q+x4ZRad)TF_hO7zNL$$!3f7?4Li5eYK6< zU)?lVmfkQ?2XIia#pu9YPv#4wrRSMy#HQAV3FSC=XPf7X&LI*8tDJ)J!6mDZivnQK z7&#GojvK^+_<Hm2*DcM2t;^D1`z(JSt$7|B*hqz1dt7^5j`7*!^G{xjB!ayb!dHXF zS(hj~x@jvv|ImIc98Ek1MRo!*nEgbDRT>AM4;}!{1L>ddXl=D$U$-!2#I++M%*?e4 ze<T&O7JB4xCi=!R(PR?L#x4?~cPm70({ZzIgLXmz^t(!k5hX;*SBX`HdywPM239<P z5KZOoE=K))R@a~Zf$#2sM9)w_JGWHS;(7Pd9HwBL4P_ydNN|L+l?GPr!JV-LHh#pH zbk$Sxzz{(4e&Yj#9Z>ju1A#*OVr4rBO$Yz0uit8@eW}8VoaN^sB#<k7buJQrGuaeW zLhx2m`(kLKA|SCWN}Jj0>kV&oh5+hUb5FdMe!nZ0qLQpV{9!>qf=_!_AaObv3usQO zxX?Fw8(*AVSSj**uOL3Yq74B|hiV|%It;m3ufU9l%-5mN+!_r_pv%p?>pXMqwwsrr z`zr-G{(S|QeM*g@&@v1Hv<`p5Tf7NaHCUcuo*0CA1rVTXfVqg9um2Q!9<jC)L}s!c z$ld6|e{;PK{mrd;r#0r{8xSebDTq(F59}l%GO!wo+%h<V2~3V;@8c($uvZUkfM7@F z#VGm3t%{F{{V&zVoWh0i8_x2qfziD0^x2<7{;#G<%uiMc&K~Kv&(P~vLP~{k{mt4L z?zo%wLO-N$ov(4kWH@6uz7qan$|w;zk@+zJC0Z6@-}1`|I$UY5j!QX=Izi*F^_~N# zd}7lp)MGIPNcEZd1In*TjB-cc2aBa|YWh1(y6g-QIOxPNk26pplg4&oO#^+mUO}*e zJ+O5TA+p6DUPR}g>Ocv5Kd)z?`0g71{p~IE*o(_w#AE`%WCz87D_|CdYYqT64gg-% z`x_kKMJDojiS|7vd3?ssvTzol3X@vPaF@t1Ytiat+TF4ZRNERH^UE)_O)x97_U^vL zs4o?$hWY`nc*p*w{@-Q$BIYQL>Sfq+uCQIZ9*``=mJe=>gdizN?%j(RwF_c1_<Zmu z_sAH2seyK9SJKvt38`VKYKgC2DdprQ@%jsQ^$2yf0v(THZtG|<V0;M1ICT6pHwIOP zH!L7HUxycMGp@P0lJmlA4G$FDS)N_9_EkB$hGp+uNGonTQX_hgbmF2}-S}1*FMXD? z$pShbW?2^|4DJd`oxI;w<nXs2!UwF6FgiZEpr~{YuS<qgF|m|GPQlf*3tE!!HO)XG z?l6{MBH8AiTFx6|mZd=IRqb@Qu>`7P;O=MKSCs0M;3R(gMCxk|SJ(C#Yi!l`q@T`O zwiyna1lL7n<0jsqW}fk+x;@7bT)xGgK8M}{X-fltvVT~*-Vf=P?l`_)kS`s;Sh)r| z5TmTUQZ%)sc-JeT2}4aQKSubi-4=&5okcTrp=Stm|AFOi{13MPF9Dd)(2u%07HbcJ zWn4oA1u6h_=K<jRdQ6`GQz4jgC1CjUxVs0YrxhEeNFE3&70m&4Osl39T}+RKEIf(= z%$O}ra!l{&{}fS>0&}^u*Q>~0FX?;77)sCBO-~aJO^k*5njesT@{&FS3Iat6Hgr3G z27>WKvSXEpp<{XPoHB16k$hai($k4yoCggN^9o%<ql^<Vtuah1G1!3vUM9NlAd%S; z#h<+7T)ZSaesaJ2$dfI<!f6Ce?H~6G1t?Zmb)e~=eQ{BBh}Eo3V8TehrQmI<uAiAy z$@pil-(}7Zf7(KL;h3OHo0`t-Bj<0Va<zKI^KcCT?K7KVZR;88(egt)k^}O?-`Ag5 zKqtceq`2X|isKt1mnh{zQS-QwadgXo5I(?Z%)i<as;i5c-Ae86fgz|^|3W+K+KB}D zmksSl9_&-!tAHKRPR+0d*W;dY-&>9ykf;Fc8ISRl@pBiL+!#_6PO<T#@+WcqR&-K@ ziHHPQpncKsKpvR!91x*e$NKgqmyBBk7RT<1ut!)Pdy=_UqcBVcA!I<1{mev4VS;7* zbljqw*ojW$`*<{1K>!gaNlC^?`{i4Khkh`1Hr&)~qiFhJq@P+7=q6+O_9&A#kV*L9 zldVEHJNu5Mp(%;xci6Udx$s`RYjApooNy+)AAxguud4Y|V)THJALu6@zCM(>1sM9R z9_8}!-{ABkrG(MTGDuUeljSLj;bDvHha&B;&uKWqjUYuk{X?d=88v1A3G4sT7hfqP zn)yRqSpx{w8@FIMCOYf!i$P6DFQ5^qg~g~c@NS6!S6kfa0s0x;qNAXbvusbN#MvJT z?F7R8JYI6YJw|Ud?eSvtGljov24^lCSG<)16byejf^{{{n|hl~oT@xNy0@J%_b23Z zNuD~FT|d-kl{o9_^_9HJd5c^txzoDL*<^kCxQ-<ZHEP_ew8ErgB2sVcq!8~7b0i}x zV_dvylZBToME3U4_G;+f2I;1{JIjZ|lp+UGg#|#!+D;>uc4udRfV~m`X!hSI^}P$< z1x)x3`by_O^&~^Tm+ZW_M>-?iWQM&4ucvtUqw)$TQ0XlUto+WC>%Vhz*ELzT?{)m{ zBzJggmy6bT@`1kQy=mOrWd~rWOtStV*z*bF;|v9KHhZaNNBh!C3RNp>YAB`Rs44AC z;2rXj%S8d`fi{Bg{IB8ne^j&;@=yZqVm;45|Fx7hGK1B<#Yt2Ez!~zd<N0-+O>bDS zW+e7DKa7`_Lj9KQi!{=JuG_Kgtz^#UwyXNi&gZ7@)>il(l@LSGXo*5rAxkhzkx^Z3 zC8W5QI+fOfPX4k#UlUy|aGy3kif4N<a7w>)`(h0JwaE2;PwnK-fM0a>s}XJVxuW-s z!M(2^jmQWAzaJ*+XnbxI{KC}ON;bizYe>O^r<S=p3BPz{R46*{UPM`+(@iR^j=|1w zUE9@&W4MQnR%VG-)J;K6R|!8WqXHAHsTnv7c|QQwkt(l=;R_ivxQ!_OEO3*o=JyHN zXRrtg1rES>Kh9O>IWY#ZqlXic$Dm`R;flts;})$UOyiWJTSkTwK>)U*5V8~VmM%8e zA&=BSH)3BUXwL}bkH|7?JBYEcg{HvoYv1+%fZRd{ngOXJ4UC{TEm+(Ib;{!~wk!N4 zuWYo{##-7nZ5)b9ST%LxVOlZe8lJ}8LiOceOEEbiO#2YW0>^vKVL!KdDYWAGcuU`| zgU;V203$ATmygWH4d3b|;^Hn5pkbSCl8+SA$##ZF>7b^eXnInT$<}Hg{lPORY<1Bv zarw7#{XaX$U0udItH$;=h}d(*p~W<L(naS@sdafzYSga^p$cgH5@f7r+F`^m&&HB! zYAXvWZ}|#NuCmRY2|$G(4{zueStVs;41Cj1L?Frla#AI@<OVWnx5;Er?ds5tcblv) z<-f=JG8;%+3F@Hxx&C+i%>wDtebxJyW`_UcWR;Far@yxw&xO`~W^#?arfWs!_Vr(u zd_(hqObD*8op;X_da{d}MSpD+##uuIr|+Q`JkfyW&Mfj3&QfM54XPBEjLIPmNPrO| z--?n@T{*xV@xV4kt`<5Eixp-FS~DD}hvS-LtjyHwrWQ5HTnWqr#d3GO(^rbn&Tp9J z4#|}2BL3z2I%r`erXiY-X0_hCacpuA+ktyX8DHfSA;88j0@(O~($I)>MTLk&y0_^i zn^dTcZxlpI*Bl?5=owW7n@tzy6)s`pn3y<r{jIL+&*`gpZ!Q;9c>`HPo@9n?poUP7 zS4o~1gKWW_OXWKs5Ul-YIQV?Qy2Yv+^Y9o`NT7`H^R*iOE?^f0>Od-GNRUt^ZJTLg z7j&ooR<dTdx5$?C1<8spK>pPMIE7y7%u^%)gfxu13w3TV^mjRsB}z8+Xd^<gB<&Ki zeup)<ZH0=`I+>fhWFM^CH+7kV*ncdhR7;a&AO&9d;8r*TCRQca(h2CJK(oCuqQTK_ zt(1~dr~>#HrdT^O+UiMuL=AIglgfFS-uXvR@!I2;_QG%DaD`u<0MOomwGHNRld^92 zCyjhR%cwCMSlwxWBgu*)8H%+T%Aj6hjLOsu_|z*>Mu>>6Ltq<$8L`v^n>MNXRzY<v zLv6L=%!FSph=!1r8N3SH%>H#lKM$KcVVud-JhQo(ny(jc`4)(qdwlQ7Zg;Bao;w`3 zon=dKZ&t@}wU3)^4p$uj7z%}QIXsoU@lg?ZTWnCKN_=V2Nh<x>6{)YECfc(=@BS-7 zS$2F}Mzw;1)an~m2WCCO<9Z}U4Z5~f>>Mg}QH$g>n9NvJX-VFwlikTaY2dJ0tvO4W zCfn{ijGq4>jT(`QhNmYD(jlq8kdJ^7#t!x?_7A9)^3w>kd}#`%(uKtP^%9J!`J}+& zi>0yA3k6Veiw8N1isYVcfMPekaed1+h{b^2<2}4H_~mvVd?NQ5oSNaz5GX3))|0K` zgQ|7CM!zGlWqS;E@m~sMcfmizJ$iLHu>Rjy`DAs<GLoE^**A(Z)*q=I_n^Ujj!a#o z6ot8smAq4kO(=0PCCERN4iL13Wmgntud%Qgp&P?K$R5u_Pj<n9S}t=l$d+c(<gUN6 zOnt6Qf*=&+LMf}VajQL`d3rGA<JJe>Rrl+28?`9A?*(GNX$=+MNw|+Rd@0<(`?zw} zT{cs1S!zc~k=+;7KPD``-Xs_sfu>>J#OUcJDIO}5{<Y<d1}&o<RvGfDtSoen2Z$!# zs$%6z*MX$!I6>RhXi^Ev&OU3fxPeURX6-_Gw{O{iImX3V_TEaP>v(DT7aV?KC}grB zD8}hE*vLGq%}pyTj54N%`g6Y_gyCuefRXbBDE7I|ui!5?C}#XaToKAl(zw3pG0V{| z-z}1u7km2<ypz;VYb4E+AQr8PI*5dMnOTy#>uBN@r>eXjGNl*0!1=U_7iS6Jf!JZ? zf=hI_LdrT|5(c_19-{Y_(^Ibam2+};s$`2Z5+#FN(L<sfb5R5}Fd&ySka1-tl$-Y+ z5az$=6er~U^8d)bk06xn^%8dlW>XjOUFARe&RFaDZuGL?zh7T#?+Y7kRP#MhTI(rf ze$H^$^)RtR_f;inf+W{sBV`SXQL*X(ZUC`~RE+aWc3^?NyhTmNXt$*#ke7;15CyL- zf>!;yLQTex^udI6{EKi0?&hAlDfS-t&F({=`@yG9Va=_SW)|e`((+28LIWJP&Qy`` zWr9>G@5LIovB#Um8Qka2Y%<~y3RBr8<gscHW=Q%GVq}J@Xfh7XEZgciWfM)H{LURC zshy45Rn@M=MM!gk=B&W3wO+NwH|gh2zs{Zhc&2}VYQNB<Zf(dMGn^9#Sz=98l`|o4 zg?Lj{P!3p=b?o%&|CG-@mkx*_aV-nc*CXo)Navh%@>Heiuc_H#m?a{F5>H|*>2evc zZUbNo0O!9(eB7@{bjguJd*oJXTXX$4K^_TAfdiP~zRS+nZ)t`7mu9g=9ZW=Un}Sj! zP*?s#-|i8Rr{ikdF{@}78H<oWxw&H%v~6V3jjXM@)K9)C{8kG7Lu;I-Vb<dfoVVvh zrpzUmWEY%}`>#$VKGgHoSm1$S@qZ9A@qFCHYg+}t()~|Z)u_Yi@e*<J6wG{R*n&B$ zTqL)4i`2m{beAw)X+WuCzJk<zbnZ@dDC|IR@najDFhW%Sp9$*o5@g9C>l|HUmk<L} zb%9FJ`1DUp@XC%`Z~`y2GIo(uW^e&EOJ}vjPlvfJA^yI+9L38klmKtpf9bO#2~i|M zV|Mo9$Zn$-rdwnoDe7H|-V=jaA)9mel3K2(0Qks~k51PG0qC9A`RxQy+K^NCAzybF zJxv;kFVFpuTWP9lQD5(eU#Vt5!d!Bx$BwHVuES0_A9f;)T_LzpkJ2Pi^Q2?k39xvJ zs+-!kxMtK&c+1WWjN=g*uh@T8RRM3n{Xj5dQ4)G`bVa?iu_|650>jaH59PI1__VWb zt_=5Y!@$n=KEk}61jGiwH1zH_k!)g{7}qCU(n6XMzJEU$GzQre6sR#sP&;AvEU65j zA?Hr1=O&^>OUnM(s%Pvq^-G_Muc)i=^y*UC-X)!$WH|d|`M#2@c0QpK0t0bd6~B#s z`>VZpg#uc}#Eg_GbzEYSRui)@I%lbE>hSi;U{)e+U7`-3bl_!Al1Q-P1I%Lp2z`() zDFWE%><h6vdoOBLPpy+G)r-y)^FZ&iMh0-+upuX~r*7w=Iaz8j=T2b{bL1vGa8<9i zlCLfm3Gj?&XK&1c7~q(SIKE<tWl#!#2}~|TZgSSynVF&b&A!A_=%28+6L_#d0i0<6 zwY=P(pqvJwFx0N&^?b%4dbaUxiYHCn4-k7>!7Thy&ZGpvfnC(=1OD*sf@Nxx=b5vR z8V+FD0<}H5_xS>W-;pW89jKq_#GYBjT6i*s#R^LxrzV)^CaC8Iz_cZR@#X|&zutXA znT7F+9XvTKYB{B~q<Y=!SAW)p7Xd5r+J39)MTF`)>kkHR8JxRiji~EqQn4C3G`_Wg zoa`M22Ggcm%AtiR^=IZ#26W<z7O|iiI4LbeeW%Jw#ib}(-y!O%_wEd^LmW`OWRNA& zdQM}b#cGNX94t8y8DTncX@}oqGLs3QIrT@$fskI5cA;#Ts0C_xFe{nAlYT;=QJk<Q zGJPAPcEj6G#!d!O95ERsX7{H*Y^}F`hOBM~($PhM_AD9fwm!xo%$x;PDOFLQkK?#| zL;%nFbYBASOj7~e)0M4)mCcfk?a@Q<Kd2*s32JX9I8eh1H>bE9<S|~ED952NAnz*Y z^CWEkzZbNuHUUVCXF9Yz>n>Hc^KslH;%qPmrd|TR+<??k3D~+&V!POW2^4uN)va{w zL*Ga~{^GHS_9Bu>g}g`sKVp7P(w_4~)ihC?!Ur}f+t=#jpuETkg49~+X<i~Z_p~1m z%{sI(rCOW*mHPJ1E~VQBUI7;`k17Ud-eGwi?jrJX6!aC_pkul&^5`Go2HVD3t0{Pu z>!2Q|;eYQtO19<BX~|D@*mTTKae2WG1q|>cP`nFdTrEOQ=D-V+MGEiGY(Ilf_hd=2 z%%UE^yHG$zz3R8(U=y?(HE>gO(D^|$q-Cttx)JIoU@tIop%chBEqBAgo83~h2>o0s zo%7|t02J;{xD)sE^2L7FjsZ_;GYf2dkm|-h3y}@O$O|NZ418`#8T(@wgzaSi3%F_> zMWAY;LarOWDSazI4H*+$#Y;zM2z$PR-oh$K1B#KhDg4{Te6Ml?HEWhcji8px9H|9D zzHr^>`nk;B699O=FA)cI+uwUVr5;ZqSF?aAHqT13$=fQ9?xUhwSQM(INB(*cYhq#j zlv9|mz%ky0Ix<e-p&9TkTKc`x0TnMvzIVC@!5)_Yl8!M(rd&Q|^-|rxGGYd#?yJel z!3syih2#5X0GiuPX>zHc$NG@Rl_B7djB~5>@t|Vopi0+J+JuZm&Gt~m!qU_zl#ZxF zPn1!Vf-^BriRvfKH`Zku;)>}$R|3`zUHzo1i^NO+0RlYOK;;x<tG!MSv5wN;7821) zk>eOIx6=l1)GLMdUmO+UuKd9au@juOs&06h`+G9}s-h`>Vy6GvgiKTp-YBbqaPvrh zHUPxNO_$&E#I=nnWo3Xr@@<^z;~Z@JYJZZrIK?{gbcCsS?POTYsI8{fa7kUPF?C3h z3t$V?M~s%YUEMgvCd7{A&6CFB1dVg07VJof9Nm+$<sfqVh%2cS-9hZ++f&ee{ynR( zfkz-lxJV0KYt}AbR0C$G^@E_7jS*K5hMeDjj}}4)+LMjDdBqbVHfV+8!`}=N`G1=& zLT8}LPKD@K>a~jX(2vtBF#$XXpqkU)k{bHEZ|TRLNK2Zb>bsPQtQbLb<;UIbYl$>$ z!8E<$y%)zj$nTR$)A)b1hD7<@p~wix7_Zh_O05-M(&u+<_KjRX?*o-f<}P=+PkF-u zb)7;KpOyBSO`Z(5ANwi*$AikCml$xK+)m?80GAwq=*i7f1O$igh_tC(@ru^;jFMV- zhMcHRL)VJ=LR&nqzV;ootI!DGbg>$B&5~+zeQEli?I^$iuWFp+Nkaw3Aq4Z;iYu^c zzgK7jcf{%5@>{LPj&UJrzZi-)wn-Bx|18lgU=8u`23j6Uc=<@Ud%xjCKSj~VBt_^9 z#l)1m!{rnsOK2FOv%wf{{)Ky2XK{AxOcLMpHgj5NlzI2KOf@*v<JI5{UdCi?yOHRm zCc0l1hHlzY!65-z+C<p<AhG>KUB~)~m&fYQ8Q2K)xMw3l+LK&Zx~k436vu4A>C^rO z<A{Gy7sNAZ#>^wLxY1vUXP?cdtp}FqU|ca|vhre};*hC^z7(I-$0}Gl_F34A24snG z5HVt9_Zu%nu~O?0XUr|89+pU;xH5)VS_TNLhWbilXk{od+7*q%4J;LKREY$dAN?L< zmzpd{k=g*x2U(3w1<i7X&W3|OY_XyV(^N57J0<CdA7?S}qkBFDou?a&`+r0MTqMBf zRvw>lGgtr;Hd9c9oip)5BJU`@Yin4Q`cqOU2|Lw23KLVZl_2TkndIUh;lX1&nfEjN zxt|a4pA8Y$*+Nmur{ABpW~Yi%^iK0RE$CI08Q}@Q43vu-aKP!gwt>^o5cBEi7D5|R z)u5*jwZAL0>k|sY7P%nqV^Gg!P-4EAt?$T+Y8`RvC<0wL-hTH$HuwO-!$1D)=|+vJ zPfk5wLjx$Z%)n<WciA6_%L7SFd0HmQHLx<>OEc*-W)`R>8oS%&ZR5#EH8WCl=hiG4 zZq}m#KEI<~%o`*DLw1hqEwnrX!zV-_Huk)rvSEg#fxeRy2n>cKm?~2NV9=aR)kzCm z;UdO;uq5ldBlJ6HW#_jn#UQ6L;ou*CT!*?gMOiM;7SSg&w%Pan`>CGLWJ|I@=|2~1 z+vl|}4>`r%IxVqCgO{K%&lFLA#1J#qO8aVs-%zCQgzPGURDU3cXELHrO0QJ)Lu^h5 z8r)M7UBQ9Savbs<j%pSz01zQ^$B{&dR0qQvSg9nn{W&$NICW{?jy*}!Qmbg|7N(rm z*cZB0MiiC5-^A>~Tu0PplAKg-rmJvDTF$lfK%M+YqYHCgEV>&TNgNw^d5Si+$b4?1 z--heZ>-3eoeI#1iX!e!0K=m~(q--EMGTk*aXC@*yMd=71?1wT+opQ|WuDz~C&z=Mh zN;Cfpz`A=BD4AZtx2CT!jbZitY8k>L?u%FmjWO!U(szu5j>9SA<{LWg;)TxT{;Q0; zw~qjC?{br5Z3UTq={AWrx)g2>XDY`^JVirJaqq75c)89Cs7ldj3u?`n0L^nP_)AQ@ zK&N4Q8h+)6R`0@cb5VL##{Wqjpt7yp_VKq#c7x(WcQmZ(M%Z9_#@U9k=4;;N*{!nP zPxgsd8ZjpE0&cp(I5s8?25`we{L0km``Tp@Bo|e+39!XTDIdB~Y!5UnU+DoRpSXco ztOspKc41C-3TL!q;n1ISH)@czsP1WWkdkM4MUnO77@wuZVe*Aa!UY2{ze^|^%*e$L zYVkmcTMWly>Dx%Njf_*`9m%m9XyQhVCSlXfD6@#XVdCtgrkFc=#ojhO_8=bsJ-+6P zXjN4?D}GLl7Up>im6Km@{3W>?Te@@Up@Y)i%uGdmJm3PN^5AFkz5DUDC<B0u|J^>h zVRurWEbV@gix0zyCZZFI5zVjy2TEtA0sA&3z-)DfOX_j;o!?LV47eKR1pu*Cs+%S7 z-}3{hKBo8h?+8za4%O{hMKNDfuRd6~;F1f_dYla8v&v{n@)r=p_Y&{J+~F`gpAW@; zN3cZ$){Qx)j{|6dsZpyiDVYpG>7pcvB8=Aia%KRI(1R_^E{XwJNt;h=_<dJlHmdcq zh+_$0)a>PC3~|ItOy8YRMCc1VqWr*vDZRYFF<Gw8mJoo<FSi*T{{G<}CczDgR#>P> z8Va~m;}Gs|nVS*8G%uXA_jTxg?*#`^2Cl928P+QW+q5{rb<Y6@DsR{l5>?b99{k_I zo-u#iaZ`&yd1r?*IvYK4Y2TAoW8cz&2OlGCjbn7zb8kR;_oEMIae7_wv_q>3#xO2m z>V8s%6%-FNIu*7@KAItLgIt7hNGFz&d&Jniw+s8N2Cv7N7{6Lt7o-7N`QmTSw@I=@ zfTD!Im5|ZmZ_L8<#vww^dFgx_jWZ<K!!G?3|LIyOx*!w6J4-MfkVCt2v3-ZH7#SPN zwfv*%A6%;vd(w;NHTI#CzOlpxCv2yTF3Rq|a92E*ibX%MV7Z|d=hqsPX#v}BgM>uN z>lYvc3-Ez~r=9k;sZ*Ii=;-6~9OH7sHkdyTkwbdY9CAA5XF9KXBt-beP|-abtQNrM zVQ`1<3qJHibM%GF`Cq&0f5g9!(Lnit>$|KNs8P${T9Zh(?41^%t88oNnG)2_(JTBR z^&Gh=qJ<3TI_dO~d~m{gx`zSElb<OPqPivOXlEfB#CKN9e+DGM-5obnvwps_U-ZBq zD3|MWkHWW(*9hp08~b@>YMwbQBI8W$f!TW?0Zmg|tYYyu1hSzCB)*J|_-NwQp(ybL zfUz(9X>9C54-zL5PQ0%qP_ywYZ+`;Mf~MLH)$9^uOYM1JS0-jMi}@RsV^_;9-l5_| zEG$})D&tPvFQ?#W5o>+)ec4bI*sD}@z1D$a5ncklF^dy*-0lwHw;h5TVD}1mO+0WA z`0jfroAiu{B}P49ib|lXP@8F5UyfUs4KO^%Gd<J)jiDd;Ue-MhuC|rV?N#tE2mjzu z(<oBchwfpg1p3Z!jfq{Bf~_MIMRmX#x4xglj3-}v{!O_bM@tm1ttr5y=%<;bom*Rm zaaH7qjc*I6>3CNfLa}y(1TW5Ex3<G@vq%OmiH-kok6lHv@R!%v94QF!XS7@7C!C;Y zF%TLpjJy1ftwUH`0NL$l(|{&dC$In}^7_f%A28h{kM8i6%2Rjk>MUaZW+}q_JYbrf zJsCEMZ11r&;?>d~u(db7+#cTO4&mn?diavWo{812kL2SNB(GxhU<MZcT$vKe*=M7u z9@o?6!PYriXiH}3)0<%5*3SjR$=t7yJ)Ee__pPW)-?Oqrvpgb~*coGD2GY8c;E(I3 zh60YPdNz5FKZ<Q?NGS&crNN%}@YbLV>yvKQ(!p$D?kd@xJcN`l>teA?IxB5Ro0|MN z!2V{e<Y#)uE2AMoP9*f_(=dNfxho=!K|`}6rYjoVDT|>@i0(O9%X-H5Fq2o>^wE4B z{d~R1H@}xWz6K2Qn|#r2#=rP|-;??~Jxqa~xLmwl`B}wo{t++N6lAh~I3~F{E4tAH zz}z|$_R`#w+k05f_t_2e@?UeB-BziF(}xU&Y`_DXwYbuvDO+4+@LX#dngA^s6$?q4 z6gsa$A-ZhvqTkI>W67_RCxFR$yz&lo00MV@K#9n9{Wd=U;HRff8#A86hv>Ot&&Yy5 zSZLOOphFu;#kRj)f&X$<z**;q6S3ICqJF9Ua*o6Mqeg#KRcB5f&@g^GnqkFEaDbMB zSeho7(MPYPJyLVE_lS6Xd`w(|0HU6A6o$h?_@dZFc_jg&ez)Z!O-d*yAM7C?8$c6N z8?0JF>nLW(VNTXc>9`bJ<*_t)_8uxSD+yKXMp^6@iU_qqF7>McL{k(@KdQeA6Wr<8 zu@)6mn>}zBSx?mx&8R~UXi3-`)fw96r+E3`*>mV6^1c>?-x%E6mc!5^0l9?*H_ztd zo}S5Q7fu~U_@X*WfzH#3?y$w^dlP&<Of$jZQ1QqQG<)8Nh11hCGo4VTUX{yzqu10W zJ7;$^*32e17Vd430-7jqkN_wTV2Et8_*d(Ab_VEqD^P!_J=tJ?JoOm4@u}o{Pxf3< zXkz3g|I+`2IURX*JaS0J?rse}ZB;t6IpN6yE?TH|_DOD7;|nQ`fbz~C?ymrURWl|X zrAz6EpiO~YqG(2cyHGilo1=Kdm91}_AWxZqC^;h!^efQgqFNv^0z*VVEoelmFy4PP zKfq@R8E4FbXJW7IdD&on=9k;13)tjcg8&n^95}!(O&MEA!({YeXG|bOy|_Smpl=wJ zC|8HeGXrAnfNyTl;F0XTX&WdxG4|oJ?FD*9jA1WNMQ%MU4$IV^DTT>kIu-|tEAT7= zBwM;;de5U?9*@X@t2L0h9N(AtR~T0`v@`BA^Lq63<2=iNJDD}82bV7%>~&%};U>rJ zF#hW%+Ezf&#wQICoOKsLQY|x7rTEB}T(8oV1CI913&y0Z_&P$a9jg$D+i>go1V*MI zuDpQt5n~JO_2lv29|(`bbv9cXO+9&cis<bzaFq(L05D~e0si9yZ7`hy`|?szH`gQv z%#2Um>gK2P8W504B~LoX9Ziz2BE7aGc5;Rg59j~Is~~sn6h1BCH|6pO0Ez#v=nTv> zKxlCb#PnTplwH1f1uYTlDBcRjoJVr@r)QpnSU?^!4(jKc06hP9e)g+L;Wy!=R3H@{ z$-Xo<DFbFYUCqs^|Dx1T_yZ&IZ#I5iuiZ~}hXD61eRLN)y1z(#;%4xbn}}h}z{v!_ z&Aa=7dwgmpRYWUe&L~~OF`@Jbt$p=LjZ9JGpcXFkW!%W29dpdj7U7C$MYR16r04=Q zy@XPa_ttks3k$Oe`N*Z^iXgwiF`ZBsi^Gsm;k@fznt)G)TDnD4S%Xyd9RX~nxe`yw zO#5_8yExA?f}?ShJ%EZq@DK1Yu@|83bXayk@+|J83!ZFJR~6;afGL1&s4z<vj|e!e z0F9X<;5Gbh5f@PK>pOvs77iWJj#VkUun@wGm>2dKZ%KWH8IE5zw|r5UfgZW84sE+r z0r(t%cr(}pFmIUKmmv0w-;e6i4j|&%w5L_QQ^^8bhA!zvr}!w6t;t$aM!?0p0g)li zoTjBW#KdCSgp{okX>OP7>5*^gjNw}u&CS{K=JO^05FBDA%x?jSEQO>e2-3WKOKLPQ zeC4bBfK>ZTs{GedC+zDh+vS$$X-86Q=T45TRSEM=j;H`FY&SI&F#v(l5xlRwHiY{v zmg>-2czbAa9~y{aa4Z2ho`GDwoysI@52=yJ#zG*@q0TiWtZ|uOONlGIikxotTqvl6 zCFt0vlidPvK=fC%%Ga8hhb==I1nUy0Wq`5O)De`qi5_<NY%VOCEmOvX!78?5fIakq zD@7hyqj?OUi1*eNKes@Os-l7G2K5Tv27%@ghk(ZW%<^aMu|K`zA$7SxPuj8$606yp z2G5Y&ZP(oU5g-3-Lpt9Ez~9;89|k6|b^4P>BXzw=z^!AIXHXlCT6mOBO5d)9(MqB? zScw!@ahDr5W|f%#;!)b!6dd#)Z}-1#(*ab1lds<dtj~j~!{({SK-MksVFJ}mpKT)v zAM^2cY{k6XgEjP{cP8N~lSu$w^>LMHeBmEP6vfUy`sFxolI9b#_veSf@kK8<$m6kp zcD#wEmXH`q>1KaT?QSc*At!vpqrNY5;m&&ju4X+hZZQo<Mdmeh;G%9ET#+CfyocU* z`nS*3*Vza5ctbc`zbYRv5Od{X<_c4<tE-LARNrIU^(4xpY$33W-<!u0NX&vtji!^2 zv;xhfs2~=lCN;I%lRB;I#G~eid0v+sD`Y`p>3v_J2eQ@kCzD-jWNcjX!pO9Jlx5Cx zxA04F(*)euu~km(-6nBrME)SF#mu?fourbf;-Iq#Y%lEmU`Gd5dfMc|Whv7*8xKYa ziejEl{Yg`wteH#1Km7zRyC}osfaU|SR9KXeuPz~`Z@8%)GR_iBTQuepE7kR(aj-d3 zcsv^gygUZLe)16Q_zv0Mbj+V+>owkKE0=8q1z9$_k5gc<N&Xr7(_fjnP<d<$zQB`C zRILiI_@VIo2?H*b)+V{uHW~K=J*b#s1o9AKiLip@-_gRN5|L3(R^fIOE4=;shuB$4 z2QV)e2&;dn=H^i5{)SVa8t_s8CoV%X6r~OU0?_rvpDxV8R2@>xr)XfNFD`a_P;@SY z-}{S(c$(?x^6xA{t-@6Rcm0t5_D&<bi}UFwbBzabix$vPD4V-`i#Lw22L(fGAZ?pd z;#gbeM_LFo7)e=;BF+}vegs)zz#jqV4-2CZ47q5$`XY6-BrGg|8^;)`dEW=!+i$wR zzaGDgX4>4p$E{#sSy}(dp7ph^heF1g*hn2cqsr#?9sG7v@AkrOep+rm2fwk~uQ3EX zI*SHECNMu3TQ85ulJ#vRQd&+_4Yi;)@8@}T(VC2Uxgv@t2DR#Q6nMJ+GiUxS7hdFR z5?Pro6|Hufda5_55c+Gf2fm<=(H;AYc62BCWqn_(eM34{#w1PjnT>6gUPo`BzE|jw z(H~Wo4u;eMklwb2)Q?%e(xnu+<W38Z*XgV+!fu_k-V2V;Xa3`G88N7kfTu9DfS;d4 zV|kv&Pr2R_i5{>q#=i%;W?8A6hgR&14boKMZ4&O4CryPjza*O_mB`%R&(C+1z_q%L zP{YuffEuiQ+x%j&nNQ%5m!iynk98PDt>o9BAF#)}BdD#P?K0C@oXURfYPXZ>L8Yn$ z@$hxN{8hGv5wENyI|~^ZDL}!y*CSMwGDIW2^x&UyN?`6|ABj8QO~}V4>;C!s`7M}> zPmC)!rQq`E)&*THiS}-6KRS+BZXy;{m`i>NLxHXi2|#~XW9U_UJ;d7cxauNbIHhLh zi1?B7uqsN@6rCkHC3kv6B7ehtQ1zU1?D#}M9$gzApImXJ(t_>P9Q@lPco745tH*Qs zMe3^akB*6Iy_EkPKxCEl1RP<8g(w!ehC)naLFD_f=ZrH>laF9WAJM)1$#ghQMvI=5 zu|10~rxeVd9hvXA+E~q6G7A<V0w=pKYN_<=d{tT-kGrPqW>XA*XWGm^`i^_eebG^c zpgXJhD4Cxq4&L1%9r?`W;vc`a6S;Siv3H)m_cwa)2x_5YxD>xm;P@P*fKNBvW^(E~ zm;~sGa{2lRh(?wOX4;%Wo_BXu9K!D^xBI5D@)nF@rjXyp4B2&yp1qfU3=mymJ@Sf< z4vgEJ_G3|yQmi1<>+Cio|4ecI*>t%)Px`#1$y_T4w~)3rZc%epfv()znv+wMNv7h~ z2L~UM+vwO-DLlbj;>t_)^-?p}^&@=;{5ty-^A~it$!ND(xVEo|j{GD{)kPMVzaDUk z)oGd%{89mU#aVcDEIEZGq8ybywFQM*Z-rt3aXqza`E`f~c`|#+0P>uo_*i~Q+dk&8 z$}xD{4x6hh^7BHqq7YA?dF~Lihex~om*uYE4Pbc5Ub;{qiDsLG-0c|zglZRYCA*I% zHL#h;uEZbXVI<s=`F{2Y_p}cf$Qf#J6eI0j!cjwUganKRmG8La1S7MpV<Q*1?VFfu zPq8}HosF=c4fdyJJ-=<7+`a7$E8t+=238m`PL^wkFH_`Jj|Hw93gi>Qwo>ROz&D@$ zvZ)?U16yidL&w4@&J##}y9t_c=v{cZPdwQ9e*PCW%eC+85Da(hFQ*!Gv}OM-D(7h4 zB1SHC8q<+8@Gv;I-|YHI0iU^RuLc$Gx49?NHUnh|N=+=_tCq>Szrw*!Z-|95*W?a$ zBFlT7b>pFKyDjC3;<$ynp(ZC+QYFe?AWhAecy<=8+bM%NiF<!Of?Y*1P^JI2aF9Bg z<Z?qdi5o7N$%5b5Qfgk?dfq<;UYM^g%LA@&UyXF=fYOXEb(QY;%Ej-DCx2$|AN-*v zr^TVEI0V@dQnMeT!6@niWWSAypF?Hrg|jcgiTYw5Z&WWs#|X=I$A_ZOPgBy<Q`*~) zAwE*k&ooG_^JG&C{pqt%Ks=R9CCza`G@%>OioMa&4i@G(VhS7N(-xX$h0YZa>GcWm z|BIcObs@m<)4=b>2mOT4H#e0abNYm+Z^e;n@=NE%pM%kam<Zj^-jwFAJpN8acRLxH z8!HBc_oO8<gcZ3u_PtbZLE$o}(elDhZgNhZlC3|b{_Y~p3-Eupvr__UdYUimN4^oC zFp7`51&`1QnIK{;Co-Q+q>&RWY1f&lZzW?0QL*v1PS*a(etmr;2A0xt=xSIDYTv=M z5v{90()%!8wWll4LhBx4Avkii721#?9l0#pQ4Gv1tPED7-p-QtE>eDeBJao8of}|P zkN}dB43%6)JbL0k!8^$9IkUvX6~am+V4;<7v;tVX7O}+Wdc`N}$st)of~LW%+&|t* z(#j@7ylpmVW3JH4#|++jt{!|!5A{3;CLgsz^m*JoK0*ea!G0d%J=TW(Y#+$ZF_NDh zdwh~=<4^YekZtUi^9H<}ZU|cOBShLoYJp4sGW)XfM({J}=vv`STo9oB=d|7rD7!^! zg%k?qK*R3Erp}&5U8I3MGOyp>_&Akczgtw>9Nu>$w_X3n361Frzy8zQp?MK-=bsUr z?@RLg8>%7T&Ej-ZXx0ImL{5=YGvDCgAZTccfy8PVMMe`#d-q@|)d;t)Zob+HOH_(D zBuWOD2?9FgB|U|Lvg{Azg(<jB13e?aZhv+bI-84HU6Z;N1=nNhVQPmg-s15$;IT>c z@6#T6vs%LWX_M$Xo4IItcb*zW_c=}Gh`9T>c8MZOobrkOD{6Tb?(aWL5MPrmG9K}l zFgdTe)zy)skm>kTBDZ#&5zV9rBXaG6hg-D2lWuLgmR=6uXb=`09gmD@Iikt5nFgkr z-Cx;zJ5}S(Q6yi@Q+?u`t@lQc{qWA%Bd6$4uvX*v^|YxN9PqL>ci!R8eyJ&M@WYtC zmJ;~A6%@wf6UH7N$J|@TT3g3Go`3}Z%8}bD{8x<8p6V`snO_+XCHp0%1!r*%P*XA3 zlANw2TB-Ms5FtLH!0V(6p&kZ{;qQDezmR=l5zF%@=G0n9HBuRY6qYv#gY=h_qgV8W zYrRDox|XoJi<rN!aI25t#Uj+rdYh<&J_@%?eIxItvR(%)3wYK@Z}e*U^|AZVQW}}n z;j(}unrB|kTR`WNR(Q>Y1dG?DPt|a%HabPwL8s3_R^E7PYj@iC2mPN_n3uyA1{~IK z##lw6K-4(rK$>rIl+GGogS4u_qrie+yavi<Be%QA{ab{9ZW}w3ke#0#$<UbTiYyOT z{0bAx_c66%oh^e2*A{wT%ugW_G!iKV8R$`Kf!+ik@x~Uhj+ac<4N?K#p{-40<*Ofm zR0A<DSVCPR=ZW^ZXo?%Smat`;{@^q6c(gC5oL>Sp3n9-JxC0&z4PMfe`Iwkp{y=3T zRz{Zt%vSG}ED^CJUHC90@I|33EGdpw0j!zdH}I$ul4aM;8L)E?T)}^7QLP<E&P-FO z4Q8}elk$@=#S#NuEWOnRw?c{I{eC*od4K!4SNT#skm5G&cf6>eq%2h)G@Bu+k8zBp z?{l?)`R91HxRb{;;>$tVD8TobT105($^E7Qin{#01IudJsYZhyZb{>CzaISX1`Q#G zCcaWQEV{2!v0y;Jc7eIV)n-TZ>#+=`cjlMPDcBm6&A{?-de}&1-4sI}JJ}<J)lGo^ z39Pf;;as;Ak4KM~$;}N`!Ey%3w5eucLfiPIos*6w*$%UQK9ZzW3~8i`m~Ul!bx=)p zf6bsT{XcCJ3(nJeACopEpVFz!Fbq;o{w5|ofCh~k%(atbQtXA_a*)T19Xoo-J1rD* z@{nzBk-c6=-M4K^3HXw(Z<n-lmq~KB4<vYF{8e!)0Uz2Et8)pVQijK@!k~}+?ww<3 z6?HPsV(qY{{Q1Dw@^l5Xf<Wi;iys~PNoh0E8(;iQ=U^)*T;NLF^+}mi9-Lc7vhLU7 zNJ@OxfU!t;MCEYZxBt3J6#OGoXfMOiDasKrU0yH&%gn$kq$_r^C=+021ODf9ixpxC z-Ce2bzB4lG62H}-2=!u8uA7@)LeF<_8@nh+2cf|ErG0b26o!2kCXb&)Q~OrPiepfO z{Hg9E?y-pnYV>;O`^LlTH3UU)RG3>4pXCb99O7|mWWF`q?>AoWRSOBo1odA42lp<V zp}_6=woDs*)AG5I;!GyjoB3g>5P9eza{TQF{FY_O@23WBN9od8eEVBk;#iv}xg5`f z9vrLogNgU^s9(x+9=;Xn0YT9C#8;cmc@Jz$<m8Fka9%-nZB+COWA0Cq0(MCs+l0lv zpF$m-BK}VC7tb${;L;H%+Ta+AiY*<>UU0&q>E0U8^JX#vxY<FrX9ZQR0F1MA`tyGq z%bTeVPGW)U*+*$_m4`}_hP2l*Wew3aF05-Pf=S)eoRv{>D^`UZPrEvthf9oIo3ED9 zS^VB<^z&Z!$*Rjhsstd}{~pK|kh^@>XJhJfL`(Qp88<S!khme)8b#-&z`=!MqxkFX ziW33<*AE={6Frapi&7QI?JCnnzo2Sw%Af~}YEV<@PDzHzA)AA!_JT&CpQ918W|<5) zT|LA+yu_R9B(Gg!e|Jg7M-|X@*3pkCIFrFk(xg;H#MtuuOz>yWS7`f>@arrJA)?Ms zO3Z=*&GML`+|E`p;5B}2y=@3suXz2Ur)K|hS$8!^sK%R8>Yqg^vJ?`1)Fj?QSMZ=K zzF+K~Nd_N8*2Y<eS=RZLnB$&gYN>VyMH{Q~0sBni1$`nuK46FtY>K*YbtD(b1Pfm2 zT(xGft_6!j=c1o=k_xtJ8_$v>{69pUWmHvRyR}uiySqag>F#c6q`Q%l+|u3MU6NAL z-QC^N-J9lHp7Xxv8^hs08R}m9S@$#NHRs)B4o59V8_!uh-?P>bn$t<Dr7vo3?%ARx z=E+A+`il|@CbY<}@f>QBP1+#}@{qzl?=|T{u0VREw!@yM5+8Y?;hIV@3fj{RTYx>n z{)@6x<TO0I(pMuS+`p^6IyDm7du6CL?P=n4*Y>Sv=12pWn8jVGpKKJg(K$RwTdT8a zc02TMqIyNBPYl%`GA#U5@T4A%NgUNQN@1$QwEgThl=Z%uOiT_V-^=`Il;ILe@L8i= z2aZUA9%>>7mt3*0T4IX?kaxVl=EM?}|B8E6)?feZ(mq*qISDTOG;m(F!ux+0yaNXl zXq3A3Az~6up#JY*7`E*%j;u(jvg~87nip6UQg1aSE^Ptne5%Cx;E%%ftjTo(h4o2w z*y3W?f&uyn!raWxP;gI44*RYsErbrH0am}}0|K8~$^q_+KU}<^82Jupn`4CXpmLgJ zQjx3;n(O4e)x9I9?3dB6{mIz3`9LogXs=mHAztd$b*k5ww21}IqY2L8^Jr$F)+XWb zii$vBv!1M;RQ&)p52qZfcKA3ixA#xxJ3Rk}!N3y&;Hki9_Z74Ii*@xR2MnBW3&h<o zZHuR^To30dlqgPk5ReNGFKjDb>%BA@2NHp;qCGu0ggl*dDZAwaPNyUVkPGdzr3<C~ zP@<aX>~-uwr4|5&!!<TaySuXjBwro7?FsT<^dZC@QA$M8aAg%l6<F<H8{Hbb1^m-H zDky9<%-t-`{xhORkBC+qG(dXe_wd)zxn#;PS=4NaOfu1yWE(S8F0dQwGW|K9{?H_Q zb@{uZ#R_FOL9PHQIv<N3whc}MGp~2Z0+Jqt);Ppsg|Nq<Xhq_vtJZQs5Bd;W5^L6h za<?*WT+yv{l9N|w0^SO)x*<~x0NE%17%CSx{n`5q`y|K2zOxg_?9=-EWUVtqU)ki( zC*%Ei*VGJx>vo@+^>4N70=4UmGiOBC0T8tXCSzBuoOUVf^^!rZw_}+!0XD7<kcD#W z(RuQV*Rh7B<(h$3z+B;{o+lavVh-TYQsijbyog7ea1hL$<5X?AIK+YsRkhs9LP%QB zDyqrCUchWpT*c6IR~TD{>wm=CKSg);Ia6A8)PFX$Ux1-+H<T#0&2QnuY-avddI>&@ zB$+xO1ceB!qMA`94CCU#!uBhCo_uVqV0|3zk6wqU9#T*j#A73MpB;sALe|6`yW@D= z5M183h*!#y7W6Hws}pl`k@j?oZg20$;`!*GXhznuAY9K}P^&E)=f+apRi;|=hgIxh z7w>A7tFN=I<o?7f|IbCJK0l3?w&di5XgjB0+i~*m72gk>Wy&t~^^>gn_PZVD%_wh+ zuP;Zh<~=`t99}k+$O$~e(<HAT3d6ApiIwK$Vee1b#K0~rc!#aM@LTCopnPH;+pssv zlCX^)i4@v`6*D+5_>$;X%vcw4dd9ea`ICII#xAGXW|c^fhKm0CCkxp9_NLZI?vxQj z!>Hacg30e0<g#bQ_fKI3KB6`Pxiwlg)d$!TrQG+RV^q0lb|@wVmVt-6dOorwZ7Ob< zVoXOI2~EF^AXcVmGDIg4<+syS8WS*)zRGq^<F@l=y*GEW#Yo(9*k_B^Zpp?vsrxI4 zEEEzMPNBFn+XNya<Em=bGfq<?)F4$d`t+;a`BR1#>}T7t>sU-p^Tu@h;LjL{2-Le& z(cDNHd;b5OF5iy&0um9Pq_v~8NOrkT_~VL*6jSyB$wQG*i{R=9p!YO!fqGSHX4%zS zzSDWEVvh)$#x_{Tk|-Iq9gU33VUydn%teE;{-TUD#H46$JS6V&@xjU2kiwia8f((o zqmSKn&LA;oWK%~M=D9nuS(UKNE1Tz$$V`|vMc<_^U(}+(rj?j?#2f*#gn&;bHD}0x z=J_Q969&d~b+wR0DBkyJcT_AoX4t`=-^i|VaRx&qpO@*Ek%WlK!&o`x)vh`r`JIRV zvUZPDd0(}@iWe9Gm`cJxk3pC7(4HQ69DYsoNV9kiK^FuSa0#MBU?fIQ<{))*7(}a{ zBzlk#0pk=S9?4uao+vIk!pH3wTkWUzDdwnhF6Fv9mQIL+gQ=EYS9IHSk>vb($<Q_* zAKY#7fKedx@3aJ5S%1gwZ(tT?ZRs$|pCs3Kh&?>OdHPPgXM1ki$v@rsX<;It&@JoZ zRS+DIgj7n=M8}7eerQJPXN<T>S6}B*fW!(em4pxwiUGPgQVqH|9cmgGkiH5gs9|QW zeU`hG==&3dgo^PAnGqQWa%hbIX&7U!01I@85hUhm9#F6(@PqoPyKGDyZd*ywGHTys zShK>I?evgOTu)ms-dNY})Gp!lGW8bFQ-pkJ9xwfFZ?KoQ1t0IQ7H}_i@q$Z9MWyOW zpBO}Z22SvT@u$s>>{FVKeR-tJ2(|J=B@ER|mGf|PQ7~)PomJVbTc6ppj@K;U))Y=i z)`sOK@t2bzlL=t=iL@Mzon-Iy^p*FhC1Lajp;6ByHf7ND(sxE?a(7NKE#RxYX6#kg z)|4}|p5uEgCSh{~B&r2Pj~n20PmN}T>CsOt!hF3bLl7Z9XS*a`T_=%!bU%Vg0NFUp zDlKVw;%fz<RS|T&S&8J!7yD7eBvRm$gX6r#9O8~X{_%cR++elDVW#-QM>gBbD-Yz5 zPBUM26JNGsZM{}ka{$o!lq5DM+vLJNu1z>BSSJ!)898$Xb3u5;kAKjNX9Bmhe?tOz zit|g9LV?7Q?_K&2pWYOrPH&k@OQ;=7V_Hr()QcyEB!YCA;8k;$?TKN>t8(wv-4i$v zc+r9&+Laq`80hjuVyAl^jk<MR{I)2rT*n@$<MpkNMSOfbZ&71fi6r6t!V6rJpf>hM z#ia0C28IsaR@pj%E-Dc1*QweBKIOQhrlzUH_NMb9WhXZUKR>1CWBlcnNzc5xe}fdH zoZN<AjFB!1hzq_uI+i<uDx)9i_9hS3_rU|PGA;nZ8-I9xT;6_8MK0nH_!EOlu*@R| zXo0Z=iRV>mtbxBlN_4V}Ma8*w&}iLI{t-5%K@zuh7J=2A%H=lFCeSL@FK?Ly3!E5f zilW?UyrAZ|NUpRm245crD;LFXvb~x#bUH^74C33rXJI<K?T-$lAWQ#oAL8T!h7)P9 z+fZ~2T~&3P32AN*ta^k>12k{Ch?IVPyUoCM#TC_FG39UQhN@sDz4K)VIc=ZA4v$Ga z;I;F=_aUYF96U_sH`SgnMv1T_MmerRC7Lpp>#Hhc*nHe0%2LX%Lb?S^OfD{56P8Ns z$7QJgZr1(`iZSL3M;XywVIkkZzAFJwym`r;gJW?jJoOe+0qKKX8opQ@>J%jSAK%hL zu7CwP9m!;w`qX>!e(iQ~B*bxcXR-G7@pit{>nr3!g1JrHgPa*nlwjllCnWzV0#0rO z2|qe`z5N47P0UbQf6pjG*Pw^H&w$(;y4gYPdl!EBhyWZlhd>x|rw7%8Ll2viFtUtH zfT9^Z{DS)S)whHAvcbm`{gt{Q)$k4t9lCUnst1P|cF_R+{5010P5$00LGRO8fAeII zG+*qAesJ+2DpnwE(dgI)A$&xuReTYg#0|cWi*!@F-0k<QA0`10^UzM$_)f?TZKsPN zd5z~OD|d9sOfnXD3`~helV6|{eNwwD70^?T+Z73^ocO0E^HI$$Q~+xU7;f$DbJr!q zdM22Jv;8y<Y41ZgoQU#a;UI(-xnTxuWWrVTF+t`77DPZ9ZOvQ!*0S2%%V{iJ_;Z5K z&gilQmerj@-(r;!_#P65Nugc(`GE1CM&|u;cn}l-aec#neeyZHRU<8qfYb>|Jx65G z=CCOk*}5ZAnZG;Abz`hIO<$vY>0`V$61uXw*Z&Qri#Nz7y2)rV$=UaQh?!lkt`4#( zY$G#bDnC_e)dNUH^Ks!!zT#4dgpeN@+W9rNf3{1kW+^#H9hIw&NibVtpg67v2Ejah zcGTe9`L2(vkgHGdAZMXtbAvKsb`H`?em`6yTAAkve{Z8NHim`}r?~XmM8_5hfg$UQ z)1N>nlUIxz!9G0}I~-V0oC-esyTf5L)o%~NPtPzjF*!rvds_QyN2{IDLVr}O{yl!w z$E{*o7EUlI{nO_Oi*FqGfQmJ@z*YMGl)du)#{BON%(<X4I$G)p0r!b=3S&6QDPKZT zo^D{((M9nHl>GA8_*gDiV)`UB$k7J#?RX8+r}6C>`rvh=6iejT)dlrO92gi%vjxet zbSbp7C`&n{3sSxRM7Q$~*6TJ^{A{~~)KK<4LKO{S$4{|n;_u(6XLVP&u44x^IeGi@ z2n}*NILg4JPzN%rD(!#47j(9|#59kM{O%SwM|jAH0ZZ2$GnH^fGoN+jJ)kC&0@u;z zTkN-F_B9=y8qSze#0T2h^{jsx;%u}4-?dQVM%&EHqYyAtu#)k#&?ScSWDEs719fyI zgmgsA&AmBqKbUd-0I{(MX_m62dmRtZg5KHhpq#)W%qttTbcmQd#q(Ebnyp?PdYA97 z?{P1i4u#LHn2VaJU%K)Cj{f}1t6Ki7x~j8oVR(cZB*}B7{T6i7hh<KwD^GoIgNNEh za2t-NGgE%0{GT___NK7$U1}MbcK%0_>kW;PgO}YWT~gUky?G-HgnQpi6D4JS&Xb{w zqXuGH`O5)1zHtJim)F5v&2=QX(s0INAI`y?eg~=6H!)^LV8R=e4NjG`RDbZg?`LbN zBq~v8iT)-)Q{P$EV*M*_50WR<sIsD(DrXmHP_;6x_V#P~zQqf-zn{Ld<9~V>YU_~V z;v8{0OH-?qLwA4Al7gd^;Ai<2v%nt~PIf#$|I&<9Mh9IFI_%R0OGCYQeWT>r9`7AM zOTJ$tTrppS8rbEMRC}x!#33Bxy(-Z8yr|m9Keaw9GSb14Tkp!%T!T{`6sg(P`$#p; z$GeU(c**_4$wSFYCv*4rRql92^e9T_fxpdAathr&ct}Z+C1o*nl`qHD!mj#IspkV` z=mIxJ;$9(K<81fF2B6XFwML!PJ67tRj&tl^11Fbrryv7!x4h3#Weqs6-^S$b%Wu!V zB(qpcl8N4QeOj(lGdc<-b4pd@-kF9gG-E_wSQfcaV9ufap1EMQFLPQq+yg5rAZ+-k zN~f|DbV-18+e27e^K)#Hj2%hI+v>HXSUHWmmUttgV<~0OWsClWkOGwZx^~GXICO^m z_AM$_YyG~#>Nv`ys)}x6V)z~m$c(Qmm(L`H85x+sr842!38TNXDR@ryQ@Mte6qzhc zsj7lvq&rR@KJzCf8A+58EJT;z)_ngNPcEIA+CV17<BKo$U<^~pyZVZjG^p9CVb+R_ zS?~$5n>EJcca{TObjJH?l~ClVI8n;3qYpi>MW4bO4HaP23Y#L-GCw7_vEY;dB}GdV z27;KC)fgQ=qWN|F{7w;yA+y+IoXdJPTa1W_NCe_eI=SOXp49CNncP^2vG6dYvg>t; zF@CyT2epEh*wcAeB!}v!H@Py2c8b+F>`A{S!Ndy5gbQ?%Zf;VnuTw3rkS}kLuV3kC z?ms}f`vj#DQsIYrD~o<LPs9W^t+r$9$N!`QDsNc0Vmz+{Eq$^c#%+$PH&GpI0cT3_ z_7=|5%<Pi~2dZT&b3=Uw?H{3Ewyr`>9P8Eg-<P+WhzT*oFGIYhLla->_aE>nM!W6* zN^bDaUpgiR5}!JLbG?N-4){b54@V*(8YXJ(>c3~!GZ-`6NL(NUqTXDm5aQ2oYU#s< zD;yBgCCL5c07<U0rm6c`HK%g5jocYpv#@C&X@AFm=Qi_U9BLZ4K@yxC(kR6)4<v@< zwqb-3jLCkdm{EezF=+R?$5U6N{^QQ&)hzXZSXpHD4CH})Hxlmec)M5d8~+aLmS8d= zsu&$gTnBt~Hwc*&beaG~FGyqN0mqMuxeb)xd!(O-Oz}uvYnk(AAtE6)Dpo)<-?!EX z5je-R{g;KT8yE#7`j^VxBm%9GK82a+*o~E~;`^X$cA!MtN#>vL|3|8^^<=ob{abi1 zM0l^**dEWs?i;&5Y}uq}f!~~snVbEg%v;sph8sy3t-p6wH4kitk30I$Z)Z851+aG` zybf|)9Sr_E0{7tLbJ2kNWM(#BP+r%TYTJ~b2t25yG0`of;K?iQlXoO^O~N^=Xosqq z0HL;>doVL|dxE)!i)-rqCoAMn2F4#MN=5X>$0e(HAPL#|%`{(iqaW@<c7!|!P|kcr zW6M0t=fp?*)LFpo7r4uvp2d@pm{dFD&Wp<XX^^4ME8jsgh4Wh&vI$k)ARaJ~BV$P% zN{t3i>Z1dR&6g9e9pJhH=<nW7frh@s0<)KpOO!wm(DTiG>hRH?T~-EuB$xd_Nc4{q z@g>n<Ztjh;A%WDt1sOU~m(y(BEA-tX@ZG?Dw|#q98tJhgY60Iij-0v|ij2O3Oe8eg zS};`sicU4NZpkfT=K)fO@pPQAe-CND_=sqtHgkyAzeFk4^K@Jc`l()2Hl~Z|8#_06 zNK@W%)^q4f@pKGhSwF3I7soL$O>5$2)^&VQE7K=ID|%w;vUgPMug=kVZm6bgSrf8* zEiZloX*drFY%(c8+hzmH2!{W-$q0E?mY>d2FHayp9<kmxhS@Z9<0a0Z4oI6Ir=<mX zBIQr<IfnmG_-xaiXf9GkSqlxSgH1{?`>(nI-%D*#kle@S*L|#hI<%X+_=qI!-n%VZ zD^o9df=VR5)Rn_uuB_(rg<63{JNig3?%U>8Rfgm0bw-XG3{Y{rv5}V}cr~F|$1Yvq z2kGg*)%LZd4J1WF&(#11!2Q3qZ&u!16eraiNgGll(Yzc!d`DMyTzkb$IKC$(3KN$q zYDyV)$=fS-@;3_!nqFSOl@?gtS(uR{19lr$Qeyq1FoaNFcStH~RqY;v>^K1|dCG7D zOdX6^ov7StQavqF?>GO4d7J!y)91VF?K#o*=s{_}2gzK7{HZ{%^PFW>I;q<ETgL&| zr&T{~umJPd%Qa<?cO3j9pX5*epV@K0p?Z@b!xPha)|rZ8J(1KSjI2HibpEs-%RlM( zDvgiywE!CC8FQQ<T!Ua1u#^1Qv5DrrgR79eYsxQ~%#eX=WG&&U%<J>HPO4%^+j_p` zI{Lbv7gyh-$JYYC@B*?FK)S|LT}Yu$!c()a86WWMbNrozm`JR6F3=lpE2^z%Q2qG5 zGY_#i?l&Xbh7ys%kg6*voe;m%6Kt{&3@?N=P#fY^XTd{(n3#xi|04ybNrPb3I?ljA zm5?yrcZCwTweI#xT~`7;fJyi&wU(0J5$QEmz#ZOKpM{tpmO$a>DkDVP2zF>2TOqYt znuH@1(fP!?U-V=Z|0M!)wh7m8(Kz-|1^vd-hjfvW&=60{<(zcIJtY<LG3gOsgTMJ% zGVg!3@@KbW;n_cqAJd}!Zd)SZ<{|ULTejxSe+y{DKbVBg=9gq13m|q6J;_pxN%rzl zfSUlL_dUkk7G1HSape|qii$N&gC9WemQM3!J8KEHT<e$nzNOVl9(7Geofmn5^M|C) zU^g8PVepwn01G;c5=Hgc9#;Pq>+%~J@PGrl=<*x!(KPGhG}`?&`sy+1K)$T1PS|3* z^UqQCNDfS^@Xu@x$~^3HKu6LQ0FO;(qqTb~v~_H+pDZj+Pi7aS>`R@uBbKZ=PS3F1 zuvHjQf*YS+#V2-u3(b5IyV(m=Vyasy9P2tZUl@w*de}<IP{j5zqW8SCL|dG<%Xv_w z>DAl{e!HLY{oFe#Y;${^KUoZ)h~s0RC0xxw7Na4Jg5oGe)0DujH`8NI)Th&zs>-M0 zD6&i9PIq`3{%Q5tFhWf}Il%%><R<*#H1Odt)bcOZ^e9fCQZ{N81DVPfR{4vt`-qcD zgc+*Lf%72+OGK_299h+Qnd+Q-jyq@+zu@O|?=pcs1fTBaJXgCV$GXjnEP}`N0II;9 zU|ja*kT#cu0riv%M|=NR!=Q^+-}PC6HG%4+?njqI<wX6~W;&hFcHhLk)DwcSVY<g@ z)}uGU<qf9c1&f(1yX#k<YoI31ZWfF(joM$dpu3KtB{JS>O&`TAi=!G*H$kJ<?DsO1 z{q`#n^d6p2Br}`q-3;mUqYe4}E+U@r|2r`PxblWiZZ;lx8<e;w;IWZ=-{SgfrY|EY zSm`wZ>i8)Q?W@`+(Weinv-WXWnFU}Jxch~$jgJ2HhR`S|r^DuEvd>rWAPhgVN~K5l z`_D>i<>On6{AA4zLkixB$3}mbct~>fzQvuL#reL7&ol^cE|Ycgmo(kvuf*eIo5E7K zpn5KUvw3M^WQ$~E88ECA5zpH<hs)tFx<4msFxXJ>dLB5z5%Aejz{kdkYi`c&nAwfY z4RcdPITQq?zde4x{ISWem8|@Z==8eFL=J9=7O+ju=}0Yo<Pr4<9{V!&c@*$yfrWgf z;|iq?<d&yLaGX}#;fOYjhaZX{C=uHv6R+`ns3#q%2hH*N_n_k4V@I89Um<GS#jFP{ zmiCc$dGbjCH_j|V%�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�${I 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 literal 0 HcmV?d00001 diff --git a/view/js/css/layui.css b/view/js/css/layui.css new file mode 100644 index 0000000..24faef3 --- /dev/null +++ b/view/js/css/layui.css @@ -0,0 +1 @@ +blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{display:inline-block;border:none;vertical-align:middle}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h1,h2,h3{font-weight:400}h4,h5,h6{font-size:100%;font-weight:400}button,input,select,textarea{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:1.6;color:#333;color:rgba(0,0,0,.85);font:14px Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif}hr{height:0;line-height:0;margin:10px 0;padding:0;border:none!important;border-bottom:1px solid #eee!important;clear:both;overflow:hidden;background:0 0}a{color:#333;text-decoration:none}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.layui-edge{position:relative;display:inline-block;vertical-align:middle;width:0;height:0;border-width:6px;border-style:dashed;border-color:transparent;overflow:hidden}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-disabled,.layui-icon,.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-show-v{visibility:visible!important}.layui-hide-v{visibility:hidden!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=256);src:url(../font/iconfont.eot?v=256#iefix) format('embedded-opentype'),url(../font/iconfont.woff2?v=256) format('woff2'),url(../font/iconfont.woff?v=256) format('woff'),url(../font/iconfont.ttf?v=256) format('truetype'),url(../font/iconfont.svg?v=256#layui-icon) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-search:before{content:"\e615"}.layui-icon-share:before{content:"\e641"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-engine:before{content:"\e628"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-star:before{content:"\e600"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-chat:before{content:"\e606"}.layui-icon-release:before{content:"\e609"}.layui-icon-list:before{content:"\e60a"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-ok-circle:before{content:"\1005"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-table:before{content:"\e62d"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-ie:before{content:"\e7bb"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-edit:before{content:"\e642"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-down:before{content:"\e61a"}.layui-icon-file:before{content:"\e621"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-read:before{content:"\e705"}.layui-icon-404:before{content:"\e61c"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-help:before{content:"\e607"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-windows:before{content:"\e67f"}.layui-icon-water:before{content:"\e636"}.layui-icon-username:before{content:"\e66f"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-about:before{content:"\e60b"}.layui-icon-location:before{content:"\e715"}.layui-icon-up:before{content:"\e619"}.layui-icon-pause:before{content:"\e651"}.layui-icon-date:before{content:"\e637"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-delete:before{content:"\e640"}.layui-icon-play:before{content:"\e652"}.layui-icon-top:before{content:"\e604"}.layui-icon-firefox:before{content:"\e686"}.layui-icon-friends:before{content:"\e612"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-ok:before{content:"\e605"}.layui-icon-layer:before{content:"\e638"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-group:before{content:"\e613"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-link:before{content:"\e64c"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-log:before{content:"\e60e"}.layui-icon-key:before{content:"\e683"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-return:before{content:"\e65c"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-form:before{content:"\e63c"}.layui-icon-cart:before{content:"\e657"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-heart-fill:before{content:"\e68f"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-ios:before{content:"\e680"}.layui-icon-at:before{content:"\e687"}.layui-icon-fire:before{content:"\e756"}.layui-icon-set:before{content:"\e716"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-tips:before{content:"\e702"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-bluetooth:before{content:"\e689"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-addition:before{content:"\e624"}.layui-icon-home:before{content:"\e68e"}.layui-icon-time:before{content:"\e68d"}.layui-icon-user:before{content:"\e770"}.layui-icon-notice:before{content:"\e667"}.layui-icon-chrome:before{content:"\e68a"}.layui-icon-edge:before{content:"\e68b"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-voice:before{content:"\e688"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-heart:before{content:"\e68c"}.layui-icon-logout:before{content:"\e682"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-template:before{content:"\e663"}.layui-icon-transfer:before{content:"\e691"}.layui-icon-auz:before{content:"\e672"}.layui-icon-console:before{content:"\e665"}.layui-icon-app:before{content:"\e653"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-next:before{content:"\e65b"}.layui-icon-component:before{content:"\e857"}.layui-icon-android:before{content:"\e684"}.layui-icon-more:before{content:"\e65f"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-camera:before{content:"\e660"}.layui-icon-note:before{content:"\e66e"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-screen-restore:before{content:"\e758"}.layui-icon-password:before{content:"\e673"}.layui-icon-senior:before{content:"\e674"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-service:before{content:"\e626"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-print:before{content:"\e66d"}.layui-icon-cols:before{content:"\e610"}.layui-icon-wifi:before{content:"\e7e0"}.layui-icon-export:before{content:"\e67d"}.layui-icon-rss:before{content:"\e808"}.layui-icon-slider:before{content:"\e714"}.layui-icon-email:before{content:"\e618"}.layui-icon-subtraction:before{content:"\e67e"}.layui-icon-mike:before{content:"\e6dc"}.layui-icon-light:before{content:"\e748"}.layui-icon-gift:before{content:"\e627"}.layui-icon-mute:before{content:"\e685"}.layui-icon-reduce-circle:before{content:"\e616"}.layui-icon-music:before{content:"\e690"}.layui-main{position:relative;width:1160px;margin:0 auto}.layui-header{position:relative;z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{position:relative;width:220px;height:100%;overflow-x:hidden}.layui-body{position:relative;left:200px;right:0;top:0;bottom:0;z-index:900;width:auto;box-sizing:border-box}.layui-layout-body{overflow-x:hidden}.layui-layout-admin .layui-header{position:fixed;top:0;left:0;right:0;background-color:#23262e}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{position:absolute;top:60px;padding-bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;z-index:990;height:44px;line-height:44px;padding:0 15px;box-shadow:-1px 0 4px rgb(0 0 0 / 12%);background-color:#fafafa}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#009688;font-size:16px;box-shadow:0 1px 2px 0 rgb(0 0 0 / 15%)}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:"";display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:767.98px){.layui-container{padding:0 15px}.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:720px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:960px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1150px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space2{margin:-1px}.layui-col-space2>*{padding:1px}.layui-col-space4{margin:-2px}.layui-col-space4>*{padding:2px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space6{margin:-3px}.layui-col-space6>*{padding:3px}.layui-col-space8{margin:-4px}.layui-col-space8>*{padding:4px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space14{margin:-7px}.layui-col-space14>*{padding:7px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space16{margin:-8px}.layui-col-space16>*{padding:8px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space24{margin:-12px}.layui-col-space24>*{padding:12px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space26{margin:-13px}.layui-col-space26>*{padding:13px}.layui-col-space28{margin:-14px}.layui-col-space28>*{padding:14px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:1.6;border-left:5px solid #5fb878;border-radius:0 2px 2px 0;background-color:#fafafa}.layui-quote-nm{border-style:solid;border-width:1px;border-left-width:5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border-width:0;border-top-width:1px}.layui-field-box{padding:15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#eee}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#5fb878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#5f5f5f}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#fafafa;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:1.6;color:#5f5f5f}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-card:last-child{margin-bottom:0}.layui-card-header{position:relative;height:42px;line-height:42px;padding:0 15px;border-bottom:1px solid #f6f6f6;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-card-body{position:relative;padding:10px 15px;line-height:24px}.layui-card-body[pad15]{padding:15px}.layui-card-body[pad20]{padding:20px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel{position:relative;border-width:1px;border-style:solid;border-radius:2px;box-shadow:1px 1px 4px rgb(0 0 0 / 8%);background-color:#fff;color:#5f5f5f}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #eee;background-color:#fff}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999}.layui-bg-red{background-color:#ff5722!important;color:#fff!important}.layui-bg-orange{background-color:#ffb800!important;color:#fff!important}.layui-bg-green{background-color:#009688!important;color:#fff!important}.layui-bg-cyan{background-color:#2f4056!important;color:#fff!important}.layui-bg-blue{background-color:#1e9fff!important;color:#fff!important}.layui-bg-black{background-color:#393d49!important;color:#fff!important}.layui-bg-gray{background-color:#fafafa!important;color:#5f5f5f!important}.layui-badge-rim,.layui-border,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-layedit,.layui-layedit-tool,.layui-panel,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#eee}.layui-border{border-width:1px;border-style:solid;color:#5f5f5f!important}.layui-border-red{border-width:1px;border-style:solid;border-color:#ff5722!important;color:#ff5722!important}.layui-border-orange{border-width:1px;border-style:solid;border-color:#ffb800!important;color:#ffb800!important}.layui-border-green{border-width:1px;border-style:solid;border-color:#009688!important;color:#009688!important}.layui-border-cyan{border-width:1px;border-style:solid;border-color:#2f4056!important;color:#2f4056!important}.layui-border-blue{border-width:1px;border-style:solid;border-color:#1e9fff!important;color:#1e9fff!important}.layui-border-black{border-width:1px;border-style:solid;border-color:#393d49!important;color:#393d49!important}.layui-timeline-item:before{background-color:#eee}.layui-text{line-height:1.6;font-size:14px;color:#5f5f5f}.layui-text h1,.layui-text h2,.layui-text h3,.layui-text h4,.layui-text h5,.layui-text h6{font-weight:500;color:#333}.layui-text h1{font-size:32px}.layui-text h2{font-size:24px}.layui-text h3{font-size:18px}.layui-text h4{font-size:16px}.layui-text h5{font-size:14px}.layui-text h6{font-size:13px}.layui-text a:not(.layui-btn){color:#01aaed}.layui-text a:not(.layui-btn):hover{text-decoration:underline}.layui-text ol,.layui-text ul{padding:5px 0 5px 15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text ol li{margin-top:5px;list-style-type:decimal}.layui-text em,.layui-word-aux{color:#999!important;padding-left:5px!important;padding-right:5px!important}.layui-text p{margin:15px 0}.layui-text p:first-child{margin-top:0}.layui-text p:last-child{margin-bottom:0}.layui-text blockquote:not(.layui-elem-quote){padding:5px 15px;border-left:5px solid #eee}.layui-text pre:not(.layui-code){padding:15px;font-family:Lucida Console,Consolas,Courier New;background-color:#fafafa}.layui-font-12{font-size:12px!important}.layui-font-14{font-size:14px!important}.layui-font-16{font-size:16px!important}.layui-font-18{font-size:18px!important}.layui-font-20{font-size:20px!important}.layui-font-red{color:#ff5722!important}.layui-font-orange{color:#ffb800!important}.layui-font-green{color:#009688!important}.layui-font-cyan{color:#2f4056!important}.layui-font-blue{color:#01aaed!important}.layui-font-black{color:#000!important}.layui-font-gray{color:#c2c2c2!important}.layui-btn{display:inline-block;vertical-align:middle;height:38px;line-height:38px;border:1px solid transparent;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border-radius:2px;cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{font-size:0}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{padding:0 2px;vertical-align:middle\0;vertical-align:bottom}.layui-btn-primary{border-color:#d2d2d2;background:0 0;color:#5f5f5f}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1e9fff}.layui-btn-warm{background-color:#ffb800}.layui-btn-danger{background-color:#ff5722}.layui-btn-checked{background-color:#5fb878}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border-color:#eee!important;background-color:#fbfbfb!important;color:#d2d2d2!important;cursor:not-allowed!important;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:12px!important}.layui-btn-group{display:inline-block;vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#d2d2d2;color:#009688}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #d2d2d2}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;color:rgba(0,0,0,.85);border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#eee!important}.layui-input:focus,.layui-textarea:focus{border-color:#d2d2d2!important}.layui-textarea{position:relative;min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{position:relative;float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block,.layui-input-inline{position:relative}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{position:relative;float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#ff5722!important}.layui-form-select{position:relative}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #eee;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:1px 1px 4px rgb(0 0 0 / 8%);box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#f6f6f6;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#5fb878;color:#fff}.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.layui-form-selected .layui-edge{margin-top:-3px\0}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;display:inline-block;vertical-align:middle;height:30px;line-height:30px;margin-right:10px;padding-right:30px;background-color:#fff;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox *{display:inline-block;vertical-align:middle}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5fb878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5fb878}.layui-form-checked i,.layui-form-checked:hover i{color:#5fb878}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:28px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#5f5f5f}.layui-form-checkbox[lay-skin=primary] i{right:auto;left:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:#5fb878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5fb878!important;background-color:#5fb878;color:#fff}.layui-checkbox-disabled[lay-skin=primary] span{background:0 0!important;color:#c2c2c2!important}.layui-form-checked.layui-checkbox-disabled[lay-skin=primary] i{background:#eee!important;border-color:#eee!important}.layui-checkbox-disabled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-switch{position:relative;display:inline-block;vertical-align:middle;height:22px;line-height:22px;min-width:35px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch em{position:relative;top:0;width:25px;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5fb878;background-color:#5fb878}.layui-form-onswitch i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch em{margin-left:5px;margin-right:21px;color:#fff!important}.layui-checkbox-disabled{border-color:#eee!important}.layui-checkbox-disabled span{background-color:#eee!important}.layui-checkbox-disabled i{border-color:#eee!important}.layui-checkbox-disabled em{color:#d2d2d2!important}.layui-checkbox-disabled:hover i{color:#fff!important}[lay-radio]{display:none}.layui-form-radio{display:inline-block;vertical-align:middle;line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio *{display:inline-block;vertical-align:middle;font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio:hover *,.layui-form-radioed,.layui-form-radioed>i{color:#5fb878}.layui-radio-disabled>i{color:#eee!important}.layui-radio-disabled *{color:#c2c2c2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#fafafa;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0;border-right-width:1px}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto!important;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-layedit{border-width:1px;border-style:solid;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom-width:1px;border-bottom-style:solid;font-size:0}.layedit-tool-fixed{position:fixed;top:0;border-top:1px solid #eee}.layui-layedit-tool .layedit-tool-mid,.layui-layedit-tool .layui-icon{display:inline-block;vertical-align:middle;text-align:center;font-size:14px}.layui-layedit-tool .layui-icon{position:relative;width:32px;height:30px;line-height:30px;margin:3px 5px;border-radius:2px;color:#777;cursor:pointer;border-radius:2px}.layui-layedit-tool .layui-icon:hover{color:#393d49}.layui-layedit-tool .layui-icon:active{color:#000}.layui-layedit-tool .layedit-tool-active{background-color:#eee;color:#000}.layui-layedit-tool .layui-disabled,.layui-layedit-tool .layui-disabled:hover{color:#d2d2d2;cursor:not-allowed}.layui-layedit-tool .layedit-tool-mid{width:1px;height:18px;margin:0 10px;background-color:#d2d2d2}.layedit-tool-html{width:50px!important;font-size:30px!important}.layedit-tool-b,.layedit-tool-code,.layedit-tool-help{font-size:16px!important}.layedit-tool-d,.layedit-tool-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-layedit-iframe iframe{display:block;width:100%}#LAY_layedit_code{overflow:hidden}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #eee}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-laypage a:hover{color:#009688}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage a{text-decoration:none}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{display:inline-block;width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#009688!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{display:inline-block;vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;margin:10px 0;background-color:#fff;color:#5f5f5f}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:400}.layui-table tbody tr:hover,.layui-table thead tr,.layui-table-click,.layui-table-header,.layui-table-hover,.layui-table-mend,.layui-table-patch,.layui-table-tool,.layui-table-total,.layui-table-total tr{background-color:#fafafa}.layui-table[lay-even] tr:nth-child(even){background-color:#f2f2f2}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#eee}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0;border-bottom-width:1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0;border-right-width:1px}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding-top:15px;padding-right:30px;padding-bottom:15px;padding-left:30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:50px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{padding-top:5px;padding-right:10px;padding-bottom:5px;padding-left:10px;font-size:12px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:30px;line-height:20px;padding-top:5px;padding-right:5px}.layui-table[lay-data]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view{margin:10px 0}.layui-table-view .layui-table{position:relative;width:auto;margin:0;border:0;border-collapse:separate}.layui-table-view .layui-table[lay-skin=line]{border-width:0;border-right-width:1px}.layui-table-view .layui-table[lay-skin=row]{border-width:0;border-bottom-width:1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:0;border-top:none;border-left:none}.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td{cursor:default}.layui-table-view .layui-table td[data-edit=text]{cursor:text}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;width:100%;height:100%;text-align:center;z-index:110}.layui-table-init .layui-icon{position:absolute;left:50%;top:50%;margin:-15px 0 0 -15px;font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0;border-bottom-width:1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-column{position:relative;width:100%;min-height:41px;padding:8px 16px;border-width:0;border-bottom-width:1px}.layui-table-column .layui-btn-container{margin-bottom:-8px}.layui-table-column .layui-btn-container .layui-btn{margin-right:8px;margin-bottom:8px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;padding:5px 0;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-tool-panel li{padding:0 10px;line-height:30px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%}.layui-table-tool-panel li:hover{background-color:#f6f6f6}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{padding-left:28px}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0;border-left-width:1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#5f5f5f}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#5f5f5f}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:38px;line-height:28px;padding:6px 15px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-table-link{color:#01aaed}.layui-table-cell .layui-btn{vertical-align:inherit}.layui-table-cell[align=center]{-webkit-box-pack:center}.layui-table-cell[align=right]{-webkit-box-pack:end}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{text-align:center;-webkit-box-pack:center}.layui-table-body{position:relative;overflow:auto;margin-right:-1px;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:30px 15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:-1px;border-width:0;border-left-width:1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px}.layui-table-tool{position:relative;z-index:890;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0;border-bottom-width:1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-total{margin-bottom:-1px;border-width:0;border-top-width:1px;overflow:hidden}.layui-table-page{z-index:880;border-width:0;border-top-width:1px;margin-bottom:-1px;white-space:nowrap;overflow:hidden}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-11px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-pagebar{float:right;line-height:23px}.layui-table-pagebar .layui-btn-sm{margin-top:-1px}.layui-table-pagebar .layui-btn-xs{margin-top:2px}.layui-table-view select[lay-ignore]{display:inline-block}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;z-index:900;min-width:100%;min-height:100%;padding:5px 14px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15);background-color:#fff}.layui-table-edit:focus{border-color:#5fb878!important}input.layui-input.layui-table-edit{height:100%}select.layui-table-edit{padding:0 0 0 10px;border-color:#d2d2d2}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0;box-sizing:content-box}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:26px;height:100%;padding:5px 0;border-width:0;border-left-width:1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px}.layui-table-grid-down:hover{background-color:#fbfbfb}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-49px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#5f5f5f}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#5f5f5f;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-list{margin:10px 0}.layui-upload-choose{max-width:200px;padding:0 10px;color:#999;font-size:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-upload-drag{position:relative;display:inline-block;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#009688}.layui-upload-drag[lay-over]{border-color:#009688}.layui-upload-form{display:inline-block}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;display:inline-block;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-btn-container .layui-upload-choose{padding-left:0}.layui-menu{position:relative;margin:5px 0;background-color:#fff;box-sizing:border-box}.layui-menu *{box-sizing:border-box}.layui-menu li,.layui-menu-body-title a{padding:5px 15px}.layui-menu li{position:relative;margin:1px 0;width:calc(100% + 1px);line-height:26px;color:rgba(0,0,0,.8);font-size:14px;white-space:nowrap;cursor:pointer;transition:all .3s}.layui-menu li:hover{background-color:#f6f6f6}.layui-menu-item-parent:hover>.layui-menu-body-panel{display:block;animation-name:layui-fadein;animation-duration:.3s;animation-fill-mode:both;animation-delay:.2s}.layui-menu-item-group .layui-menu-body-title,.layui-menu-item-parent .layui-menu-body-title{padding-right:25px}.layui-menu .layui-menu-item-divider:hover,.layui-menu .layui-menu-item-group:hover,.layui-menu .layui-menu-item-none:hover{background:0 0;cursor:default}.layui-menu .layui-menu-item-group>ul{margin:5px 0 -5px}.layui-menu .layui-menu-item-group>.layui-menu-body-title{color:rgba(0,0,0,.35);user-select:none}.layui-menu .layui-menu-item-none{color:rgba(0,0,0,.35);cursor:default}.layui-menu .layui-menu-item-none{text-align:center}.layui-menu .layui-menu-item-divider{margin:5px 0;padding:0;height:0;line-height:0;border-bottom:1px solid #eee;overflow:hidden}.layui-menu .layui-menu-item-down:hover,.layui-menu .layui-menu-item-up:hover{cursor:pointer}.layui-menu .layui-menu-item-up>.layui-menu-body-title{color:rgba(0,0,0,.8)}.layui-menu .layui-menu-item-up>ul{visibility:hidden;height:0;overflow:hidden}.layui-menu .layui-menu-item-down:hover>.layui-menu-body-title>.layui-icon,.layui-menu .layui-menu-item-up>.layui-menu-body-title:hover>.layui-icon{color:#000}.layui-menu .layui-menu-item-down>ul{visibility:visible;height:auto}.layui-menu .layui-menu-item-checked,.layui-menu .layui-menu-item-checked2{background-color:#f6f6f6!important;color:#5fb878}.layui-menu .layui-menu-item-checked a,.layui-menu .layui-menu-item-checked2 a{color:#5fb878}.layui-menu .layui-menu-item-checked:after{position:absolute;right:0;top:0;bottom:0;border-right:3px solid #5fb878;content:""}.layui-menu-body-title{position:relative;overflow:hidden;text-overflow:ellipsis}.layui-menu-body-title a{display:block;margin:-5px -15px;color:rgba(0,0,0,.8)}.layui-menu-body-title a:hover{transition:all .3s}.layui-menu-body-title>.layui-icon{position:absolute;right:0;top:0;font-size:14px}.layui-menu-body-title>.layui-icon:hover{transition:all .3s}.layui-menu-body-title>.layui-icon-right{right:-1px}.layui-menu-body-panel{display:none;position:absolute;top:-7px;left:100%;z-index:1000;margin-left:13px;padding:5px 0}.layui-menu-body-panel:before{content:"";position:absolute;width:20px;left:-16px;top:0;bottom:0}.layui-menu-body-panel-left{left:auto;right:100%;margin:0 13px 0}.layui-menu-body-panel-left:before{left:auto;right:-16px}.layui-menu-lg li{line-height:32px}.layui-menu-lg .layui-menu-body-title a:hover,.layui-menu-lg li:hover{background:0 0;color:#5fb878}.layui-menu-lg li .layui-menu-body-panel{margin-left:14px}.layui-menu-lg li .layui-menu-body-panel-left{margin:0 15px 0}.layui-dropdown{position:absolute;left:-999999px;top:-999999px;z-index:77777777;margin:5px 0;min-width:100px}.layui-dropdown:before{content:"";position:absolute;width:100%;height:6px;left:0;top:-6px}.layui-nav{position:relative;padding:0 20px;background-color:#393d49;color:#fff;border-radius:2px;font-size:0;box-sizing:border-box}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar{content:"";position:absolute;left:0;top:0;width:0;height:5px;background-color:#5fb878;transition:all .2s;-webkit-transition:all .2s;pointer-events:none}.layui-nav-bar{z-index:1000}.layui-nav[lay-bar=disabled] .layui-nav-bar{display:none}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{position:absolute;top:0;right:3px;left:auto!important;margin-top:0;font-size:12px;cursor:pointer;transition:all .2s;-webkit-transition:all .2s}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{transform:rotate(180deg)}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #eee;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap}.layui-nav .layui-nav-child a{color:#5f5f5f;color:rgba(0,0,0,.8)}.layui-nav .layui-nav-child a:hover{background-color:#f6f6f6;color:rgba(0,0,0,.8)}.layui-nav-child dd{margin:1px 0;position:relative}.layui-nav-child dd.layui-this{background-color:#f6f6f6;color:#000}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-child-r{left:auto;right:0}.layui-nav-child-c{text-align:center}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:40px}.layui-nav-tree .layui-nav-item a{position:relative;height:40px;line-height:40px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item>a{padding-top:5px;padding-bottom:5px}.layui-nav-tree .layui-nav-more{right:15px}.layui-nav-tree .layui-nav-item>a .layui-nav-more{padding:5px 0}.layui-nav-tree .layui-nav-bar{width:5px;height:0}.layui-side .layui-nav-tree .layui-nav-bar{width:2px}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-bar{background-color:#009688}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child dd{margin:0}.layui-nav-tree .layui-nav-child a{color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-itemed>.layui-nav-child{display:block;background-color:rgba(0,0,0,.3)!important}.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-breadcrumb{visibility:hidden;font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#5fb878!important}.layui-breadcrumb a cite{color:#5f5f5f;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom-width:1px;border-bottom-style:solid;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{position:relative;line-height:40px;min-width:65px;padding:0 15px;text-align:center;cursor:pointer}.layui-tab-title li a{display:block;padding:0 15px;margin:0 -15px}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:"";width:100%;height:41px;border-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#eee;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\0;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:15px 0}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#ff5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #5fb878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#fafafa}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#5fb878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#5fb878;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#ff5722}.layui-timeline-item:before{content:"";position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:first-child:before{display:block}.layui-timeline-item:last-child:before{display:none}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px;line-height:22px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#ff5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#5f5f5f}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-5px 6px 0}.layui-nav .layui-badge{margin-top:-10px}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\0;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:none 0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\0;opacity:1;left:20px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#eee;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{left:0}.layui-carousel>[carousel-item]>.layui-carousel-prev{left:-100%}.layui-carousel>[carousel-item]>.layui-carousel-next{left:100%}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{left:0}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{left:-100%}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{left:100%}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{top:100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{top:100%}.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9f9f9f;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#5f5f5f;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #d9d9d9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #eee;border-left-width:6px;background-color:#fafafa;color:#333;font-family:Courier New;font-size:12px}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#eee}.layui-transfer-box{position:relative;display:inline-block;vertical-align:middle;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 10px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:10px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;margin-top:-8px;color:#5f5f5f}.layui-transfer-active{margin:0 15px;display:inline-block;vertical-align:middle}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#5fb878;border-color:#5fb878;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#fbfbfb;border-color:#eee;color:#d2d2d2}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;padding:0 10px}.layui-transfer-data li:hover{background-color:#f6f6f6;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 10px;text-align:center;color:#999}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:10px 5px 10px 0;font-size:0}.layui-rate li i.layui-icon{font-size:20px;color:#ffb800}.layui-rate li i.layui-icon{margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:26px;height:26px;border:1px solid #eee;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:34px;height:34px;line-height:32px}.layui-colorpicker.layui-colorpicker-sm{width:24px;height:24px;line-height:22px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:20px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#fff;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;left:-999999px;top:-999999px;z-index:77777777;width:280px;margin:5px 0;padding:7px;background:#fff;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #fff;border-radius:50%;position:absolute;top:-3px;right:-3px;cursor:pointer}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;box-sizing:border-box;background:#fff;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;box-sizing:border-box;background:#fff;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;margin-right:10px;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:150px;height:30px;color:#5f5f5f}.layui-slider{height:4px;background:#eee;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#fff;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#fff;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:77777777;white-space:nowrap;display:none;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#fff;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:"";position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #eee;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-14px}.layui-slider-input-btn{position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #eee}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #eee}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none}.layui-slider-input-btn i:hover{color:#009688}.layui-slider-vertical{width:4px;margin-left:33px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:"";position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:20px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{display:inline-block;vertical-align:middle;cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:"";position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{display:inline-block;vertical-align:middle;position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:12px;line-height:12px;width:12px;text-align:center;border:1px solid #c0c4cc}.layui-tree-iconClick .layui-icon{font-size:18px}.layui-tree-icon .layui-icon{font-size:12px;color:#5f5f5f}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:"";position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-spread>.layui-tree-entry .layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#5f5f5f}.layui-tree-btnGroup{visibility:hidden;display:inline-block;vertical-align:middle;position:relative}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{position:relative;display:inline-block;vertical-align:middle;height:20px;line-height:20px;padding:0 3px;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.layui-anim{-webkit-animation-duration:.3s;-webkit-animation-fill-mode:both;animation-duration:.3s;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .2s;-webkit-transition:all .2s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,15px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,15px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@keyframes layui-down{0%{opacity:.3;transform:translate3d(0,-100%,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-down{animation-name:layui-down}@keyframes layui-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-downbit{animation-name:layui-downbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@keyframes layui-scalesmall{0%{opacity:.3;transform:scale(1.5)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall{animation-name:layui-scalesmall}@keyframes layui-scalesmall-spring{0%{opacity:.3;transform:scale(1.5)}80%{opacity:.8;transform:scale(.9)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall-spring{animation-name:layui-scalesmall-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout} \ No newline at end of file diff --git a/view/js/css/modules/code.css b/view/js/css/modules/code.css new file mode 100644 index 0000000..a2ff92a --- /dev/null +++ b/view/js/css/modules/code.css @@ -0,0 +1 @@ +html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-view{display:block;position:relative;margin:10px 0;padding:0;border:1px solid #eee;border-left-width:6px;background-color:#fafafa;color:#333;font-family:Courier New;font-size:13px}.layui-code-title{position:relative;padding:0 10px;height:40px;line-height:40px;border-bottom:1px solid #eee;font-size:12px}.layui-code-title>.layui-code-about{position:absolute;right:10px;top:0;color:#b7b7b7}.layui-code-about>a{padding-left:10px}.layui-code-view>.layui-code-ol,.layui-code-view>.layui-code-ul{position:relative;overflow:auto}.layui-code-view>.layui-code-ol>li{position:relative;margin-left:45px;line-height:20px;padding:0 10px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view>.layui-code-ol>li:first-child,.layui-code-view>.layui-code-ul>li:first-child{padding-top:10px}.layui-code-view>.layui-code-ol>li:last-child,.layui-code-view>.layui-code-ul>li:last-child{padding-bottom:10px}.layui-code-view>.layui-code-ul>li{position:relative;line-height:20px;padding:0 10px;list-style-type:none;*list-style-type:none;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-dark{border:1px solid #0c0c0c;border-left-color:#3f3f3f;background-color:#0c0c0c;color:#c2be9e}.layui-code-dark>.layui-code-title{border-bottom:none}.layui-code-dark>.layui-code-ol>li,.layui-code-dark>.layui-code-ul>li{background-color:#3f3f3f;border-left:none}.layui-code-dark>.layui-code-ul>li{margin-left:6px}.layui-code-demo .layui-code{visibility:visible!important;margin:-15px;border-top:none;border-right:none;border-bottom:none}.layui-code-demo .layui-tab-content{padding:15px;border-top:none} \ No newline at end of file diff --git a/view/js/css/modules/laydate/default/laydate.css b/view/js/css/modules/laydate/default/laydate.css new file mode 100644 index 0000000..549ccb8 --- /dev/null +++ b/view/js/css/modules/laydate/default/laydate.css @@ -0,0 +1 @@ +html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate,.layui-laydate *{box-sizing:border-box}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@keyframes laydate-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-laydate{animation-name:laydate-downbit}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;padding:0 5px;color:#999;font-size:18px;cursor:pointer}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-set-ym span{padding:0 10px;cursor:pointer}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content th{font-weight:400}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.laydate-day-holidays:before{position:absolute;left:0;top:0;font-size:12px;transform:scale(.7)}.laydate-day-holidays:before{content:'\4F11';color:#ff5722}.laydate-day-holidays[type=work]:before{content:'\73ED';color:inherit}.layui-laydate .layui-this .laydate-day-holidays:before{color:#fff}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px}.layui-laydate-footer span{display:inline-block;vertical-align:top;height:26px;line-height:24px;padding:0 10px;border:1px solid #c9c9c9;border-radius:2px;background-color:#fff;font-size:12px;cursor:pointer;white-space:nowrap;transition:all .3s}.layui-laydate-footer span:hover{color:#5fb878}.layui-laydate-footer span.layui-laydate-preview{cursor:default;border-color:transparent!important}.layui-laydate-footer span.layui-laydate-preview:hover{color:#666}.layui-laydate-footer span:first-child.layui-laydate-preview{padding-left:0}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{margin:0 0 0 -1px}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;box-sizing:border-box;background-color:#fff}.layui-laydate-list>li{position:relative;display:inline-block;width:33.3%;height:36px;line-height:36px;margin:3px 0;vertical-align:middle;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;height:30px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px;color:#ff5722}.layui-laydate-range{width:546px}.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range .laydate-main-list-1 .layui-laydate-header{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5fb878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#b5fff8}.laydate-selected:hover{background-color:#00f7de!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eee;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#ff5722}.laydate-day-mark::after{background-color:#5fb878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5fb878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px} \ No newline at end of file diff --git a/view/js/css/modules/layer/default/icon-ext.png b/view/js/css/modules/layer/default/icon-ext.png new file mode 100644 index 0000000000000000000000000000000000000000..bbbb669bb311514baa5db3a6a00b4644d0e280f1 GIT binary patch literal 5911 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 YZmOLxGt_1UThtH@6<y_WCF{ul0LuG;00000 literal 0 HcmV?d00001 diff --git a/view/js/css/modules/layer/default/icon.png b/view/js/css/modules/layer/default/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3e17da8b1aaae2935e19ac97d9015f0fe24e8770 GIT binary patch literal 11493 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 IBuu~mA09cwRsaA1 literal 0 HcmV?d00001 diff --git a/view/js/css/modules/layer/default/layer.css b/view/js/css/modules/layer/default/layer.css new file mode 100644 index 0000000..d5122e3 --- /dev/null +++ b/view/js/css/modules/layer/default/layer.css @@ -0,0 +1 @@ +html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch}.layui-layer{top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #b2b2b2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) #eee center center no-repeat}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:50px;line-height:50px;border-bottom:1px solid #f0f0f0;font-size:14px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:17px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2e2d3c;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2d93ca}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1e9fff;background-color:#1e9fff;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:300px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8d8d8d;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #d3d4d3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476a7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #e9e7e7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#e9e7e7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#c9c5c5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92b8b1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:260px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:300px;padding:0 20px;text-align:center;cursor:default;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:51px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{background:0 0;box-shadow:none}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgnext,.layui-layer-imgprev{position:fixed;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:30px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:30px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:fixed;left:0;right:0;bottom:0;width:100%;height:40px;line-height:40px;background-color:#000\9;filter:Alpha(opacity=60);background-color:rgba(2,0,0,.35);color:#fff;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}} \ No newline at end of file diff --git a/view/js/css/modules/layer/default/loading-0.gif b/view/js/css/modules/layer/default/loading-0.gif new file mode 100644 index 0000000000000000000000000000000000000000..6f3c9539a22171cc2f12639492e346d97a9078e8 GIT binary patch literal 5793 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 bWW^%>x7XlHV^#Q1uOX^B?ki3(VEg|7!QHuF literal 0 HcmV?d00001 diff --git a/view/js/css/modules/layer/default/loading-1.gif b/view/js/css/modules/layer/default/loading-1.gif new file mode 100644 index 0000000000000000000000000000000000000000..db3a483e4b74971fbfb1cc0fb6499852cedfe650 GIT binary patch literal 701 zcmZ?wbhEHbRAo?Qn8?Ji_w)@mZNLBj|1&T!DE{a6a}5c0b_{Se(lcOY1PT3QVdY|A zV$cDyff`g97?`@J^shYqmS1s(LX_+4yGox$4el*+Jm?ved2^25GBru=T^dGm#<906 za&AQCZ08H8P;Bd&{NT;vl&}c_^L4%p?g_hjB<KpSb=eisoiA+`yS^%|&b8})KEqJ9 z;%V-@${+t;2BtNdDE)AlntY<|=n3;@Gu#&cXcp%TK3Tf5oipv4W}EAE^<696tGcQJ zklZH#bR-J{H_&~oJwW%xAY3lWz{<b{mJywz-zc&7=AF*Mpj5rKD`onI4>u{YB2<bq z2r}?6FvHA1k`ZMPg_<EeC28itEFRgOtZiAT$AW|3>9{c>Ob}p@z~Ks3xCw+@!HClp xtZ<(QPf3`00FNu+VbOvoEE+h73k#4LIKl$IE8t;)<_eUs!0QU6uz<M28UPBGzXAXN literal 0 HcmV?d00001 diff --git a/view/js/css/modules/layer/default/loading-2.gif b/view/js/css/modules/layer/default/loading-2.gif new file mode 100644 index 0000000000000000000000000000000000000000..5bb90fd6a49107a321c35b9cee4a7b810314b51f GIT binary patch literal 1787 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 literal 0 HcmV?d00001 diff --git a/view/js/layui.js b/view/js/layui.js new file mode 100644 index 0000000..854f60e --- /dev/null +++ b/view/js/layui.js @@ -0,0 +1 @@ +/** 2.7.5 | MIT Licensed */;!function(d){"use strict";var t,h=d.document,m={modules:{},status:{},timeout:10,event:{}},r=function(){this.v="2.7.5"},e=d.LAYUI_GLOBAL||{},v=(t=h.currentScript?h.currentScript.src:function(){for(var t,e=h.scripts,o=e.length-1,r=o;0<r;r--)if("interactive"===e[r].readyState){t=e[r].src;break}return t||e[o].src}(),m.dir=e.dir||t.substring(0,t.lastIndexOf("/")+1)),g=function(t,e){e=e||"log",d.console&&console[e]&&console[e]("layui error hint: "+t)},b="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),N=m.builtin={lay:"lay",layer:"layer",laydate:"laydate",laypage:"laypage",laytpl:"laytpl",layedit:"layedit",form:"form",upload:"upload",dropdown:"dropdown",transfer:"transfer",tree:"tree",table:"table",element:"element",rate:"rate",colorpicker:"colorpicker",slider:"slider",carousel:"carousel",flow:"flow",util:"util",code:"code",jquery:"jquery",all:"all","layui.all":"layui.all"},s=(r.prototype.cache=m,r.prototype.define=function(t,r){return"function"==typeof t&&(r=t,t=[]),this.use(t,function(){var o=function(t,e){layui[t]=e,m.status[t]=!0};return"function"==typeof r&&r(function(t,e){o(t,e),m.callback[t]=function(){r(o)}}),this},null,"define"),this},r.prototype.use=function(o,t,e,r){var n=this,i=m.dir=m.dir||v,a=h.getElementsByTagName("head")[0],u=(o="string"==typeof o?[o]:"function"==typeof o?(t=o,["all"]):o,d.jQuery&&jQuery.fn.on&&(n.each(o,function(t,e){"jquery"===e&&o.splice(t,1)}),layui.jquery=layui.$=jQuery),o[0]),l=0;function s(t,e){var o="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;"load"!==t.type&&!o.test((t.currentTarget||t.srcElement).readyState)||(m.modules[u]=e,a.removeChild(p),function r(){return++l>1e3*m.timeout/4?g(u+" is not a valid module","error"):void(m.status[u]?c():setTimeout(r,4))}())}function c(){e.push(layui[u]),1<o.length?n.use(o.slice(1),t,e,r):"function"==typeof t&&(layui.jquery&&"function"==typeof layui.jquery&&"define"!==r?layui.jquery(function(){t.apply(layui,e)}):t.apply(layui,e))}if(e=e||[],m.host=m.host||(i.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===o.length||layui["layui.all"]&&N[u])return c(),n;var p,y=(y=(N[u]?i+"modules/":!/^\{\/\}/.test(n.modules[u])&&m.base||"")+(n.modules[u]||u)+".js").replace(/^\{\/\}/,"");return!m.modules[u]&&layui[u]&&(m.modules[u]=y),m.modules[u]?function f(){return++l>1e3*m.timeout/4?g(u+" is not a valid module","error"):void("string"==typeof m.modules[u]&&m.status[u]?c():setTimeout(f,4))}():((p=h.createElement("script"))["async"]=!0,p.charset="utf-8",p.src=y+((i=!0===m.version?m.v||(new Date).getTime():m.version||"")?"?v="+i:""),a.appendChild(p),!p.attachEvent||p.attachEvent.toString&&p.attachEvent.toString().indexOf("[native code")<0||b?p.addEventListener("load",function(t){s(t,y)},!1):p.attachEvent("onreadystatechange",function(t){s(t,y)}),m.modules[u]=y),n},r.prototype.disuse=function(t){var o=this;return t=o.isArray(t)?t:[t],o.each(t,function(t,e){m.status[e],delete o[e],delete N[e],delete o.modules[e],delete m.status[e],delete m.modules[e]}),o},r.prototype.getStyle=function(t,e){t=t.currentStyle||d.getComputedStyle(t,null);return t[t.getPropertyValue?"getPropertyValue":"getAttribute"](e)},r.prototype.link=function(o,r,t){var n=this,e=h.getElementsByTagName("head")[0],i=h.createElement("link"),t=((t="string"==typeof r?r:t)||o).replace(/\.|\//g,""),a=i.id="layuicss-"+t,u="creating",l=0;return i.rel="stylesheet",i.href=o+(m.debug?"?v="+(new Date).getTime():""),i.media="all",h.getElementById(a)||e.appendChild(i),"function"!=typeof r||function s(t){var e=h.getElementById(a);return++l>1e3*m.timeout/100?g(o+" timeout"):void(1989===parseInt(n.getStyle(e,"width"))?(t===u&&e.removeAttribute("lay-status"),e.getAttribute("lay-status")===u?setTimeout(s,100):r()):(e.setAttribute("lay-status",u),setTimeout(function(){s(u)},100)))}(),n},r.prototype.addcss=function(t,e,o){return layui.link(m.dir+"css/"+t,e,o)},m.callback={},r.prototype.factory=function(t){if(layui[t])return"function"==typeof m.callback[t]?m.callback[t]:null},r.prototype.img=function(t,e,o){var r=new Image;if(r.src=t,r.complete)return e(r);r.onload=function(){r.onload=null,"function"==typeof e&&e(r)},r.onerror=function(t){r.onerror=null,"function"==typeof o&&o(t)}},r.prototype.config=function(t){for(var e in t=t||{})m[e]=t[e];return this},r.prototype.modules=function(){var t,e={};for(t in N)e[t]=N[t];return e}(),r.prototype.extend=function(t){for(var e in t=t||{})this[e]||this.modules[e]?g(e+" Module already exists","error"):this.modules[e]=t[e];return this},r.prototype.router=r.prototype.hash=function(t){var o={path:[],search:{},hash:((t=t||location.hash).match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(t)&&(t=t.replace(/^#\//,""),o.href="/"+t,t=t.replace(/([^#])(#.*$)/,"$1").split("/")||[],this.each(t,function(t,e){/^\w+=/.test(e)?(e=e.split("="),o.search[e[0]]=e[1]):o.path.push(e)})),o},r.prototype.url=function(t){var n,e,o=this;return{pathname:(t?((t.match(/\.[^.]+?\/.+/)||[])[0]||"").replace(/^[^\/]+/,"").replace(/\?.+/,""):location.pathname).replace(/^\//,"").split("/"),search:(n={},e=(t?((t.match(/\?.+/)||[])[0]||"").replace(/\#.+/,""):location.search).replace(/^\?+/,"").split("&"),o.each(e,function(t,e){var o=e.indexOf("="),r=o<0?e.substr(0,e.length):0!==o&&e.substr(0,o);r&&(n[r]=0<o?e.substr(o+1):null)}),n),hash:o.router(t?(t.match(/#.+/)||[])[0]||"/":location.hash)}},r.prototype.data=function(t,e,o){if(t=t||"layui",o=o||localStorage,d.JSON&&d.JSON.parse){if(null===e)return delete o[t];e="object"==typeof e?e:{key:e};try{var r=JSON.parse(o[t])}catch(n){r={}}return"value"in e&&(r[e.key]=e.value),e.remove&&delete r[e.key],o[t]=JSON.stringify(r),e.key?r[e.key]:r}},r.prototype.sessionData=function(t,e){return this.data(t,e,sessionStorage)},r.prototype.device=function(t){var o=navigator.userAgent.toLowerCase(),e=function(t){var e=new RegExp(t+"/([^\\s\\_\\-]+)");return(t=(o.match(e)||[])[1])||!1},r={os:/windows/.test(o)?"windows":/linux/.test(o)?"linux":/iphone|ipod|ipad|ios/.test(o)?"ios":/mac/.test(o)?"mac":void 0,ie:!!(d.ActiveXObject||"ActiveXObject"in d)&&((o.match(/msie\s(\d+)/)||[])[1]||"11"),weixin:e("micromessenger")};return t&&!r[t]&&(r[t]=e(t)),r.android=/android/.test(o),r.ios="ios"===r.os,r.mobile=!(!r.android&&!r.ios),r},r.prototype.hint=function(){return{error:g}},r.prototype._typeof=r.prototype.type=function(t){return null===t?String(t):"object"==typeof t||"function"==typeof t?(e=(e=Object.prototype.toString.call(t).match(/\s(.+)\]$/)||[])[1]||"Object",new RegExp("\\b(Function|Array|Date|RegExp|Object|Error|Symbol)\\b").test(e)?e.toLowerCase():"object"):typeof t;var e},r.prototype._isArray=r.prototype.isArray=function(t){var e,o=this.type(t);return!(!t||"object"!=typeof t||t===d)&&(e="length"in t&&t.length,"array"===o||0===e||"number"==typeof e&&0<e&&e-1 in t)},r.prototype.each=function(t,o){var e,r=function(t,e){return o.call(e[t],t,e[t])};if("function"!=typeof o)return this;if(this.isArray(t=t||[]))for(e=0;e<t.length&&!r(e,t);e++);else for(e in t)if(r(e,t))break;return this},r.prototype.sort=function(t,n,e){var o=JSON.parse(JSON.stringify(t||[]));return"object"!==this.type(t)||n?"object"!=typeof t?[o]:(o.sort(function(t,e){var o=t[n],r=e[n];if(!isNaN(t)&&!isNaN(e))return t-e;if(!isNaN(t)&&isNaN(e)){if(!n||"object"!=typeof e)return-1;o=t}else if(isNaN(t)&&!isNaN(e)){if(!n||"object"!=typeof t)return 1;r=e}t=[!isNaN(o),!isNaN(r)];return t[0]&&t[1]?o&&!r&&0!==r?1:!o&&0!==o&&r?-1:o-r:t[0]||t[1]?t[0]||!t[1]?-1:!t[0]||t[1]?1:void 0:r<o?1:o<r?-1:0}),e&&o.reverse(),o):o},r.prototype.stope=function(t){t=t||d.event;try{t.stopPropagation()}catch(e){t.cancelBubble=!0}},"LAYUI-EVENT-REMOVE");r.prototype.onevent=function(t,e,o){return"string"!=typeof t||"function"!=typeof o?this:r.event(t,e,null,o)},r.prototype.event=r.event=function(t,e,o,r){var n=this,i=null,a=(e||"").match(/\((.*)\)$/)||[],t=(t+"."+e).replace(a[0],""),u=a[1]||"",l=function(t,e){!1===(e&&e.call(n,o))&&null===i&&(i=!1)};return o===s?(delete(n.cache.event[t]||{})[u],n):r?(m.event[t]=m.event[t]||{},m.event[t][u]=[r],this):(layui.each(m.event[t],function(t,e){"{*}"===u?layui.each(e,l):(""===t&&layui.each(e,l),u&&t===u&&layui.each(e,l))}),i)},r.prototype.on=function(t,e,o){return this.onevent.call(this,e,t,o)},r.prototype.off=function(t,e){return this.event.call(this,e,t,s)},d.layui=new r}(window);layui.define(function(a){var i=layui.cache;layui.config({dir:i.dir.replace(/lay\/dest\/$/,"")}),a("layui.all",layui.v)});!function(l){"use strict";var t,f=l.document,h=function(t){return new i(t)},i=function(t){for(var e=0,n="object"==typeof t?[t]:(this.selector=t,f.querySelectorAll(t||null));e<n.length;e++)this.push(n[e])};(i.prototype=[]).constructor=i,h.extend=function(){var t,e=1,n=arguments,o=function(t,e){for(var n in t=t||("array"===layui.type(e)?[]:{}),e)t[n]=e[n]&&e[n].constructor===Object?o(t[n],e[n]):e[n];return t};for(n[0]="object"==typeof n[0]?n[0]:{},t=n.length;e<t;e++)"object"==typeof n[e]&&o(n[0],n[e]);return n[0]},h.v="1.0.8",h.ie=(t=navigator.userAgent.toLowerCase(),!!(l.ActiveXObject||"ActiveXObject"in l)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")),h.layui=layui||{},h.getPath=layui.cache.dir,h.stope=layui.stope,h.each=function(){return layui.each.apply(layui,arguments),this},h.digit=function(t,e){if("string"!=typeof t&&"number"!=typeof t)return"";var n="";e=e||2;for(var o=(t=String(t)).length;o<e;o++)n+="0";return t<Math.pow(10,e)?n+t:t},h.elem=function(t,e){var n=f.createElement(t);return h.each(e||{},function(t,e){n.setAttribute(t,e)}),n},h.hasScrollbar=function(){return f.body.scrollHeight>(l.innerHeight||f.documentElement.clientHeight)},h.position=function(t,e,n){var o,i,r,c,u,a,s;e&&(n=n||{},t!==f&&t!==h("body")[0]||(n.clickType="right"),u="right"===n.clickType?{left:(u=n.e||l.event||{}).clientX,top:u.clientY,right:u.clientX,bottom:u.clientY}:t.getBoundingClientRect(),a=e.offsetWidth,s=e.offsetHeight,o=function(t){return f.body[t=t?"scrollLeft":"scrollTop"]|f.documentElement[t]},r=u.left,c=u.bottom,"center"===n.align?r-=(a-t.offsetWidth)/2:"right"===n.align&&(r=r-a+t.offsetWidth),(r=r+a+5>(i=function(t){return f.documentElement[t?"clientWidth":"clientHeight"]})("width")?i("width")-a-5:r)<5&&(r=5),c+s+5>i()&&(u.top>s+5?c=u.top-s-10:"right"===n.clickType?(c=i()-s-10)<0&&(c=0):c=5),(a=n.position)&&(e.style.position=a),e.style.left=r+("fixed"===a?0:o(1))+"px",e.style.top=c+("fixed"===a?0:o())+"px",h.hasScrollbar()||(s=e.getBoundingClientRect(),!n.SYSTEM_RELOAD&&s.bottom+5>i()&&(n.SYSTEM_RELOAD=!0,setTimeout(function(){h.position(t,e,n)},50))))},h.options=function(t,e){t=h(t),e=e||"lay-options";try{return new Function("return "+(t.attr(e)||"{}"))()}catch(n){return hint.error("parseerror\uff1a"+n,"error"),{}}},h.isTopElem=function(n){var t=[f,h("body")[0]],o=!1;return h.each(t,function(t,e){if(e===n)return o=!0}),o},i.addStr=function(n,t){return n=n.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),h.each(t,function(t,e){new RegExp("\\b"+e+"\\b").test(n)||(n=n+" "+e)}),n.replace(/^\s|\s$/,"")},i.removeStr=function(n,t){return n=n.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),h.each(t,function(t,e){e=new RegExp("\\b"+e+"\\b");e.test(n)&&(n=n.replace(e,""))}),n.replace(/\s+/," ").replace(/^\s|\s$/,"")},i.prototype.find=function(o){var i=this,r=0,c=[],u="object"==typeof o;return this.each(function(t,e){for(var n=u?e.contains(o):e.querySelectorAll(o||null);r<n.length;r++)c.push(n[r]);i.shift()}),u||(i.selector=(i.selector?i.selector+" ":"")+o),h.each(c,function(t,e){i.push(e)}),i},i.prototype.each=function(t){return h.each.call(this,this,t)},i.prototype.addClass=function(n,o){return this.each(function(t,e){e.className=i[o?"removeStr":"addStr"](e.className,n)})},i.prototype.removeClass=function(t){return this.addClass(t,!0)},i.prototype.hasClass=function(n){var o=!1;return this.each(function(t,e){new RegExp("\\b"+n+"\\b").test(e.className)&&(o=!0)}),o},i.prototype.css=function(e,o){var t=this,i=function(t){return isNaN(t)?t:t+"px"};return"string"!=typeof e||o!==undefined?t.each(function(t,n){"object"==typeof e?h.each(e,function(t,e){n.style[t]=i(e)}):n.style[e]=i(o)}):0<t.length?t[0].style[e]:void 0},i.prototype.width=function(n){var o=this;return n!==undefined?o.each(function(t,e){o.css("width",n)}):0<o.length?o[0].offsetWidth:void 0},i.prototype.height=function(n){var o=this;return n!==undefined?o.each(function(t,e){o.css("height",n)}):0<o.length?o[0].offsetHeight:void 0},i.prototype.attr=function(n,o){var t=this;return o!==undefined?t.each(function(t,e){e.setAttribute(n,o)}):0<t.length?t[0].getAttribute(n):void 0},i.prototype.removeAttr=function(n){return this.each(function(t,e){e.removeAttribute(n)})},i.prototype.html=function(n){var t=this;return n!==undefined?this.each(function(t,e){e.innerHTML=n}):0<t.length?t[0].innerHTML:void 0},i.prototype.val=function(n){var t=this;return n!==undefined?this.each(function(t,e){e.value=n}):0<t.length?t[0].value:void 0},i.prototype.append=function(n){return this.each(function(t,e){"object"==typeof n?e.appendChild(n):e.innerHTML=e.innerHTML+n})},i.prototype.remove=function(n){return this.each(function(t,e){n?e.removeChild(n):e.parentNode.removeChild(e)})},i.prototype.on=function(n,o){return this.each(function(t,e){e.attachEvent?e.attachEvent("on"+n,function(t){t.target=t.srcElement,o.call(e,t)}):e.addEventListener(n,o,!1)})},i.prototype.off=function(n,o){return this.each(function(t,e){e.detachEvent?e.detachEvent("on"+n,o):e.removeEventListener(n,o,!1)})},l.lay=h,l.layui&&layui.define&&layui.define(function(t){t("lay",h)})}(window,window.document);layui.define(function(e){"use strict";var p={open:"{{",close:"}}"},a={exp:function(e){return new RegExp(e,"g")},query:function(e,r,n){return l((r||"")+p.open+["#([\\s\\S])+?","([^{#}])*?"][e||0]+p.close+(n||""))},escape:function(e){return e===undefined||null===e?"":/[<"'>]|&(?=#[a-zA-Z0-9]+)/g.test(e+="")?e.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,"""):e},error:function(e,r){var n="Laytpl Error: ";return"object"==typeof console&&console.error(n+e+"\n"+(r||"")),n+e}},l=a.exp,r=function(e){this.tpl=e},n=(r.pt=r.prototype,window.errors=0,r.pt.parse=function(e,r){var n=e,c=l("^"+p.open+"#",""),t=l(p.close+"$","");e='"use strict";var view = "'+(e=e.replace(/\s+|\r|\t|\n/g," ").replace(l(p.open+"#"),p.open+"# ").replace(l(p.close+"}"),"} "+p.close).replace(/\\/g,"\\\\").replace(l(p.open+"!(.+?)!"+p.close),function(e){return e=e.replace(l("^"+p.open+"!"),"").replace(l("!"+p.close),"").replace(l(p.open+"|"+p.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(a.query(),function(e){return'";'+(e=e.replace(c,"").replace(t,"")).replace(/\\(.)/g,"$1")+';view+="'}).replace(a.query(1),function(e){var r='"+laytpl.escape(';return e.replace(/\s/g,"")===p.open+p.close?"":(e=e.replace(l(p.open+"|"+p.close),""),/^=/.test(e)?e=e.replace(/^=/,""):/^-/.test(e)&&(e=e.replace(/^-/,""),r='"+('),r+e.replace(/\\(.)/g,"$1")+')+"')}))+'";return view;';try{return this.cache=e=new Function("d, laytpl",e),e(r,a)}catch(o){return delete this.cache,a.error(o,n)}},r.pt.render=function(e,r){var n=this;return e?(e=n.cache?n.cache(e,a):n.parse(n.tpl,e),r?void r(e):e):a.error("no data")},function(e){return"string"!=typeof e?a.error("Template not found"):new r(e)});n.config=function(e){for(var r in e=e||{})p[r]=e[r]},n.v="1.2.0",e("laytpl",n)});layui.define(function(e){"use strict";var n=document,u="getElementById",c="getElementsByTagName",a="layui-disabled",t=function(e){var a=this;a.config=e||{},a.config.index=++o.index,a.render(!0)},o=(t.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return e.elem.length===undefined?2:3},t.prototype.view=function(){var t,i,r=this.config,n=r.groups="groups"in r?Number(r.groups)||0:5,u=(r.layout="object"==typeof r.layout?r.layout:["prev","page","next"],r.count=Number(r.count)||0,r.curr=Number(r.curr)||1,r.limits="object"==typeof r.limits?r.limits:[10,20,30,40,50],r.limit=Number(r.limit)||10,r.pages=Math.ceil(r.count/r.limit)||1,r.curr>r.pages?r.curr=r.pages:r.curr<1&&(r.curr=1),n<0?n=1:n>r.pages&&(n=r.pages),r.prev="prev"in r?r.prev:"上一页",r.next="next"in r?r.next:"下一页",r.pages>n?Math.ceil((r.curr+(1<n?1:0))/(0<n?n:1)):1),s={prev:r.prev?'<a href="javascript:;" class="layui-laypage-prev'+(1==r.curr?" "+a:"")+'" data-page="'+(r.curr-1)+'">'+r.prev+"</a>":"",page:function(){var e=[];if(r.count<1)return"";1<u&&!1!==r.first&&0!==n&&e.push('<a href="javascript:;" class="layui-laypage-first" data-page="1" title="首页">'+(r.first||1)+"</a>");var a=Math.floor((n-1)/2),t=1<u?r.curr-a:1,i=1<u?(a=r.curr+(n-a-1))>r.pages?r.pages:a:n;for(i-t<n-1&&(t=i-n+1),!1!==r.first&&2<t&&e.push('<span class="layui-laypage-spr">…</span>');t<=i;t++)t===r.curr?e.push('<span class="layui-laypage-curr"><em class="layui-laypage-em" '+(/^#/.test(r.theme)?'style="background-color:'+r.theme+';"':"")+"></em><em>"+t+"</em></span>"):e.push('<a href="javascript:;" data-page="'+t+'">'+t+"</a>");return r.pages>n&&r.pages>i&&!1!==r.last&&(i+1<r.pages&&e.push('<span class="layui-laypage-spr">…</span>'),0!==n&&e.push('<a href="javascript:;" class="layui-laypage-last" title="尾页" data-page="'+r.pages+'">'+(r.last||r.pages)+"</a>")),e.join("")}(),next:r.next?'<a href="javascript:;" class="layui-laypage-next'+(r.curr==r.pages?" "+a:"")+'" data-page="'+(r.curr+1)+'">'+r.next+"</a>":"",count:'<span class="layui-laypage-count">\u5171 '+r.count+" \u6761</span>",limit:(t=['<span class="layui-laypage-limits"><select lay-ignore>'],layui.each(r.limits,function(e,a){t.push('<option value="'+a+'"'+(a===r.limit?"selected":"")+">"+a+" \u6761/\u9875</option>")}),t.join("")+"</select></span>"),refresh:['<a href="javascript:;" data-page="'+r.curr+'" class="layui-laypage-refresh">','<i class="layui-icon layui-icon-refresh"></i>',"</a>"].join(""),skip:['<span class="layui-laypage-skip">到第','<input type="text" min="1" value="'+r.curr+'" class="layui-input">','页<button type="button" class="layui-laypage-btn">确定</button>',"</span>"].join("")};return['<div class="layui-box layui-laypage layui-laypage-'+(r.theme?/^#/.test(r.theme)?"molv":r.theme:"default")+'" id="layui-laypage-'+r.index+'">',(i=[],layui.each(r.layout,function(e,a){s[a]&&i.push(s[a])}),i.join("")),"</div>"].join("")},t.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,n=e[c]("button")[0],u=e[c]("input")[0],e=e[c]("select")[0],s=function(){var e=Number(u.value.replace(/\s|\D/g,""));e&&(i.curr=e,t.render())};if(a)return s();for(var l=0,p=r.length;l<p;l++)"a"===r[l].nodeName.toLowerCase()&&o.on(r[l],"click",function(){var e=Number(this.getAttribute("data-page"));e<1||e>i.pages||(i.curr=e,t.render())});e&&o.on(e,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),n&&o.on(n,"click",function(){s()})}},t.prototype.skip=function(t){var i,e;t&&(i=this,(e=t[c]("input")[0])&&o.on(e,"keyup",function(e){var a=this.value,e=e.keyCode;/^(37|38|39|40)$/.test(e)||(/\D/.test(a)&&(this.value=a.replace(/\D/,"")),13===e&&i.jump(t,!0))}))},t.prototype.render=function(e){var a=this,t=a.config,i=a.type(),r=a.view(),i=(2===i?t.elem&&(t.elem.innerHTML=r):3===i?t.elem.html(r):n[u](t.elem)&&(n[u](t.elem).innerHTML=r),t.jump&&t.jump(t,e),n[u]("layui-laypage-"+t.index));a.jump(i),t.hash&&!e&&(location.hash="!"+t.hash+"="+t.curr),a.skip(i)},{render:function(e){return new t(e).index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(a,e,t){return a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1),this}});e("laypage",o)});!function(i,r){"use strict";var n=i.layui&&layui.define,l={getPath:i.lay&&lay.getPath?lay.getPath:"",link:function(e,t,a){u.path&&i.lay&&lay.layui&&lay.layui.link(u.path+e,t,a)}},e=i.LAYUI_GLOBAL||{},u={v:"5.3.1",config:{weekStart:0},index:i.laydate&&i.laydate.v?1e5:0,path:e.laydate_dir||l.getPath,set:function(e){var t=this;return t.config=lay.extend({},t.config,e),t},ready:function(e){var t="laydate",a=(n?"modules/laydate/":"theme/")+"default/laydate.css?v="+u.v;return n?layui.addcss(a,e,t):l.link(a,e,t),this}},s=function(){var t=this,e=t.config.id;return{hint:function(e){t.hint.call(t,e)},config:(s.that[e]=t).config}},a="laydate",w="layui-this",x="laydate-disabled",h=[100,2e5],p="layui-laydate-static",M="layui-laydate-list",o="layui-laydate-hint",E=".laydate-btns-confirm",C="laydate-time-text",k="laydate-btns-time",f="layui-laydate-preview",g=function(e){var t=this,a=(t.index=++u.index,t.config=lay.extend({},t.config,u.config,e),lay(e.elem||t.config.elem));if(1<a.length)return layui.each(a,function(){u.render(lay.extend({},t.config,{elem:this}))}),t;(e=t.config).id="id"in e?e.id:t.index,u.ready(function(){t.init()})},y="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s";s.formatArr=function(e){return(e||"").match(new RegExp(y+"|.","g"))||[]},g.isLeapYear=function(e){return e%4==0&&e%100!=0||e%400==0},g.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,isInitValue:!0,min:"1900-1-1",max:"2099-12-31",trigger:"click",show:!1,showBottom:!0,isPreview:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},holidays:null,zIndex:null,done:null,change:null},g.prototype.lang=function(){var e={cn:{weeks:["\u65e5","\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d"],time:["\u65f6","\u5206","\u79d2"],timeTips:"\u9009\u62e9\u65f6\u95f4",startTime:"\u5f00\u59cb\u65f6\u95f4",endTime:"\u7ed3\u675f\u65f6\u95f4",dateTips:"\u8fd4\u56de\u65e5\u671f",month:["\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u5341\u4e00","\u5341\u4e8c"],tools:{confirm:"\u786e\u5b9a",clear:"\u6e05\u7a7a",now:"\u73b0\u5728"},timeout:"\u7ed3\u675f\u65f6\u95f4\u4e0d\u80fd\u65e9\u4e8e\u5f00\u59cb\u65f6\u95f4<br>\u8bf7\u91cd\u65b0\u9009\u62e9",invalidDate:"\u4e0d\u5728\u6709\u6548\u65e5\u671f\u6216\u65f6\u95f4\u8303\u56f4\u5185",formatError:["\u65e5\u671f\u683c\u5f0f\u4e0d\u5408\u6cd5<br>\u5fc5\u987b\u9075\u5faa\u4e0b\u8ff0\u683c\u5f0f\uff1a<br>","<br>\u5df2\u4e3a\u4f60\u91cd\u7f6e"],preview:"\u5f53\u524d\u9009\u4e2d\u7684\u7ed3\u679c"},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"},timeout:"End time cannot be less than start Time<br>Please re-select",invalidDate:"Invalid date",formatError:["The date format error<br>Must be followed\uff1a<br>","<br>It has been reset"],preview:"The selected result"}};return e[this.config.lang]||e.cn},g.prototype.init=function(){var r=this,o=r.config,e="static"===o.position,t={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};o.elem=lay(o.elem),o.eventElem=lay(o.eventElem),o.elem[0]&&(r.rangeStr=o.range?"string"==typeof o.range?o.range:"-":"","array"===layui.type(o.range)&&(r.rangeElem=[lay(o.range[0]),lay(o.range[1])]),t[o.type]||(i.console&&console.error&&console.error("laydate type error:'"+o.type+"' is not supported"),o.type="date"),o.format===t.date&&(o.format=t[o.type]||t.date),r.format=s.formatArr(o.format),o.weekStart&&!/^[0-6]$/.test(o.weekStart)&&(t=r.lang(),o.weekStart=t.weeks.indexOf(o.weekStart),-1===o.weekStart&&(o.weekStart=0)),r.EXP_IF="",r.EXP_SPLIT="",lay.each(r.format,function(e,t){e=new RegExp(y).test(t)?"\\d{"+(new RegExp(y).test(r.format[0===e?e+1:e-1]||"")?/^yyyy|y$/.test(t)?4:t.length:/^yyyy$/.test(t)?"1,4":/^y$/.test(t)?"1,308":"1,2")+"}":"\\"+t;r.EXP_IF=r.EXP_IF+e,r.EXP_SPLIT=r.EXP_SPLIT+"("+e+")"}),r.EXP_IF_ONE=new RegExp("^"+r.EXP_IF+"$"),r.EXP_IF=new RegExp("^"+(o.range?r.EXP_IF+"\\s\\"+r.rangeStr+"\\s"+r.EXP_IF:r.EXP_IF)+"$"),r.EXP_SPLIT=new RegExp("^"+r.EXP_SPLIT+"$",""),r.isInput(o.elem[0])||"focus"===o.trigger&&(o.trigger="click"),o.elem.attr("lay-key")||(o.elem.attr("lay-key",r.index),o.eventElem.attr("lay-key",r.index)),o.mark=lay.extend({},o.calendar&&"cn"===o.lang?{"0-1-1":"\u5143\u65e6","0-2-14":"\u60c5\u4eba","0-3-8":"\u5987\u5973","0-3-12":"\u690d\u6811","0-4-1":"\u611a\u4eba","0-5-1":"\u52b3\u52a8","0-5-4":"\u9752\u5e74","0-6-1":"\u513f\u7ae5","0-9-10":"\u6559\u5e08","0-10-1":"\u56fd\u5e86","0-12-25":"\u5723\u8bde"}:{},o.mark),lay.each(["min","max"],function(e,t){var a,n,i=[],l=[];l="number"==typeof o[t]?(n=o[t],a=new Date,a=r.newDate({year:a.getFullYear(),month:a.getMonth(),date:a.getDate(),hours:"23",minutes:"59",seconds:"59"}).getTime(),i=[(n=new Date(n?n<864e5?a+864e5*n:n:a)).getFullYear(),n.getMonth()+1,n.getDate()],[n.getHours(),n.getMinutes(),n.getSeconds()]):(i=(o[t].match(/\d+-\d+-\d+/)||[""])[0].split("-"),(o[t].match(/\d+:\d+:\d+/)||[""])[0].split(":")),o[t]={year:0|i[0]||(new Date).getFullYear(),month:i[1]?(0|i[1])-1:(new Date).getMonth(),date:0|i[2]||(new Date).getDate(),hours:0|l[0],minutes:0|l[1],seconds:0|l[2]}}),r.elemID="layui-laydate"+o.elem.attr("lay-key"),(o.show||e)&&r.render(),e||r.events(),o.value&&o.isInitValue&&("date"===layui.type(o.value)?r.setValue(r.parse(0,r.systemDate(o.value))):r.setValue(o.value)))},g.prototype.render=function(){var n,e,t=this,o=t.config,s=t.lang(),i="static"===o.position,a=t.elem=lay.elem("div",{id:t.elemID,"class":["layui-laydate",o.range?" layui-laydate-range":"",i?" "+p:"",o.theme&&"default"!==o.theme&&!/^#/.test(o.theme)?" laydate-theme-"+o.theme:""].join("")}),y=t.elemMain=[],d=t.elemHeader=[],m=t.elemCont=[],c=t.table=[],l=t.footer=lay.elem("div",{"class":"layui-laydate-footer"});o.zIndex&&(a.style.zIndex=o.zIndex),lay.each(new Array(2),function(e){if(!o.range&&0<e)return!0;var a=lay.elem("div",{"class":"layui-laydate-header"}),t=[((t=lay.elem("i",{"class":"layui-icon laydate-icon laydate-prev-y"})).innerHTML="",t),((t=lay.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"})).innerHTML="",t),(t=lay.elem("div",{"class":"laydate-set-ym"}),n=lay.elem("span"),l=lay.elem("span"),t.appendChild(n),t.appendChild(l),t),((n=lay.elem("i",{"class":"layui-icon laydate-icon laydate-next-m"})).innerHTML="",n),((l=lay.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"})).innerHTML="",l)],n=lay.elem("div",{"class":"layui-laydate-content"}),i=lay.elem("table"),l=lay.elem("thead"),r=lay.elem("tr");lay.each(t,function(e,t){a.appendChild(t)}),l.appendChild(r),lay.each(new Array(6),function(a){var n=i.insertRow(0);lay.each(new Array(7),function(e){var t;0===a&&((t=lay.elem("th")).innerHTML=s.weeks[(e+o.weekStart)%7],r.appendChild(t)),n.insertCell(e)})}),i.insertBefore(l,i.children[0]),n.appendChild(i),y[e]=lay.elem("div",{"class":"layui-laydate-main laydate-main-list-"+e}),y[e].appendChild(a),y[e].appendChild(n),d.push(t),m.push(n),c.push(i)}),lay(l).html((e=[],n=[],"datetime"===o.type&&e.push('<span lay-type="datetime" class="'+k+'">'+s.timeTips+"</span>"),!o.range&&"datetime"===o.type||e.push('<span class="'+f+'" title="'+s.preview+'"></span>'),lay.each(o.btns,function(e,t){var a=s.tools[t]||"btn";o.range&&"now"===t||(i&&"clear"===t&&(a="cn"===o.lang?"\u91cd\u7f6e":"Reset"),n.push('<span lay-type="'+t+'" class="laydate-btns-'+t+'">'+a+"</span>"))}),e.push('<div class="laydate-footer-btns">'+n.join("")+"</div>"),e.join(""))),lay.each(y,function(e,t){a.appendChild(t)}),o.showBottom&&a.appendChild(l),/^#/.test(o.theme)&&(e=lay.elem("style"),l=["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,t.elemID).replace(/{{theme}}/g,o.theme),"styleSheet"in e?(e.setAttribute("type","text/css"),e.styleSheet.cssText=l):e.innerHTML=l,lay(a).addClass("laydate-theme-molv"),a.appendChild(e)),t.remove(g.thisElemDate),u.thisId=o.id,i?o.elem.append(a):(r.body.appendChild(a),t.position()),t.checkDate().calendar(null,0,"init"),t.changeEvent(),g.thisElemDate=t.elemID,"function"==typeof o.ready&&o.ready(lay.extend({},o.dateTime,{month:o.dateTime.month+1})),t.preview()},g.prototype.remove=function(e){var t=this,a=t.config,n=lay("#"+(e||t.elemID));return n[0]&&(n.hasClass(p)||t.checkDate(function(){n.remove(),delete u.thisId,"function"==typeof a.close&&a.close(t)})),t},g.prototype.position=function(){var e=this.config;return lay.position(this.bindElem||e.elem[0],this.elem,{position:e.position}),this},g.prototype.hint=function(e){var t=this,a=(t.config,lay.elem("div",{"class":o}));t.elem&&(a.innerHTML=e||"",lay(t.elem).find("."+o).remove(),t.elem.appendChild(a),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){lay(t.elem).find("."+o).remove()},3e3))},g.prototype.getAsYM=function(e,t,a){return a?t--:t++,t<0&&(t=11,e--),11<t&&(t=0,e++),[e,t]},g.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},g.prototype.checkDate=function(e){var t,o,s=this,y=(new Date,s.config),a=s.lang(),n=y.dateTime=y.dateTime||s.systemDate(),i=s.bindElem||y.elem[0],l=(s.isInput(i),function(){if(s.rangeElem){var e=[s.rangeElem[0].val(),s.rangeElem[1].val()];if(e[0]&&e[1])return e.join(" "+s.rangeStr+" ")}return s.isInput(i)?i.value:"static"===y.position?"":lay(i).attr("lay-date")}()),d=function(e){e.year>h[1]&&(e.year=h[1],o=!0),11<e.month&&(e.month=11,o=!0),59<e.seconds&&(e.seconds=0,e.minutes++,o=!0),59<e.minutes&&(e.minutes=0,e.hours++,o=!0),23<e.hours&&(e.hours=0,o=!0),t=u.getEndDate(e.month+1,e.year),e.date>t&&(e.date=t,o=!0)},r=function(n,i,l){var r=["startTime","endTime"];i=(i.match(s.EXP_SPLIT)||[]).slice(1),l=l||0,y.range&&(s[r[l]]=s[r[l]]||{}),lay.each(s.format,function(e,t){var a=parseFloat(i[e]);i[e].length<t.length&&(o=!0),/yyyy|y/.test(t)?(a<h[0]&&(a=h[0],o=!0),n.year=a):/MM|M/.test(t)?(a<1&&(a=1,o=!0),n.month=a-1):/dd|d/.test(t)?(a<1&&(a=1,o=!0),n.date=a):/HH|H/.test(t)?(a<0&&(o=!(a=0)),23<a&&(a=23,o=!0),n.hours=a,y.range&&(s[r[l]].hours=a)):/mm|m/.test(t)?(a<0&&(o=!(a=0)),59<a&&(a=59,o=!0),n.minutes=a,y.range&&(s[r[l]].minutes=a)):/ss|s/.test(t)&&(a<0&&(o=!(a=0)),59<a&&(a=59,o=!0),n.seconds=a,y.range&&(s[r[l]].seconds=a))}),d(n)};if("limit"===e)return d(n),s;"string"==typeof(l=l||y.value)&&(l=l.replace(/\s+/g," ").replace(/^\s|\s$/g,""));var m,c=function(){var e,t,a;y.range&&(s.endDate=s.endDate||lay.extend({},y.dateTime,(e={},t=y.dateTime,a=s.getAsYM(t.year,t.month),"year"===y.type?e.year=t.year+1:"time"!==y.type&&(e.year=a[0],e.month=a[1]),"datetime"!==y.type&&"time"!==y.type||(e.hours=23,e.minutes=e.seconds=59),e)))};return c(),"string"==typeof l&&l?s.EXP_IF.test(l)?y.range?(l=l.split(" "+s.rangeStr+" "),lay.each([y.dateTime,s.endDate],function(e,t){r(t,l[e],e)})):r(n,l):(s.hint(a.formatError[0]+(y.range?y.format+" "+s.rangeStr+" "+y.format:y.format)+a.formatError[1]),o=!0):l&&"date"===layui.type(l)?y.dateTime=s.systemDate(l):(y.dateTime=s.systemDate(),delete s.startTime,delete s.endDate,c(),delete s.endTime),s.rangeElem&&(a=[s.rangeElem[0].val(),s.rangeElem[1].val()],m=[y.dateTime,s.endDate],lay.each(a,function(e,t){s.EXP_IF_ONE.test(t)&&r(m[e],t,e)})),d(n),y.range&&d(s.endDate),o&&l&&s.setValue(!y.range||s.endDate?s.parse():""),s.getDateTime(n)>s.getDateTime(y.max)?n=y.dateTime=lay.extend({},y.max):s.getDateTime(n)<s.getDateTime(y.min)&&(n=y.dateTime=lay.extend({},y.min)),y.range&&((s.getDateTime(s.endDate)<s.getDateTime(y.min)||s.getDateTime(s.endDate)>s.getDateTime(y.max))&&(s.endDate=lay.extend({},y.max)),s.startTime={hours:y.dateTime.hours,minutes:y.dateTime.minutes,seconds:y.dateTime.seconds},s.endTime={hours:s.endDate.hours,minutes:s.endDate.minutes,seconds:s.endDate.seconds}),e&&e(),s},g.prototype.mark=function(e,a){var n,t=this.config;return lay.each(t.mark,function(e,t){e=e.split("-");e[0]!=a[0]&&0!=e[0]||e[1]!=a[1]&&0!=e[1]||e[2]!=a[2]||(n=t||a[2])}),n&&e.html('<span class="laydate-day-mark">'+n+"</span>"),this},g.prototype.holidays=function(n,i){var e=this.config,l=["","work"];return"array"!==layui.type(e.holidays)||lay.each(e.holidays,function(a,e){lay.each(e,function(e,t){t===n.attr("lay-ymd")&&n.html('<span class="laydate-day-holidays"'+(l[a]?'type="'+l[a]+'"':"")+">"+i[2]+"</span>")})}),this},g.prototype.limit=function(e,t,a,i){var l=this,n=l.config,r={},a=(i?0:41)<a?l.endDate:n.dateTime,a=lay.extend({},a,t||{});return lay.each({now:a,min:n.min,max:n.max},function(e,a){var n;r[e]=l.newDate(lay.extend({year:a.year,month:a.month,date:a.date},(n={},lay.each(i,function(e,t){n[t]=a[t]}),n))).getTime()}),t=r.now<r.min||r.now>r.max,e&&e[t?"addClass":"removeClass"](x),t},g.prototype.thisDateTime=function(e){var t=this.config;return e?this.endDate:t.dateTime},g.prototype.calendar=function(e,t,a){var i,l,r,o=this,n=o.config,t=t?1:0,s=e||o.thisDateTime(t),y=new Date,d=o.lang(),m="date"!==n.type&&"datetime"!==n.type,c=lay(o.table[t]).find("td"),t=lay(o.elemHeader[t][2]).find("span");return s.year<h[0]&&(s.year=h[0],o.hint(d.invalidDate)),s.year>h[1]&&(s.year=h[1],o.hint(d.invalidDate)),o.firstDate||(o.firstDate=lay.extend({},s)),y.setFullYear(s.year,s.month,1),i=(y.getDay()+(7-n.weekStart))%7,l=u.getEndDate(s.month||12,s.year),r=u.getEndDate(s.month+1,s.year),lay.each(c,function(e,t){var a=[s.year,s.month],n=0;(t=lay(t)).removeAttr("class"),e<i?(n=l-i+e,t.addClass("laydate-day-prev"),a=o.getAsYM(s.year,s.month,"sub")):i<=e&&e<r+i?(n=e-i)+1===s.date&&t.addClass(w):(n=e-r-i,t.addClass("laydate-day-next"),a=o.getAsYM(s.year,s.month)),a[1]++,a[2]=n+1,t.attr("lay-ymd",a.join("-")).html(a[2]),o.mark(t,a).holidays(t,a).limit(t,{year:a[0],month:a[1]-1,date:a[2]},e)}),lay(t[0]).attr("lay-ym",s.year+"-"+(s.month+1)),lay(t[1]).attr("lay-ym",s.year+"-"+(s.month+1)),"cn"===n.lang?(lay(t[0]).attr("lay-type","year").html(s.year+" \u5e74"),lay(t[1]).attr("lay-type","month").html(s.month+1+" \u6708")):(lay(t[0]).attr("lay-type","month").html(d.month[s.month]),lay(t[1]).attr("lay-type","year").html(s.year)),m&&(n.range?e&&(o.listYM=[[n.dateTime.year,n.dateTime.month+1],[o.endDate.year,o.endDate.month+1]],o.list(n.type,0).list(n.type,1),"time"===n.type?o.setBtnStatus("\u65f6\u95f4",lay.extend({},o.systemDate(),o.startTime),lay.extend({},o.systemDate(),o.endTime)):o.setBtnStatus(!0)):(o.listYM=[[s.year,s.month+1]],o.list(n.type,0))),n.range&&"init"===a&&!e&&o.calendar(o.endDate,1),n.range||o.limit(lay(o.footer).find(E),null,0,["hours","minutes","seconds"]),o.setBtnStatus(),o},g.prototype.list=function(t,n){var i,l,e,r,o=this,s=o.config,y=s.dateTime,d=o.lang(),a=s.range&&"date"!==s.type&&"datetime"!==s.type,m=lay.elem("ul",{"class":M+" "+{year:"laydate-year-list",month:"laydate-month-list",time:"laydate-time-list"}[t]}),c=o.elemHeader[n],u=lay(c[2]).find("span"),h=o.elemCont[n||0],p=lay(h).find("."+M)[0],f="cn"===s.lang,g=f?"\u5e74":"",v=o.listYM[n]||{},T=["hours","minutes","seconds"],D=["startTime","endTime"][n];return v[0]<1&&(v[0]=1),"year"===t?(e=i=v[0]-7,i<1&&(e=i=1),lay.each(new Array(15),function(e){var t=lay.elem("li",{"lay-ym":i}),a={year:i,month:0,date:1};i==v[0]&&lay(t).addClass(w),t.innerHTML=i+g,m.appendChild(t),o.limit(lay(t),a,n),i++}),lay(u[f?0:1]).attr("lay-ym",i-8+"-"+v[1]).html(e+g+" - "+(i-1)+g)):"month"===t?(lay.each(new Array(12),function(e){var t=lay.elem("li",{"lay-ym":e}),a={year:v[0],month:e,date:1};e+1==v[1]&&lay(t).addClass(w),t.innerHTML=d.month[e]+(f?"\u6708":""),m.appendChild(t),o.limit(lay(t),a,n)}),lay(u[f?0:1]).attr("lay-ym",v[0]+"-"+v[1]).html(v[0]+g)):"time"===t&&(l=function(){lay(m).find("ol").each(function(a,e){lay(e).find("li").each(function(e,t){o.limit(lay(t),[{hours:e},{hours:o[D].hours,minutes:e},{hours:o[D].hours,minutes:o[D].minutes,seconds:e}][a],n,[["hours"],["hours","minutes"],["hours","minutes","seconds"]][a])})}),s.range||o.limit(lay(o.footer).find(E),o[D],0,["hours","minutes","seconds"])},s.range?o[D]||(o[D]="startTime"===D?y:o.endDate):o[D]=y,lay.each([24,60,60],function(t,e){var a=lay.elem("li"),n=["<p>"+d.time[t]+"</p><ol>"];lay.each(new Array(e),function(e){n.push("<li"+(o[D][T[t]]===e?' class="'+w+'"':"")+">"+lay.digit(e,2)+"</li>")}),a.innerHTML=n.join("")+"</ol>",m.appendChild(a)}),l()),p&&h.removeChild(p),h.appendChild(m),"year"===t||"month"===t?(lay(o.elemMain[n]).addClass("laydate-ym-show"),lay(m).find("li").on("click",function(){var e=0|lay(this).attr("lay-ym");lay(this).hasClass(x)||(0===n?(y[t]=e,o.limit(lay(o.footer).find(E),null,0)):o.endDate[t]=e,"year"===s.type||"month"===s.type?(lay(m).find("."+w).removeClass(w),lay(this).addClass(w),"month"===s.type&&"year"===t&&(o.listYM[n][0]=e,a&&((n?o.endDate:y).year=e),o.list("month",n))):(o.checkDate("limit").calendar(null,n),o.closeList()),o.setBtnStatus(),s.range||("month"===s.type&&"month"===t||"year"===s.type&&"year"===t)&&o.setValue(o.parse()).remove().done(),o.done(null,"change"),lay(o.footer).find("."+k).removeClass(x))})):(e=lay.elem("span",{"class":C}),r=function(){lay(m).find("ol").each(function(e){var a=this,t=lay(a).find("li");a.scrollTop=30*(o[D][T[e]]-2),a.scrollTop<=0&&t.each(function(e,t){if(!lay(this).hasClass(x))return a.scrollTop=30*(e-2),!0})})},u=lay(c[2]).find("."+C),r(),e.innerHTML=s.range?[d.startTime,d.endTime][n]:d.timeTips,lay(o.elemMain[n]).addClass("laydate-time-show"),u[0]&&u.remove(),c[2].appendChild(e),lay(m).find("ol").each(function(t){var a=this;lay(a).find("li").on("click",function(){var e=0|this.innerHTML;lay(this).hasClass(x)||(s.range?o[D][T[t]]=e:y[T[t]]=e,lay(a).find("."+w).removeClass(w),lay(this).addClass(w),l(),r(),!o.endDate&&"time"!==s.type||o.done(null,"change"),o.setBtnStatus())})})),o},g.prototype.listYM=[],g.prototype.closeList=function(){var a=this;a.config;lay.each(a.elemCont,function(e,t){lay(this).find("."+M).remove(),lay(a.elemMain[e]).removeClass("laydate-ym-show laydate-time-show")}),lay(a.elem).find("."+C).remove()},g.prototype.setBtnStatus=function(e,t,a){var n=this,i=n.config,l=n.lang(),r=lay(n.footer).find(E);i.range&&"time"!==i.type&&(t=t||i.dateTime,a=a||n.endDate,i=n.newDate(t).getTime()>n.newDate(a).getTime(),n.limit(null,t)||n.limit(null,a)?r.addClass(x):r[i?"addClass":"removeClass"](x),e&&i&&n.hint("string"==typeof e?l.timeout.replace(/\u65e5\u671f/g,e):l.timeout))},g.prototype.parse=function(e,t){var a=this,n=a.config,t=t||("end"==e?lay.extend({},a.endDate,a.endTime):n.range?lay.extend({},n.dateTime,a.startTime):n.dateTime),t=u.parse(t,a.format,1);return n.range&&e===undefined?t+" "+a.rangeStr+" "+a.parse("end"):t},g.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},g.prototype.getDateTime=function(e){return this.newDate(e).getTime()},g.prototype.setValue=function(e){var t=this,a=t.config,n=t.bindElem||a.elem[0];return"static"===a.position||(e=e||"",t.isInput(n)?lay(n).val(e):(a=t.rangeElem)?("array"!==layui.type(e)&&(e=e.split(" "+t.rangeStr+" ")),a[0].val(e[0]||""),a[1].val(e[1]||"")):(0===lay(n).find("*").length&&lay(n).html(e),lay(n).attr("lay-date",e))),t},g.prototype.preview=function(){var e,t=this,a=t.config;a.isPreview&&(e=lay(t.elem).find("."+f),a=!a.range||t.endDate?t.parse():"",e.html(a).css({color:"#5FB878"}),setTimeout(function(){e.css({color:"#666"})},300))},g.prototype.done=function(e,t){var a=this,n=a.config,i=lay.extend({},lay.extend(n.dateTime,a.startTime)),l=lay.extend({},lay.extend(a.endDate,a.endTime));return lay.each([i,l],function(e,t){"month"in t&&lay.extend(t,{month:t.month+1})}),a.preview(),e=e||[a.parse(),i,l],"function"==typeof n[t||"done"]&&n[t||"done"].apply(n,e),a},g.prototype.choose=function(e,a){var n=this,i=n.config,l=n.thisDateTime(a),t=(lay(n.elem).find("td"),{year:0|(t=e.attr("lay-ymd").split("-"))[0],month:(0|t[1])-1,date:0|t[2]});e.hasClass(x)||(lay.extend(l,t),i.range?(lay.each(["startTime","endTime"],function(e,t){n[t]=n[t]||{hours:e?23:0,minutes:e?59:0,seconds:e?59:0},a===e&&(n.getDateTime(lay.extend({},l,n[t]))<n.getDateTime(i.min)?(n[t]={hours:i.min.hours,minutes:i.min.minutes,seconds:i.min.seconds},lay.extend(l,n[t])):n.getDateTime(lay.extend({},l,n[t]))>n.getDateTime(i.max)&&(n[t]={hours:i.max.hours,minutes:i.max.minutes,seconds:i.max.seconds},lay.extend(l,n[t])))}),n.calendar(null,a).done(null,"change")):"static"===i.position?n.calendar().done().done(null,"change"):"date"===i.type?n.setValue(n.parse()).remove().done():"datetime"===i.type&&n.calendar().done(null,"change"))},g.prototype.tool=function(e,t){var a=this,n=a.config,i=a.lang(),l=n.dateTime,r="static"===n.position,o={datetime:function(){lay(e).hasClass(x)||(a.list("time",0),n.range&&a.list("time",1),lay(e).attr("lay-type","date").html(a.lang().dateTips))},date:function(){a.closeList(),lay(e).attr("lay-type","datetime").html(a.lang().timeTips)},clear:function(){r&&(lay.extend(l,a.firstDate),a.calendar()),n.range&&(delete n.dateTime,delete a.endDate,delete a.startTime,delete a.endTime),a.setValue("").remove(),a.done(["",{},{}])},now:function(){var e=new Date;lay.extend(l,a.systemDate(),{hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}),a.setValue(a.parse()).remove(),r&&a.calendar(),a.done()},confirm:function(){if(n.range){if(lay(e).hasClass(x))return a.hint("time"===n.type?i.timeout.replace(/\u65e5\u671f/g,"\u65f6\u95f4"):i.timeout)}else if(lay(e).hasClass(x))return a.hint(i.invalidDate);a.setValue(a.parse()).remove(),a.done()}};o[t]&&o[t]()},g.prototype.change=function(n){var i=this,l=i.config,r=i.thisDateTime(n),o=l.range&&("year"===l.type||"month"===l.type),s=i.elemCont[n||0],y=i.listYM[n],e=function(e){var t=lay(s).find(".laydate-year-list")[0],a=lay(s).find(".laydate-month-list")[0];return t&&(y[0]=e?y[0]-15:y[0]+15,i.list("year",n)),a&&(e?y[0]--:y[0]++,i.list("month",n)),(t||a)&&(lay.extend(r,{year:y[0]}),o&&(r.year=y[0]),l.range||i.done(null,"change"),l.range||i.limit(lay(i.footer).find(E),{year:y[0]})),i.setBtnStatus(),t||a};return{prevYear:function(){e("sub")||(r.year--,i.checkDate("limit").calendar(null,n),i.done(null,"change"))},prevMonth:function(){var e=i.getAsYM(r.year,r.month,"sub");lay.extend(r,{year:e[0],month:e[1]}),i.checkDate("limit").calendar(null,n),i.done(null,"change")},nextMonth:function(){var e=i.getAsYM(r.year,r.month);lay.extend(r,{year:e[0],month:e[1]}),i.checkDate("limit").calendar(null,n),i.done(null,"change")},nextYear:function(){e()||(r.year++,i.checkDate("limit").calendar(null,n),i.done(null,"change"))}}},g.prototype.changeEvent=function(){var i=this;i.config;lay(i.elem).on("click",function(e){lay.stope(e)}).on("mousedown",function(e){lay.stope(e)}),lay.each(i.elemHeader,function(n,e){lay(e[0]).on("click",function(e){i.change(n).prevYear()}),lay(e[1]).on("click",function(e){i.change(n).prevMonth()}),lay(e[2]).find("span").on("click",function(e){var t=lay(this),a=t.attr("lay-ym"),t=t.attr("lay-type");a&&(a=a.split("-"),i.listYM[n]=[0|a[0],0|a[1]],i.list(t,n),lay(i.footer).find("."+k).addClass(x))}),lay(e[3]).on("click",function(e){i.change(n).nextMonth()}),lay(e[4]).on("click",function(e){i.change(n).nextYear()})}),lay.each(i.table,function(e,t){lay(t).find("td").on("click",function(){i.choose(lay(this),e)})}),lay(i.footer).find("span").on("click",function(){var e=lay(this).attr("lay-type");i.tool(this,e)})},g.prototype.isInput=function(e){return/input|textarea/.test(e.tagName.toLocaleLowerCase())||/INPUT|TEXTAREA/.test(e.tagName)},g.prototype.events=function(){var a=this,n=a.config,e=function(e,t){e.on(n.trigger,function(){u.thisId!==n.id&&(t&&(a.bindElem=this),a.render())})};n.elem[0]&&!n.elem[0].eventHandler&&(e(n.elem,"bind"),e(n.eventElem),n.elem[0].eventHandler=!0)},s.that={},s.getThis=function(e){var t=s.that[e];return!t&&n&&layui.hint().error(e?a+" instance with ID '"+e+"' not found":"ID argument required"),t},l.run=function(n){n(r).on("mousedown",function(e){var t,a;!u.thisId||(t=s.getThis(u.thisId))&&(a=t.config,e.target!==a.elem[0]&&e.target!==a.eventElem[0]&&e.target!==n(a.closeStop)[0]&&t.remove())}).on("keydown",function(e){var t;!u.thisId||(t=s.getThis(u.thisId))&&"static"!==t.config.position&&13===e.keyCode&&n("#"+t.elemID)[0]&&t.elemID===g.thisElemDate&&(e.preventDefault(),n(t.footer).find(E)[0].click())}),n(i).on("resize",function(){if(u.thisId){var e=s.getThis(u.thisId);if(e)return!(!e.elem||!n(".layui-laydate")[0])&&void e.position()}})},u.render=function(e){e=new g(e);return s.call(e)},u.parse=function(a,n,i){return a=a||{},n=((n="string"==typeof n?s.formatArr(n):n)||[]).concat(),lay.each(n,function(e,t){/yyyy|y/.test(t)?n[e]=lay.digit(a.year,t.length):/MM|M/.test(t)?n[e]=lay.digit(a.month+(i||0),t.length):/dd|d/.test(t)?n[e]=lay.digit(a.date,t.length):/HH|H/.test(t)?n[e]=lay.digit(a.hours,t.length):/mm|m/.test(t)?n[e]=lay.digit(a.minutes,t.length):/ss|s/.test(t)&&(n[e]=lay.digit(a.seconds,t.length))}),n.join("")},u.getEndDate=function(e,t){var a=new Date;return a.setFullYear(t||a.getFullYear(),e||a.getMonth()+1,1),new Date(a.getTime()-864e5).getDate()},u.close=function(e){e=s.getThis(e||u.thisId);if(e)return e.remove()},n?(u.ready(),layui.define("lay",function(e){u.path=layui.cache.dir,l.run(lay),e(a,u)})):"function"==typeof define&&define.amd?define(function(){return l.run(lay),u}):(u.ready(),l.run(i.lay),i.laydate=u)}(window,window.document);!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e):function(e){if(e.document)return t(e);throw new Error("jQuery requires a window with a document")}:t(e)}("undefined"!=typeof window?window:this,function(T,M){var f=[],g=T.document,c=f.slice,O=f.concat,R=f.push,P=f.indexOf,B={},W=B.toString,m=B.hasOwnProperty,y={},e="1.12.4",C=function(e,t){return new C.fn.init(e,t)},I=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,$=/^-ms-/,z=/-([\da-z])/gi,X=function(e,t){return t.toUpperCase()};function U(e){var t=!!e&&"length"in e&&e.length,n=C.type(e);return"function"!==n&&!C.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}C.fn=C.prototype={jquery:e,constructor:C,selector:"",length:0,toArray:function(){return c.call(this)},get:function(e){return null!=e?e<0?this[e+this.length]:this[e]:c.call(this)},pushStack:function(e){e=C.merge(this.constructor(),e);return e.prevObject=this,e.context=this.context,e},each:function(e){return C.each(this,e)},map:function(n){return this.pushStack(C.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(c.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,e=+e+(e<0?t:0);return this.pushStack(0<=e&&e<t?[this[e]]:[])},end:function(){return this.prevObject||this.constructor()},push:R,sort:f.sort,splice:f.splice},C.extend=C.fn.extend=function(){var e,t,n,r,i,o=arguments[0]||{},a=1,s=arguments.length,u=!1;for("boolean"==typeof o&&(u=o,o=arguments[a]||{},a++),"object"==typeof o||C.isFunction(o)||(o={}),a===s&&(o=this,a--);a<s;a++)if(null!=(r=arguments[a]))for(n in r)i=o[n],o!==(t=r[n])&&(u&&t&&(C.isPlainObject(t)||(e=C.isArray(t)))?(i=e?(e=!1,i&&C.isArray(i)?i:[]):i&&C.isPlainObject(i)?i:{},o[n]=C.extend(u,i,t)):t!==undefined&&(o[n]=t));return o},C.extend({expando:"jQuery"+(e+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return"function"===C.type(e)},isArray:Array.isArray||function(e){return"array"===C.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){var t=e&&e.toString();return!C.isArray(e)&&0<=t-parseFloat(t)+1},isEmptyObject:function(e){for(var t in e)return!1;return!0},isPlainObject:function(e){if(!e||"object"!==C.type(e)||e.nodeType||C.isWindow(e))return!1;try{if(e.constructor&&!m.call(e,"constructor")&&!m.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!y.ownFirst)for(var t in e)return m.call(e,t);for(t in e);return t===undefined||m.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?B[W.call(e)]||"object":typeof e},globalEval:function(e){e&&C.trim(e)&&(T.execScript||function(e){T.eval.call(T,e)})(e)},camelCase:function(e){return e.replace($,"ms-").replace(z,X)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var n,r=0;if(U(e))for(n=e.length;r<n&&!1!==t.call(e[r],r,e[r]);r++);else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(I,"")},makeArray:function(e,t){t=t||[];return null!=e&&(U(Object(e))?C.merge(t,"string"==typeof e?[e]:e):R.call(t,e)),t},inArray:function(e,t,n){var r;if(t){if(P)return P.call(t,e,n);for(r=t.length,n=n?n<0?Math.max(0,r+n):n:0;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;)e[i++]=t[r++];if(n!=n)for(;t[r]!==undefined;)e[i++]=t[r++];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!=a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(U(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return O.apply([],a)},guid:1,proxy:function(e,t){var n,r;return"string"==typeof t&&(r=e[t],t=e,e=r),C.isFunction(e)?(n=c.call(arguments,2),(r=function(){return e.apply(t||this,n.concat(c.call(arguments)))}).guid=e.guid=e.guid||C.guid++,r):undefined},now:function(){return+new Date},support:y}),"function"==typeof Symbol&&(C.fn[Symbol.iterator]=f[Symbol.iterator]),C.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){B["[object "+t+"]"]=t.toLowerCase()});var e=function(M){var e,g,b,o,O,w,R,P,T,u,l,C,E,t,N,m,r,i,y,k="sizzle"+ +new Date,v=M.document,S=0,B=0,W=le(),I=le(),A=le(),$=function(e,t){return e===t&&(l=!0),0},z={}.hasOwnProperty,n=[],X=n.pop,U=n.push,D=n.push,V=n.slice,j=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},Y="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",a="[\\x20\\t\\r\\n\\f]",s="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",J="\\["+a+"*("+s+")(?:"+a+"*([*^$|!~]?=)"+a+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+s+"))|)"+a+"*\\]",G=":("+s+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+J+")*)|.*)\\)|)",K=new RegExp(a+"+","g"),L=new RegExp("^"+a+"+|((?:^|[^\\\\])(?:\\\\.)*)"+a+"+$","g"),Q=new RegExp("^"+a+"*,"+a+"*"),Z=new RegExp("^"+a+"*([>+~]|"+a+")"+a+"*"),ee=new RegExp("="+a+"*([^\\]'\"]*?)"+a+"*\\]","g"),te=new RegExp(G),ne=new RegExp("^"+s+"$"),f={ID:new RegExp("^#("+s+")"),CLASS:new RegExp("^\\.("+s+")"),TAG:new RegExp("^("+s+"|[*])"),ATTR:new RegExp("^"+J),PSEUDO:new RegExp("^"+G),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+a+"*(even|odd|(([+-]|)(\\d*)n|)"+a+"*(?:([+-]|)"+a+"*(\\d+)|))"+a+"*\\)|)","i"),bool:new RegExp("^(?:"+Y+")$","i"),needsContext:new RegExp("^"+a+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+a+"*((?:-\\d)?\\d*)"+a+"*\\)|)(?=[^-]|$)","i")},re=/^(?:input|select|textarea|button)$/i,ie=/^h\d$/i,c=/^[^{]+\{\s*\[native \w/,oe=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ae=/[+~]/,se=/'|\\/g,d=new RegExp("\\\\([\\da-f]{1,6}"+a+"?|("+a+")|.)","ig"),p=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(65536+r):String.fromCharCode(r>>10|55296,1023&r|56320)},ue=function(){C()};try{D.apply(n=V.call(v.childNodes),v.childNodes),n[v.childNodes.length].nodeType}catch(F){D={apply:n.length?function(e,t){U.apply(e,V.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function H(e,t,n,r){var i,o,a,s,u,l,c,f,d=t&&t.ownerDocument,p=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==p&&9!==p&&11!==p)return n;if(!r&&((t?t.ownerDocument||t:v)!==E&&C(t),t=t||E,N)){if(11!==p&&(l=oe.exec(e)))if(i=l[1]){if(9===p){if(!(a=t.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(d&&(a=d.getElementById(i))&&y(t,a)&&a.id===i)return n.push(a),n}else{if(l[2])return D.apply(n,t.getElementsByTagName(e)),n;if((i=l[3])&&g.getElementsByClassName&&t.getElementsByClassName)return D.apply(n,t.getElementsByClassName(i)),n}if(g.qsa&&!A[e+" "]&&(!m||!m.test(e))){if(1!==p)d=t,f=e;else if("object"!==t.nodeName.toLowerCase()){for((s=t.getAttribute("id"))?s=s.replace(se,"\\$&"):t.setAttribute("id",s=k),o=(c=w(e)).length,u=ne.test(s)?"#"+s:"[id='"+s+"']";o--;)c[o]=u+" "+_(c[o]);f=c.join(","),d=ae.test(e)&&de(t.parentNode)||t}if(f)try{return D.apply(n,d.querySelectorAll(f)),n}catch(h){}finally{s===k&&t.removeAttribute("id")}}}return P(e.replace(L,"$1"),t,n,r)}function le(){var n=[];function r(e,t){return n.push(e+" ")>b.cacheLength&&delete r[n.shift()],r[e+" "]=t}return r}function q(e){return e[k]=!0,e}function h(e){var t=E.createElement("div");try{return!!e(t)}catch(F){return!1}finally{t.parentNode&&t.parentNode.removeChild(t)}}function ce(e,t){for(var n=e.split("|"),r=n.length;r--;)b.attrHandle[n[r]]=t}function fe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||1<<31)-(~e.sourceIndex||1<<31);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function x(a){return q(function(o){return o=+o,q(function(e,t){for(var n,r=a([],e.length,o),i=r.length;i--;)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function de(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in g=H.support={},O=H.isXML=function(e){e=e&&(e.ownerDocument||e).documentElement;return!!e&&"HTML"!==e.nodeName},C=H.setDocument=function(e){var e=e?e.ownerDocument||e:v;return e!==E&&9===e.nodeType&&e.documentElement&&(t=(E=e).documentElement,N=!O(E),(e=E.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",ue,!1):e.attachEvent&&e.attachEvent("onunload",ue)),g.attributes=h(function(e){return e.className="i",!e.getAttribute("className")}),g.getElementsByTagName=h(function(e){return e.appendChild(E.createComment("")),!e.getElementsByTagName("*").length}),g.getElementsByClassName=c.test(E.getElementsByClassName),g.getById=h(function(e){return t.appendChild(e).id=k,!E.getElementsByName||!E.getElementsByName(k).length}),g.getById?(b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&N)return(e=t.getElementById(e))?[e]:[]},b.filter.ID=function(e){var t=e.replace(d,p);return function(e){return e.getAttribute("id")===t}}):(delete b.find.ID,b.filter.ID=function(e){var t=e.replace(d,p);return function(e){e="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return e&&e.value===t}}),b.find.TAG=g.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):g.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"!==e)return o;for(;n=o[i++];)1===n.nodeType&&r.push(n);return r},b.find.CLASS=g.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&N)return t.getElementsByClassName(e)},r=[],m=[],(g.qsa=c.test(E.querySelectorAll))&&(h(function(e){t.appendChild(e).innerHTML="<a id='"+k+"'></a><select id='"+k+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]="+a+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||m.push("\\["+a+"*(?:value|"+Y+")"),e.querySelectorAll("[id~="+k+"-]").length||m.push("~="),e.querySelectorAll(":checked").length||m.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||m.push(".#.+[+~]")}),h(function(e){var t=E.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&m.push("name"+a+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||m.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),m.push(",.*:")})),(g.matchesSelector=c.test(i=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.msMatchesSelector))&&h(function(e){g.disconnectedMatch=i.call(e,"div"),i.call(e,"[s!='']:x"),r.push("!=",G)}),m=m.length&&new RegExp(m.join("|")),r=r.length&&new RegExp(r.join("|")),e=c.test(t.compareDocumentPosition),y=e||c.test(t.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,t=t&&t.parentNode;return e===t||!(!t||1!==t.nodeType||!(n.contains?n.contains(t):e.compareDocumentPosition&&16&e.compareDocumentPosition(t)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},$=e?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!g.sortDetached&&t.compareDocumentPosition(e)===n?e===E||e.ownerDocument===v&&y(v,e)?-1:t===E||t.ownerDocument===v&&y(v,t)?1:u?j(u,e)-j(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===E?-1:t===E?1:i?-1:o?1:u?j(u,e)-j(u,t):0;if(i===o)return fe(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;a[r]===s[r];)r++;return r?fe(a[r],s[r]):a[r]===v?-1:s[r]===v?1:0}),E},H.matches=function(e,t){return H(e,null,null,t)},H.matchesSelector=function(e,t){if((e.ownerDocument||e)!==E&&C(e),t=t.replace(ee,"='$1']"),g.matchesSelector&&N&&!A[t+" "]&&(!r||!r.test(t))&&(!m||!m.test(t)))try{var n=i.call(e,t);if(n||g.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(F){}return 0<H(t,E,null,[e]).length},H.contains=function(e,t){return(e.ownerDocument||e)!==E&&C(e),y(e,t)},H.attr=function(e,t){(e.ownerDocument||e)!==E&&C(e);var n=b.attrHandle[t.toLowerCase()],n=n&&z.call(b.attrHandle,t.toLowerCase())?n(e,t,!N):undefined;return n!==undefined?n:g.attributes||!N?e.getAttribute(t):(n=e.getAttributeNode(t))&&n.specified?n.value:null},H.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},H.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!g.detectDuplicates,u=!g.sortStable&&e.slice(0),e.sort($),l){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return u=null,e},o=H.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=o(t);return n},(b=H.selectors={cacheLength:50,createPseudo:q,match:f,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(d,p),e[3]=(e[3]||e[4]||e[5]||"").replace(d,p),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||H.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&H.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return f.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&te.test(n)&&(t=w(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(d,p).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=W[e+" "];return t||(t=new RegExp("(^|"+a+")"+e+"("+a+"|$)"))&&W(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(e){e=H.attr(e,t);return null==e?"!="===n:!n||(e+="","="===n?e===r:"!="===n?e!==r:"^="===n?r&&0===e.indexOf(r):"*="===n?r&&-1<e.indexOf(r):"$="===n?r&&e.slice(-r.length)===r:"~="===n?-1<(" "+e.replace(K," ")+" ").indexOf(r):"|="===n&&(e===r||e.slice(0,r.length+1)===r+"-"))}},CHILD:function(h,e,t,g,m){var y="nth"!==h.slice(0,3),v="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===m?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!=v?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),d=!n&&!x,p=!1;if(c){if(y){for(;l;){for(a=e;a=a[l];)if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[v?c.firstChild:c.lastChild],v&&d){for(p=(s=(r=(i=(o=(a=c)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1])&&r[2],a=s&&c.childNodes[s];a=++s&&a&&a[l]||(p=s=0)||u.pop();)if(1===a.nodeType&&++p&&a===e){i[h]=[S,s,p];break}}else if(!1===(p=d?s=(r=(i=(o=(a=e)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1]:p))for(;(a=++s&&a&&a[l]||(p=s=0)||u.pop())&&((x?a.nodeName.toLowerCase()!==f:1!==a.nodeType)||!++p||(d&&((i=(o=a[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[S,p]),a!==e)););return(p-=m)===g||p%g==0&&0<=p/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||H.error("unsupported pseudo: "+e);return a[k]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?q(function(e,t){for(var n,r=a(e,o),i=r.length;i--;)e[n=j(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:q(function(e){var r=[],i=[],s=R(e.replace(L,"$1"));return s[k]?q(function(e,t,n,r){for(var i,o=s(e,null,r,[]),a=e.length;a--;)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:q(function(t){return function(e){return 0<H(t,e).length}}),contains:q(function(t){return t=t.replace(d,p),function(e){return-1<(e.textContent||e.innerText||o(e)).indexOf(t)}}),lang:q(function(n){return ne.test(n||"")||H.error("unsupported lang: "+n),n=n.replace(d,p).toLowerCase(),function(e){var t;do{if(t=N?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=M.location&&M.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===t},focus:function(e){return e===E.activeElement&&(!E.hasFocus||E.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return!1===e.disabled},disabled:function(e){return!0===e.disabled},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return ie.test(e.nodeName)},input:function(e){return re.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(e=e.getAttribute("type"))||"text"===e.toLowerCase())},first:x(function(){return[0]}),last:x(function(e,t){return[t-1]}),eq:x(function(e,t,n){return[n<0?n+t:n]}),even:x(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:x(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:x(function(e,t,n){for(var r=n<0?n+t:n;0<=--r;)e.push(r);return e}),gt:x(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=function(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=function(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}(e);function pe(){}function _(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function he(a,e,t){var s=e.dir,u=t&&"parentNode"===s,l=B++;return e.first?function(e,t,n){for(;e=e[s];)if(1===e.nodeType||u)return a(e,t,n)}:function(e,t,n){var r,i,o=[S,l];if(n){for(;e=e[s];)if((1===e.nodeType||u)&&a(e,t,n))return!0}else for(;e=e[s];)if(1===e.nodeType||u){if((r=(i=(i=e[k]||(e[k]={}))[e.uniqueID]||(i[e.uniqueID]={}))[s])&&r[0]===S&&r[1]===l)return o[2]=r[2];if((i[s]=o)[2]=a(e,t,n))return!0}}}function ge(i){return 1<i.length?function(e,t,n){for(var r=i.length;r--;)if(!i[r](e,t,n))return!1;return!0}:i[0]}function me(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)!(o=e[s])||n&&!n(o,r,i)||(a.push(o),l&&t.push(s));return a}function ye(p,h,g,m,y,e){return m&&!m[k]&&(m=ye(m)),y&&!y[k]&&(y=ye(y,e)),q(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)H(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!p||!e&&h?c:me(c,s,p,n,r),d=g?y||(e?p:l||m)?[]:t:f;if(g&&g(f,d,n,r),m)for(i=me(d,u),m(i,[],n,r),o=i.length;o--;)(a=i[o])&&(d[u[o]]=!(f[u[o]]=a));if(e){if(y||p){if(y){for(i=[],o=d.length;o--;)(a=d[o])&&i.push(f[o]=a);y(null,d=[],i,r)}for(o=d.length;o--;)(a=d[o])&&-1<(i=y?j(e,a):s[o])&&(e[i]=!(t[i]=a))}}else d=me(d===t?d.splice(l,d.length):d),y?y(null,t,d,r):D.apply(t,d)})}return pe.prototype=b.filters=b.pseudos,b.setFilters=new pe,w=H.tokenize=function(e,t){var n,r,i,o,a,s,u,l=I[e+" "];if(l)return t?0:l.slice(0);for(a=e,s=[],u=b.preFilter;a;){for(o in n&&!(r=Q.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=Z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(L," ")}),a=a.slice(n.length)),b.filter)!(r=f[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?H.error(e):I(e,s).slice(0)},R=H.compile=function(e,t){var n,m,y,v,x,r,i=[],o=[],a=A[e+" "];if(!a){for(n=(t=t||w(e)).length;n--;)((a=function f(e){for(var r,t,n,i=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=he(function(e){return e===r},a,!0),l=he(function(e){return-1<j(r,e)},a,!0),c=[function(e,t,n){return e=!o&&(n||t!==T)||((r=t).nodeType?u:l)(e,t,n),r=null,e}];s<i;s++)if(t=b.relative[e[s].type])c=[he(ge(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[k]){for(n=++s;n<i&&!b.relative[e[n].type];n++);return ye(1<s&&ge(c),1<s&&_(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(L,"$1"),t,s<n&&f(e.slice(s,n)),n<i&&f(e=e.slice(n)),n<i&&_(e))}c.push(t)}return ge(c)}(t[n]))[k]?i:o).push(a);(a=A(e,(m=o,v=0<(y=i).length,x=0<m.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],d=T,p=e||x&&b.find.TAG("*",i),h=S+=null==d?1:Math.random()||.1,g=p.length;for(i&&(T=t===E||t||i);l!==g&&null!=(o=p[l]);l++){if(x&&o){for(a=0,t||o.ownerDocument===E||(C(o),n=!N);s=m[a++];)if(s(o,t||E,n)){r.push(o);break}i&&(S=h)}v&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,v&&l!==u){for(a=0;s=y[a++];)s(c,f,t,n);if(e){if(0<u)for(;l--;)c[l]||f[l]||(f[l]=X.call(r));f=me(f)}D.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&H.uniqueSort(r)}return i&&(S=h,T=d),c},v?q(r):r))).selector=e}return a},P=H.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&w(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&g.getById&&9===t.nodeType&&N&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(d,p),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=f.needsContext.test(e)?0:o.length;i--&&(a=o[i],!b.relative[s=a.type]);)if((u=b.find[s])&&(r=u(a.matches[0].replace(d,p),ae.test(o[0].type)&&de(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&_(o))break;return D.apply(n,r),n}}return(l||R(e,c))(r,t,!N,n,!t||ae.test(e)&&de(t.parentNode)||t),n},g.sortStable=k.split("").sort($).join("")===k,g.detectDuplicates=!!l,C(),g.sortDetached=h(function(e){return 1&e.compareDocumentPosition(E.createElement("div"))}),h(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ce("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),g.attributes&&h(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ce("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),h(function(e){return null==e.getAttribute("disabled")})||ce(Y,function(e,t,n){if(!n)return!0===e[t]?t.toLowerCase():(n=e.getAttributeNode(t))&&n.specified?n.value:null}),H}(T),r=(C.find=e,C.expr=e.selectors,C.expr[":"]=C.expr.pseudos,C.uniqueSort=C.unique=e.uniqueSort,C.text=e.getText,C.isXMLDoc=e.isXML,C.contains=e.contains,function(e,t,n){for(var r=[],i=n!==undefined;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&C(e).is(n))break;r.push(e)}return r}),V=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Y=C.expr.match.needsContext,J=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,G=/^.[^:#\[\.,]*$/;function K(e,n,r){if(C.isFunction(n))return C.grep(e,function(e,t){return!!n.call(e,t,e)!==r});if(n.nodeType)return C.grep(e,function(e){return e===n!==r});if("string"==typeof n){if(G.test(n))return C.filter(n,e,r);n=C.filter(n,e)}return C.grep(e,function(e){return-1<C.inArray(e,n)!==r})}C.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?C.find.matchesSelector(r,e)?[r]:[]:C.find.matches(e,C.grep(t,function(e){return 1===e.nodeType}))},C.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(C(e).filter(function(){for(t=0;t<i;t++)if(C.contains(r[t],this))return!0}));for(t=0;t<i;t++)C.find(e,r[t],n);return(n=this.pushStack(1<i?C.unique(n):n)).selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(K(this,e||[],!1))},not:function(e){return this.pushStack(K(this,e||[],!0))},is:function(e){return!!K(this,"string"==typeof e&&Y.test(e)?C(e):e||[],!1).length}});var Q,Z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ee=((C.fn.init=function(e,t,n){if(!e)return this;if(n=n||Q,"string"!=typeof e)return e.nodeType?(this.context=this[0]=e,this.length=1,this):C.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(C):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),C.makeArray(e,this));if(!(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&3<=e.length?[null,e,null]:Z.exec(e))||!r[1]&&t)return(!t||t.jquery?t||n:this.constructor(t)).find(e);if(r[1]){if(t=t instanceof C?t[0]:t,C.merge(this,C.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:g,!0)),J.test(r[1])&&C.isPlainObject(t))for(var r in t)C.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if((n=g.getElementById(r[2]))&&n.parentNode){if(n.id!==r[2])return Q.find(e);this.length=1,this[0]=n}return this.context=g,this.selector=e,this}).prototype=C.fn,Q=C(g),/^(?:parents|prev(?:Until|All))/),te={children:!0,contents:!0,next:!0,prev:!0};function ne(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}C.fn.extend({has:function(e){var t,n=C(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(C.contains(this,n[t]))return!0})},closest:function(e,t){for(var n,r=0,i=this.length,o=[],a=Y.test(e)||"string"!=typeof e?C(e,t||this.context):0;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&C.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?C.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?C.inArray(this[0],C(e)):C.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(C.uniqueSort(C.merge(this.get(),C(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),C.each({parent:function(e){e=e.parentNode;return e&&11!==e.nodeType?e:null},parents:function(e){return r(e,"parentNode")},parentsUntil:function(e,t,n){return r(e,"parentNode",n)},next:function(e){return ne(e,"nextSibling")},prev:function(e){return ne(e,"previousSibling")},nextAll:function(e){return r(e,"nextSibling")},prevAll:function(e){return r(e,"previousSibling")},nextUntil:function(e,t,n){return r(e,"nextSibling",n)},prevUntil:function(e,t,n){return r(e,"previousSibling",n)},siblings:function(e){return V((e.parentNode||{}).firstChild,e)},children:function(e){return V(e.firstChild)},contents:function(e){return C.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:C.merge([],e.childNodes)}},function(r,i){C.fn[r]=function(e,t){var n=C.map(this,i,e);return(t="Until"!==r.slice(-5)?e:t)&&"string"==typeof t&&(n=C.filter(t,n)),1<this.length&&(te[r]||(n=C.uniqueSort(n)),ee.test(r)&&(n=n.reverse())),this.pushStack(n)}});var re,ie,E=/\S+/g;function oe(){g.addEventListener?(g.removeEventListener("DOMContentLoaded",i),T.removeEventListener("load",i)):(g.detachEvent("onreadystatechange",i),T.detachEvent("onload",i))}function i(){!g.addEventListener&&"load"!==T.event.type&&"complete"!==g.readyState||(oe(),C.ready())}for(ie in C.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},C.each(e.match(E)||[],function(e,t){n[t]=!0}),n):C.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=r.once,o=i=!0;u.length;l=-1)for(t=u.shift();++l<s.length;)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1);r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){C.each(e,function(e,t){C.isFunction(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==C.type(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return C.each(arguments,function(e,t){for(var n;-1<(n=C.inArray(t,s,n));)s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<C.inArray(e,s):0<s.length},empty:function(){return s=s&&[],this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=!0,t||f.disable(),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},C.extend({Deferred:function(e){var o=[["resolve","done",C.Callbacks("once memory"),"resolved"],["reject","fail",C.Callbacks("once memory"),"rejected"],["notify","progress",C.Callbacks("memory")]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},then:function(){var i=arguments;return C.Deferred(function(r){C.each(o,function(e,t){var n=C.isFunction(i[e])&&i[e];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&C.isFunction(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this===a?r.promise():this,n?[e]:arguments)})}),i=null}).promise()},promise:function(e){return null!=e?C.extend(e,a):a}},s={};return a.pipe=a.then,C.each(o,function(e,t){var n=t[2],r=t[3];a[t[1]]=n.add,r&&n.add(function(){i=r},o[1^e][2].disable,o[2][2].lock),s[t[0]]=function(){return s[t[0]+"With"](this===s?a:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var i,t,n,r=0,o=c.call(arguments),a=o.length,s=1!==a||e&&C.isFunction(e.promise)?a:0,u=1===s?e:C.Deferred(),l=function(t,n,r){return function(e){n[t]=this,r[t]=1<arguments.length?c.call(arguments):e,r===i?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(1<a)for(i=new Array(a),t=new Array(a),n=new Array(a);r<a;r++)o[r]&&C.isFunction(o[r].promise)?o[r].promise().progress(l(r,t,i)).done(l(r,n,o)).fail(u.reject):--s;return s||u.resolveWith(n,o),u.promise()}}),C.fn.ready=function(e){return C.ready.promise().done(e),this},C.extend({isReady:!1,readyWait:1,holdReady:function(e){e?C.readyWait++:C.ready(!0)},ready:function(e){(!0===e?--C.readyWait:C.isReady)||(C.isReady=!0)!==e&&0<--C.readyWait||(re.resolveWith(g,[C]),C.fn.triggerHandler&&(C(g).triggerHandler("ready"),C(g).off("ready")))}}),C.ready.promise=function(e){if(!re)if(re=C.Deferred(),"complete"===g.readyState||"loading"!==g.readyState&&!g.documentElement.doScroll)T.setTimeout(C.ready);else if(g.addEventListener)g.addEventListener("DOMContentLoaded",i),T.addEventListener("load",i);else{g.attachEvent("onreadystatechange",i),T.attachEvent("onload",i);var t=!1;try{t=null==T.frameElement&&g.documentElement}catch(n){}t&&t.doScroll&&!function r(){if(!C.isReady){try{t.doScroll("left")}catch(n){return T.setTimeout(r,50)}oe(),C.ready()}}()}return re.promise(e)},C.ready.promise(),C(y))break;y.ownFirst="0"===ie,y.inlineBlockNeedsLayout=!1,C(function(){var e,t,n=g.getElementsByTagName("body")[0];n&&n.style&&(e=g.createElement("div"),(t=g.createElement("div")).style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(t).appendChild(e),"undefined"!=typeof e.style.zoom&&(e.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",y.inlineBlockNeedsLayout=e=3===e.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(t))});e=g.createElement("div");y.deleteExpando=!0;try{delete e.test}catch(yn){y.deleteExpando=!1}var o,v=function(e){var t=C.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||!0!==t&&e.getAttribute("classid")===t)},ae=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,se=/([A-Z])/g;function ue(e,t,n){if(n===undefined&&1===e.nodeType){var r="data-"+t.replace(se,"-$1").toLowerCase();if("string"==typeof(n=e.getAttribute(r))){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:ae.test(n)?C.parseJSON(n):n)}catch(i){}C.data(e,t,n)}else n=undefined}return n}function le(e){for(var t in e)if(("data"!==t||!C.isEmptyObject(e[t]))&&"toJSON"!==t)return;return 1}function ce(e,t,n,r){if(v(e)){var i,o=C.expando,a=e.nodeType,s=a?C.cache:e,u=a?e[o]:e[o]&&o;if(u&&s[u]&&(r||s[u].data)||n!==undefined||"string"!=typeof t)return s[u=u||(a?e[o]=f.pop()||C.guid++:o)]||(s[u]=a?{}:{toJSON:C.noop}),"object"!=typeof t&&"function"!=typeof t||(r?s[u]=C.extend(s[u],t):s[u].data=C.extend(s[u].data,t)),e=s[u],r||(e.data||(e.data={}),e=e.data),n!==undefined&&(e[C.camelCase(t)]=n),"string"==typeof t?null==(i=e[t])&&(i=e[C.camelCase(t)]):i=e,i}}function fe(e,t,n){if(v(e)){var r,i,o=e.nodeType,a=o?C.cache:e,s=o?e[C.expando]:C.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){i=(t=C.isArray(t)?t.concat(C.map(t,C.camelCase)):t in r||(t=C.camelCase(t))in r?[t]:t.split(" ")).length;for(;i--;)delete r[t[i]];if(n?!le(r):!C.isEmptyObject(r))return}(n||(delete a[s].data,le(a[s])))&&(o?C.cleanData([e],!0):y.deleteExpando||a!=a.window?delete a[s]:a[s]=undefined)}}}C.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return!!(e=e.nodeType?C.cache[e[C.expando]]:e[C.expando])&&!le(e)},data:function(e,t,n){return ce(e,t,n)},removeData:function(e,t){return fe(e,t)},_data:function(e,t,n){return ce(e,t,n,!0)},_removeData:function(e,t){return fe(e,t,!0)}}),C.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(e!==undefined)return"object"==typeof e?this.each(function(){C.data(this,e)}):1<arguments.length?this.each(function(){C.data(this,e,t)}):o?ue(o,e,C.data(o,e)):undefined;if(this.length&&(i=C.data(o),1===o.nodeType&&!C._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&0===(r=a[n].name).indexOf("data-")&&ue(o,r=C.camelCase(r.slice(5)),i[r]);C._data(o,"parsedAttrs",!0)}return i},removeData:function(e){return this.each(function(){C.removeData(this,e)})}}),C.extend({queue:function(e,t,n){var r;if(e)return r=C._data(e,t=(t||"fx")+"queue"),n&&(!r||C.isArray(n)?r=C._data(e,t,C.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=C.queue(e,t),r=n.length,i=n.shift(),o=C._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){C.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return C._data(e,n)||C._data(e,n,{empty:C.Callbacks("once memory").add(function(){C._removeData(e,t+"queue"),C._removeData(e,n)})})}}),C.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?C.queue(this[0],t):n===undefined?this:this.each(function(){var e=C.queue(this,t,n);C._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&C.dequeue(this,t)})},dequeue:function(e){return this.each(function(){C.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=C.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};for("string"!=typeof e&&(t=e,e=undefined),e=e||"fx";a--;)(n=C._data(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}}),y.shrinkWrapBlocks=function(){return null!=o?o:(o=!1,(t=g.getElementsByTagName("body")[0])&&t.style?(e=g.createElement("div"),(n=g.createElement("div")).style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",t.appendChild(n).appendChild(e),"undefined"!=typeof e.style.zoom&&(e.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",e.appendChild(g.createElement("div")).style.width="5px",o=3!==e.offsetWidth),t.removeChild(n),o):void 0);var e,t,n};var e=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,de=new RegExp("^(?:([+-])=|)("+e+")([a-z%]*)$","i"),s=["Top","Right","Bottom","Left"],pe=function(e,t){return"none"===C.css(e=t||e,"display")||!C.contains(e.ownerDocument,e)};function he(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return C.css(e,t,"")},u=s(),l=n&&n[3]||(C.cssNumber[t]?"":"px"),c=(C.cssNumber[t]||"px"!==l&&+u)&&de.exec(C.css(e,t));if(c&&c[3]!==l)for(l=l||c[3],n=n||[],c=+u||1;c/=o=o||".5",C.style(e,t,c+l),o!==(o=s()/u)&&1!==o&&--a;);return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var d=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===C.type(n))for(s in i=!0,n)d(e,t,s,n[s],!0,o,a);else if(r!==undefined&&(i=!0,C.isFunction(r)||(a=!0),t=l?a?(t.call(e,r),null):(l=t,function(e,t,n){return l.call(C(e),n)}):t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},ge=/^(?:checkbox|radio)$/i,me=/<([\w:-]+)/,ye=/^$|\/(?:java|ecma)script/i,ve=/^\s+/,xe="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function be(e){var t=xe.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}S=g.createElement("div"),k=g.createDocumentFragment(),q=g.createElement("input"),S.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",y.leadingWhitespace=3===S.firstChild.nodeType,y.tbody=!S.getElementsByTagName("tbody").length,y.htmlSerialize=!!S.getElementsByTagName("link").length,y.html5Clone="<:nav></:nav>"!==g.createElement("nav").cloneNode(!0).outerHTML,q.type="checkbox",q.checked=!0,k.appendChild(q),y.appendChecked=q.checked,S.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!S.cloneNode(!0).lastChild.defaultValue,k.appendChild(S),(q=g.createElement("input")).setAttribute("type","radio"),q.setAttribute("checked","checked"),q.setAttribute("name","t"),S.appendChild(q),y.checkClone=S.cloneNode(!0).cloneNode(!0).lastChild.checked,y.noCloneEvent=!!S.addEventListener,S[C.expando]=1,y.attributes=!S.getAttribute(C.expando);var x={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:y.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};function b(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):undefined;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||C.nodeName(r,t)?o.push(r):C.merge(o,b(r,t));return t===undefined||t&&C.nodeName(e,t)?C.merge([e],o):o}function we(e,t){for(var n,r=0;null!=(n=e[r]);r++)C._data(n,"globalEval",!t||C._data(t[r],"globalEval"))}x.optgroup=x.option,x.tbody=x.tfoot=x.colgroup=x.caption=x.thead,x.th=x.td;var Te=/<|&#?\w+;/,Ce=/<tbody/i;function Ee(e){ge.test(e.type)&&(e.defaultChecked=e.checked)}function Ne(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,p=be(t),h=[],g=0;g<d;g++)if((a=e[g])||0===a)if("object"===C.type(a))C.merge(h,a.nodeType?[a]:a);else if(Te.test(a)){for(u=u||p.appendChild(t.createElement("div")),l=(me.exec(a)||["",""])[1].toLowerCase(),f=x[l]||x._default,u.innerHTML=f[1]+C.htmlPrefilter(a)+f[2],o=f[0];o--;)u=u.lastChild;if(!y.leadingWhitespace&&ve.test(a)&&h.push(t.createTextNode(ve.exec(a)[0])),!y.tbody)for(o=(a="table"!==l||Ce.test(a)?"<table>"!==f[1]||Ce.test(a)?0:u:u.firstChild)&&a.childNodes.length;o--;)C.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(C.merge(h,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=p.lastChild}else h.push(t.createTextNode(a));for(u&&p.removeChild(u),y.appendChecked||C.grep(b(h,"input"),Ee),g=0;a=h[g++];)if(r&&-1<C.inArray(a,r))i&&i.push(a);else if(s=C.contains(a.ownerDocument,a),u=b(p.appendChild(a),"script"),s&&we(u),n)for(o=0;a=u[o++];)ye.test(a.type||"")&&n.push(a);return u=null,p}var ke,Se,Ae=g.createElement("div");for(ke in{submit:!0,change:!0,focusin:!0})(y[ke]=(Se="on"+ke)in T)||(Ae.setAttribute(Se,"t"),y[ke]=!1===Ae.attributes[Se].expando);var De=/^(?:input|select|textarea)$/i,je=/^key/,Le=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,He=/^(?:focusinfocus|focusoutblur)$/,qe=/^([^.]*)(?:\.(.+)|)/;function _e(){return!0}function u(){return!1}function Fe(){try{return g.activeElement}catch(e){}}function Me(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=undefined),t)Me(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=undefined):null==i&&("string"==typeof n?(i=r,r=undefined):(i=r,r=n,n=undefined)),!1===i)i=u;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return C().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=C.guid++)),e.each(function(){C.event.add(this,t,i,r,n)})}C.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h=C._data(e);if(h)for(n.handler&&(n=(s=n).handler,i=s.selector),n.guid||(n.guid=C.guid++),(o=h.events)||(o=h.events={}),(l=h.handle)||((l=h.handle=function(e){return void 0===C||e&&C.event.triggered===e.type?undefined:C.event.dispatch.apply(l.elem,arguments)}).elem=e),a=(t=(t||"").match(E)||[""]).length;a--;)f=p=(d=qe.exec(t[a])||[])[1],d=(d[2]||"").split(".").sort(),f&&(u=C.event.special[f]||{},f=(i?u.delegateType:u.bindType)||f,u=C.event.special[f]||{},p=C.extend({type:f,origType:p,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&C.expr.match.needsContext.test(i),namespace:d.join(".")},s),(c=o[f])||((c=o[f]=[]).delegateCount=0,u.setup&&!1!==u.setup.call(e,r,d,l)||(e.addEventListener?e.addEventListener(f,l,!1):e.attachEvent&&e.attachEvent("on"+f,l))),u.add&&(u.add.call(e,p),p.handler.guid||(p.handler.guid=n.guid)),i?c.splice(c.delegateCount++,0,p):c.push(p),C.event.global[f]=!0)},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h,g,m=C.hasData(e)&&C._data(e);if(m&&(c=m.events)){for(l=(t=(t||"").match(E)||[""]).length;l--;)if(p=g=(s=qe.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),p){for(f=C.event.special[p]||{},d=c[p=(r?f.delegateType:f.bindType)||p]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=d.length;o--;)a=d[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(d.splice(o,1),a.selector&&d.delegateCount--,f.remove&&f.remove.call(e,a));u&&!d.length&&(f.teardown&&!1!==f.teardown.call(e,h,m.handle)||C.removeEvent(e,p,m.handle),delete c[p])}else for(p in c)C.event.remove(e,p+t[l],n,r,!0);C.isEmptyObject(c)&&(delete m.handle,C._removeData(e,"events"))}},trigger:function(e,t,n,r){var i,o,a,s,u,l,c=[n||g],f=m.call(e,"type")?e.type:e,d=m.call(e,"namespace")?e.namespace.split("."):[],p=u=n=n||g;if(3!==n.nodeType&&8!==n.nodeType&&!He.test(f+C.event.triggered)&&(-1<f.indexOf(".")&&(f=(d=f.split(".")).shift(),d.sort()),o=f.indexOf(":")<0&&"on"+f,(e=e[C.expando]?e:new C.Event(f,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=d.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=undefined,e.target||(e.target=n),t=null==t?[e]:C.makeArray(t,[e]),s=C.event.special[f]||{},r||!s.trigger||!1!==s.trigger.apply(n,t))){if(!r&&!s.noBubble&&!C.isWindow(n)){for(a=s.delegateType||f,He.test(a+f)||(p=p.parentNode);p;p=p.parentNode)c.push(p),u=p;u===(n.ownerDocument||g)&&c.push(u.defaultView||u.parentWindow||T)}for(l=0;(p=c[l++])&&!e.isPropagationStopped();)e.type=1<l?a:s.bindType||f,(i=(C._data(p,"events")||{})[e.type]&&C._data(p,"handle"))&&i.apply(p,t),(i=o&&p[o])&&i.apply&&v(p)&&(e.result=i.apply(p,t),!1===e.result&&e.preventDefault());if(e.type=f,!r&&!e.isDefaultPrevented()&&(!s._default||!1===s._default.apply(c.pop(),t))&&v(n)&&o&&n[f]&&!C.isWindow(n)){(u=n[o])&&(n[o]=null),C.event.triggered=f;try{n[f]()}catch(h){}C.event.triggered=undefined,u&&(n[o]=u)}return e.result}},dispatch:function(e){e=C.event.fix(e);var t,n,r,i,o,a=c.call(arguments),s=(C._data(this,"events")||{})[e.type]||[],u=C.event.special[e.type]||{};if((a[0]=e).delegateTarget=this,!u.preDispatch||!1!==u.preDispatch.call(this,e)){for(o=C.event.handlers.call(this,e,s),t=0;(r=o[t++])&&!e.isPropagationStopped();)for(e.currentTarget=r.elem,n=0;(i=r.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(i.namespace)||(e.handleObj=i,e.data=i.data,(i=((C.event.special[i.origType]||{}).handle||i.handler).apply(r.elem,a))!==undefined&&!1===(e.result=i)&&(e.preventDefault(),e.stopPropagation()));return u.postDispatch&&u.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(!0!==u.disabled||"click"!==e.type)){for(r=[],n=0;n<s;n++)r[i=(o=t[n]).selector+" "]===undefined&&(r[i]=o.needsContext?-1<C(i,this).index(u):C.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s<t.length&&a.push({elem:this,handlers:t.slice(s)}),a},fix:function(e){if(e[C.expando])return e;var t,n,r,i=e.type,o=e,a=this.fixHooks[i];for(a||(this.fixHooks[i]=a=Le.test(i)?this.mouseHooks:je.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new C.Event(o),t=r.length;t--;)e[n=r[t]]=o[n];return e.target||(e.target=o.srcElement||g),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,a.filter?a.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i=t.button,o=t.fromElement;return null==e.pageX&&null!=t.clientX&&(r=(n=e.target.ownerDocument||g).documentElement,n=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||n&&n.scrollLeft||0)-(r&&r.clientLeft||n&&n.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||n&&n.scrollTop||0)-(r&&r.clientTop||n&&n.clientTop||0)),!e.relatedTarget&&o&&(e.relatedTarget=o===e.target?t.toElement:o),e.which||i===undefined||(e.which=1&i?1:2&i?3:4&i?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==Fe()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){if(this===Fe()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if(C.nodeName(this,"input")&&"checkbox"===this.type&&this.click)return this.click(),!1},_default:function(e){return C.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n){e=C.extend(new C.Event,n,{type:e,isSimulated:!0});C.event.trigger(e,null,t),e.isDefaultPrevented()&&n.preventDefault()}},C.removeEvent=g.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)}:function(e,t,n){t="on"+t;e.detachEvent&&("undefined"==typeof e[t]&&(e[t]=null),e.detachEvent(t,n))},C.Event=function(e,t){if(!(this instanceof C.Event))return new C.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.defaultPrevented===undefined&&!1===e.returnValue?_e:u):this.type=e,t&&C.extend(this,t),this.timeStamp=e&&e.timeStamp||C.now(),this[C.expando]=!0},C.Event.prototype={constructor:C.Event,isDefaultPrevented:u,isPropagationStopped:u,isImmediatePropagationStopped:u,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=_e,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=_e,e&&!this.isSimulated&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=_e,e&&e.stopImmediatePropagation&&e.stopImmediatePropagation(),this.stopPropagation()}},C.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){C.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||C.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),y.submit||(C.event.special.submit={setup:function(){if(C.nodeName(this,"form"))return!1;C.event.add(this,"click._submit keypress._submit",function(e){e=e.target,e=C.nodeName(e,"input")||C.nodeName(e,"button")?C.prop(e,"form"):undefined;e&&!C._data(e,"submit")&&(C.event.add(e,"submit._submit",function(e){e._submitBubble=!0}),C._data(e,"submit",!0))})},postDispatch:function(e){e._submitBubble&&(delete e._submitBubble,this.parentNode&&!e.isTrigger&&C.event.simulate("submit",this.parentNode,e))},teardown:function(){if(C.nodeName(this,"form"))return!1;C.event.remove(this,"._submit")}}),y.change||(C.event.special.change={setup:function(){if(De.test(this.nodeName))return"checkbox"!==this.type&&"radio"!==this.type||(C.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._justChanged=!0)}),C.event.add(this,"click._change",function(e){this._justChanged&&!e.isTrigger&&(this._justChanged=!1),C.event.simulate("change",this,e)})),!1;C.event.add(this,"beforeactivate._change",function(e){e=e.target;De.test(e.nodeName)&&!C._data(e,"change")&&(C.event.add(e,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||C.event.simulate("change",this.parentNode,e)}),C._data(e,"change",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||"radio"!==t.type&&"checkbox"!==t.type)return e.handleObj.handler.apply(this,arguments)},teardown:function(){return C.event.remove(this,"._change"),!De.test(this.nodeName)}}),y.focusin||C.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){C.event.simulate(r,e.target,C.event.fix(e))};C.event.special[r]={setup:function(){var e=this.ownerDocument||this,t=C._data(e,r);t||e.addEventListener(n,i,!0),C._data(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this,t=C._data(e,r)-1;t?C._data(e,r,t):(e.removeEventListener(n,i,!0),C._removeData(e,r))}}}),C.fn.extend({on:function(e,t,n,r){return Me(this,e,t,n,r)},one:function(e,t,n,r){return Me(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,C(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"!=typeof e)return!1!==t&&"function"!=typeof t||(n=t,t=undefined),!1===n&&(n=u),this.each(function(){C.event.remove(this,e,n,t)});for(i in e)this.off(i,t,e[i]);return this},trigger:function(e,t){return this.each(function(){C.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return C.event.trigger(e,t,n,!0)}});var Oe=/ jQuery\d+="(?:null|\d+)"/g,Re=new RegExp("<(?:"+xe+")[\\s/>]","i"),Pe=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,Be=/<script|<style|<link/i,We=/checked\s*(?:[^=]|=\s*.checked.)/i,Ie=/^true\/(.*)/,$e=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ze=be(g).appendChild(g.createElement("div"));function Xe(e,t){return C.nodeName(e,"table")&&C.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ue(e){return e.type=(null!==C.find.attr(e,"type"))+"/"+e.type,e}function Ve(e){var t=Ie.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Ye(e,t){if(1===t.nodeType&&C.hasData(e)){var n,r,i,e=C._data(e),o=C._data(t,e),a=e.events;if(a)for(n in delete o.handle,o.events={},a)for(r=0,i=a[n].length;r<i;r++)C.event.add(t,n,a[n][r]);o.data&&(o.data=C.extend({},o.data))}}function w(n,r,i,o){r=O.apply([],r);var e,t,a,s,u,l,c=0,f=n.length,d=f-1,p=r[0],h=C.isFunction(p);if(h||1<f&&"string"==typeof p&&!y.checkClone&&We.test(p))return n.each(function(e){var t=n.eq(e);h&&(r[0]=p.call(this,e,t.html())),w(t,r,i,o)});if(f&&(e=(l=Ne(r,n[0].ownerDocument,!1,n,o)).firstChild,1===l.childNodes.length&&(l=e),e||o)){for(a=(s=C.map(b(l,"script"),Ue)).length;c<f;c++)t=l,c!==d&&(t=C.clone(t,!0,!0),a&&C.merge(s,b(t,"script"))),i.call(n[c],t,c);if(a)for(u=s[s.length-1].ownerDocument,C.map(s,Ve),c=0;c<a;c++)t=s[c],ye.test(t.type||"")&&!C._data(t,"globalEval")&&C.contains(u,t)&&(t.src?C._evalUrl&&C._evalUrl(t.src):C.globalEval((t.text||t.textContent||t.innerHTML||"").replace($e,"")));l=e=null}return n}function Je(e,t,n){for(var r,i=t?C.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||C.cleanData(b(r)),r.parentNode&&(n&&C.contains(r.ownerDocument,r)&&we(b(r,"script")),r.parentNode.removeChild(r));return e}C.extend({htmlPrefilter:function(e){return e.replace(Pe,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s,u=C.contains(e.ownerDocument,e);if(y.html5Clone||C.isXMLDoc(e)||!Re.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(ze.innerHTML=e.outerHTML,ze.removeChild(o=ze.firstChild)),!(y.noCloneEvent&&y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||C.isXMLDoc(e)))for(r=b(o),s=b(e),a=0;null!=(i=s[a]);++a)if(r[a]){f=c=l=p=d=void 0;var l,c,f,d=i,p=r[a];if(1===p.nodeType){if(l=p.nodeName.toLowerCase(),!y.noCloneEvent&&p[C.expando]){for(c in(f=C._data(p)).events)C.removeEvent(p,c,f.handle);p.removeAttribute(C.expando)}"script"===l&&p.text!==d.text?(Ue(p).text=d.text,Ve(p)):"object"===l?(p.parentNode&&(p.outerHTML=d.outerHTML),y.html5Clone&&d.innerHTML&&!C.trim(p.innerHTML)&&(p.innerHTML=d.innerHTML)):"input"===l&&ge.test(d.type)?(p.defaultChecked=p.checked=d.checked,p.value!==d.value&&(p.value=d.value)):"option"===l?p.defaultSelected=p.selected=d.defaultSelected:"input"!==l&&"textarea"!==l||(p.defaultValue=d.defaultValue)}}if(t)if(n)for(s=s||b(e),r=r||b(o),a=0;null!=(i=s[a]);a++)Ye(i,r[a]);else Ye(e,o);return 0<(r=b(o,"script")).length&&we(r,!u&&b(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=C.expando,u=C.cache,l=y.attributes,c=C.event.special;null!=(n=e[a]);a++)if((t||v(n))&&(o=(i=n[s])&&u[i])){if(o.events)for(r in o.events)c[r]?C.event.remove(n,r):C.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=undefined:n.removeAttribute(s),f.push(i))}}}),C.fn.extend({domManip:w,detach:function(e){return Je(this,e,!0)},remove:function(e){return Je(this,e)},text:function(e){return d(this,function(e){return e===undefined?C.text(this):this.empty().append((this[0]&&this[0].ownerDocument||g).createTextNode(e))},null,e,arguments.length)},append:function(){return w(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Xe(this,e).appendChild(e)})},prepend:function(){return w(this,arguments,function(e){var t;1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(t=Xe(this,e)).insertBefore(e,t.firstChild)})},before:function(){return w(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return w(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&C.cleanData(b(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&C.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return C.clone(this,e,t)})},html:function(e){return d(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined)return 1===t.nodeType?t.innerHTML.replace(Oe,""):undefined;if("string"==typeof e&&!Be.test(e)&&(y.htmlSerialize||!Re.test(e))&&(y.leadingWhitespace||!ve.test(e))&&!x[(me.exec(e)||["",""])[1].toLowerCase()]){e=C.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(C.cleanData(b(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return w(this,arguments,function(e){var t=this.parentNode;C.inArray(this,n)<0&&(C.cleanData(b(this)),t&&t.replaceChild(e,this))},n)}}),C.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){C.fn[e]=function(e){for(var t,n=0,r=[],i=C(e),o=i.length-1;n<=o;n++)t=n===o?this:this.clone(!0),C(i[n])[a](t),R.apply(r,t.get());return this.pushStack(r)}});var Ge,Ke={HTML:"block",BODY:"block"};function Qe(e,t){e=C(t.createElement(e)).appendTo(t.body),t=C.css(e[0],"display");return e.detach(),t}function Ze(e){var t=g,n=Ke[e];return n||("none"!==(n=Qe(e,t))&&n||((t=((Ge=(Ge||C("<iframe frameborder='0' width='0' height='0'/>")).appendTo(t.documentElement))[0].contentWindow||Ge[0].contentDocument).document).write(),t.close(),n=Qe(e,t),Ge.detach()),Ke[e]=n),n}var n,et,tt,nt,rt,it,ot,a,at=/^margin/,st=new RegExp("^("+e+")(?!px)[a-z%]+$","i"),ut=function(e,t,n,r){var i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.apply(e,r||[]),t)e.style[i]=o[i];return r},lt=g.documentElement;function t(){var e,t=g.documentElement;t.appendChild(ot),a.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",n=tt=it=!1,et=rt=!0,T.getComputedStyle&&(e=T.getComputedStyle(a),n="1%"!==(e||{}).top,it="2px"===(e||{}).marginLeft,tt="4px"===(e||{width:"4px"}).width,a.style.marginRight="50%",et="4px"===(e||{marginRight:"4px"}).marginRight,(e=a.appendChild(g.createElement("div"))).style.cssText=a.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",e.style.marginRight=e.style.width="0",a.style.width="1px",rt=!parseFloat((T.getComputedStyle(e)||{}).marginRight),a.removeChild(e)),a.style.display="none",(nt=0===a.getClientRects().length)&&(a.style.display="",a.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a.childNodes[0].style.borderCollapse="separate",(e=a.getElementsByTagName("td"))[0].style.cssText="margin:0;border:0;padding:0;display:none",(nt=0===e[0].offsetHeight)&&(e[0].style.display="",e[1].style.display="none",nt=0===e[0].offsetHeight)),t.removeChild(ot)}ot=g.createElement("div"),(a=g.createElement("div")).style&&(a.style.cssText="float:left;opacity:.5",y.opacity="0.5"===a.style.opacity,y.cssFloat=!!a.style.cssFloat,a.style.backgroundClip="content-box",a.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===a.style.backgroundClip,(ot=g.createElement("div")).style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",a.innerHTML="",ot.appendChild(a),y.boxSizing=""===a.style.boxSizing||""===a.style.MozBoxSizing||""===a.style.WebkitBoxSizing,C.extend(y,{reliableHiddenOffsets:function(){return null==n&&t(),nt},boxSizingReliable:function(){return null==n&&t(),tt},pixelMarginRight:function(){return null==n&&t(),et},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),rt},reliableMarginLeft:function(){return null==n&&t(),it}}));var l,p,ct=/^(top|right|bottom|left)$/;function ft(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}T.getComputedStyle?(l=function(e){var t=e.ownerDocument.defaultView;return(t=t&&t.opener?t:T).getComputedStyle(e)},p=function(e,t,n){var r,i,o=e.style;return""!==(i=(n=n||l(e))?n.getPropertyValue(t)||n[t]:undefined)&&i!==undefined||C.contains(e.ownerDocument,e)||(i=C.style(e,t)),n&&!y.pixelMarginRight()&&st.test(i)&&at.test(t)&&(e=o.width,t=o.minWidth,r=o.maxWidth,o.minWidth=o.maxWidth=o.width=i,i=n.width,o.width=e,o.minWidth=t,o.maxWidth=r),i===undefined?i:i+""}):lt.currentStyle&&(l=function(e){return e.currentStyle},p=function(e,t,n){var r,i,o,a=e.style;return null==(n=(n=n||l(e))?n[t]:undefined)&&a&&a[t]&&(n=a[t]),st.test(n)&&!ct.test(t)&&(r=a.left,(o=(i=e.runtimeStyle)&&i.left)&&(i.left=e.currentStyle.left),a.left="fontSize"===t?"1em":n,n=a.pixelLeft+"px",a.left=r,o&&(i.left=o)),n===undefined?n:n+""||"auto"});var dt=/alpha\([^)]*\)/i,pt=/opacity\s*=\s*([^)]*)/i,ht=/^(none|table(?!-c[ea]).+)/,gt=new RegExp("^("+e+")(.*)$","i"),mt={position:"absolute",visibility:"hidden",display:"block"},yt={letterSpacing:"0",fontWeight:"400"},vt=["Webkit","O","Moz","ms"],xt=g.createElement("div").style;function bt(e){if(e in xt)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=vt.length;n--;)if((e=vt[n]+t)in xt)return e}function wt(e,t){for(var n,r,i,o=[],a=0,s=e.length;a<s;a++)(r=e[a]).style&&(o[a]=C._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&pe(r)&&(o[a]=C._data(r,"olddisplay",Ze(r.nodeName)))):(i=pe(r),(n&&"none"!==n||!i)&&C._data(r,"olddisplay",i?n:C.css(r,"display"))));for(a=0;a<s;a++)!(r=e[a]).style||t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none");return e}function Tt(e,t,n){var r=gt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ct(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;o<4;o+=2)"margin"===n&&(a+=C.css(e,n+s[o],!0,i)),r?("content"===n&&(a-=C.css(e,"padding"+s[o],!0,i)),"margin"!==n&&(a-=C.css(e,"border"+s[o]+"Width",!0,i))):(a+=C.css(e,"padding"+s[o],!0,i),"padding"!==n&&(a+=C.css(e,"border"+s[o]+"Width",!0,i)));return a}function Et(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=l(e),a=y.boxSizing&&"border-box"===C.css(e,"boxSizing",!1,o);if(i<=0||null==i){if(((i=p(e,t,o))<0||null==i)&&(i=e.style[t]),st.test(i))return i;r=a&&(y.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+Ct(e,t,n||(a?"border":"content"),r,o)+"px"}function h(e,t,n,r,i){return new h.prototype.init(e,t,n,r,i)}C.extend({cssHooks:{opacity:{get:function(e,t){if(t)return""===(t=p(e,"opacity"))?"1":t}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":y.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=C.camelCase(t),u=e.style;if(t=C.cssProps[s]||(C.cssProps[s]=bt(s)||s),a=C.cssHooks[t]||C.cssHooks[s],n===undefined)return a&&"get"in a&&(i=a.get(e,!1,r))!==undefined?i:u[t];if("string"===(o=typeof n)&&(i=de.exec(n))&&i[1]&&(n=he(e,t,i),o="number"),null!=n&&n==n&&("number"===o&&(n+=i&&i[3]||(C.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&(n=a.set(e,n,r))===undefined)))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o=C.camelCase(t);return t=C.cssProps[o]||(C.cssProps[o]=bt(o)||o),"normal"===(i=(i=(o=C.cssHooks[t]||C.cssHooks[o])&&"get"in o?o.get(e,!0,n):i)===undefined?p(e,t,r):i)&&t in yt&&(i=yt[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),C.each(["height","width"],function(e,i){C.cssHooks[i]={get:function(e,t,n){if(t)return ht.test(C.css(e,"display"))&&0===e.offsetWidth?ut(e,mt,function(){return Et(e,i,n)}):Et(e,i,n)},set:function(e,t,n){var r=n&&l(e);return Tt(0,t,n?Ct(e,i,n,y.boxSizing&&"border-box"===C.css(e,"boxSizing",!1,r),r):0)}}}),y.opacity||(C.cssHooks.opacity={get:function(e,t){return pt.test((t&&e.currentStyle?e.currentStyle:e.style).filter||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,e=e.currentStyle,r=C.isNumeric(t)?"alpha(opacity="+100*t+")":"",i=e&&e.filter||n.filter||"";((n.zoom=1)<=t||""===t)&&""===C.trim(i.replace(dt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||e&&!e.filter)||(n.filter=dt.test(i)?i.replace(dt,r):i+" "+r)}}),C.cssHooks.marginRight=ft(y.reliableMarginRight,function(e,t){if(t)return ut(e,{display:"inline-block"},p,[e,"marginRight"])}),C.cssHooks.marginLeft=ft(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(p(e,"marginLeft"))||(C.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-ut(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),C.each({margin:"",padding:"",border:"Width"},function(i,o){C.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+s[t]+o]=r[t]||r[t-2]||r[0];return n}},at.test(i)||(C.cssHooks[i+o].set=Tt)}),C.fn.extend({css:function(e,t){return d(this,function(e,t,n){var r,i,o={},a=0;if(C.isArray(t)){for(r=l(e),i=t.length;a<i;a++)o[t[a]]=C.css(e,t[a],!1,r);return o}return n!==undefined?C.style(e,t,n):C.css(e,t)},e,t,1<arguments.length)},show:function(){return wt(this,!0)},hide:function(){return wt(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){pe(this)?C(this).show():C(this).hide()})}}),((C.Tween=h).prototype={constructor:h,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||C.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(C.cssNumber[n]?"":"px")},cur:function(){var e=h.propHooks[this.prop];return(e&&e.get?e:h.propHooks._default).get(this)},run:function(e){var t,n=h.propHooks[this.prop];return this.options.duration?this.pos=t=C.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),(n&&n.set?n:h.propHooks._default).set(this),this}}).init.prototype=h.prototype,(h.propHooks={_default:{get:function(e){return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(e=C.css(e.elem,e.prop,""))&&"auto"!==e?e:0},set:function(e){C.fx.step[e.prop]?C.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[C.cssProps[e.prop]]&&!C.cssHooks[e.prop]?e.elem[e.prop]=e.now:C.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=h.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},C.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},C.fx=h.prototype.init,C.fx.step={};var N,Nt,k,S,kt=/^(?:toggle|show|hide)$/,St=/queueHooks$/;function At(){return T.setTimeout(function(){N=undefined}),N=C.now()}function Dt(e,t){var n,r={height:e},i=0;for(t=t?1:0;i<4;i+=2-t)r["margin"+(n=s[i])]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function jt(e,t,n){for(var r,i=(A.tweeners[t]||[]).concat(A.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function A(i,e,t){var n,o,r,a,s,u,l,c=0,f=A.prefilters.length,d=C.Deferred().always(function(){delete p.elem}),p=function(){if(o)return!1;for(var e=N||At(),e=Math.max(0,h.startTime+h.duration-e),t=1-(e/h.duration||0),n=0,r=h.tweens.length;n<r;n++)h.tweens[n].run(t);return d.notifyWith(i,[h,t,e]),t<1&&r?e:(d.resolveWith(i,[h]),!1)},h=d.promise({elem:i,props:C.extend({},e),opts:C.extend(!0,{specialEasing:{},easing:C.easing._default},t),originalProperties:e,originalOptions:t,startTime:N||At(),duration:t.duration,tweens:[],createTween:function(e,t){t=C.Tween(i,h.opts,e,t,h.opts.specialEasing[e]||h.opts.easing);return h.tweens.push(t),t},stop:function(e){var t=0,n=e?h.tweens.length:0;if(o)return this;for(o=!0;t<n;t++)h.tweens[t].run(1);return e?(d.notifyWith(i,[h,1,0]),d.resolveWith(i,[h,e])):d.rejectWith(i,[h,e]),this}}),g=h.props,m=g,y=h.opts.specialEasing;for(r in m)if(s=y[a=C.camelCase(r)],u=m[r],C.isArray(u)&&(s=u[1],u=m[r]=u[0]),r!==a&&(m[a]=u,delete m[r]),(l=C.cssHooks[a])&&"expand"in l)for(r in u=l.expand(u),delete m[a],u)r in m||(m[r]=u[r],y[r]=s);else y[a]=s;for(;c<f;c++)if(n=A.prefilters[c].call(h,i,g,h.opts))return C.isFunction(n.stop)&&(C._queueHooks(h.elem,h.opts.queue).stop=C.proxy(n.stop,n)),n;return C.map(g,jt,h),C.isFunction(h.opts.start)&&h.opts.start.call(i,h),C.fx.timer(C.extend(p,{elem:i,anim:h,queue:h.opts.queue})),h.progress(h.opts.progress).done(h.opts.done,h.opts.complete).fail(h.opts.fail).always(h.opts.always)}C.Animation=C.extend(A,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return he(n.elem,e,de.exec(t),n),n}]},tweener:function(e,t){for(var n,r=0,i=(e=C.isFunction(e)?(t=e,["*"]):e.match(E)).length;r<i;r++)n=e[r],A.tweeners[n]=A.tweeners[n]||[],A.tweeners[n].unshift(t)},prefilters:[function(t,e,n){var r,i,o,a,s,u,l,c=this,f={},d=t.style,p=t.nodeType&&pe(t),h=C._data(t,"fxshow");for(r in n.queue||(null==(s=C._queueHooks(t,"fx")).unqueued&&(s.unqueued=0,u=s.empty.fire,s.empty.fire=function(){s.unqueued||u()}),s.unqueued++,c.always(function(){c.always(function(){s.unqueued--,C.queue(t,"fx").length||s.empty.fire()})})),1===t.nodeType&&("height"in e||"width"in e)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===("none"===(l=C.css(t,"display"))?C._data(t,"olddisplay")||Ze(t.nodeName):l)&&"none"===C.css(t,"float")&&(y.inlineBlockNeedsLayout&&"inline"!==Ze(t.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",y.shrinkWrapBlocks()||c.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]})),e)if(i=e[r],kt.exec(i)){if(delete e[r],o=o||"toggle"===i,i===(p?"hide":"show")){if("show"!==i||!h||h[r]===undefined)continue;p=!0}f[r]=h&&h[r]||C.style(t,r)}else l=undefined;if(C.isEmptyObject(f))"inline"===("none"===l?Ze(t.nodeName):l)&&(d.display=l);else for(r in h?"hidden"in h&&(p=h.hidden):h=C._data(t,"fxshow",{}),o&&(h.hidden=!p),p?C(t).show():c.done(function(){C(t).hide()}),c.done(function(){for(var e in C._removeData(t,"fxshow"),f)C.style(t,e,f[e])}),f)a=jt(p?h[r]:0,r,c),r in h||(h[r]=a.start,p&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}],prefilter:function(e,t){t?A.prefilters.unshift(e):A.prefilters.push(e)}}),C.speed=function(e,t,n){var r=e&&"object"==typeof e?C.extend({},e):{complete:n||!n&&t||C.isFunction(e)&&e,duration:e,easing:n&&t||t&&!C.isFunction(t)&&t};return r.duration=C.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in C.fx.speeds?C.fx.speeds[r.duration]:C.fx.speeds._default,null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){C.isFunction(r.old)&&r.old.call(this),r.queue&&C.dequeue(this,r.queue)},r},C.fn.extend({fadeTo:function(e,t,n,r){return this.filter(pe).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=C.isEmptyObject(t),o=C.speed(e,n,r),e=function(){var e=A(this,C.extend({},t),o);(i||C._data(this,"finish"))&&e.stop(!0)};return e.finish=e,i||!1===o.queue?this.each(e):this.queue(o.queue,e)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=undefined),e&&!1!==i&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=C.timers,r=C._data(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&St.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||C.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=C._data(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=C.timers,o=n?n.length:0;for(t.finish=!0,C.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),C.each(["toggle","show","hide"],function(e,r){var i=C.fn[r];C.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(Dt(r,!0),e,t,n)}}),C.each({slideDown:Dt("show"),slideUp:Dt("hide"),slideToggle:Dt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){C.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),C.timers=[],C.fx.tick=function(){var e,t=C.timers,n=0;for(N=C.now();n<t.length;n++)(e=t[n])()||t[n]!==e||t.splice(n--,1);t.length||C.fx.stop(),N=undefined},C.fx.timer=function(e){C.timers.push(e),e()?C.fx.start():C.timers.pop()},C.fx.interval=13,C.fx.start=function(){Nt=Nt||T.setInterval(C.fx.tick,C.fx.interval)},C.fx.stop=function(){T.clearInterval(Nt),Nt=null},C.fx.speeds={slow:600,fast:200,_default:400},C.fn.delay=function(r,e){return r=C.fx&&C.fx.speeds[r]||r,this.queue(e=e||"fx",function(e,t){var n=T.setTimeout(e,r);t.stop=function(){T.clearTimeout(n)}})},k=g.createElement("input"),q=g.createElement("div"),S=g.createElement("select"),e=S.appendChild(g.createElement("option")),(q=g.createElement("div")).setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",F=q.getElementsByTagName("a")[0],k.setAttribute("type","checkbox"),q.appendChild(k),(F=q.getElementsByTagName("a")[0]).style.cssText="top:1px",y.getSetAttribute="t"!==q.className,y.style=/top/.test(F.getAttribute("style")),y.hrefNormalized="/a"===F.getAttribute("href"),y.checkOn=!!k.value,y.optSelected=e.selected,y.enctype=!!g.createElement("form").enctype,S.disabled=!0,y.optDisabled=!e.disabled,(k=g.createElement("input")).setAttribute("value",""),y.input=""===k.getAttribute("value"),k.value="t",k.setAttribute("type","radio"),y.radioValue="t"===k.value;var Lt=/\r/g,Ht=/[\x20\t\r\n\f]+/g;C.fn.extend({val:function(t){var n,e,r,i=this[0];return arguments.length?(r=C.isFunction(t),this.each(function(e){1===this.nodeType&&(null==(e=r?t.call(this,e,C(this).val()):t)?e="":"number"==typeof e?e+="":C.isArray(e)&&(e=C.map(e,function(e){return null==e?"":e+""})),(n=C.valHooks[this.type]||C.valHooks[this.nodeName.toLowerCase()])&&"set"in n&&n.set(this,e,"value")!==undefined||(this.value=e))})):i?(n=C.valHooks[i.type]||C.valHooks[i.nodeName.toLowerCase()])&&"get"in n&&(e=n.get(i,"value"))!==undefined?e:"string"==typeof(e=i.value)?e.replace(Lt,""):null==e?"":e:void 0}}),C.extend({valHooks:{option:{get:function(e){var t=C.find.attr(e,"value");return null!=t?t:C.trim(C.text(e)).replace(Ht," ")}},select:{get:function(e){for(var t,n=e.options,r=e.selectedIndex,i="select-one"===e.type||r<0,o=i?null:[],a=i?r+1:n.length,s=r<0?a:i?r:0;s<a;s++)if(((t=n[s]).selected||s===r)&&(y.optDisabled?!t.disabled:null===t.getAttribute("disabled"))&&(!t.parentNode.disabled||!C.nodeName(t.parentNode,"optgroup"))){if(t=C(t).val(),i)return t;o.push(t)}return o},set:function(e,t){for(var n,r,i=e.options,o=C.makeArray(t),a=i.length;a--;)if(r=i[a],-1<C.inArray(C.valHooks.option.get(r),o))try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),C.each(["radio","checkbox"],function(){C.valHooks[this]={set:function(e,t){if(C.isArray(t))return e.checked=-1<C.inArray(C(e).val(),t)}},y.checkOn||(C.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var D,qt,j=C.expr.attrHandle,_t=/^(?:checked|selected)$/i,L=y.getSetAttribute,Ft=y.input,Mt=(C.fn.extend({attr:function(e,t){return d(this,C.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){C.removeAttr(this,e)})}}),C.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?C.prop(e,t,n):(1===o&&C.isXMLDoc(e)||(t=t.toLowerCase(),i=C.attrHooks[t]||(C.expr.match.bool.test(t)?qt:D)),n!==undefined?null===n?void C.removeAttr(e,t):i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:(e.setAttribute(t,n+""),n):!(i&&"get"in i&&null!==(r=i.get(e,t)))&&null==(r=C.find.attr(e,t))?undefined:r)},attrHooks:{type:{set:function(e,t){var n;if(!y.radioValue&&"radio"===t&&C.nodeName(e,"input"))return n=e.value,e.setAttribute("type",t),n&&(e.value=n),t}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(E);if(o&&1===e.nodeType)for(;n=o[i++];)r=C.propFix[n]||n,C.expr.match.bool.test(n)?Ft&&L||!_t.test(n)?e[r]=!1:e[C.camelCase("default-"+n)]=e[r]=!1:C.attr(e,n,""),e.removeAttribute(L?n:r)}}),qt={set:function(e,t,n){return!1===t?C.removeAttr(e,n):Ft&&L||!_t.test(n)?e.setAttribute(!L&&C.propFix[n]||n,n):e[C.camelCase("default-"+n)]=e[n]=!0,n}},C.each(C.expr.match.bool.source.match(/\w+/g),function(e,t){var o=j[t]||C.find.attr;Ft&&L||!_t.test(t)?j[t]=function(e,t,n){var r,i;return n||(i=j[t],j[t]=r,r=null!=o(e,t,n)?t.toLowerCase():null,j[t]=i),r}:j[t]=function(e,t,n){if(!n)return e[C.camelCase("default-"+t)]?t.toLowerCase():null}}),Ft&&L||(C.attrHooks.value={set:function(e,t,n){if(!C.nodeName(e,"input"))return D&&D.set(e,t,n);e.defaultValue=t}}),L||(D={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},j.id=j.name=j.coords=function(e,t,n){if(!n)return(n=e.getAttributeNode(t))&&""!==n.value?n.value:null},C.valHooks.button={get:function(e,t){t=e.getAttributeNode(t);if(t&&t.specified)return t.value},set:D.set},C.attrHooks.contenteditable={set:function(e,t,n){D.set(e,""!==t&&t,n)}},C.each(["width","height"],function(e,n){C.attrHooks[n]={set:function(e,t){if(""===t)return e.setAttribute(n,"auto"),t}}})),y.style||(C.attrHooks.style={get:function(e){return e.style.cssText||undefined},set:function(e,t){return e.style.cssText=t+""}}),/^(?:input|select|textarea|button|object)$/i),Ot=/^(?:a|area)$/i,Rt=(C.fn.extend({prop:function(e,t){return d(this,C.prop,e,t,1<arguments.length)},removeProp:function(t){return t=C.propFix[t]||t,this.each(function(){try{this[t]=undefined,delete this[t]}catch(e){}})}}),C.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&C.isXMLDoc(e)||(t=C.propFix[t]||t,i=C.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=C.find.attr(e,"tabindex");return t?parseInt(t,10):Mt.test(e.nodeName)||Ot.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.hrefNormalized||C.each(["href","src"],function(e,t){C.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),y.optSelected||(C.propHooks.selected={get:function(e){e=e.parentNode;return e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex),null},set:function(e){e=e.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),C.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){C.propFix[this.toLowerCase()]=this}),y.enctype||(C.propFix.enctype="encoding"),/[\t\r\n\f]/g);function H(e){return C.attr(e,"class")||""}C.fn.extend({addClass:function(t){var e,n,r,i,o,a,s=0;if(C.isFunction(t))return this.each(function(e){C(this).addClass(t.call(this,e,H(this)))});if("string"==typeof t&&t)for(e=t.match(E)||[];n=this[s++];)if(a=H(n),r=1===n.nodeType&&(" "+a+" ").replace(Rt," ")){for(o=0;i=e[o++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a!==(a=C.trim(r))&&C.attr(n,"class",a)}return this},removeClass:function(t){var e,n,r,i,o,a,s=0;if(C.isFunction(t))return this.each(function(e){C(this).removeClass(t.call(this,e,H(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof t&&t)for(e=t.match(E)||[];n=this[s++];)if(a=H(n),r=1===n.nodeType&&(" "+a+" ").replace(Rt," ")){for(o=0;i=e[o++];)for(;-1<r.indexOf(" "+i+" ");)r=r.replace(" "+i+" "," ");a!==(a=C.trim(r))&&C.attr(n,"class",a)}return this},toggleClass:function(i,t){var o=typeof i;return"boolean"==typeof t&&"string"==o?t?this.addClass(i):this.removeClass(i):C.isFunction(i)?this.each(function(e){C(this).toggleClass(i.call(this,e,H(this),t),t)}):this.each(function(){var e,t,n,r;if("string"==o)for(t=0,n=C(this),r=i.match(E)||[];e=r[t++];)n.hasClass(e)?n.removeClass(e):n.addClass(e);else i!==undefined&&"boolean"!=o||((e=H(this))&&C._data(this,"__className__",e),C.attr(this,"class",!e&&!1!==i&&C._data(this,"__className__")||""))})},hasClass:function(e){for(var t,n=0,r=" "+e+" ";t=this[n++];)if(1===t.nodeType&&-1<(" "+H(t)+" ").replace(Rt," ").indexOf(r))return!0;return!1}}),C.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,n){C.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}}),C.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var q=T.location,Pt=C.now(),Bt=/\?/,Wt=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g,It=(C.parseJSON=function(e){if(T.JSON&&T.JSON.parse)return T.JSON.parse(e+"");var i,o=null,t=C.trim(e+"");return t&&!C.trim(t.replace(Wt,function(e,t,n,r){return 0===(o=i&&t?0:o)?e:(i=n||t,o+=!r-!n,"")}))?Function("return "+t)():C.error("Invalid JSON: "+e)},C.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{T.DOMParser?t=(new T.DOMParser).parseFromString(e,"text/xml"):((t=new T.ActiveXObject("Microsoft.XMLDOM"))["async"]="false",t.loadXML(e))}catch(n){t=undefined}return t&&t.documentElement&&!t.getElementsByTagName("parsererror").length||C.error("Invalid XML: "+e),t},/#.*$/),$t=/([?&])_=[^&]*/,zt=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Xt=/^(?:GET|HEAD)$/,Ut=/^\/\//,Vt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Yt={},Jt={},Gt="*/".concat("*"),Kt=q.href,_=Vt.exec(Kt.toLowerCase())||[];function Qt(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(E)||[];if(C.isFunction(t))for(;n=i[r++];)"+"===n.charAt(0)?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Zt(t,r,i,o){var a={},s=t===Jt;function u(e){var n;return a[e]=!0,C.each(t[e]||[],function(e,t){t=t(r,i,o);return"string"!=typeof t||s||a[t]?s?!(n=t):void 0:(r.dataTypes.unshift(t),u(t),!1)}),n}return u(r.dataTypes[0])||!a["*"]&&u("*")}function en(e,t){var n,r,i=C.ajaxSettings.flatOptions||{};for(r in t)t[r]!==undefined&&((i[r]?e:n=n||{})[r]=t[r]);return n&&C.extend(!0,e,n),e}function tn(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(f){return{state:"parsererror",error:a?f:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}function nn(e){if(!C.contains(e.ownerDocument||g,e))return!0;for(;e&&1===e.nodeType;){if("none"===((t=e).style&&t.style.display||C.css(t,"display"))||"hidden"===e.type)return!0;e=e.parentNode}var t;return!1}C.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Kt,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(_[1]),global:!0,processData:!0,"async":!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Gt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":C.parseJSON,"text xml":C.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?en(en(e,C.ajaxSettings),t):en(C.ajaxSettings,e)},ajaxPrefilter:Qt(Yt),ajaxTransport:Qt(Jt),ajax:function(e,t){"object"==typeof e&&(t=e,e=undefined);var n,u,l,c,f,d,r,p=C.ajaxSetup({},t=t||{}),h=p.context||p,g=p.context&&(h.nodeType||h.jquery)?C(h):C.event,m=C.Deferred(),y=C.Callbacks("once memory"),v=p.statusCode||{},i={},o={},x=0,a="canceled",b={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!r)for(r={};t=zt.exec(l);)r[t[1].toLowerCase()]=t[2];t=r[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?l:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=o[n]=o[n]||e,i[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){if(e)if(x<2)for(var t in e)v[t]=[v[t],e[t]];else b.always(e[b.status]);return this},abort:function(e){e=e||a;return d&&d.abort(e),s(0,e),this}};if(m.promise(b).complete=y.add,b.success=b.done,b.error=b.fail,p.url=((e||p.url||Kt)+"").replace(It,"").replace(Ut,_[1]+"//"),p.type=t.method||t.type||p.method||p.type,p.dataTypes=C.trim(p.dataType||"*").toLowerCase().match(E)||[""],null==p.crossDomain&&(e=Vt.exec(p.url.toLowerCase()),p.crossDomain=!(!e||e[1]===_[1]&&e[2]===_[2]&&(e[3]||("http:"===e[1]?"80":"443"))===(_[3]||("http:"===_[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=C.param(p.data,p.traditional)),Zt(Yt,p,t,b),2===x)return b;for(n in(f=C.event&&p.global)&&0==C.active++&&C.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Xt.test(p.type),u=p.url,p.hasContent||(p.data&&(u=p.url+=(Bt.test(u)?"&":"?")+p.data,delete p.data),!1===p.cache&&(p.url=$t.test(u)?u.replace($t,"$1_="+Pt++):u+(Bt.test(u)?"&":"?")+"_="+Pt++)),p.ifModified&&(C.lastModified[u]&&b.setRequestHeader("If-Modified-Since",C.lastModified[u]),C.etag[u]&&b.setRequestHeader("If-None-Match",C.etag[u])),(p.data&&p.hasContent&&!1!==p.contentType||t.contentType)&&b.setRequestHeader("Content-Type",p.contentType),b.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Gt+"; q=0.01":""):p.accepts["*"]),p.headers)b.setRequestHeader(n,p.headers[n]);if(p.beforeSend&&(!1===p.beforeSend.call(h,b,p)||2===x))return b.abort();for(n in a="abort",{success:1,error:1,complete:1})b[n](p[n]);if(d=Zt(Jt,p,t,b)){if(b.readyState=1,f&&g.trigger("ajaxSend",[b,p]),2===x)return b;p["async"]&&0<p.timeout&&(c=T.setTimeout(function(){b.abort("timeout")},p.timeout));try{x=1,d.send(i,s)}catch(w){if(!(x<2))throw w;s(-1,w)}}else s(-1,"No Transport");function s(e,t,n,r){var i,o,a,s=t;2!==x&&(x=2,c&&T.clearTimeout(c),d=undefined,l=r||"",b.readyState=0<e?4:0,r=200<=e&&e<300||304===e,n&&(a=function(e,t,n){for(var r,i,o,a,s=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),i===undefined&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(a in s)if(s[a]&&s[a].test(i)){u.unshift(a);break}if(u[0]in n)o=u[0];else{for(a in n){if(!u[0]||e.converters[a+" "+u[0]]){o=a;break}r=r||a}o=o||r}if(o)return o!==u[0]&&u.unshift(o),n[o]}(p,b,n)),a=tn(p,a,b,r),r?(p.ifModified&&((n=b.getResponseHeader("Last-Modified"))&&(C.lastModified[u]=n),(n=b.getResponseHeader("etag"))&&(C.etag[u]=n)),204===e||"HEAD"===p.type?s="nocontent":304===e?s="notmodified":(s=a.state,i=a.data,r=!(o=a.error))):(o=s,!e&&s||(s="error",e<0&&(e=0))),b.status=e,b.statusText=(t||s)+"",r?m.resolveWith(h,[i,s,b]):m.rejectWith(h,[b,s,o]),b.statusCode(v),v=undefined,f&&g.trigger(r?"ajaxSuccess":"ajaxError",[b,p,r?i:o]),y.fireWith(h,[b,s]),f&&(g.trigger("ajaxComplete",[b,p]),--C.active||C.event.trigger("ajaxStop")))}return b},getJSON:function(e,t,n){return C.get(e,t,n,"json")},getScript:function(e,t){return C.get(e,undefined,t,"script")}}),C.each(["get","post"],function(e,i){C[i]=function(e,t,n,r){return C.isFunction(t)&&(r=r||n,n=t,t=undefined),C.ajax(C.extend({url:e,type:i,dataType:r,data:t,success:n},C.isPlainObject(e)&&e))}}),C._evalUrl=function(e){return C.ajax({url:e,type:"GET",dataType:"script",cache:!0,"async":!1,global:!1,"throws":!0})},C.fn.extend({wrapAll:function(t){return C.isFunction(t)?this.each(function(e){C(this).wrapAll(t.call(this,e))}):(this[0]&&(e=C(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)),this);var e},wrapInner:function(n){return C.isFunction(n)?this.each(function(e){C(this).wrapInner(n.call(this,e))}):this.each(function(){var e=C(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=C.isFunction(t);return this.each(function(e){C(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(){return this.parent().each(function(){C.nodeName(this,"body")||C(this).replaceWith(this.childNodes)}).end()}}),C.expr.filters.hidden=function(e){return y.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:nn(e)},C.expr.filters.visible=function(e){return!C.expr.filters.hidden(e)};var rn=/%20/g,on=/\[\]$/,an=/\r?\n/g,sn=/^(?:submit|button|image|reset|file)$/i,un=/^(?:input|select|textarea|keygen)/i;C.param=function(e,t){var n,r=[],i=function(e,t){t=C.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(t===undefined&&(t=C.ajaxSettings&&C.ajaxSettings.traditional),C.isArray(e)||e.jquery&&!C.isPlainObject(e))C.each(e,function(){i(this.name,this.value)});else for(n in e)!function o(n,e,r,i){if(C.isArray(e))C.each(e,function(e,t){r||on.test(n)?i(n,t):o(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==C.type(e))i(n,e);else for(var t in e)o(n+"["+t+"]",e[t],r,i)}(n,e[n],t,i);return r.join("&").replace(rn,"+")},C.fn.extend({serialize:function(){return C.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=C.prop(this,"elements");return e?C.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!C(this).is(":disabled")&&un.test(this.nodeName)&&!sn.test(e)&&(this.checked||!ge.test(e))}).map(function(e,t){var n=C(this).val();return null==n?null:C.isArray(n)?C.map(n,function(e){return{name:t.name,value:e.replace(an,"\r\n")}}):{name:t.name,value:n.replace(an,"\r\n")}}).get()}}),C.ajaxSettings.xhr=T.ActiveXObject!==undefined?function(){return this.isLocal?dn():8<g.documentMode?fn():/^(get|post|head|put|delete|options)$/i.test(this.type)&&fn()||dn()}:fn;var ln=0,cn={},F=C.ajaxSettings.xhr();function fn(){try{return new T.XMLHttpRequest}catch(e){}}function dn(){try{return new T.ActiveXObject("Microsoft.XMLHTTP")}catch(e){}}T.attachEvent&&T.attachEvent("onunload",function(){for(var e in cn)cn[e](undefined,!0)}),y.cors=!!F&&"withCredentials"in F,(F=y.ajax=!!F)&&C.ajaxTransport(function(l){var c;if(!l.crossDomain||y.cors)return{send:function(e,a){var t,s=l.xhr(),u=++ln;if(s.open(l.type,l.url,l["async"],l.username,l.password),l.xhrFields)for(t in l.xhrFields)s[t]=l.xhrFields[t];for(t in l.mimeType&&s.overrideMimeType&&s.overrideMimeType(l.mimeType),l.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)e[t]!==undefined&&s.setRequestHeader(t,e[t]+"");s.send(l.hasContent&&l.data||null),c=function(e,t){var n,r,i;if(c&&(t||4===s.readyState))if(delete cn[u],c=undefined,s.onreadystatechange=C.noop,t)4!==s.readyState&&s.abort();else{i={},n=s.status,"string"==typeof s.responseText&&(i.text=s.responseText);try{r=s.statusText}catch(o){r=""}n||!l.isLocal||l.crossDomain?1223===n&&(n=204):n=i.text?200:404}i&&a(n,r,i,s.getAllResponseHeaders())},l["async"]?4===s.readyState?T.setTimeout(c):s.onreadystatechange=cn[u]=c:c()},abort:function(){c&&c(undefined,!0)}}}),C.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return C.globalEval(e),e}}}),C.ajaxPrefilter("script",function(e){e.cache===undefined&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),C.ajaxTransport("script",function(t){var r,i;if(t.crossDomain)return i=g.head||C("head")[0]||g.documentElement,{send:function(e,n){(r=g.createElement("script"))["async"]=!0,t.scriptCharset&&(r.charset=t.scriptCharset),r.src=t.url,r.onload=r.onreadystatechange=function(e,t){!t&&r.readyState&&!/loaded|complete/.test(r.readyState)||(r.onload=r.onreadystatechange=null,r.parentNode&&r.parentNode.removeChild(r),r=null,t||n(200,"success"))},i.insertBefore(r,i.firstChild)},abort:function(){r&&r.onload(undefined,!0)}}});var pn=[],hn=/(=)\?(?=&|$)|\?\?/,gn=(C.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=pn.pop()||C.expando+"_"+Pt++;return this[e]=!0,e}}),C.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(hn.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&hn.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=C.isFunction(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(hn,"$1"+r):!1!==e.jsonp&&(e.url+=(Bt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||C.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=T[r],T[r]=function(){o=arguments},n.always(function(){i===undefined?C(T).removeProp(r):T[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,pn.push(r)),o&&C.isFunction(i)&&i(o[0]),o=i=undefined}),"script"}),C.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||g;var r=J.exec(e),n=!n&&[];return r?[t.createElement(r[1])]:(r=Ne([e],t,n),n&&n.length&&C(n).remove(),C.merge([],r.childNodes))},C.fn.load);function mn(e){return C.isWindow(e)?e:9===e.nodeType&&(e.defaultView||e.parentWindow)}return C.fn.load=function(e,t,n){if("string"!=typeof e&&gn)return gn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=C.trim(e.slice(s,e.length)),e=e.slice(0,s)),C.isFunction(t)?(n=t,t=undefined):t&&"object"==typeof t&&(i="POST"),0<a.length&&C.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?C("<div>").append(C.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},C.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){C.fn[t]=function(e){return this.on(t,e)}}),C.expr.filters.animated=function(t){return C.grep(C.timers,function(e){return t===e.elem}).length},C.offset={setOffset:function(e,t,n){var r,i,o,a,s=C.css(e,"position"),u=C(e),l={};"static"===s&&(e.style.position="relative"),o=u.offset(),r=C.css(e,"top"),a=C.css(e,"left"),s=("absolute"===s||"fixed"===s)&&-1<C.inArray("auto",[r,a])?(i=(s=u.position()).top,s.left):(i=parseFloat(r)||0,parseFloat(a)||0),null!=(t=C.isFunction(t)?t.call(e,n,C.extend({},o)):t).top&&(l.top=t.top-o.top+i),null!=t.left&&(l.left=t.left-o.left+s),"using"in t?t.using.call(e,l):u.css(l)}},C.fn.extend({offset:function(t){if(arguments.length)return t===undefined?this:this.each(function(e){C.offset.setOffset(this,t,e)});var e,n={top:0,left:0},r=this[0],i=r&&r.ownerDocument;return i?(e=i.documentElement,C.contains(e,r)?("undefined"!=typeof r.getBoundingClientRect&&(n=r.getBoundingClientRect()),r=mn(i),{top:n.top+(r.pageYOffset||e.scrollTop)-(e.clientTop||0),left:n.left+(r.pageXOffset||e.scrollLeft)-(e.clientLeft||0)}):n):void 0},position:function(){var e,t,n,r;if(this[0])return n={top:0,left:0},r=this[0],"fixed"===C.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),(n=C.nodeName(e[0],"html")?n:e.offset()).top+=C.css(e[0],"borderTopWidth",!0),n.left+=C.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-C.css(r,"marginTop",!0),left:t.left-n.left-C.css(r,"marginLeft",!0)}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&!C.nodeName(e,"html")&&"static"===C.css(e,"position");)e=e.offsetParent;return e||lt})}}),C.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o=/Y/.test(i);C.fn[t]=function(e){return d(this,function(e,t,n){var r=mn(e);if(n===undefined)return r?i in r?r[i]:r.document.documentElement[t]:e[t];r?r.scrollTo(o?C(r).scrollLeft():n,o?n:C(r).scrollTop()):e[t]=n},t,e,arguments.length,null)}}),C.each(["top","left"],function(e,n){C.cssHooks[n]=ft(y.pixelPosition,function(e,t){if(t)return t=p(e,n),st.test(t)?C(e).position()[n]+"px":t})}),C.each({Height:"height",Width:"width"},function(o,a){C.each({padding:"inner"+o,content:a,"":"outer"+o},function(r,e){C.fn[e]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return d(this,function(e,t,n){var r;return C.isWindow(e)?e.document.documentElement["client"+o]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+o],r["scroll"+o],e.body["offset"+o],r["offset"+o],r["client"+o])):n===undefined?C.css(e,t,i):C.style(e,t,n,i)},a,n?e:undefined,n,null)}})}),C.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),C.fn.size=function(){return this.length},C.fn.andSelf=C.fn.addBack,layui.define(function(e){e("jquery",layui.$=C)}),C});!function(p){"use strict";var h,f,e,n=p.layui&&layui.define,c={getPath:(e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;0<n;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}(),(p.LAYUI_GLOBAL||{}).layer_dir||e.substring(0,e.lastIndexOf("/")+1)),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(e,t){e=e.currentStyle||p.getComputedStyle(e,null);return e[e.getPropertyValue?"getPropertyValue":"getAttribute"](t)},link:function(e,i,t){var n,a,o,s,r,l;m.path&&(n=document.getElementsByTagName("head")[0],a=document.createElement("link"),o=((t="string"==typeof i?i:t)||e).replace(/\.|\//g,""),s="layuicss-"+o,r="creating",l=0,a.rel="stylesheet",a.href=m.path+e,a.id=s,document.getElementById(s)||n.appendChild(a),"function"==typeof i&&function f(e){var t=document.getElementById(s);return 100<++l?p.console&&console.error(o+".css: Invalid"):void(1989===parseInt(c.getStyle(t,"width"))?(e===r&&t.removeAttribute("lay-status"),t.getAttribute("lay-status")===r?setTimeout(f,100):i()):(t.setAttribute("lay-status",r),setTimeout(function(){f(r)},100)))}())}},m={v:"3.5.1",ie:(e=navigator.userAgent.toLowerCase(),!!(p.ActiveXObject||"ActiveXObject"in p)&&((e.match(/msie\s(\d+)/)||[])[1]||"11")),index:p.layer&&p.layer.v?1e5:0,path:c.getPath,config:function(e,t){return m.cache=c.config=h.extend({},c.config,e=e||{}),m.path=c.config.path||m.path,"string"==typeof e.extend&&(e.extend=[e.extend]),c.config.path&&m.ready(),e.extend&&(n?layui.addcss("modules/layer/"+e.extend):c.link("theme/"+e.extend)),this},ready:function(e){var t="layer",i=(n?"modules/layer/":"theme/")+"default/layer.css?v="+m.v;return n?layui.addcss(i,e,t):c.link(i,e,t),this},alert:function(e,t,i){var n="function"==typeof t;return m.open(h.extend({content:e,yes:i=n?t:i},n?{}:t))},confirm:function(e,t,i,n){var a="function"==typeof t;return a&&(n=i,i=t),m.open(h.extend({content:e,btn:c.btn,yes:i,btn2:n},a?{}:t))},msg:function(e,t,i){var n="function"==typeof t,a=c.config.skin,a=(a?a+" "+a+"-msg":"")||"layui-layer-msg",o=d.anim.length-1;return n&&(i=t),m.open(h.extend({content:e,time:3e3,shade:!1,skin:a,title:!1,closeBtn:!1,btn:!1,resize:!1,end:i},n&&!c.config.skin?{skin:a+" layui-layer-hui",anim:o}:(-1!==(t=t||{}).icon&&(void 0!==t.icon||c.config.skin)||(t.skin=a+" "+(t.skin||"layui-layer-hui")),t)))},load:function(e,t){return m.open(h.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,i){return m.open(h.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:260},i))}},t=function(e){var t=this,i=function(){t.creat()};t.index=++m.index,t.config.maxWidth=h(f).width()-30,t.config=h.extend({},t.config,c.config,e),document.body?i():setTimeout(function(){i()},30)},d=(t.pt=t.prototype,["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"]),i=(d.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],d.SHADE="layui-layer-shade",d.MOVE="layui-layer-move",t.pt.config={type:0,shade:.3,fixed:!0,move:d[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,minStack:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},t.pt.vessel=function(e,t){var i=this.index,n=this.config,a=n.zIndex+i,o="object"==typeof n.title,s=n.maxmin&&(1===n.type||2===n.type),o=n.title?'<div class="layui-layer-title" style="'+(o?n.title[1]:"")+'">'+(o?n.title[0]:n.title)+"</div>":"";return n.zIndex=a,t([n.shade?'<div class="'+d.SHADE+'" id="'+d.SHADE+i+'" times="'+i+'" style="z-index:'+(a-1)+'; "></div>':"",'<div class="'+d[0]+" layui-layer-"+c.type[n.type]+(0!=n.type&&2!=n.type||n.shade?"":" layui-layer-border")+" "+(n.skin||"")+'" id="'+d[0]+i+'" type="'+c.type[n.type]+'" times="'+i+'" showtime="'+n.time+'" conType="'+(e?"object":"string")+'" style="z-index: '+a+"; width:"+n.area[0]+";height:"+n.area[1]+";position:"+(n.fixed?"fixed;":"absolute;")+'">'+(e&&2!=n.type?"":o)+'<div id="'+(n.id||"")+'" class="layui-layer-content'+(0==n.type&&-1!==n.icon?" layui-layer-padding":"")+(3==n.type?" layui-layer-loading"+n.icon:"")+'">'+(0==n.type&&-1!==n.icon?'<i class="layui-layer-ico layui-layer-ico'+n.icon+'"></i>':"")+((1!=n.type||!e)&&n.content||"")+'</div><span class="layui-layer-setwin">'+(i=s?'<a class="layui-layer-min" href="javascript:;"><cite></cite></a><a class="layui-layer-ico layui-layer-max" href="javascript:;"></a>':"",n.closeBtn&&(i+='<a class="layui-layer-ico '+d[7]+" "+d[7]+(n.title?n.closeBtn:4==n.type?"1":"2")+'" href="javascript:;"></a>'),i)+"</span>"+(n.btn?function(){var e="";"string"==typeof n.btn&&(n.btn=[n.btn]);for(var t=0,i=n.btn.length;t<i;t++)e+='<a class="'+d[6]+t+'">'+n.btn[t]+"</a>";return'<div class="'+d[6]+" layui-layer-btn-"+(n.btnAlign||"")+'">'+e+"</div>"}():"")+(n.resize?'<span class="layui-layer-resize"></span>':"")+"</div>"],o,h('<div class="'+d.MOVE+'" id="'+d.MOVE+'"></div>')),this},t.pt.creat=function(){var e,n=this,a=n.config,o=n.index,s="object"==typeof(l=a.content),r=h("body");if(!a.id||!h("#"+a.id)[0]){switch("string"==typeof a.area&&(a.area="auto"===a.area?["",""]:[a.area,""]),a.shift&&(a.anim=a.shift),6==m.ie&&(a.fixed=!1),a.type){case 0:a.btn="btn"in a?a.btn:c.btn[0],m.closeAll("dialog");break;case 2:var l=a.content=s?a.content:[a.content||"","auto"];a.content='<iframe scrolling="'+(a.content[1]||"auto")+'" allowtransparency="true" id="'+d[4]+o+'" name="'+d[4]+o+'" onload="this.className=\'\';" class="layui-layer-load" frameborder="0" src="'+a.content[0]+'"></iframe>';break;case 3:delete a.title,delete a.closeBtn,-1===a.icon&&a.icon,m.closeAll("loading");break;case 4:s||(a.content=[a.content,"body"]),a.follow=a.content[1],a.content=a.content[0]+'<i class="layui-layer-TipsG"></i>',delete a.title,a.tips="object"==typeof a.tips?a.tips:[a.tips,!0],a.tipsMore||m.closeAll("tips")}n.vessel(s,function(e,t,i){r.append(e[0]),s?2==a.type||4==a.type?h("body").append(e[1]):l.parents("."+d[0])[0]||(l.data("display",l.css("display")).show().addClass("layui-layer-wrap").wrap(e[1]),h("#"+d[0]+o).find("."+d[5]).before(t)):r.append(e[1]),h("#"+d.MOVE)[0]||r.append(c.moveElem=i),n.layero=h("#"+d[0]+o),n.shadeo=h("#"+d.SHADE+o),a.scrollbar||d.html.css("overflow","hidden").attr("layer-full",o)}).auto(o),n.shadeo.css({"background-color":a.shade[1]||"#000",opacity:a.shade[0]||a.shade}),2==a.type&&6==m.ie&&n.layero.find("iframe").attr("src",l[0]),4==a.type?n.tips():(n.offset(),parseInt(c.getStyle(document.getElementById(d.MOVE),"z-index"))||(n.layero.css("visibility","hidden"),m.ready(function(){n.offset(),n.layero.css("visibility","visible")}))),a.fixed&&f.on("resize",function(){n.offset(),(/^\d+%$/.test(a.area[0])||/^\d+%$/.test(a.area[1]))&&n.auto(o),4==a.type&&n.tips()}),a.time<=0||setTimeout(function(){m.close(n.index)},a.time),n.move().callback(),d.anim[a.anim]&&(e="layer-anim "+d.anim[a.anim],n.layero.addClass(e).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){h(this).removeClass(e)})),a.isOutAnim&&n.layero.data("isOutAnim",!0)}},t.pt.auto=function(e){var t=this.config,i=h("#"+d[0]+e),n=(""===t.area[0]&&0<t.maxWidth&&(m.ie&&m.ie<8&&t.btn&&i.width(i.innerWidth()),i.outerWidth()>t.maxWidth&&i.width(t.maxWidth)),[i.innerWidth(),i.innerHeight()]),a=i.find(d[1]).outerHeight()||0,o=i.find("."+d[6]).outerHeight()||0,e=function(e){(e=i.find(e)).height(n[1]-a-o-2*(0|parseFloat(e.css("padding-top"))))};return 2===t.type?e("iframe"):""===t.area[1]?0<t.maxHeight&&i.outerHeight()>t.maxHeight?(n[1]=t.maxHeight,e("."+d[5])):t.fixed&&n[1]>=f.height()&&(n[1]=f.height(),e("."+d[5])):e("."+d[5]),this},t.pt.offset=function(){var e=this,t=e.config,i=e.layero,n=[i.outerWidth(),i.outerHeight()],a="object"==typeof t.offset;e.offsetTop=(f.height()-n[1])/2,e.offsetLeft=(f.width()-n[0])/2,a?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=f.width()-n[0]:"b"===t.offset?e.offsetTop=f.height()-n[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=f.height()-n[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=f.width()-n[0]):"rb"===t.offset?(e.offsetTop=f.height()-n[1],e.offsetLeft=f.width()-n[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?f.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?f.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=f.scrollTop(),e.offsetLeft+=f.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=f.height()-(i.find(d[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},t.pt.tips=function(){var e=this.config,t=this.layero,i=[t.outerWidth(),t.outerHeight()],n=h(e.follow),a={width:(n=n[0]?n:h("body")).outerWidth(),height:n.outerHeight(),top:n.offset().top,left:n.offset().left},o=t.find(".layui-layer-TipsG"),n=e.tips[0];e.tips[1]||o.remove(),a.autoLeft=function(){0<a.left+i[0]-f.width()?(a.tipLeft=a.left+a.width-i[0],o.css({right:12,left:"auto"})):a.tipLeft=a.left},a.where=[function(){a.autoLeft(),a.tipTop=a.top-i[1]-10,o.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",e.tips[1])},function(){a.tipLeft=a.left+a.width+10,a.tipTop=a.top,o.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",e.tips[1])},function(){a.autoLeft(),a.tipTop=a.top+a.height+10,o.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",e.tips[1])},function(){a.tipLeft=a.left-i[0]-10,a.tipTop=a.top,o.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",e.tips[1])}],a.where[n-1](),1===n?a.top-(f.scrollTop()+i[1]+16)<0&&a.where[2]():2===n?0<f.width()-(a.left+a.width+i[0]+16)||a.where[3]():3===n?0<a.top-f.scrollTop()+a.height+i[1]+16-f.height()&&a.where[0]():4===n&&0<i[0]+16-a.left&&a.where[1](),t.find("."+d[5]).css({"background-color":e.tips[1],"padding-right":e.closeBtn?"30px":""}),t.css({left:a.tipLeft-(e.fixed?f.scrollLeft():0),top:a.tipTop-(e.fixed?f.scrollTop():0)})},t.pt.move=function(){var o=this,s=o.config,e=h(document),r=o.layero,t=r.find(s.move),i=r.find(".layui-layer-resize"),l={};return s.move&&t.css("cursor","move"),t.on("mousedown",function(e){e.preventDefault(),s.move&&(l.moveStart=!0,l.offset=[e.clientX-parseFloat(r.css("left")),e.clientY-parseFloat(r.css("top"))],c.moveElem.css("cursor","move").show())}),i.on("mousedown",function(e){e.preventDefault(),l.resizeStart=!0,l.offset=[e.clientX,e.clientY],l.area=[r.outerWidth(),r.outerHeight()],c.moveElem.css("cursor","se-resize").show()}),e.on("mousemove",function(e){var t,i,n,a;l.moveStart&&(n=e.clientX-l.offset[0],a=e.clientY-l.offset[1],t="fixed"===r.css("position"),e.preventDefault(),l.stX=t?0:f.scrollLeft(),l.stY=t?0:f.scrollTop(),s.moveOut||(t=f.width()-r.outerWidth()+l.stX,i=f.height()-r.outerHeight()+l.stY,t<(n=n<l.stX?l.stX:n)&&(n=t),i<(a=a<l.stY?l.stY:a)&&(a=i)),r.css({left:n,top:a})),s.resize&&l.resizeStart&&(n=e.clientX-l.offset[0],a=e.clientY-l.offset[1],e.preventDefault(),m.style(o.index,{width:l.area[0]+n,height:l.area[1]+a}),l.isResize=!0,s.resizing&&s.resizing(r))}).on("mouseup",function(e){l.moveStart&&(delete l.moveStart,c.moveElem.hide(),s.moveEnd&&s.moveEnd(r)),l.resizeStart&&(delete l.resizeStart,c.moveElem.hide())}),o},t.pt.callback=function(){var t=this,i=t.layero,n=t.config;t.openLayer(),n.success&&(2==n.type?i.find("iframe").on("load",function(){n.success(i,t.index,t)}):n.success(i,t.index,t)),6==m.ie&&t.IE6(i),i.find("."+d[6]).children("a").on("click",function(){var e=h(this).index();0===e?n.yes?n.yes(t.index,i):n.btn1?n.btn1(t.index,i):m.close(t.index):!1!==(n["btn"+(e+1)]&&n["btn"+(e+1)](t.index,i))&&m.close(t.index)}),i.find("."+d[7]).on("click",function(){!1!==(n.cancel&&n.cancel(t.index,i))&&m.close(t.index)}),n.shadeClose&&t.shadeo.on("click",function(){m.close(t.index)}),i.find(".layui-layer-min").on("click",function(){!1!==(n.min&&n.min(i,t.index))&&m.min(t.index,n)}),i.find(".layui-layer-max").on("click",function(){h(this).hasClass("layui-layer-maxmin")?(m.restore(t.index),n.restore&&n.restore(i,t.index)):(m.full(t.index,n),setTimeout(function(){n.full&&n.full(i,t.index)},100))}),n.end&&(c.end[t.index]=n.end)},c.reselect=function(){h.each(h("select"),function(e,t){var i=h(this);i.parents("."+d[0])[0]||1==i.attr("layer")&&h("."+d[0]).length<1&&i.removeAttr("layer").show()})},t.pt.IE6=function(e){h("select").each(function(e,t){var i=h(this);i.parents("."+d[0])[0]||"none"!==i.css("display")&&i.attr({layer:"1"}).hide()})},t.pt.openLayer=function(){m.zIndex=this.config.zIndex,m.setTop=function(e){return m.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",function(){m.zIndex++,e.css("z-index",m.zIndex+1)}),m.zIndex}},c.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},c.rescollbar=function(e){d.html.attr("layer-full")==e&&(d.html[0].style.removeProperty?d.html[0].style.removeProperty("overflow"):d.html[0].style.removeAttribute("overflow"),d.html.removeAttr("layer-full"))},(p.layer=m).getChildFrame=function(e,t){return t=t||h("."+d[4]).attr("times"),h("#"+d[0]+t).find("iframe").contents().find(e)},m.getFrameIndex=function(e){return h("#"+e).parents("."+d[4]).attr("times")},m.iframeAuto=function(e){var t,i,n;e&&(t=m.getChildFrame("html",e).outerHeight(),i=(e=h("#"+d[0]+e)).find(d[1]).outerHeight()||0,n=e.find("."+d[6]).outerHeight()||0,e.css({height:t+i+n}),e.find("iframe").css({height:t}))},m.iframeSrc=function(e,t){h("#"+d[0]+e).find("iframe").attr("src",t)},m.style=function(e,t,i){var e=h("#"+d[0]+e),n=e.find(".layui-layer-content"),a=e.attr("type"),o=e.find(d[1]).outerHeight()||0,s=e.find("."+d[6]).outerHeight()||0;e.attr("minLeft");a!==c.type[3]&&a!==c.type[4]&&(i||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-o-s<=64&&(t.height=64+o+s)),e.css(t),s=e.find("."+d[6]).outerHeight()||0,a===c.type[2]?e.find("iframe").css({height:parseFloat(t.height)-o-s}):n.css({height:parseFloat(t.height)-o-s-parseFloat(n.css("padding-top"))-parseFloat(n.css("padding-bottom"))}))},m.min=function(e,t){t=t||{};var i=h("#"+d[0]+e),n=h("#"+d.SHADE+e),a=i.find(d[1]).outerHeight()||0,o=i.attr("minLeft")||181*c.minIndex+"px",s=i.css("position"),r={width:180,height:a,position:"fixed",overflow:"hidden"};c.record(i),c.minLeft[0]&&(o=c.minLeft[0],c.minLeft.shift()),t.minStack&&(r.left=o,r.top=f.height()-a,i.attr("minLeft")||c.minIndex++,i.attr("minLeft",o)),i.attr("position",s),m.style(e,r,!0),i.find(".layui-layer-min").hide(),"page"===i.attr("type")&&i.find(d[4]).hide(),c.rescollbar(e),n.hide()},m.restore=function(e){var t=h("#"+d[0]+e),i=h("#"+d.SHADE+e),n=t.attr("area").split(",");t.attr("type");m.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(d[4]).show(),c.rescollbar(e),i.show()},m.full=function(t){var i=h("#"+d[0]+t);c.record(i),d.html.attr("layer-full")||d.html.css("overflow","hidden").attr("layer-full",t),clearTimeout(void 0),setTimeout(function(){var e="fixed"===i.css("position");m.style(t,{top:e?0:f.scrollTop(),left:e?0:f.scrollLeft(),width:f.width(),height:f.height()},!0),i.find(".layui-layer-min").hide()},100)},m.title=function(e,t){h("#"+d[0]+(t||m.index)).find(d[1]).html(e)},m.close=function(a,o){var s,e,r=h("#"+d[0]+a),l=r.attr("type");r[0]&&(s="layui-layer-wrap",e=function(){if(l===c.type[1]&&"object"===r.attr("conType")){r.children(":not(."+d[5]+")").remove();for(var e=r.find("."+s),t=0;t<2;t++)e.unwrap();e.css("display",e.data("display")).removeClass(s)}else{if(l===c.type[2])try{var i=h("#"+d[4]+a)[0];i.contentWindow.document.write(""),i.contentWindow.close(),r.find("."+d[5])[0].removeChild(i)}catch(n){}r[0].innerHTML="",r.remove()}"function"==typeof c.end[a]&&c.end[a](),delete c.end[a],"function"==typeof o&&o()},r.data("isOutAnim")&&r.addClass("layer-anim layer-anim-close"),h("#layui-layer-moves, #"+d.SHADE+a).remove(),6==m.ie&&c.reselect(),c.rescollbar(a),r.attr("minLeft")&&(c.minIndex--,c.minLeft.push(r.attr("minLeft"))),m.ie&&m.ie<10||!r.data("isOutAnim")?e():setTimeout(function(){e()},200))},m.closeAll=function(n,a){"function"==typeof n&&(a=n,n=null);var o=h("."+d[0]);h.each(o,function(e){var t=h(this),i=n?t.attr("type")===n:1;i&&m.close(t.attr("times"),e===o.length-1?a:null)}),0===o.length&&"function"==typeof a&&a()},m.cache||{}),g=function(e){return i.skin?" "+i.skin+" "+i.skin+"-"+e:""};m.prompt=function(i,n){var e="";"function"==typeof(i=i||{})&&(n=i),i.area&&(e='style="width: '+(t=i.area)[0]+"; height: "+t[1]+';"',delete i.area);var a,t=2==i.formType?'<textarea class="layui-layer-input"'+e+"></textarea>":'<input type="'+(1==i.formType?"password":"text")+'" class="layui-layer-input">',o=i.success;return delete i.success,m.open(h.extend({type:1,btn:["确定","取消"],content:t,skin:"layui-layer-prompt"+g("prompt"),maxWidth:f.width(),success:function(e){(a=e.find(".layui-layer-input")).val(i.value||"").focus(),"function"==typeof o&&o(e)},resize:!1,yes:function(e){var t=a.val();""===t?a.focus():t.length>(i.maxlength||500)?m.tips("最多输入"+(i.maxlength||500)+"个字数",a,{tips:1}):n&&n(t,e,a)}},i))},m.tab=function(n){var a=(n=n||{}).tab||{},o="layui-this",s=n.success;return delete n.success,m.open(h.extend({type:1,skin:"layui-layer-tab"+g("tab"),resize:!1,title:function(){var e=a.length,t=1,i="";if(0<e)for(i='<span class="'+o+'">'+a[0].title+"</span>";t<e;t++)i+="<span>"+a[t].title+"</span>";return i}(),content:'<ul class="layui-layer-tabmain">'+function(){var e=a.length,t=1,i="";if(0<e)for(i='<li class="layui-layer-tabli '+o+'">'+(a[0].content||"no content")+"</li>";t<e;t++)i+='<li class="layui-layer-tabli">'+(a[t].content||"no content")+"</li>";return i}()+"</ul>",success:function(e){var t=e.find(".layui-layer-title").children(),i=e.find(".layui-layer-tabmain").children();t.on("mousedown",function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0;var e=h(this),t=e.index();e.addClass(o).siblings().removeClass(o),i.eq(t).show().siblings().hide(),"function"==typeof n.change&&n.change(t)}),"function"==typeof s&&s(e)}},n))},m.photos=function(i,e,n){var a={};if((i=i||{}).photos){var t=!("string"==typeof i.photos||i.photos instanceof h),o=t?i.photos:{},s=o.data||[],r=o.start||0,l=(a.imgIndex=1+(0|r),i.img=i.img||"img",i.success);if(delete i.success,t){if(0===s.length)return m.msg("没有图片")}else{var f=h(i.photos),c=function(){s=[],f.find(i.img).each(function(e){var t=h(this);t.attr("layer-index",e),s.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(c(),0===s.length)return;if(e||f.on("click",i.img,function(){c();var e=h(this).attr("layer-index");m.photos(h.extend(i,{photos:{start:e,data:s,tab:i.tab},full:i.full}),!0)}),!e)return}a.imgprev=function(e){a.imgIndex--,a.imgIndex<1&&(a.imgIndex=s.length),a.tabimg(e)},a.imgnext=function(e,t){a.imgIndex++,a.imgIndex>s.length&&(a.imgIndex=1,t)||a.tabimg(e)},a.keyup=function(e){var t;a.end||(t=e.keyCode,e.preventDefault(),37===t?a.imgprev(!0):39===t?a.imgnext(!0):27===t&&m.close(a.index))},a.tabimg=function(e){if(!(s.length<=1))return o.start=a.imgIndex-1,m.close(a.index),m.photos(i,!0,e)},a.event=function(){a.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),a.imgprev(!0)}),a.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),a.imgnext(!0)}),h(document).on("keyup",a.keyup)},a.loadi=m.load(1,{shade:!("shade"in i)&&.9,scrollbar:!1});var t=s[r].src,d=function(e){var t;m.close(a.loadi),n&&(i.anim=-1),a.index=m.open(h.extend({type:1,id:"layui-layer-photos",area:(e=[e.width,e.height],t=[h(p).width()-100,h(p).height()-100],!i.full&&(e[0]>t[0]||e[1]>t[1])&&((t=[e[0]/t[0],e[1]/t[1]])[1]<t[0]?(e[0]=e[0]/t[0],e[1]=e[1]/t[0]):t[0]<t[1]&&(e[0]=e[0]/t[1],e[1]=e[1]/t[1])),[e[0]+"px",e[1]+"px"]),title:!1,shade:.9,shadeClose:!0,closeBtn:!1,move:".layui-layer-phimg img",moveType:1,scrollbar:!1,moveOut:!0,anim:5,isOutAnim:!1,skin:"layui-layer-photos"+g("photos"),content:'<div class="layui-layer-phimg"><img src="'+s[r].src+'" alt="'+(s[r].alt||"")+'" layer-pid="'+s[r].pid+'">'+(1<s.length?'<div class="layui-layer-imgsee"><span class="layui-layer-imguide"><a href="javascript:;" class="layui-layer-iconext layui-layer-imgprev"></a><a href="javascript:;" class="layui-layer-iconext layui-layer-imgnext"></a></span><div class="layui-layer-imgbar" style="display:'+(n?"block":"")+'"><span class="layui-layer-imgtit"><a href="javascript:;">'+(s[r].alt||"")+"</a><em>"+a.imgIndex+" / "+s.length+"</em></span></div></div>":"")+"</div>",success:function(e,t){a.bigimg=e.find(".layui-layer-phimg"),a.imgsee=e.find(".layui-layer-imgbar"),a.event(e),i.tab&&i.tab(s[r],e),"function"==typeof l&&l(e)},end:function(){a.end=!0,h(document).off("keyup",a.keyup)}},i))},u=function(){m.close(a.loadi),m.msg("当前图片地址异常<br>是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){1<s.length&&a.imgnext(!0,!0)}})},y=new Image;(y.src=t,y.complete)?d(y):(y.onload=function(){y.onload=null,d(y)},y.onerror=function(e){y.onerror=null,u(e)})}},c.run=function(e){f=(h=e)(p),d.html=h("html"),m.open=function(e){return new t(e).index}},p.layui&&layui.define?(m.ready(),layui.define("jquery",function(e){m.path=layui.cache.dir,c.run(layui.$),e("layer",p.layer=m)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return c.run(p.jQuery),m}):(m.ready(),c.run(p.jQuery))}(window);layui.define("jquery",function(e){"use strict";var u=layui.$,a=layui.hint(),o={fixbar:function(t){var e,i,n="layui-fixbar",o="layui-fixbar-top",a=u(document),r=u("body"),l=((t=u.extend({showHeight:200},t)).bar1=!0===t.bar1?"":t.bar1,t.bar2=!0===t.bar2?"":t.bar2,t.bgcolor=t.bgcolor?"background-color:"+t.bgcolor:"",[t.bar1,t.bar2,""]),l=u(['<ul class="'+n+'">',t.bar1?'<li class="layui-icon" lay-type="bar1" style="'+t.bgcolor+'">'+l[0]+"</li>":"",t.bar2?'<li class="layui-icon" lay-type="bar2" style="'+t.bgcolor+'">'+l[1]+"</li>":"",'<li class="layui-icon '+o+'" lay-type="top" style="'+t.bgcolor+'">'+l[2]+"</li>","</ul>"].join("")),c=l.find("."+o),g=function(){a.scrollTop()>=t.showHeight?e||(c.show(),e=1):e&&(c.hide(),e=0)};u("."+n)[0]||("object"==typeof t.css&&l.css(t.css),r.append(l),g(),l.find("li").on("click",function(){var e=u(this).attr("lay-type");"top"===e&&u("html,body").animate({scrollTop:0},200),t.click&&t.click.call(this,e)}),a.on("scroll",function(){clearTimeout(i),i=setTimeout(function(){g()},100)}))},countdown:function(e,t,i){var n=this,o="function"==typeof t,a=new Date(e).getTime(),r=new Date(!t||o?(new Date).getTime():t).getTime(),a=a-r,l=[Math.floor(a/864e5),Math.floor(a/36e5)%24,Math.floor(a/6e4)%60,Math.floor(a/1e3)%60],o=(o&&(i=t),setTimeout(function(){n.countdown(e,r+1e3,i)},1e3));return i&&i(0<a?l:[0,0,0,0],t,o),a<=0&&clearTimeout(o),o},timeAgo:function(e,t){var i=this,n=[[],[]],o=(new Date).getTime()-new Date(e).getTime();return 26784e5<o?(o=new Date(e),n[0][0]=i.digit(o.getFullYear(),4),n[0][1]=i.digit(o.getMonth()+1),n[0][2]=i.digit(o.getDate()),t||(n[1][0]=i.digit(o.getHours()),n[1][1]=i.digit(o.getMinutes()),n[1][2]=i.digit(o.getSeconds())),n[0].join("-")+" "+n[1].join(":")):864e5<=o?(o/1e3/60/60/24|0)+"\u5929\u524d":36e5<=o?(o/1e3/60/60|0)+"\u5c0f\u65f6\u524d":18e4<=o?(o/1e3/60|0)+"\u5206\u949f\u524d":o<0?"\u672a\u6765":"\u521a\u521a"},digit:function(e,t){var i="";t=t||2;for(var n=(e=String(e)).length;n<t;n++)i+="0";return e<Math.pow(10,t)?i+(0|e):e},toDateString:function(e,t){if(null===e||""===e)return"";var i=this,n=new Date(function(){if(e)return!isNaN(e)&&"string"==typeof e?parseInt(e):e}()||new Date),o=[i.digit(n.getFullYear(),4),i.digit(n.getMonth()+1),i.digit(n.getDate())],i=[i.digit(n.getHours()),i.digit(n.getMinutes()),i.digit(n.getSeconds())];return n.getDate()?(t=t||"yyyy-MM-dd HH:mm:ss").replace(/yyyy/g,o[0]).replace(/MM/g,o[1]).replace(/dd/g,o[2]).replace(/HH/g,i[0]).replace(/mm/g,i[1]).replace(/ss/g,i[2]):(a.error('Invalid Msec for "util.toDateString(Msec)"'),"")},escape:function(e){return e===undefined||null===e?"":/[<"'>]|&(?=#[a-zA-Z0-9]+)/g.test(e+="")?e.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,"""):e},unescape:function(e){return e!==undefined&&null!==e||(e=""),(e+="").replace(/\&/g,"&").replace(/\</g,"<").replace(/\>/g,">").replace(/\'/g,"'").replace(/\"/g,'"')},toVisibleArea:function(e){var t,i,n,o,a,r,l,c;(e=u.extend({margin:160,duration:200,type:"y"},e)).scrollElem[0]&&e.thisElem[0]&&(t=e.scrollElem,l=e.thisElem,n=(a="y"===e.type)?"top":"left",o=t[i=a?"scrollTop":"scrollLeft"](),a=t[a?"height":"width"](),r=t.offset()[n],c={},((l=l.offset()[n]-r)>a-e.margin||l<e.margin)&&(c[i]=l-a/2+o,t.animate(c,e.duration)))},event:function(i,n,e){var t=u("body");return e=e||"click",n=o.event[i]=u.extend(!0,o.event[i],n)||{},o.event.UTIL_EVENT_CALLBACK=o.event.UTIL_EVENT_CALLBACK||{},t.off(e,"*["+i+"]",o.event.UTIL_EVENT_CALLBACK[i]),o.event.UTIL_EVENT_CALLBACK[i]=function(){var e=u(this),t=e.attr(i);"function"==typeof n[t]&&n[t].call(this,e)},t.on(e,"*["+i+"]",o.event.UTIL_EVENT_CALLBACK[i]),n}};o.on=o.event,e("util",o)});layui.define(["jquery","laytpl","lay"],function(e){"use strict";var n,i,t,s=layui.$,m=layui.laytpl,a=layui.hint(),l=layui.device().mobile?"click":"mousedown",o="dropdown",r="layui_"+o+"_index",c={config:{},index:layui[o]?layui[o].index+1e4:0,set:function(e){var i=this;return i.config=s.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,o,e,i)}},p=function(){var i=this,e=i.config,t=e.id;return p.that[t]=i,{config:e,reload:function(e){i.reload.call(i,e)}}},u="layui-menu-item-up",d="layui-menu-item-down",y="layui-menu-body-title",f="layui-menu-item-group",g="layui-menu-item-parent",h="layui-menu-item-checked",v="layui-menu-item-checked2",w="layui-menu-body-panel",C="layui-menu-body-panel-left",V="."+f+">."+y,k=function(e){var i=this;i.index=++c.index,i.config=s.extend({},i.config,c.config,e),i.init()};k.prototype.config={trigger:"click",content:"",className:"",style:"",show:!1,isAllowSpread:!0,isSpreadItem:!0,data:[],delay:300},k.prototype.reload=function(e){var i=this;i.config=s.extend({},i.config,e),i.init(!0)},k.prototype.init=function(e){var i=this,t=i.config,n=t.elem=s(t.elem);return 1<n.length?(layui.each(n,function(){c.render(s.extend({},t,{elem:this}))}),i):!e&&n[0]&&n.data(r)?(n=p.getThis(n.data(r)))?n.reload(t):void 0:(t.id="id"in t?t.id:i.index,t.show&&i.render(e),void i.events())},k.prototype.render=function(e){var n=this,u=n.config,i=s("body"),d=function(r,e){return layui.each(e,function(e,i){var t,n=i.child&&0<i.child.length,a=("isSpreadItem"in i?i:u).isSpreadItem,l=i.templet?m(i.templet).render(i):u.templet?m(u.templet).render(i):i.title,o=(n&&(i.type=i.type||"parent"),i.type?{group:"group",parent:"parent","-":"-"}[i.type]||"parent":"");("-"===o||i.title||i.id||n)&&((l=s(["<li"+(t={group:"layui-menu-item-group"+(u.isAllowSpread?a?" layui-menu-item-down":" layui-menu-item-up":""),parent:g,"-":"layui-menu-item-divider"},n||o?' class="'+t[o]+'"':"")+">",(t="href"in i?'<a href="'+i.href+'" target="'+(i.target||"_self")+'">'+l+"</a>":l,n?'<div class="'+y+'">'+t+("parent"===o?'<i class="layui-icon layui-icon-right"></i>':"group"===o&&u.isAllowSpread?'<i class="layui-icon layui-icon-'+(a?"up":"down")+'"></i>':"")+"</div>":'<div class="'+y+'">'+t+"</div>"),"</li>"].join(""))).data("item",i),n&&(a=s('<div class="layui-panel layui-menu-body-panel"></div>'),t=s("<ul></ul>"),"parent"===o?(a.append(d(t,i.child)),l.append(a)):l.append(d(t,i.child))),r.append(l))}),r},t=['<div class="layui-dropdown layui-border-box layui-panel layui-anim layui-anim-downbit">',"</div>"].join("");!(e="contextmenu"!==u.trigger&&!lay.isTopElem(u.elem[0])?e:!0)&&u.elem.data(r+"_opened")||(n.elemView=s(t),n.elemView.append(u.content||(e=s('<ul class="layui-menu layui-dropdown-menu"></ul>'),0<u.data.length?d(e,u.data):e.html('<li class="layui-menu-item-none">no menu</li>'),e)),u.className&&n.elemView.addClass(u.className),u.style&&n.elemView.attr("style",u.style),c.thisId=u.id,n.remove(),i.append(n.elemView),u.elem.data(r+"_opened",!0),n.position(),(p.prevElem=n.elemView).data("prevElem",u.elem),n.elemView.find(".layui-menu").on(l,function(e){layui.stope(e)}),n.elemView.find(".layui-menu li").on("click",function(e){var i=s(this),t=i.data("item")||{};t.child&&0<t.child.length||"-"===t.type||(n.remove(),"function"==typeof u.click&&u.click(t,i))}),n.elemView.find(V).on("click",function(e){var i=s(this).parent();"group"===(i.data("item")||{}).type&&u.isAllowSpread&&p.spread(i)}),"mouseenter"===u.trigger&&n.elemView.on("mouseenter",function(){clearTimeout(p.timer)}).on("mouseleave",function(){n.delayRemove()}))},k.prototype.position=function(e){var i=this.config;lay.position(i.elem[0],this.elemView[0],{position:i.position,e:this.e,clickType:"contextmenu"===i.trigger?"right":null,align:i.align||null})},k.prototype.remove=function(){this.config;var e=p.prevElem;e&&(e.data("prevElem")&&e.data("prevElem").data(r+"_opened",!1),e.remove())},k.prototype.delayRemove=function(){var e=this,i=e.config;clearTimeout(p.timer),p.timer=setTimeout(function(){e.remove()},i.delay)},k.prototype.events=function(){var i=this,t=i.config;"hover"===t.trigger&&(t.trigger="mouseenter"),i.prevElem&&i.prevElem.off(t.trigger,i.prevElemCallback),i.prevElem=t.elem,i.prevElemCallback=function(e){clearTimeout(p.timer),i.e=e,i.render(),e.preventDefault(),"function"==typeof t.ready&&t.ready(i.elemView,t.elem,i.e.target)},t.elem.on(t.trigger,i.prevElemCallback),"mouseenter"===t.trigger&&t.elem.on("mouseleave",function(){i.delayRemove()})},p.that={},p.getThis=function(e){var i=p.that[e];return i||a.error(e?o+" instance with ID '"+e+"' not found":"ID argument required"),i},p.spread=function(e){var i=e.children("."+y).find(".layui-icon");e.hasClass(u)?(e.removeClass(u).addClass(d),i.removeClass("layui-icon-down").addClass("layui-icon-up")):(e.removeClass(d).addClass(u),i.removeClass("layui-icon-up").addClass("layui-icon-down"))},n=s(window),i=s(document),n.on("resize",function(){if(c.thisId){var e=p.getThis(c.thisId);if(e){if(!e.elemView[0]||!s(".layui-dropdown")[0])return!1;"contextmenu"===e.config.trigger?e.remove():e.position()}}}),i.on(l,function(e){var i,t;!c.thisId||(i=p.getThis(c.thisId))&&(t=i.config,!lay.isTopElem(t.elem[0])&&"contextmenu"!==t.trigger&&(e.target===t.elem[0]||t.elem.find(e.target)[0]||e.target===i.elemView[0]||i.elemView&&i.elemView.find(e.target)[0])||i.remove())}),t=".layui-menu:not(.layui-dropdown-menu) li",i.on("click",t,function(e){var i=s(this),t=i.parents(".layui-menu").eq(0),n=i.hasClass(f)||i.hasClass(g),a=t.attr("lay-filter")||t.attr("id"),l=lay.options(this);i.hasClass("layui-menu-item-divider")||n||(t.find("."+h).removeClass(h),t.find("."+v).removeClass(v),i.addClass(h),i.parents("."+g).addClass(v),layui.event.call(this,o,"click("+a+")",l))}),i.on("click",t+V,function(e){var i=s(this).parents("."+f+":eq(0)"),t=lay.options(i[0]);"isAllowSpread"in t&&!t.isAllowSpread||p.spread(i)}),t=".layui-menu ."+g,i.on("mouseenter",t,function(e){var i,t=s(this).find("."+w);t[0]&&((i=t[0].getBoundingClientRect()).right>n.width()&&(t.addClass(C),(i=t[0].getBoundingClientRect()).left<0&&t.removeClass(C)),i.bottom>n.height()&&t.eq(0).css("margin-top",-(i.bottom-n.height()+5)))}).on("mouseleave",t,function(e){var i=s(this).children("."+w);i.removeClass(C),i.css("margin-top",0)}),c.reload=function(e,i){e=p.getThis(e);return e?(e.reload(i),p.call(e)):this},c.render=function(e){e=new k(e);return p.call(e)},e(o,c)});layui.define("jquery",function(e){"use strict";var h=layui.$,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var i=this;return i.config=h.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,a,e,i)}},a="slider",c="layui-disabled",y="layui-slider-bar",g="layui-slider-wrap",b="layui-slider-wrap-btn",x="layui-slider-tips",T="layui-slider-input-txt",w="layui-slider-hover",i=function(e){var i=this;i.index=++t.index,i.config=h.extend({},i.config,t.config,e),i.render()};i.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},i.prototype.render=function(){var a,n=this,l=n.config,e=(l.step<1&&(l.step=1),l.max<l.min&&(l.max=l.min+l.step),l.range?(l.value="object"==typeof l.value?l.value:[l.min,l.value],i=Math.min(l.value[0],l.value[1]),s=Math.max(l.value[0],l.value[1]),l.value[0]=i>l.min?i:l.min,l.value[1]=s>l.min?s:l.min,l.value[0]=l.value[0]>l.max?l.max:l.value[0],l.value[1]=l.value[1]>l.max?l.max:l.value[1],i=Math.floor((l.value[0]-l.min)/(l.max-l.min)*100),t=(s=Math.floor((l.value[1]-l.min)/(l.max-l.min)*100))-i+"%",i+="%",s+="%"):("object"==typeof l.value&&(l.value=Math.min.apply(null,l.value)),l.value<l.min&&(l.value=l.min),l.value>l.max&&(l.value=l.max),t=Math.floor((l.value-l.min)/(l.max-l.min)*100)+"%"),l.disabled?"#c2c2c2":l.theme),i='<div class="layui-slider '+("vertical"===l.type?"layui-slider-vertical":"")+'">'+(l.tips?'<div class="'+x+'"></div>':"")+'<div class="layui-slider-bar" style="background:'+e+"; "+("vertical"===l.type?"height":"width")+":"+t+";"+("vertical"===l.type?"bottom":"left")+":"+(i||0)+';"></div><div class="layui-slider-wrap" style="'+("vertical"===l.type?"bottom":"left")+":"+(i||t)+';"><div class="layui-slider-wrap-btn" style="border: 2px solid '+e+';"></div></div>'+(l.range?'<div class="layui-slider-wrap" style="'+("vertical"===l.type?"bottom":"left")+":"+s+';"><div class="layui-slider-wrap-btn" style="border: 2px solid '+e+';"></div></div>':"")+"</div>",t=h(l.elem),s=t.next(".layui-slider");if(s[0]&&s.remove(),n.elemTemp=h(i),l.range?(n.elemTemp.find("."+g).eq(0).data("value",l.value[0]),n.elemTemp.find("."+g).eq(1).data("value",l.value[1])):n.elemTemp.find("."+g).data("value",l.value),t.html(n.elemTemp),"vertical"===l.type&&n.elemTemp.height(l.height+"px"),l.showstep){for(var o=(l.max-l.min)/l.step,r="",u=1;u<1+o;u++){var d=100*u/o;d<100&&(r+='<div class="layui-slider-step" style="'+("vertical"===l.type?"bottom":"left")+":"+d+'%"></div>')}n.elemTemp.append(r)}l.input&&!l.range&&(e=h('<div class="layui-slider-input layui-input"><div class="layui-slider-input-txt"><input type="text" class="layui-input"></div><div class="layui-slider-input-btn"><i class="layui-icon layui-icon-up"></i><i class="layui-icon layui-icon-down"></i></div></div>'),t.css("position","relative"),t.append(e),t.find("."+T).children("input").val(l.value),"vertical"===l.type?e.css({left:0,top:-48}):n.elemTemp.css("margin-right",e.outerWidth()+15)),l.disabled?(n.elemTemp.addClass(c),n.elemTemp.find("."+b).addClass(c)):n.slide(),n.elemTemp.find("."+b).on("mouseover",function(){var e="vertical"===l.type?l.height:n.elemTemp[0].offsetWidth,i=n.elemTemp.find("."+g),t=("vertical"===l.type?e-h(this).parent()[0].offsetTop-i.height():h(this).parent()[0].offsetLeft)/e*100,i=h(this).parent().data("value"),e=l.setTips?l.setTips(i):i;n.elemTemp.find("."+x).html(e),clearTimeout(a),a=setTimeout(function(){"vertical"===l.type?n.elemTemp.find("."+x).css({bottom:t+"%","margin-bottom":"20px",display:"inline-block"}):n.elemTemp.find("."+x).css({left:t+"%",display:"inline-block"})},300)}).on("mouseout",function(){clearTimeout(a),n.elemTemp.find("."+x).css("display","none")})},i.prototype.slide=function(e,i,t){var o=this.config,r=this.elemTemp,u=function(){return"vertical"===o.type?o.height:r[0].offsetWidth},d=r.find("."+g),s=r.next(".layui-slider-input"),c=s.children("."+T).children("input").val(),m=100/((o.max-o.min)/Math.ceil(o.step)),v=function(e,i){e=100<(e=100<Math.ceil(e)*m?Math.ceil(e)*m:Math.round(e)*m)?100:e,d.eq(i).css("vertical"===o.type?"bottom":"left",e+"%");var t,a=p(d[0].offsetLeft),n=o.range?p(d[1].offsetLeft):0,l=("vertical"===o.type?(r.find("."+x).css({bottom:e+"%","margin-bottom":"20px"}),a=p(u()-d[0].offsetTop-d.height()),n=o.range?p(u()-d[1].offsetTop-d.height()):0):r.find("."+x).css("left",e+"%"),a=100<a?100:a,n=100<n?100:n,Math.min(a,n)),a=Math.abs(a-n),n=("vertical"===o.type?r.find("."+y).css({height:a+"%",bottom:l+"%"}):r.find("."+y).css({width:a+"%",left:l+"%"}),o.min+Math.round((o.max-o.min)*e/100));c=n,s.children("."+T).children("input").val(c),d.eq(i).data("value",n),r.find("."+x).html(o.setTips?o.setTips(n):n),o.range&&(t=[d.eq(0).data("value"),d.eq(1).data("value")])[0]>t[1]&&t.reverse(),o.change&&o.change(o.range?t:n)},p=function(e){var i=e/u()*100/m,t=Math.round(i)*m;return t=e==u()?Math.ceil(i)*m:t},f=h(['<div class="layui-auxiliar-moving" id="LAY-slider-moving"></div'].join(""));if("set"===e)return v(i,t);r.find("."+b).each(function(l){var s=h(this);s.on("mousedown",function(e){e=e||window.event;var i,t,a=s.parent()[0].offsetLeft,n=e.clientX;"vertical"===o.type&&(a=u()-s.parent()[0].offsetTop-d.height(),n=e.clientY);e=function(e){e=e||window.event;var i=a+("vertical"===o.type?n-e.clientY:e.clientX-n),i=(i=(i=i<0?0:i)>u()?u():i)/u()*100/m;v(i,l),s.addClass(w),r.find("."+x).show(),e.preventDefault()},i=function(){s.removeClass(w),r.find("."+x).hide()},t=function(){i&&i(),f.remove()},h("#LAY-slider-moving")[0]||h("body").append(f),f.on("mousemove",e),f.on("mouseup",t).on("mouseleave",t)})}),r.on("click",function(e){var i=h("."+b),t=h(this);!i.is(event.target)&&0===i.has(event.target).length&&i.length&&(t=(i=(i=(i="vertical"===o.type?u()-e.clientY+t.offset().top-h(window).scrollTop():e.clientX-t.offset().left-h(window).scrollLeft())<0?0:i)>u()?u():i)/u()*100/m,i=o.range?"vertical"===o.type?Math.abs(i-parseInt(h(d[0]).css("bottom")))>Math.abs(i-parseInt(h(d[1]).css("bottom")))?1:0:Math.abs(i-d[0].offsetLeft)>Math.abs(i-d[1].offsetLeft)?1:0:0,v(t,i),e.preventDefault())}),s.children(".layui-slider-input-btn").children("i").each(function(i){h(this).on("click",function(){c=s.children("."+T).children("input").val();var e=((c=1==i?c-o.step<o.min?o.min:Number(c)-o.step:Number(c)+o.step>o.max?o.max:Number(c)+o.step)-o.min)/(o.max-o.min)*100/m;v(e,0)})});var a=function(){var e=this.value,e=(e=(e=(e=isNaN(e)?0:e)<o.min?o.min:e)>o.max?o.max:e,((this.value=e)-o.min)/(o.max-o.min)*100/m);v(e,0)};s.children("."+T).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),a.call(this))}).on("change",a)},i.prototype.events=function(){this.config},t.render=function(e){e=new i(e);return function(){var t=this,a=t.config;return{setValue:function(e,i){return a.value=e,t.slide("set",e,i||0)},config:a}}.call(e)},e(a,t)});layui.define(["jquery","lay"],function(e){"use strict";var y=layui.jquery,o=layui.lay,r=layui.device().mobile?"click":"mousedown",i={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var i=this;return i.config=y.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},n="layui-colorpicker",l=".layui-colorpicker-main",m="layui-icon-down",x="layui-icon-close",P="layui-colorpicker-trigger-span",C="layui-colorpicker-trigger-i",B="layui-colorpicker-side-slider",w="layui-colorpicker-basis",D="layui-colorpicker-alpha-bgcolor",j="layui-colorpicker-alpha-slider",E="layui-colorpicker-basis-cursor",F="layui-colorpicker-main-input",H=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),n=r-o;return i.b=r,i.s=0!=r?255*n/r:0,0!=i.s?e.r==r?i.h=(e.g-e.b)/n:e.g==r?i.h=2+(e.b-e.r)/n:i.h=4+(e.r-e.g)/n:i.h=-1,r==o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},M=function(e){var i,o={},r=e.h,n=255*e.s/100,e=255*e.b/100;return 0==n?o.r=o.g=o.b=e:(e=r%60*((i=e)-(n=(255-n)*e/255))/60,(r=360==r?0:r)<60?(o.r=i,o.b=n,o.g=n+e):r<120?(o.g=i,o.b=n,o.r=i-e):r<180?(o.g=i,o.r=n,o.b=n+e):r<240?(o.b=i,o.r=n,o.g=i-e):r<300?(o.b=i,o.g=n,o.r=n+e):r<360?(o.r=i,o.g=n,o.b=i-e):(o.r=0,o.g=0,o.b=0)),{r:Math.round(o.r),g:Math.round(o.g),b:Math.round(o.b)}},f=function(e){var e=M(e),o=[e.r.toString(16),e.g.toString(16),e.b.toString(16)];return y.each(o,function(e,i){1==i.length&&(o[e]="0"+i)}),o.join("")},Y=function(e){e=e.match(/[0-9]{1,3}/g)||[];return{r:e[0],g:e[1],b:e[2]}},I=y(window),t=y(document),c=function(e){this.index=++i.index,this.config=y.extend({},this.config,i.config,e),this.render()};c.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},c.prototype.render=function(){var e=this,i=e.config,o=y(['<div class="layui-unselect layui-colorpicker">',"<span "+("rgb"==i.format&&i.alpha?'class="layui-colorpicker-trigger-bgcolor"':"")+">",'<span class="layui-colorpicker-trigger-span" ','lay-type="'+("rgb"==i.format?i.alpha?"rgba":"torgb":"")+'" ','style="'+(o="",i.color?(o=i.color,3<(i.color.match(/[0-9]{1,3}/g)||[]).length&&(i.alpha&&"rgb"==i.format||(o="#"+f(H(Y(i.color))))),"background: "+o):o)+'">','<i class="layui-icon layui-colorpicker-trigger-i '+(i.color?m:x)+'"></i>',"</span>","</span>","</div>"].join("")),r=y(i.elem);i.size&&o.addClass("layui-colorpicker-"+i.size),r.addClass("layui-inline").html(e.elemColorBox=o),e.color=e.elemColorBox.find("."+P)[0].style.background,e.events()},c.prototype.renderPicker=function(){var o,e=this,i=e.config,r=e.elemColorBox[0],i=e.elemPicker=y(['<div id="layui-colorpicker'+e.index+'" data-index="'+e.index+'" class="layui-anim layui-anim-downbit layui-colorpicker-main">','<div class="layui-colorpicker-main-wrapper">','<div class="layui-colorpicker-basis">','<div class="layui-colorpicker-basis-white"></div>','<div class="layui-colorpicker-basis-black"></div>','<div class="layui-colorpicker-basis-cursor"></div>',"</div>",'<div class="layui-colorpicker-side">','<div class="layui-colorpicker-side-slider"></div>',"</div>","</div>",'<div class="layui-colorpicker-main-alpha '+(i.alpha?"layui-show":"")+'">','<div class="layui-colorpicker-alpha-bgcolor">','<div class="layui-colorpicker-alpha-slider"></div>',"</div>","</div>",i.predefine?(o=['<div class="layui-colorpicker-main-pre">'],layui.each(i.colors,function(e,i){o.push(['<div class="layui-colorpicker-pre'+(3<(i.match(/[0-9]{1,3}/g)||[]).length?" layui-colorpicker-pre-isalpha":"")+'">','<div style="background:'+i+'"></div>',"</div>"].join(""))}),o.push("</div>"),o.join("")):"",'<div class="layui-colorpicker-main-input">','<div class="layui-inline">','<input type="text" class="layui-input">',"</div>",'<div class="layui-btn-container">','<button class="layui-btn layui-btn-primary layui-btn-sm" colorpicker-events="clear">\u6e05\u7a7a</button>','<button class="layui-btn layui-btn-sm" colorpicker-events="confirm">\u786e\u5b9a</button>',"</div","</div>","</div>"].join(""));e.elemColorBox.find("."+P)[0];y(l)[0]&&y(l).data("index")==e.index?e.removePicker(c.thisElemInd):(e.removePicker(c.thisElemInd),y("body").append(i)),c.thisElemInd=e.index,c.thisColor=r.style.background,e.position(),e.pickerEvents()},c.prototype.removePicker=function(e){this.config;return y("#layui-colorpicker"+(e||this.index)).remove(),this},c.prototype.position=function(){var e=this,i=e.config;return o.position(e.bindElem||e.elemColorBox[0],e.elemPicker[0],{position:i.position,align:"center"}),e},c.prototype.val=function(){var e,i=this,o=(i.config,i.elemColorBox.find("."+P)),r=i.elemPicker.find("."+F),n=o[0].style.backgroundColor;n?(e=H(Y(n)),o=o.attr("lay-type"),i.select(e.h,e.s,e.b),"torgb"===o&&r.find("input").val(n),"rgba"===o&&(e=Y(n),3==(n.match(/[0-9]{1,3}/g)||[]).length?(r.find("input").val("rgba("+e.r+", "+e.g+", "+e.b+", 1)"),i.elemPicker.find("."+j).css("left",280)):(r.find("input").val(n),o=280*n.slice(n.lastIndexOf(",")+1,n.length-1),i.elemPicker.find("."+j).css("left",o)),i.elemPicker.find("."+D)[0].style.background="linear-gradient(to right, rgba("+e.r+", "+e.g+", "+e.b+", 0), rgb("+e.r+", "+e.g+", "+e.b+"))")):(i.select(0,100,100),r.find("input").val(""),i.elemPicker.find("."+D)[0].style.background="",i.elemPicker.find("."+j).css("left",280))},c.prototype.side=function(){var n=this,l=n.config,t=n.elemColorBox.find("."+P),c=t.attr("lay-type"),a=n.elemPicker.find(".layui-colorpicker-side"),e=n.elemPicker.find("."+B),s=n.elemPicker.find("."+w),r=n.elemPicker.find("."+E),d=n.elemPicker.find("."+D),f=n.elemPicker.find("."+j),u=e[0].offsetTop/180*360,p=100-(r[0].offsetTop+3)/180*100,g=(r[0].offsetLeft+3)/260*100,h=Math.round(f[0].offsetLeft/280*100)/100,v=n.elemColorBox.find("."+C),i=n.elemPicker.find(".layui-colorpicker-pre").children("div"),b=function(e,i,o,r){n.select(e,i,o);e=M({h:e,s:i,b:o});v.addClass(m).removeClass(x),t[0].style.background="rgb("+e.r+", "+e.g+", "+e.b+")","torgb"===c&&n.elemPicker.find("."+F).find("input").val("rgb("+e.r+", "+e.g+", "+e.b+")"),"rgba"===c&&(f.css("left",280*r),n.elemPicker.find("."+F).find("input").val("rgba("+e.r+", "+e.g+", "+e.b+", "+r+")"),t[0].style.background="rgba("+e.r+", "+e.g+", "+e.b+", "+r+")",d[0].style.background="linear-gradient(to right, rgba("+e.r+", "+e.g+", "+e.b+", 0), rgb("+e.r+", "+e.g+", "+e.b+"))"),l.change&&l.change(n.elemPicker.find("."+F).find("input").val())},o=y(['<div class="layui-auxiliar-moving" id="LAY-colorpicker-moving"></div>'].join("")),k=function(e){y("#LAY-colorpicker-moving")[0]||y("body").append(o),o.on("mousemove",e),o.on("mouseup",function(){o.remove()}).on("mouseleave",function(){o.remove()})};e.on("mousedown",function(e){var r=this.offsetTop,n=e.clientY;k(function(e){var i=r+(e.clientY-n),o=a[0].offsetHeight,o=(i=o<(i=i<0?0:i)?o:i)/180*360;b(u=o,g,p,h),e.preventDefault()}),e.preventDefault()}),a.on("click",function(e){var i=e.clientY-y(this).offset().top,i=(i=(i=i<0?0:i)>this.offsetHeight?this.offsetHeight:i)/180*360;b(u=i,g,p,h),e.preventDefault()}),r.on("mousedown",function(e){var l=this.offsetTop,t=this.offsetLeft,c=e.clientY,a=e.clientX;layui.stope(e),k(function(e){var i=l+(e.clientY-c),o=t+(e.clientX-a),r=s[0].offsetHeight-3,n=s[0].offsetWidth-3,n=((o=n<(o=o<-3?-3:o)?n:o)+3)/260*100,o=100-((i=r<(i=i<-3?-3:i)?r:i)+3)/180*100;b(u,g=n,p=o,h),e.preventDefault()}),e.preventDefault()}),s.on("mousedown",function(e){var i=e.clientY-y(this).offset().top-3+I.scrollTop(),o=e.clientX-y(this).offset().left-3+I.scrollLeft(),o=((i=i<-3?-3:i)>this.offsetHeight-3&&(i=this.offsetHeight-3),((o=(o=o<-3?-3:o)>this.offsetWidth-3?this.offsetWidth-3:o)+3)/260*100),i=100-(i+3)/180*100;b(u,g=o,p=i,h),layui.stope(e),e.preventDefault(),r.trigger(e,"mousedown")}),f.on("mousedown",function(e){var r=this.offsetLeft,n=e.clientX;k(function(e){var i=r+(e.clientX-n),o=d[0].offsetWidth,o=(o<(i=i<0?0:i)&&(i=o),Math.round(i/280*100)/100);b(u,g,p,h=o),e.preventDefault()}),e.preventDefault()}),d.on("click",function(e){var i=e.clientX-y(this).offset().left,i=((i=i<0?0:i)>this.offsetWidth&&(i=this.offsetWidth),Math.round(i/280*100)/100);b(u,g,p,h=i),e.preventDefault()}),i.each(function(){y(this).on("click",function(){y(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e=this.style.backgroundColor,i=H(Y(e)),o=e.slice(e.lastIndexOf(",")+1,e.length-1);u=i.h,g=i.s,p=i.b,3==(e.match(/[0-9]{1,3}/g)||[]).length&&(o=1),h=o,b(i.h,i.s,i.b,o)})})},c.prototype.select=function(e,i,o,r){var n=this,l=(n.config,f({h:e,s:100,b:100})),t=f({h:e,s:i,b:o}),e=e/360*180,o=180-o/100*180-3,i=i/100*260-3;n.elemPicker.find("."+B).css("top",e),n.elemPicker.find("."+w)[0].style.background="#"+l,n.elemPicker.find("."+E).css({top:o,left:i}),"change"!==r&&n.elemPicker.find("."+F).find("input").val("#"+t)},c.prototype.pickerEvents=function(){var c=this,a=c.config,s=c.elemColorBox.find("."+P),d=c.elemPicker.find("."+F+" input"),o={clear:function(e){s[0].style.background="",c.elemColorBox.find("."+C).removeClass(m).addClass(x),c.color="",a.done&&a.done(""),c.removePicker()},confirm:function(e,i){var o,r,n=d.val(),l=n,t={};if(-1<n.indexOf(",")?(t=H(Y(n)),c.select(t.h,t.s,t.b),s[0].style.background=l="#"+f(t),3<(n.match(/[0-9]{1,3}/g)||[]).length&&"rgba"===s.attr("lay-type")&&(o=280*n.slice(n.lastIndexOf(",")+1,n.length-1),c.elemPicker.find("."+j).css("left",o),l=s[0].style.background=n)):(3==(o=-1<(o=n).indexOf("#")?o.substring(1):o).length&&(o=(r=o.split(""))[0]+r[0]+r[1]+r[1]+r[2]+r[2]),r={r:(o=parseInt(o,16))>>16,g:(65280&o)>>8,b:255&o},t=H(r),s[0].style.background=l="#"+f(t),c.elemColorBox.find("."+C).removeClass(x).addClass(m)),"change"===i)return c.select(t.h,t.s,t.b,i),void(a.change&&a.change(l));c.color=n,a.done&&a.done(n),c.removePicker()}};c.elemPicker.on("click","*[colorpicker-events]",function(){var e=y(this),i=e.attr("colorpicker-events");o[i]&&o[i].call(this,e)}),d.on("keyup",function(e){var i=y(this);o.confirm.call(this,i,13===e.keyCode?null:"change")})},c.prototype.events=function(){var i=this,e=i.config,o=i.elemColorBox.find("."+P);i.elemColorBox.on("click",function(){i.renderPicker(),y(l)[0]&&(i.val(),i.side())}),e.elem[0]&&!i.elemColorBox[0].eventHandler&&(t.on(r,function(e){y(e.target).hasClass(n)||y(e.target).parents("."+n)[0]||y(e.target).hasClass(l.replace(/\./g,""))||y(e.target).parents(l)[0]||i.elemPicker&&(i.color?(e=H(Y(i.color)),i.select(e.h,e.s,e.b)):i.elemColorBox.find("."+C).removeClass(m).addClass(x),o[0].style.background=i.color||"",i.removePicker())}),I.on("resize",function(){if(!i.elemPicker||!y(l)[0])return!1;i.position()}),i.elemColorBox[0].eventHandler=!0)},i.render=function(e){e=new c(e);return function(){return{config:this.config}}.call(e)},e("colorpicker",i)});layui.define("jquery",function(t){"use strict";var u=layui.$,d=(layui.hint(),layui.device()),c="element",r="layui-this",y="layui-show",i=function(){this.config={}},h=(i.prototype.set=function(t){return u.extend(!0,this.config,t),this},i.prototype.on=function(t,i){return layui.onevent.call(this,c,t,i)},i.prototype.tabAdd=function(t,i){var a,t=u(".layui-tab[lay-filter="+t+"]"),e=t.children(".layui-tab-title"),l=e.children(".layui-tab-bar"),t=t.children(".layui-tab-content"),n="<li"+(a=[],layui.each(i,function(t,i){/^(title|content)$/.test(t)||a.push("lay-"+t+'="'+i+'"')}),0<a.length&&a.unshift(""),a.join(" "))+">"+(i.title||"unnaming")+"</li>";return l[0]?l.before(n):e.append(n),t.append('<div class="layui-tab-item">'+(i.content||"")+"</div>"),C.hideTabMore(!0),C.tabAuto(),this},i.prototype.tabDelete=function(t,i){t=u(".layui-tab[lay-filter="+t+"]").children(".layui-tab-title").find('>li[lay-id="'+i+'"]');return C.tabDelete(null,t),this},i.prototype.tabChange=function(t,i){t=u(".layui-tab[lay-filter="+t+"]").children(".layui-tab-title").find('>li[lay-id="'+i+'"]');return C.tabClick.call(t[0],null,null,t),this},i.prototype.tab=function(a){a=a||{},e.on("click",a.headerElem,function(t){var i=u(this).index();C.tabClick.call(this,t,i,null,a)})},i.prototype.progress=function(t,i){var a="layui-progress",t=u("."+a+"[lay-filter="+t+"]").find("."+a+"-bar"),a=t.find("."+a+"-text");return t.css("width",i).attr("lay-percent",i),a.text(i),this},".layui-nav"),f="layui-nav-item",l="layui-nav-bar",p="layui-nav-tree",b="layui-nav-child",v="layui-nav-more",m="layui-anim layui-anim-upbit",C={tabClick:function(t,i,a,e){e=e||{};var a=a||u(this),i=i||a.parent().children("li").index(a),l=e.headerElem?a.parent():a.parents(".layui-tab").eq(0),e=e.bodyElem?u(e.bodyElem):l.children(".layui-tab-content").children(".layui-tab-item"),n=a.find("a"),n="javascript:;"!==n.attr("href")&&"_blank"===n.attr("target"),s="string"==typeof a.attr("lay-unselect"),o=l.attr("lay-filter");n||s||(a.addClass(r).siblings().removeClass(r),e.eq(i).addClass(y).siblings().removeClass(y)),layui.event.call(this,c,"tab("+o+")",{elem:l,index:i})},tabDelete:function(t,i){var i=i||u(this).parent(),a=i.index(),e=i.parents(".layui-tab").eq(0),l=e.children(".layui-tab-content").children(".layui-tab-item"),n=e.attr("lay-filter");i.hasClass(r)&&(i.next()[0]&&i.next().is("li")?C.tabClick.call(i.next()[0],null,a+1):i.prev()[0]&&i.prev().is("li")&&C.tabClick.call(i.prev()[0],null,a-1)),i.remove(),l.eq(a).remove(),setTimeout(function(){C.tabAuto()},50),layui.event.call(this,c,"tabDelete("+n+")",{elem:e,index:a})},tabAuto:function(){var e="layui-tab-bar",l="layui-tab-close",n=this;u(".layui-tab").each(function(){var t=u(this),i=t.children(".layui-tab-title"),a=(t.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),a=u('<span class="layui-unselect layui-tab-bar" '+a+"><i "+a+' class="layui-icon"></i></span>');n===window&&8!=d.ie&&C.hideTabMore(!0),t.attr("lay-allowClose")&&i.find("li").each(function(){var t,i=u(this);i.find("."+l)[0]||((t=u('<i class="layui-icon layui-icon-close layui-unselect '+l+'"></i>')).on("click",C.tabDelete),i.append(t))}),"string"!=typeof t.attr("lay-unauto")&&(i.prop("scrollWidth")>i.outerWidth()+1?i.find("."+e)[0]||(i.append(a),t.attr("overflow",""),a.on("click",function(t){i[this.title?"removeClass":"addClass"]("layui-tab-more"),this.title=this.title?"":"\u6536\u7f29"})):(i.find("."+e).remove(),t.removeAttr("overflow")))})},hideTabMore:function(t){var i=u(".layui-tab-title");!0!==t&&"tabmore"===u(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=u(this),i=t.parents(h),a=i.attr("lay-filter"),e=t.parent(),l=t.siblings("."+b),n="string"==typeof e.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||n||l[0]||(i.find("."+r).removeClass(r),e.addClass(r)),i.hasClass(p)&&(l.removeClass(m),l[0]&&(e["none"===l.css("display")?"addClass":"removeClass"](f+"ed"),"all"===i.attr("lay-shrink")&&e.siblings().removeClass(f+"ed"))),layui.event.call(this,c,"nav("+a+")",t)},collapse:function(){var t=u(this),i=t.find(".layui-colla-icon"),a=t.siblings(".layui-colla-content"),e=t.parents(".layui-collapse").eq(0),l=e.attr("lay-filter"),n="none"===a.css("display");"string"==typeof e.attr("lay-accordion")&&((e=e.children(".layui-colla-item").children("."+y)).siblings(".layui-colla-title").children(".layui-colla-icon").html(""),e.removeClass(y)),a[n?"addClass":"removeClass"](y),i.html(n?"":""),layui.event.call(this,c,"collapse("+l+")",{title:t,content:a,show:n})}},a=(i.prototype.render=i.prototype.init=function(t,i){var a=i?'[lay-filter="'+i+'"]':"",i={tab:function(){C.tabAuto.call({})},nav:function(){var s={},o={},c={},r="layui-nav-title";u(h+a).each(function(t){var i=u(this),a=u('<span class="'+l+'"></span>'),e=i.find("."+f);i.find("."+l)[0]||(i.append(a),(i.hasClass(p)?e.find("dd,>."+r):e).on("mouseenter",function(){!function(t,i,a){var e,l=u(this),n=l.find("."+b);i.hasClass(p)?n[0]||(e=l.children("."+r),t.css({top:l.offset().top-i.offset().top,height:(e[0]?e:l).outerHeight(),opacity:1})):(n.addClass(m),n.hasClass("layui-nav-child-c")&&n.css({left:-(n.outerWidth()-l.width())/2}),n[0]?t.css({left:t.position().left+t.width()/2,width:0,opacity:0}):t.css({left:l.position().left+parseFloat(l.css("marginLeft")),top:l.position().top+l.height()-t.height()}),s[a]=setTimeout(function(){t.css({width:n[0]?0:l.width(),opacity:n[0]?0:1})},d.ie&&d.ie<10?0:200),clearTimeout(c[a]),"block"===n.css("display")&&clearTimeout(o[a]),o[a]=setTimeout(function(){n.addClass(y),l.find("."+v).addClass(v+"d")},300))}.call(this,a,i,t)}).on("mouseleave",function(){i.hasClass(p)?a.css({height:0,opacity:0}):(clearTimeout(o[t]),o[t]=setTimeout(function(){i.find("."+b).removeClass(y),i.find("."+v).removeClass(v+"d")},300))}),i.on("mouseleave",function(){clearTimeout(s[t]),c[t]=setTimeout(function(){i.hasClass(p)||a.css({width:0,left:a.position().left+a.width()/2,opacity:0})},200)})),e.find("a").each(function(){var t=u(this);t.parent();t.siblings("."+b)[0]&&!t.children("."+v)[0]&&t.append('<i class="layui-icon layui-icon-down '+v+'"></i>'),t.off("click",C.clickThis).on("click",C.clickThis)})})},breadcrumb:function(){u(".layui-breadcrumb"+a).each(function(){var t=u(this),i="lay-separator",a=t.attr(i)||"/",e=t.find("a");e.next("span["+i+"]")[0]||(e.each(function(t){t!==e.length-1&&u(this).after("<span "+i+">"+a+"</span>")}),t.css("visibility","visible"))})},progress:function(){var e="layui-progress";u("."+e+a).each(function(){var t=u(this),i=t.find(".layui-progress-bar"),a=i.attr("lay-percent");i.css("width",/^.+\/.+$/.test(a)?100*new Function("return "+a)()+"%":a),t.attr("lay-showPercent")&&setTimeout(function(){i.html('<span class="'+e+'-text">'+a+"</span>")},350)})},collapse:function(){u(".layui-collapse"+a).each(function(){u(this).find(".layui-colla-item").each(function(){var t=u(this),i=t.find(".layui-colla-title"),t="none"===t.find(".layui-colla-content").css("display");i.find(".layui-colla-icon").remove(),i.append('<i class="layui-icon layui-colla-icon">'+(t?"":"")+"</i>"),i.off("click",C.collapse).on("click",C.collapse)})})}};return i[t]?i[t]():layui.each(i,function(t,i){i()})},new i),e=u(document);u(function(){a.render()});e.on("click",".layui-tab-title li",C.tabClick),e.on("click",C.hideTabMore),u(window).on("resize",C.tabAuto),t(c,a)});layui.define("layer",function(e){"use strict";var v=layui.$,t=layui.layer,r=layui.hint(),y=layui.device(),i={config:{},set:function(e){var t=this;return t.config=v.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,n,e,t)}},n="upload",o="layui-upload-file",a="layui-upload-form",F="layui-upload-iframe",b="layui-upload-choose",x=function(e){var t=this;t.config=v.extend({},t.config,i.config,e),t.render()};x.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",force:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},x.prototype.render=function(e){var t=this;(e=t.config).elem=v(e.elem),e.bindAction=v(e.bindAction),t.file(),t.events()},x.prototype.file=function(){var e=this,t=e.config,i=e.elemFile=v(['<input class="'+o+'" type="file" accept="'+t.acceptMime+'" name="'+t.field+'"',t.multiple?" multiple":"",">"].join("")),n=t.elem.next();(n.hasClass(o)||n.hasClass(a))&&n.remove(),y.ie&&y.ie<10&&t.elem.wrap('<div class="layui-upload-wrap"></div>'),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(i),y.ie&&y.ie<10&&e.initIE()},x.prototype.initIE=function(){var i,e=this.config,t=v('<iframe id="'+F+'" class="'+F+'" name="'+F+'" frameborder="0"></iframe>'),n=v(['<form target="'+F+'" class="'+a+'" method="post" key="set-mine" enctype="multipart/form-data" action="'+e.url+'">',"</form>"].join(""));v("#"+F)[0]||v("body").append(t),e.elem.next().hasClass(a)||(this.elemFile.wrap(n),e.elem.next("."+a).append((i=[],layui.each(e.data,function(e,t){t="function"==typeof t?t():t,i.push('<input type="hidden" name="'+e+'" value="'+t+'">')}),i.join(""))))},x.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},x.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},x.prototype.preview=function(n){window.FileReader&&layui.each(this.chooseFiles,function(e,t){var i=new FileReader;i.readAsDataURL(t),i.onload=function(){n&&n(e,t,this.result)}})},x.prototype.upload=function(i,e){var n,o,t,a,l=this,r=l.config,u=l.elemFile[0],c=function(){var t=0,o=0,e=i||l.files||l.chooseFiles||u.files,a=function(){r.multiple&&t+o===l.fileLength&&"function"==typeof r.allDone&&r.allDone({total:l.fileLength,successful:t,failed:o})};layui.each(e,function(i,e){var n=new FormData,e=(n.append(r.field,e),layui.each(r.data,function(e,t){t="function"==typeof t?t():t,n.append(e,t)}),{url:r.url,type:"post",data:n,contentType:!1,processData:!1,dataType:"json",headers:r.headers||{},success:function(e){t++,f(i,e),a()},error:function(e){o++,l.msg("Request URL is abnormal: "+(e.statusText||"error")),p(i),a()}});"function"==typeof r.progress&&(e.xhr=function(){var e=v.ajaxSettings.xhr();return e.upload.addEventListener("progress",function(e){var t;e.lengthComputable&&(t=Math.floor(e.loaded/e.total*100),r.progress(t,(r.item||r.elem)[0],e,i))}),e}),v.ajax(e)})},s=function(){var n=v("#"+F);l.elemFile.parent().submit(),clearInterval(x.timer),x.timer=setInterval(function(){var e,t=n.contents().find("body");try{e=t.text()}catch(i){l.msg("Cross-domain requests are not supported"),clearInterval(x.timer),p()}e&&(clearInterval(x.timer),t.html(""),f(0,e))},30)},f=function(e,t){if(l.elemFile.next("."+b).remove(),u.value="","json"===r.force&&"object"!=typeof t)try{t=JSON.parse(t)}catch(i){return t={},l.msg("Please return JSON data format")}"function"==typeof r.done&&r.done(t,e||0,function(e){l.upload(e)})},p=function(e){r.auto&&(u.value=""),"function"==typeof r.error&&r.error(e||0,function(e){l.upload(e)})},d=r.exts,m=(o=[],layui.each(i||l.chooseFiles,function(e,t){o.push(t.name)}),o),h={preview:function(e){l.preview(e)},upload:function(e,t){var i={};i[e]=t,l.upload(i)},pushFile:function(){return l.files=l.files||{},layui.each(l.chooseFiles,function(e,t){l.files[e]=t}),l.files},resetFile:function(e,t,i){t=new File([t],i);l.files=l.files||{},l.files[e]=t}},g={file:"\u6587\u4ef6",images:"\u56fe\u7247",video:"\u89c6\u9891",audio:"\u97f3\u9891"}[r.accept]||"\u6587\u4ef6",m=0===m.length?u.value.match(/[^\/\\]+\..+/g)||[]||"":m;if(0!==m.length){switch(r.accept){case"file":layui.each(m,function(e,t){if(d&&!RegExp(".\\.("+d+")$","i").test(escape(t)))return n=!0});break;case"video":layui.each(m,function(e,t){if(!RegExp(".\\.("+(d||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(t)))return n=!0});break;case"audio":layui.each(m,function(e,t){if(!RegExp(".\\.("+(d||"mp3|wav|mid")+")$","i").test(escape(t)))return n=!0});break;default:layui.each(m,function(e,t){if(!RegExp(".\\.("+(d||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(t)))return n=!0})}if(n)return l.msg("\u9009\u62e9\u7684"+g+"\u4e2d\u5305\u542b\u4e0d\u652f\u6301\u7684\u683c\u5f0f"),u.value="";if("choose"!==e&&!r.auto||(r.choose&&r.choose(h),"choose"!==e)){if(l.fileLength=(t=0,g=i||l.files||l.chooseFiles||u.files,layui.each(g,function(){t++}),t),r.number&&l.fileLength>r.number)return l.msg("\u540c\u65f6\u6700\u591a\u53ea\u80fd\u4e0a\u4f20: "+r.number+" \u4e2a\u6587\u4ef6<br>\u60a8\u5f53\u524d\u5df2\u7ecf\u9009\u62e9\u4e86: "+l.fileLength+" \u4e2a\u6587\u4ef6");if(0<r.size&&!(y.ie&&y.ie<10))if(layui.each(l.chooseFiles,function(e,t){t.size>1024*r.size&&(t=1<=(t=r.size/1024)?t.toFixed(2)+"MB":r.size+"KB",u.value="",a=t)}),a)return l.msg("\u6587\u4ef6\u5927\u5c0f\u4e0d\u80fd\u8d85\u8fc7 "+a);if(!r.before||!1!==r.before(h))y.ie?(9<y.ie?c:s)():c()}}},x.prototype.reload=function(e){delete(e=e||{}).elem,delete e.bindAction;(e=this.config=v.extend({},this.config,i.config,e)).elem.next().attr({name:e.name,accept:e.acceptMime,multiple:e.multiple})},x.prototype.events=function(){var n=this,o=n.config,a=function(e){n.chooseFiles={},layui.each(e,function(e,t){var i=(new Date).getTime();n.chooseFiles[i+"-"+e]=t})},l=function(e,t){var i=n.elemFile,e=(o.item||o.elem,1<e.length?e.length+"\u4e2a\u6587\u4ef6":(e[0]||{}).name||i[0].value.match(/[^\/\\]+\..+/g)||[]||"");i.next().hasClass(b)&&i.next().remove(),n.upload(null,"choose"),n.isFile()||o.choose||i.after('<span class="layui-inline '+b+'">'+e+"</span>")};o.elem.off("upload.start").on("upload.start",function(){var e=v(this),t=e.attr("lay-data");if(t)try{t=new Function("return "+t)(),n.config=v.extend({},o,t)}catch(i){r.error("Upload element property lay-data configuration item has a syntax error: "+t)}n.config.item=e,n.elemFile[0].click()}),y.ie&&y.ie<10||o.elem.off("upload.over").on("upload.over",function(){v(this).attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){v(this).removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(e,t){var i=v(this),t=t.originalEvent.dataTransfer.files||[];i.removeAttr("lay-over"),a(t),o.auto?n.upload():l(t)}),n.elemFile.off("upload.change").on("upload.change",function(){var e=this.files||[];a(e),o.auto?n.upload():l(e)}),o.bindAction.off("upload.action").on("upload.action",function(){n.upload()}),o.elem.data("haveEvents")||(n.elemFile.on("change",function(){v(this).trigger("upload.change")}),o.elem.on("click",function(){n.isFile()||v(this).trigger("upload.start")}),o.drag&&o.elem.on("dragover",function(e){e.preventDefault(),v(this).trigger("upload.over")}).on("dragleave",function(e){v(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),v(this).trigger("upload.drop",e)}),o.bindAction.on("click",function(){v(this).trigger("upload.action")}),o.elem.data("haveEvents",!0))},i.render=function(e){e=new x(e);return function(){var t=this;return{upload:function(e){t.upload.call(t,e)},reload:function(e){t.reload.call(t,e)},config:t.config}}.call(e)},e(n,i)});layui.define("layer",function(e){"use strict";var C=layui.$,h=layui.layer,l=layui.hint(),w=(layui.device(),"form"),s=".layui-form",T="layui-this",$="layui-hide",E="layui-disabled",t=function(){this.config={verify:{required:[/[\S]+/,"\u5fc5\u586b\u9879\u4e0d\u80fd\u4e3a\u7a7a"],phone:[/^1\d{10}$/,"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u624b\u673a\u53f7"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"\u90ae\u7bb1\u683c\u5f0f\u4e0d\u6b63\u786e"],url:[/^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/,"\u94fe\u63a5\u683c\u5f0f\u4e0d\u6b63\u786e"],number:function(e){if(!e||isNaN(e))return"\u53ea\u80fd\u586b\u5199\u6570\u5b57"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"\u65e5\u671f\u683c\u5f0f\u4e0d\u6b63\u786e"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u8eab\u4efd\u8bc1\u53f7"]},autocomplete:null}},i=(t.prototype.set=function(e){return C.extend(!0,this.config,e),this},t.prototype.verify=function(e){return C.extend(!0,this.config.verify,e),this},t.prototype.getFormElem=function(e){return C(s+(e?'[lay-filter="'+e+'"]':""))},t.prototype.on=function(e,t){return layui.onevent.call(this,w,e,t)},t.prototype.val=function(e,i){return this.getFormElem(e).each(function(e,t){var a=C(this);layui.each(i,function(e,t){var i,e=a.find('[name="'+e+'"]');e[0]&&("checkbox"===(i=e[0].type)?e[0].checked=t:"radio"===i?e.each(function(){this.value==t&&(this.checked=!0)}):e.val(t))})}),r.render(null,e),this.getValue(e)},t.prototype.getValue=function(e,t){t=t||this.getFormElem(e);var a={},n={},e=t.find("input,select,textarea");return layui.each(e,function(e,t){var i;C(this);t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name&&(/^.*\[\]$/.test(t.name)&&(i=t.name.match(/^(.*)\[\]$/g)[0],a[i]=0|a[i],i=t.name.replace(/^(.*)\[\]$/,"$1["+a[i]+++"]")),/^checkbox|radio$/.test(t.type)&&!t.checked||(n[i||t.name]=t.value))}),n},t.prototype.render=function(e,t){var i=this.config,a=C(s+(t?'[lay-filter="'+t+'"]':"")),n={input:function(e){e=e||a.find("input,textarea");i.autocomplete&&e.attr("autocomplete",i.autocomplete)},select:function(e){var p,c="\u8bf7\u9009\u62e9",m="layui-form-select",g="layui-select-title",k="layui-select-none",x="",e=e||a.find("select"),b=function(e,t){C(e.target).parent().hasClass(g)&&!t||(C("."+m).removeClass(m+"ed "+m+"up"),p&&x&&p.val(x)),p=null},u=function(a,e,t){var o,r,i,n,s,l,c=C(this),u=a.find("."+g),d=u.find("input"),f=a.find("dl"),h=f.children("dd"),y=f.children("dt"),v=this.selectedIndex;e||(r=c.attr("lay-search"),i=function(){var e=a.offset().top+a.outerHeight()+5-q.scrollTop(),t=f.outerHeight();v=c[0].selectedIndex,a.addClass(m+"ed"),h.removeClass($),y.removeClass($),o=null,h.eq(v).addClass(T).siblings().removeClass(T),e+t>q.height()&&t<=e&&a.addClass(m+"up"),s()},n=function(e){a.removeClass(m+"ed "+m+"up"),d.blur(),o=null,e||l(d.val(),function(e){var t=c[0].selectedIndex;e&&(x=C(c[0].options[t]).html(),0===t&&x===d.attr("placeholder")&&(x=""),d.val(x||""))})},s=function(){var e,t,i=f.children("dd."+T);i[0]&&(e=i.position().top,t=f.height(),i=i.height(),t<e&&f.scrollTop(e+f.scrollTop()-t+i-5),e<0&&f.scrollTop(e+f.scrollTop()-5))},u.on("click",function(e){a.hasClass(m+"ed")?n():(b(e,!0),i()),f.find("."+k).remove()}),u.find(".layui-edge").on("click",function(){d.focus()}),d.on("keyup",function(e){9===e.keyCode&&i()}).on("keydown",function(l){var e=l.keyCode,r=(9===e&&n(),function(a,n){l.preventDefault();var e=function(){var e=f.children("dd."+T);if(f.children("dd."+$)[0]&&"next"===a){var t=f.children("dd:not(."+$+",."+E+")"),i=t.eq(0).index();if(0<=i&&i<e.index()&&!t.hasClass(T))return t.eq(0).prev()[0]?t.eq(0).prev():f.children(":last")}return n&&n[0]?n:o&&o[0]?o:e}(),t=e[a](),i=e[a]("dd:not(."+$+")");return t[0]?(o=e[a](),i[0]&&!i.hasClass(E)||!o[0]?(i.addClass(T).siblings().removeClass(T),void s()):r(a,o)):o=null});38===e&&r("prev"),40===e&&r("next"),13===e&&(l.preventDefault(),f.children("dd."+T).trigger("click"))}),l=function(a,e,n){var l=0,t=(layui.each(h,function(){var e=C(this),t=e.text(),i=("exact"!==r&&(t=t.toLowerCase(),a=a.toLowerCase()),-1===t.indexOf(a));(""===a||"blur"===n?a!==t:i)&&l++,"keyup"===n&&e[i?"addClass":"removeClass"]($)}),"keyup"===n&&layui.each(y,function(){var e=C(this),t=e.nextUntil("dt").filter("dd");e[t.length==t.filter("."+$).length?"addClass":"removeClass"]($)}),l===h.length);return e(t),t},t&&d.on("keyup",function(e){var t=this.value,e=e.keyCode;if(9===e||13===e||37===e||38===e||39===e||40===e)return!1;l(t,function(e){e?f.find("."+k)[0]||f.append('<p class="'+k+'">\u65e0\u5339\u914d\u9879</p>'):f.find("."+k).remove()},"keyup"),""===t&&f.find("."+k).remove(),s()}).on("blur",function(e){var t=c[0].selectedIndex;p=d,x=C(c[0].options[t]).html(),0===t&&x===d.attr("placeholder")&&(x=""),setTimeout(function(){l(d.val(),function(e){x||d.val("")},"blur")},200)}),h.on("click",function(){var e=C(this),t=e.attr("lay-value"),i=c.attr("lay-filter");return e.hasClass(E)||(e.hasClass("layui-select-tips")?d.val(""):(d.val(e.text()),e.addClass(T)),e.siblings().removeClass(T),c.val(t).removeClass("layui-form-danger"),layui.event.call(this,w,"select("+i+")",{elem:c[0],value:t,othis:a}),n(!0)),!1}),a.find("dl>dt").on("click",function(e){return!1}),C(document).off("click",b).on("click",b))};e.each(function(e,t){var i=C(this),a=i.next("."+m),n=this.disabled,l=t.value,r=C(t.options[t.selectedIndex]),t=t.options[0];if("string"==typeof i.attr("lay-ignore"))return i.show();var o,s="string"==typeof i.attr("lay-search"),t=t&&!t.value&&t.innerHTML||c,r=C(['<div class="'+(s?"":"layui-unselect ")+m,(n?" layui-select-disabled":"")+'">','<div class="'+g+'">','<input type="text" placeholder="'+C.trim(t)+'" value="'+C.trim(l?r.html():"")+'"'+(!n&&s?"":" readonly")+' class="layui-input'+(s?"":" layui-unselect")+(n?" "+E:"")+'">','<i class="layui-edge"></i></div>','<dl class="layui-anim layui-anim-upbit'+(i.find("optgroup")[0]?" layui-select-group":"")+'">',(t=i.find("*"),o=[],layui.each(t,function(e,t){0!==e||t.value?"optgroup"===t.tagName.toLowerCase()?o.push("<dt>"+t.label+"</dt>"):o.push('<dd lay-value="'+t.value+'" class="'+(l===t.value?T:"")+(t.disabled?" "+E:"")+'">'+C.trim(t.innerHTML)+"</dd>"):o.push('<dd lay-value="" class="layui-select-tips">'+C.trim(t.innerHTML||c)+"</dd>")}),0===o.length&&o.push('<dd lay-value="" class="'+E+'">\u6ca1\u6709\u9009\u9879</dd>'),o.join("")+"</dl>"),"</div>"].join(""));a[0]&&a.remove(),i.after(r),u.call(this,r,n,s)})},checkbox:function(e){var s={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},e=e||a.find("input[type=checkbox]");e.each(function(e,t){var i=C(this),a=i.attr("lay-skin"),n=(i.attr("lay-text")||"").split("|"),l=this.disabled,r=s[a="switch"===a?"_"+a:a]||s.checkbox;if("string"==typeof i.attr("lay-ignore"))return i.show();var o=i.next("."+r[0]),t=C(['<div class="layui-unselect '+r[0],t.checked?" "+r[1]:"",l?" layui-checkbox-disabled "+E:"",'"',a?' lay-skin="'+a+'"':"",">",(l={checkbox:[t.title.replace(/\s/g,"")?"<span>"+t.title+"</span>":"",'<i class="layui-icon layui-icon-ok"></i>'].join(""),_switch:"<em>"+((t.checked?n[0]:n[1])||"")+"</em><i></i>"})[a]||l.checkbox,"</div>"].join(""));o[0]&&o.remove(),i.after(t),function(i,a){var n=C(this);i.on("click",function(){var e=n.attr("lay-filter"),t=(n.attr("lay-text")||"").split("|");n[0].disabled||(n[0].checked?(n[0].checked=!1,i.removeClass(a[1]).find("em").text(t[1])):(n[0].checked=!0,i.addClass(a[1]).find("em").text(t[0])),layui.event.call(n[0],w,a[2]+"("+e+")",{elem:n[0],value:n[0].value,othis:i}))})}.call(this,t,r)})},radio:function(e){var r="layui-form-radio",o=["",""],e=e||a.find("input[type=radio]");e.each(function(e,t){var i=C(this),a=i.next("."+r),n=this.disabled;if("string"==typeof i.attr("lay-ignore"))return i.show();a[0]&&a.remove();n=C(['<div class="layui-unselect '+r,t.checked?" "+r+"ed":"",(n?" layui-radio-disabled "+E:"")+'">','<i class="layui-anim layui-icon">'+o[t.checked?0:1]+"</i>","<div>"+(a=t.title||"",a="string"==typeof i.next().attr("lay-radio")?i.next().html():a)+"</div>","</div>"].join(""));i.after(n),function(a){var n=C(this),l="layui-anim-scaleSpring";a.on("click",function(){var e=n[0].name,t=n.parents(s),i=n.attr("lay-filter"),e=t.find("input[name="+e.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(e,function(){var e=C(this).next("."+r);this.checked=!1,e.removeClass(r+"ed"),e.find(".layui-icon").removeClass(l).html(o[1])}),n[0].checked=!0,a.addClass(r+"ed"),a.find(".layui-icon").addClass(l).html(o[0]),layui.event.call(n[0],w,"radio("+i+")",{elem:n[0],value:n[0].value,othis:a}))})}.call(this,n)})}};return"object"===layui.type(e)?e.each(function(e,t){var i=C(t);i.closest(s).length&&("SELECT"===t.tagName?n.select(i):"INPUT"===t.tagName&&("checkbox"===(t=t.type)||"radio"===t?n[t](i):n.input(i)))}):e?n[e]?n[e]():l.error('\u4e0d\u652f\u6301\u7684 "'+e+'" \u8868\u5355\u6e32\u67d3'):layui.each(n,function(e,t){t()}),this},t.prototype.validate=function(e){var u=null,d=r.config.verify,f="layui-form-danger";return!(e=C(e))[0]||(e.attr("lay-verify")!==undefined||!1!==this.validate(e.find("*[lay-verify]")))&&(layui.each(e,function(e,r){var o=C(this),t=(o.attr("lay-verify")||"").split("|"),s=o.attr("lay-verType"),c=o.val();if(o.removeClass(f),layui.each(t,function(e,t){var i="",a=d[t];if(a){var n="function"==typeof a?i=a(c,r):!a[0].test(c),l="select"===r.tagName.toLowerCase()||/^checkbox|radio$/.test(r.type),i=i||a[1];if("required"===t&&(i=o.attr("lay-reqText")||i),n)return"tips"===s?h.tips(i,"string"!=typeof o.attr("lay-ignore")&&l?o.next():o,{tips:1}):"alert"===s?h.alert(i,{title:"\u63d0\u793a",shadeClose:!0}):/\bstring|number\b/.test(typeof i)&&h.msg(i,{icon:5,shift:6}),setTimeout(function(){(l?o.next().find("input"):r).focus()},7),o.addClass(f),u=!0}}),u)return u}),!u)},t.prototype.submit=function(e,t){var i=C(this),e="string"==typeof e?e:i.attr("lay-filter"),a=this.getFormElem?this.getFormElem(e):i.parents(s).eq(0),n=a.find("*[lay-verify]");if(!r.validate(n))return!1;n=r.getValue(null,a),a={elem:this.getFormElem?window.event&&window.event.target:this,form:(this.getFormElem?a:i.parents("form"))[0],field:n};return"function"==typeof t&&t(a),layui.event.call(this,w,"submit("+e+")",a)}),r=new t,t=C(document),q=C(window);C(function(){r.render()}),t.on("reset",s,function(){var e=C(this).attr("lay-filter");setTimeout(function(){r.render(null,e)},50)}),t.on("submit",s,i).on("click","*[lay-submit]",i),e(w,r)});layui.define(["laytpl","laypage","form","util"],function(e){"use strict";var m=layui.$,v=layui.laytpl,r=layui.laypage,g=layui.layer,y=layui.form,b=layui.util,f=layui.hint(),h=layui.device(),x={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX",disabledName:"LAY_DISABLED"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var t=this;return t.config=m.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,C,e,t)}},p=function(){var a=this,e=a.config,i=e.id||e.index;return i&&(p.that[i]=a,p.config[i]=e),{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){x.reloadData(i,e,t)},setColsWidth:function(){a.setColsWidth.call(a)},resize:function(){a.resize.call(a)}}},l=function(e){var t=p.config[e];return t||f.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},k=function(e){var t=this.config||{},a=(e=e||{}).item3,i=e.content,t=(("escape"in a?a:t).escape&&(i=b.escape(i)),e.text&&a.exportTemplet||a.templet||a.toolbar);return t&&(i="function"==typeof t?t.call(a,e.tplData,e.obj):v(m(t).html()||String(i)).render(m.extend({LAY_COL:a},e.tplData))),e.text?m("<div>"+i+"</div>").text():i},C="table",w="layui-hide",c="layui-hide-v",d="layui-none",s="layui-table-view",u=".layui-table-header",T=".layui-table-body",L=".layui-table-pageview",N=".layui-table-sort",D="layui-table-edit",A="layui-table-hover",E="layui-table-col-special",_="LAY_TABLE_MOVE_DICT",t=function(e){return['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{=d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{=d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>',"<thead>","{{# layui.each(d.data.cols, function(i1, item1){ }}","<tr>","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',(e=e||{}).fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':"","{{# var isSort = !(item2.colGroup) && item2.sort; }}",'<th data-field="{{= item2.field||i2 }}" data-key="{{=d.index}}-{{=i1}}-{{=i2}}" {{# if( item2.parentKey){ }}data-parentkey="{{= item2.parentKey }}"{{# } }} {{# if(item2.minWidth){ }}data-minwidth="{{=item2.minWidth}}"{{# } }} {{#if(item2.colspan){}} colspan="{{=item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{=item2.rowspan}}"{{#}}} {{# if(item2.unresize || item2.colGroup){ }}data-unresize="true"{{# } }} class="{{# if(item2.hide){ }}layui-hide{{# } }}{{# if(isSort){ }} layui-unselect{{# } }}{{# if(!item2.field){ }} layui-table-col-special{{# } }}">','<div class="layui-table-cell laytable-cell-',"{{# if(item2.colGroup){ }}","group","{{# } else { }}","{{=d.index}}-{{=i1}}-{{=i2}}",'{{# if(item2.type !== "normal"){ }}'," laytable-cell-{{= item2.type }}","{{# } }}","{{# } }}",'" {{#if(item2.align){}}align="{{=item2.align}}"{{#}}}>','{{# if(item2.type === "checkbox"){ }}','<input type="checkbox" name="layTableCheckbox" lay-skin="primary" lay-filter="layTableAllChoose" {{# if(item2[d.data.checkName]){ }}checked{{# }; }}>',"{{# } else { }}",'<span>{{-item2.title||""}}</span>',"{{# if(isSort){ }}",'<span class="layui-table-sort layui-inline"><i class="layui-edge layui-table-sort-asc" title="\u5347\u5e8f"></i><i class="layui-edge layui-table-sort-desc" title="\u964d\u5e8f"></i></span>',"{{# } }}","{{# } }}","</div>","</th>",e.fixed?"{{# }; }}":"","{{# }); }}","</tr>","{{# }); }}","</thead>","</table>"].join("")},a=['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{=d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{=d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>',"<tbody></tbody>","</table>"].join(""),j=[,"{{# if(d.data.toolbar){ }}",'<div class="layui-table-tool">','<div class="layui-table-tool-temp"></div>','<div class="layui-table-tool-self"></div>',"</div>","{{# } }}",'<div class="layui-table-box">',"{{# if(d.data.loading){ }}",'<div class="layui-table-init" style="background-color: #fff;">','<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>',"</div>","{{# } }}","{{# var left, right; }}",'<div class="layui-table-header">',t(),"</div>",'<div class="layui-table-body layui-table-main">',a,"</div>","{{# if(left){ }}",'<div class="layui-table-fixed layui-table-fixed-l">','<div class="layui-table-header">',t({fixed:!0}),"</div>",'<div class="layui-table-body">',a,"</div>","</div>","{{# }; }}","{{# if(right){ }}",'<div class="layui-table-fixed layui-table-fixed-r layui-hide">','<div class="layui-table-header">',t({fixed:"right"}),'<div class="layui-table-mend"></div>',"</div>",'<div class="layui-table-body">',a,"</div>","</div>","{{# }; }}","</div>","{{# if(d.data.totalRow){ }}",'<div class="layui-table-total">','<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{=d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{=d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>','<tbody><tr><td><div class="layui-table-cell" style="visibility: hidden;">Total</div></td></tr></tbody>',"</table>","</div>","{{# } }}",'<div class="layui-table-column layui-table-page layui-hide">','<div class="layui-inline layui-table-pageview" id="layui-table-page{{=d.index}}"></div>',"</div>","<style>","{{# layui.each(d.data.cols, function(i1, item1){","layui.each(item1, function(i2, item2){ }}",".laytable-cell-{{=d.index}}-{{=i1}}-{{=i2}}{ ","{{# if(item2.width){ }}","width: {{=item2.width}}px;","{{# } }}"," }","{{# });","}); }}","{{# if(d.data.lineStyle){",'var cellClassName = ".layui-table-view-"+ d.index +" .layui-table-body .layui-table .layui-table-cell";',"}}","{{= cellClassName }}{","display: -webkit-box; -webkit-box-align: center; white-space: normal; {{- d.data.lineStyle }} ","}","{{= cellClassName }}:hover{overflow: auto;}","{{# } }}","{{# if(d.data.css){ }}","{{- d.data.css }}","{{# } }}","</style>"].join(""),R=m(window),S=m(document),i=function(e){this.index=++x.index,this.config=m.extend({},this.config,x.config,e),this.render()},F=(i.prototype.config={limit:10,loading:!0,escape:!0,cellMinWidth:60,editTrigger:"click",defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"\u65e0\u6570\u636e"}},i.prototype.render=function(e){var t=this,a=t.config;if(a.elem=m(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id")||t.index,a.request=m.extend({pageName:"page",limitName:"limit"},a.request),a.response=m.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,t.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return t;if("reloadData"===e)return t.pullData(t.page,{type:"reloadData"});a.height&&/^full-\d+$/.test(a.height)&&(t.fullHeightGap=a.height.split("-")[1],a.height=R.height()-t.fullHeightGap),t.setInit();var i,l,e=a.elem,n=e.next("."+s),o=t.elem=m("<div></div>");o.addClass((i=[s,s+"-"+t.index,"layui-form","layui-border-box"],a.className&&i.push(a.className),i.join(" "))).attr({"lay-filter":"LAY-TABLE-FORM-DF-"+t.index,"lay-id":a.id,style:(i=[],a.width&&i.push("width:"+a.width+"px;"),a.height&&i.push("height:"+a.height+"px;"),i.join(""))}).html(v(j).render({data:a,index:t.index})),a.index=t.index,t.key=a.id||a.index,n[0]&&n.remove(),e.after(o),t.layTool=o.find(".layui-table-tool"),t.layBox=o.find(".layui-table-box"),t.layHeader=o.find(u),t.layMain=o.find(".layui-table-main"),t.layBody=o.find(T),t.layFixed=o.find(".layui-table-fixed"),t.layFixLeft=o.find(".layui-table-fixed-l"),t.layFixRight=o.find(".layui-table-fixed-r"),t.layTotal=o.find(".layui-table-total"),t.layPage=o.find(".layui-table-page"),t.renderToolbar(),t.renderPagebar(),t.fullSize(),1<a.cols.length&&(i=t.layFixed.find(u).find("th"),l=t.layHeader.first(),layui.each(i,function(e,t){(t=m(t)).height(l.find('th[data-key="'+t.attr("data-key")+'"]').height()+"px")})),t.pullData(t.page),t.events()},i.prototype.initOpts=function(e){this.config;e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||{checkbox:50,radio:50,space:30,numbers:60}[e.type])},i.prototype.setInit=function(e){var l,a,r=this,c=r.config;if(c.clientWidth=c.width||(l=function(e){var t,a=(e=e||c.elem.parent()).width();try{t="none"===e.css("display")}catch(i){}return!e[0]||a&&!t?a:l(e.parent())})(),"width"===e)return c.clientWidth;c.css&&-1===c.css.indexOf(s)&&(a=c.css.split("}"),layui.each(a,function(e,t){t&&(a[e]="."+s+"-"+r.index+" "+t)}),c.css=a.join("}"));var d=function(a,e,i,l){var n,o;l?(l.key=a+"-"+i,l.hide=l.hide||!1,l.colspan=l.colspan||1,l.rowspan=l.rowspan||1,r.initOpts(l),(n=a+(parseInt(l.rowspan)||1))<c.cols.length?(l.colGroup=!0,o=0,layui.each(c.cols[n],function(e,t){t.HAS_PARENT||1<=o&&o==(l.colspan||1)||(t.HAS_PARENT=!0,t.parentKey=a+"-"+i,o+=parseInt(1<t.colspan?t.colspan:1),d(n,c.cols[n],e,t))})):l.colGroup=!1):e.splice(i,1)};layui.each(c.cols,function(a,i){if(a)return!0;layui.each(i,function(e,t){d(a,i,e,t)})})},i.prototype.renderToolbar=function(){var e=this.config,t=['<div class="layui-inline" lay-event="add"><i class="layui-icon layui-icon-add-1"></i></div>','<div class="layui-inline" lay-event="update"><i class="layui-icon layui-icon-edit"></i></div>','<div class="layui-inline" lay-event="delete"><i class="layui-icon layui-icon-delete"></i></div>'].join(""),a=this.layTool.find(".layui-table-tool-temp"),i=("default"===e.toolbar?a.html(t):"string"==typeof e.toolbar&&(t=m(e.toolbar).html()||"")&&a.html(v(t).render(e)),{filter:{title:"\u7b5b\u9009\u5217",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"\u5bfc\u51fa",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"\u6253\u5370",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}}),l=[];"object"==typeof e.defaultToolbar&&layui.each(e.defaultToolbar,function(e,t){t="string"==typeof t?i[t]:t;t&&l.push('<div class="layui-inline" title="'+t.title+'" lay-event="'+t.layEvent+'"><i class="layui-icon '+t.icon+'"></i></div>')}),this.layTool.find(".layui-table-tool-self").html(l.join(""))},i.prototype.renderPagebar=function(){var e,t=this.config,a=this.layPagebar=m('<div class="layui-inline layui-table-pagebar"></div>');t.pagebar&&((e=m(t.pagebar).html()||"")&&a.append(v(e).render(t)),this.layPage.append(a))},i.prototype.setParentCol=function(e,t){var a=this.config,i=this.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),l=parseInt(i.attr("colspan"))||0;i[0]&&(t=t.split("-"),t=a.cols[t[0]][t[1]],e?l--:l++,i.attr("colspan",l),i[l<1?"addClass":"removeClass"](w),t.colspan=l,t.hide=l<1,(a=i.data("parentkey"))&&this.setParentCol(e,a))},i.prototype.setColsPatch=function(){var a=this,e=a.config;layui.each(e.cols,function(e,t){layui.each(t,function(e,t){t.hide&&a.setParentCol(t.hide,t.parentKey)})})},i.prototype.setColsWidth=function(){var t,a,i=this,o=i.config,l=0,r=0,c=0,d=0,s=i.setInit("width"),e=(i.eachCols(function(e,t){t.hide||l++}),s=s-("line"===o.skin||"nob"===o.skin?2:l+1)-i.getScrollWidth(i.layMain[0])-1,function(n){layui.each(o.cols,function(e,l){layui.each(l,function(e,t){var a=0,i=t.minWidth||o.cellMinWidth;t?t.colGroup||t.hide||(n?c&&c<i&&(r--,a=i):(a=t.width||0,/\d+%$/.test(a)?(a=Math.floor(parseFloat(a)/100*s))<i&&(a=i):a||(t.width=a=0,r++)),t.hide&&(a=0),d+=a):l.splice(e,1)})}),d<s&&r&&(c=(s-d)/r)}),n=(e(),e(!0),i.autoColNums=r,i.eachCols(function(e,t){var a=t.minWidth||o.cellMinWidth;t.colGroup||t.hide||(0===t.width?i.getCssRule(o.index+"-"+t.key,function(e){e.style.width=Math.floor(a<=c?c:a)+"px"}):/\d+%$/.test(t.width)&&i.getCssRule(o.index+"-"+t.key,function(e){e.style.width=Math.floor(parseFloat(t.width)/100*s)+"px"}))}),i.layMain.width()-i.getScrollWidth(i.layMain[0])-i.layMain.children("table").outerWidth());i.autoColNums&&-l<=n&&n<=l&&(e=(a=(t=function(e){return!(e=e||i.layHeader.eq(0).find("thead th:last-child")).data("field")&&e.prev()[0]?t(e.prev()):e})()).data("key"),i.getCssRule(e,function(e){var t=e.style.width||a.outerWidth();e.style.width=parseFloat(t)+n+"px",0<i.layMain.height()-i.layMain.prop("clientHeight")&&(e.style.width=parseFloat(e.style.width)-1+"px")})),i.loading(!0)},i.prototype.resize=function(){this.fullSize(),this.setColsWidth(),this.scrollPatch()},i.prototype.reload=function(e,t,a){var i=this;e=e||{},delete i.haveInit,layui.each(e,function(e,t){"array"===layui.type(t)&&delete i.config[e]}),i.config=m.extend(t,{},i.config,e),i.render(a)},i.prototype.errorView=function(e){var t=this,a=t.layMain.find("."+d),e=m('<div class="'+d+'">'+(e||"Error")+"</div>");a[0]&&(t.layNone.remove(),a.remove()),t.layFixed.addClass(w),t.layMain.find("tbody").html(""),t.layMain.append(t.layNone=e),t.layTotal.addClass(c),t.layPage.find(L).addClass(c),x.cache[t.key]=[],t.syncCheckAll()},i.prototype.page=1,i.prototype.pullData=function(t,a){var e,i=this,l=i.config,n=l.request,o=l.response,r=function(){"object"==typeof l.initSort&&i.sort(l.initSort.field,l.initSort.type)};a=a||{},"function"==typeof l.before&&l.before(l),i.startTime=(new Date).getTime(),l.url?((e={})[n.pageName]=t,e[n.limitName]=l.limit,n=m.extend(e,l.where),l.contentType&&0==l.contentType.indexOf("application/json")&&(n=JSON.stringify(n)),i.loading(),m.ajax({type:l.method||"get",url:l.url,contentType:l.contentType,data:n,dataType:l.dataType||"json",jsonpCallback:l.jsonpCallback,headers:l.headers||{},success:function(e){(e="function"==typeof l.parseData?l.parseData(e)||e:e)[o.statusName]!=o.statusCode?(i.renderForm(),i.errorView(e[o.msgName]||'\u8fd4\u56de\u7684\u6570\u636e\u4e0d\u7b26\u5408\u89c4\u8303\uff0c\u6b63\u786e\u7684\u6210\u529f\u72b6\u6001\u7801\u5e94\u4e3a\uff1a"'+o.statusName+'": '+o.statusCode)):(i.renderData({res:e,curr:t,count:e[o.countName],type:a.type}),r(),l.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof l.done&&l.done(e,t,e[o.countName])},error:function(e,t){i.errorView("\u8bf7\u6c42\u5f02\u5e38\uff0c\u9519\u8bef\u63d0\u793a\uff1a"+t),i.renderForm(),i.setColsWidth(),"function"==typeof l.error&&l.error(e,t)}})):"array"===layui.type(l.data)&&(e=t*l.limit-l.limit,(n={})[o.dataName]=l.data.concat().splice(e,l.limit),n[o.countName]=l.data.length,"object"==typeof l.totalRow&&(n[o.totalRowName]=m.extend({},l.totalRow)),i.renderData({res:n,curr:t,count:n[o.countName],type:a.type}),r(),i.setColsWidth(),"function"==typeof l.done&&l.done(n,t,n[o.countName]))},i.prototype.eachCols=function(e){return x.eachCols(null,e,this.config.cols),this},i.prototype.col=function(e){try{return e=e.split("-"),this.config.cols[e[1]][e[2]]}catch(t){return f.error(t),{}}},i.prototype.renderData=function(e){var u=this,y=u.config,t=e.res,l=e.curr,a=e.count,n=e.sort,i=t[y.response.dataName]||[],t=t[y.response.totalRowName],h=[],f=[],p=[],o=function(){var s;if(y.HAS_SET_COLS_PATCH||u.setColsPatch(),y.HAS_SET_COLS_PATCH=!0,!n&&u.sortKey)return u.sort(u.sortKey.field,u.sortKey.sort,!0);layui.each(i,function(o,r){var a=[],i=[],c=[],d=o+y.limit*(l-1)+1;"array"===layui.type(r)&&0===r.length||(n||(r[x.config.indexName]=o),u.eachCols(function(e,l){var e=l.field||e,t=y.index+"-"+l.key,n=r[e];n!==undefined&&null!==n||(n=""),l.colGroup||(t=['<td data-field="'+e+'" data-key="'+t+'" '+(e=[],l.templet&&e.push('data-content="'+b.escape(n)+'"'),l.toolbar&&e.push('data-off="true"'),l.event&&e.push('lay-event="'+l.event+'"'),l.minWidth&&e.push('data-minwidth="'+l.minWidth+'"'),e.join(" "))+' class="'+(e=[],l.hide&&e.push(w),l.field||e.push(E),e.join(" "))+'">','<div class="layui-table-cell laytable-cell-'+("normal"===l.type?t:t+" laytable-cell-"+l.type)+'"'+(l.align?' align="'+l.align+'"':"")+(e=[],l.style&&e.push('style="'+l.style+'"'),e.join(" "))+">"+function(){var e,t=m.extend(!0,{LAY_INDEX:d,LAY_COL:l},r),a=x.config.checkName,i=x.config.disabledName;switch(l.type){case"checkbox":return'<input type="checkbox" name="layTableCheckbox" lay-skin="primary" '+(e=[],l[a]&&(r[a]=l[a],l[a]&&(e[0]="checked")),t[a]&&(e[0]="checked"),t[i]&&e.push("disabled"),e.join(" "))+">";case"radio":return t[a]&&(s=o),'<input type="radio" name="layTableRadio_'+y.index+'" '+(e=[],t[a]&&(e[0]="checked"),t[i]&&e.push("disabled"),e.join(" "))+' lay-type="layTableRadio">';case"numbers":return d}return l.toolbar?v(m(l.toolbar).html()||"").render(t):k.call(u,{item3:l,content:n,tplData:t})}(),"</div></td>"].join(""),a.push(t),l.fixed&&"right"!==l.fixed&&i.push(t),"right"===l.fixed&&c.push(t))}),h.push('<tr data-index="'+o+'">'+a.join("")+"</tr>"),f.push('<tr data-index="'+o+'">'+i.join("")+"</tr>"),p.push('<tr data-index="'+o+'">'+c.join("")+"</tr>"))}),"fixed"===y.scrollPos&&"reloadData"===e.type||u.layBody.scrollTop(0),"reset"===y.scrollPos&&u.layBody.scrollLeft(0),u.layMain.find("."+d).remove(),u.layMain.find("tbody").html(h.join("")),u.layFixLeft.find("tbody").html(f.join("")),u.layFixRight.find("tbody").html(p.join("")),u.renderForm(),"number"==typeof s&&u.setThisRowChecked(s),u.syncCheckAll(),u.fullSize(),u.haveInit?u.scrollPatch():setTimeout(function(){u.scrollPatch()},50),u.haveInit=!0,g.close(u.tipsIndex)};return x.cache[u.key]=i,u.layTotal[0==i.length?"addClass":"removeClass"](c),u.layPage[y.page||y.pagebar?"removeClass":"addClass"](w),u.layPage.find(L)[!y.page||0==a||0===i.length&&1==l?"addClass":"removeClass"](c),0===i.length?(u.renderForm(),u.errorView(y.text.none)):(u.layFixLeft.removeClass(w),n?o():(o(),u.renderTotal(i,t),u.layTotal&&u.layTotal.removeClass(w),void(y.page&&(y.page=m.extend({elem:"layui-table-page"+y.index,count:a,limit:y.limit,limits:y.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'<i class="layui-icon"></i>',next:'<i class="layui-icon"></i>',jump:function(e,t){t||(u.page=e.curr,y.limit=e.limit,u.pullData(e.curr))}},y.page),y.page.count=a,r.render(y.page)))))},i.prototype.renderTotal=function(e,o){var r,c=this,d=c.config,s={};d.totalRow&&(layui.each(e,function(e,i){"array"===layui.type(i)&&0===i.length||c.eachCols(function(e,t){var e=t.field||e,a=i[e];t.totalRow&&(s[e]=(s[e]||0)+(parseFloat(a)||0))})}),c.dataTotal={},r=[],c.eachCols(function(e,t){var a,e=t.field||e,i=o&&o[t.field],l=(a=t.totalRowText||"",n="totalRowDecimals"in t?t.totalRowDecimals:2,n=parseFloat(s[e]).toFixed(n),(l={LAY_COL:t})[e]=n,n=t.totalRow&&k.call(c,{item3:t,content:n,tplData:l})||a,i||n),n=['<td data-field="'+e+'" data-key="'+d.index+"-"+t.key+'" '+(a=[],t.align&&a.push('align="'+t.align+'"'),t.minWidth&&a.push('data-minwidth="'+t.minWidth+'"'),a.join(" "))+' class="'+(n=[],t.hide&&n.push(w),t.field||n.push(E),n.join(" "))+'">','<div class="layui-table-cell laytable-cell-'+(a=d.index+"-"+t.key,"normal"===t.type?a:a+" laytable-cell-"+t.type)+'"'+(n=[],t.style&&n.push('style="'+t.style+'"'),n.join(" "))+">"+("string"==typeof(a=t.totalRow||d.totalRow)?v(a).render(m.extend({TOTAL_NUMS:i||s[e],LAY_COL:t},t)):l),"</div></td>"].join("");t.field&&(c.dataTotal[e]=l),r.push(n)}),c.layTotal.find("tbody").html("<tr>"+r.join("")+"</tr>"))},i.prototype.getColElem=function(e,t){var a=this.config;return e.eq(0).find(".laytable-cell-"+a.index+"-"+t+":eq(0)")},i.prototype.renderForm=function(e){this.config;var t=this.elem.attr("lay-filter");y.render(e,t)},i.prototype.setThisRowChecked=function(e){this.config;var t="layui-table-click";this.layBody.find('tr[data-index="'+e+'"]').addClass(t).siblings("tr").removeClass(t)},i.prototype.sort=function(l,e,t,a){var i,n=this,o={},r=n.config,c=r.elem.attr("lay-filter"),d=x.cache[n.key];"string"==typeof l&&(s=l,n.layHeader.find("th").each(function(e,t){var a=m(this),i=a.data("field");if(i===l)return l=a,s=i,!1}));try{var s=s||l.data("field"),u=l.data("key");if(n.sortKey&&!t&&s===n.sortKey.field&&e===n.sortKey.sort)return;var y=n.layHeader.find("th .laytable-cell-"+u).find(N);n.layHeader.find("th").find(N).removeAttr("lay-sort"),y.attr("lay-sort",e||null),n.layFixed.find("th")}catch(h){f.error("Table modules: sort field '"+s+"' not matched")}n.sortKey={field:s,sort:e},r.autoSort&&("asc"===e?i=layui.sort(d,s):"desc"===e?i=layui.sort(d,s,!0):(i=layui.sort(d,x.config.indexName),delete n.sortKey,delete r.initSort)),o[r.response.dataName]=i||d,n.renderData({res:o,curr:n.page,count:n.count,sort:!0}),a&&(r.initSort={field:s,type:e},layui.event.call(l,C,"sort("+c+")",r.initSort))},i.prototype.loading=function(e){var t=this;t.config.loading&&(e?(t.layInit&&t.layInit.remove(),delete t.layInit,t.layBox.find(".layui-table-init").remove()):(t.layInit=m(['<div class="layui-table-init">','<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>',"</div>"].join("")),t.layBox.append(t.layInit)))},i.prototype.setCheckData=function(e,t){var a=this.config,i=x.cache[this.key];i[e]&&"array"!==layui.type(i[e])&&(i[e][a.checkName]=t)},i.prototype.syncCheckAll=function(){var e=this,i=e.config,t=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(a){return e.eachCols(function(e,t){"checkbox"===t.type&&(t[i.checkName]=a)}),a};t[0]&&(x.checkStatus(e.key).isAll?(t[0].checked||(t.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(t[0].checked&&(t.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},i.prototype.getCssRule=function(a,i){var e=this.elem.find("style")[0],e=e.sheet||e.styleSheet||{},e=e.cssRules||e.rules;layui.each(e,function(e,t){if(t.selectorText===".laytable-cell-"+a)return i(t),!0})},i.prototype.fullSize=function(){var e=this,t=e.config,a=t.height;e.fullHeightGap&&(a=R.height()-e.fullHeightGap,e.elem.css("height",a=a<135?135:a)),a&&(a=parseFloat(a)-(e.layHeader.outerHeight()||38),t.toolbar&&(a-=e.layTool.outerHeight()||50),t.totalRow&&(a-=e.layTotal.outerHeight()||40),(t.page||t.pagebar)&&(a-=e.layPage.outerHeight()||43),e.layMain.outerHeight(a))},i.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:((e=document.createElement("div")).style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},i.prototype.scrollPatch=function(){var e=this,t=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),i=e.layMain.height()-e.layMain.prop("clientHeight"),l=(e.getScrollWidth(e.layMain[0]),t.outerWidth()-e.layMain.width()),n=function(e){var t;a&&i?(e=e.eq(0)).find(".layui-table-patch")[0]||((t=m('<th class="layui-table-patch"><div class="layui-table-cell"></div></th>')).find("div").css({width:a}),e.find("tr").append(t)):e.find(".layui-table-patch").remove()};n(e.layHeader),n(e.layTotal);n=e.layMain.height()-i;e.layFixed.find(T).css("height",t.height()>=n?n:"auto"),e.layFixRight[0<l?"removeClass":"addClass"](w),e.layFixRight.css("right",a-1)},i.prototype.events=function(){var s=this,c=s.config,d=c.elem.attr("lay-filter"),e=s.layHeader.find("th"),u=".layui-table-cell",i=m("body"),l={},n=(s.layTool.on("click","*[lay-event]",function(e){var a,i=m(this),t=i.attr("lay-event"),l=function(e){var t=m(e.list),a=m('<ul class="layui-table-tool-panel"></ul>');a.html(t),c.height&&a.css("max-height",c.height-(s.layTool.outerHeight()||50)),i.find(".layui-table-tool-panel")[0]||i.append(a),s.renderForm(),a.on("click",function(e){layui.stope(e)}),e.done&&e.done(a,t)};switch(layui.stope(e),S.trigger("table.tool.panel.remove"),g.close(s.tipsIndex),t){case"LAYTABLE_COLS":l({list:(a=[],s.eachCols(function(e,t){t.field&&"normal"==t.type&&a.push('<li><input type="checkbox" name="'+t.field+'" data-key="'+t.key+'" data-parentkey="'+(t.parentKey||"")+'" lay-skin="primary" '+(t.hide?"":"checked")+' title="'+b.escape(t.title||t.field)+'" lay-filter="LAY_TABLE_TOOL_COLS"></li>')}),a.join("")),done:function(){y.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var e=m(e.elem),i=this.checked,l=e.data("key"),n=e.data("parentkey");layui.each(c.cols,function(a,e){layui.each(e,function(e,t){a+"-"+e===l&&(e=t.hide,t.hide=!i,s.elem.find('*[data-key="'+c.index+"-"+l+'"]')[i?"removeClass":"addClass"](w),e!=t.hide&&s.setParentCol(!i,n),s.resize())})})})}});break;case"LAYTABLE_EXPORT":h.ie?g.tips("\u5bfc\u51fa\u529f\u80fd\u4e0d\u652f\u6301 IE\uff0c\u8bf7\u7528 Chrome \u7b49\u9ad8\u7ea7\u6d4f\u89c8\u5668\u5bfc\u51fa",this,{tips:3}):l({list:['<li data-type="csv">\u5bfc\u51fa csv \u683c\u5f0f\u6587\u4ef6</li>','<li data-type="xls">\u5bfc\u51fa xls \u683c\u5f0f\u6587\u4ef6</li>'].join(""),done:function(e,t){t.on("click",function(){var e=m(this).data("type");x.exportFile.call(s,c.id,null,e)})}});break;case"LAYTABLE_PRINT":var n=window.open("about:blank","_blank"),o=["<style>","body{font-size: 12px; color: #5F5F5F;}","table{width: 100%; border-collapse: collapse; border-spacing: 0;}","th,td{line-height: 20px; padding: 9px 15px; border: 1px solid #ccc; text-align: left; font-size: 12px; color: #5F5F5F;}","a{color: #5F5F5F; text-decoration:none;}","*.layui-hide{display: none}","</style>"].join(""),r=m(s.layHeader.html());r.append(s.layMain.find("table").html()),r.append(s.layTotal.find("table").html()),r.find("th.layui-table-patch").remove(),r.find("thead>tr>th."+E).filter(function(e,t){return!m(t).children(".laytable-cell-group").length}).remove(),r.find("tbody>tr>td."+E).remove(),n.document.write(o+r.prop("outerHTML")),n.document.close(),n.print(),n.close()}layui.event.call(this,C,"toolbar("+d+")",m.extend({event:t,config:c},{}))}),s.layPagebar.on("click","*[lay-event]",function(e){var t=m(this).attr("lay-event");layui.event.call(this,C,"pagebar("+d+")",m.extend({event:t,config:c},{}))}),e.on("mousemove",function(e){var t=m(this),a=t.offset().left,e=e.clientX-a;t.data("unresize")||p.eventMoveElem||(l.allowResize=t.width()-e<=10,i.css("cursor",l.allowResize?"col-resize":""))}).on("mouseleave",function(){m(this);p.eventMoveElem||i.css("cursor","")}).on("mousedown",function(e){var t,a=m(this);l.allowResize&&(t=a.data("key"),e.preventDefault(),l.offset=[e.clientX,e.clientY],s.getCssRule(t,function(e){var t=e.style.width||a.outerWidth();l.rule=e,l.ruleWidth=parseFloat(t),l.minWidth=a.data("minwidth")||c.cellMinWidth}),a.data(_,l),p.eventMoveElem=a)}),p.docEvent||S.on("mousemove",function(e){var t;p.eventMoveElem&&(t=p.eventMoveElem.data(_)||{},p.eventMoveElem.data("resizing",1),e.preventDefault(),t.rule&&((e=t.ruleWidth+e.clientX-t.offset[0])<t.minWidth&&(e=t.minWidth),t.rule.style.width=e+"px",g.close(s.tipsIndex)))}).on("mouseup",function(e){p.eventMoveElem&&(l={},i.css("cursor",""),s.scrollPatch(),p.eventMoveElem.removeData(_),delete p.eventMoveElem)}),p.docEvent=!0,e.on("click",function(e){var t=m(this),a=t.find(N),i=a.attr("lay-sort");if(!a[0]||1===t.data("resizing"))return t.removeData("resizing");s.sort(t,"asc"===i?"desc":"desc"===i?null:"asc",null,!0)}).find(N+" .layui-edge ").on("click",function(e){var t=m(this),a=t.index(),t=t.parents("th").eq(0).data("field");layui.stope(e),0===a?s.sort(t,"asc",null,!0):s.sort(t,"desc",null,!0)}),s.commonMember=function(e){var t=m(this).parents("tr").eq(0).data("index"),c=s.layBody.find('tr[data-index="'+t+'"]'),d=(d=x.cache[s.key]||[])[t]||{};return m.extend({tr:c,data:x.clearCacheKey(d),del:function(){x.cache[s.key][t]=[],c.remove(),s.scrollPatch()},update:function(e,r){e=e||{},layui.each(e,function(i,l){var n=c.children('td[data-field="'+i+'"]'),o=n.children(u);i in d&&(d[i]=l),s.eachCols(function(e,t){var a;t.field==i?(o.html(k.call(s,{item3:t,content:l,tplData:d})),n.data("content",l)):r&&(t.templet||t.toolbar)&&(e=c.children('td[data-field="'+(t.field||e)+'"]'),a=d[t.field],e.children(u).html(k.call(s,{item3:t,content:a,tplData:d})),e.data("content",a))})}),s.renderForm()}},e)}),t=(s.elem.on("click",'input[name="layTableCheckbox"]+',function(){var e=m(this).prev(),t=s.layBody.find('input[name="layTableCheckbox"]'),a=e.parents("tr").eq(0).data("index"),i=e[0].checked,l="layTableAllChoose"===e.attr("lay-filter");e[0].disabled||(l?(t.each(function(e,t){t.checked=i,s.setCheckData(e,i)}),s.syncCheckAll(),s.renderForm("checkbox")):(s.setCheckData(a,i),s.syncCheckAll()),layui.event.call(e[0],C,"checkbox("+d+")",n.call(e[0],{checked:i,type:l?"all":"one"})))}),s.elem.on("click",'input[lay-type="layTableRadio"]+',function(){var e=m(this).prev(),t=e[0].checked,a=x.cache[s.key],i=e.parents("tr").eq(0).data("index");layui.each(a,function(e,t){i===e?t[c.checkName]=!0:delete t[c.checkName]}),s.setThisRowChecked(i),layui.event.call(this,C,"radio("+d+")",n.call(this,{checked:t}))}),s.layBody.on("mouseenter","tr",function(){var e=m(this),t=e.index();e.data("off")||s.layBody.find("tr:eq("+t+")").addClass(A)}).on("mouseleave","tr",function(){var e=m(this),t=e.index();e.data("off")||s.layBody.find("tr:eq("+t+")").removeClass(A)}).on("click","tr",function(){t.call(this,"row")}).on("dblclick","tr",function(){t.call(this,"rowDouble")}),function(e){var t=m(this);t.data("off")||layui.event.call(this,C,e+"("+d+")",n.call(t.children("td")[0]))}),o=(s.layBody.on("change","."+D,function(){var e=m(this),t=this.value,a=e.parent().data("field"),e=e.parents("tr").eq(0).data("index");x.cache[s.key][e][a]=t,layui.event.call(this,C,"edit("+d+")",n.call(this,{value:t,field:a}))}).on("blur","."+D,function(){var e,t=m(this),a=t.parent(),i=a.data("key"),l=t.closest("tr").data("index"),l=x.cache[s.key][l];t.siblings(u).html((e=t[0].value,k.call(s,{item3:s.col(i),content:e,tplData:l}))),a.data("content",t[0].value),t.remove()}),s.layBody.on(c.editTrigger,"td",function(e){var t,a,i,l,n=m(this);n.data("off")||(t=n.data("field"),l=n.data("key"),l=s.col(l),a=n.closest("tr").data("index"),a=x.cache[s.key][a],i=n.children(u),(l="function"==typeof l.edit?l.edit(a):l.edit)&&((l=m("textarea"===l?'<textarea class="layui-input '+D+'"></textarea>':'<input class="layui-input '+D+'">'))[0].value=n.data("content")||a[t]||i.text(),n.find("."+D)[0]||n.append(l),l.focus(),layui.stope(e)))}).on("mouseenter","td",function(){a.call(this)}).on("mouseleave","td",function(){a.call(this,"hide")}),"layui-table-grid-down"),a=function(e){var t=m(this),a=t.children(u);t.data("off")||(e?t.find(".layui-table-grid-down").remove():!(a.prop("scrollWidth")>a.outerWidth()||0<a.find("br").length)||c.lineStyle||a.find("."+o)[0]||t.append('<div class="'+o+'"><i class="layui-icon layui-icon-down"></i></div>'))},r=(s.layBody.on("click","."+o,function(e){var t=m(this).parent().children(u);s.tipsIndex=g.tips(['<div class="layui-table-tips-main" style="margin-top: -'+(t.height()+23)+"px;"+("sm"===c.size?"padding: 4px 15px; font-size: 12px;":"lg"===c.size?"padding: 14px 15px;":"")+'">',t.html(),"</div>",'<i class="layui-icon layui-table-tips-c layui-icon-close"></i>'].join(""),t[0],{tips:[3,""],time:-1,anim:-1,maxWidth:h.ios||h.android?300:s.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){g.close(t)})}}),layui.stope(e)}),function(e){var t=m(this),a=t.parents("tr").eq(0).data("index");layui.event.call(this,C,(e||"tool")+"("+d+")",n.call(this,{event:t.attr("lay-event")})),s.setThisRowChecked(a)});s.layBody.on("click","*[lay-event]",function(){return r.call(this),!1}).on("dblclick","*[lay-event]",function(){return r.call(this,"toolDouble"),!1}),s.layMain.on("scroll",function(){var e=m(this),t=e.scrollLeft(),e=e.scrollTop();s.layHeader.scrollLeft(t),s.layTotal.scrollLeft(t),s.layFixed.find(T).scrollTop(e),g.close(s.tipsIndex)}),R.on("resize",function(){s.resize()})},S.on("click",function(){S.trigger("table.remove.tool.panel")}),S.on("table.remove.tool.panel",function(){m(".layui-table-tool-panel").remove()}),x.init=function(a,i){i=i||{};var e=m(a?'table[lay-filter="'+a+'"]':".layui-table[lay-data]"),r="Table element property lay-data configuration item has a syntax error: ";return e.each(function(){var e=m(this),t=e.attr("lay-data");try{t=new Function("return "+t)()}catch(l){f.error(r+t,"error")}var n=[],o=m.extend({elem:this,cols:[],data:[],skin:e.attr("lay-skin"),size:e.attr("lay-size"),even:"string"==typeof e.attr("lay-even")},x.config,i,t);a&&e.hide(),e.find("thead>tr").each(function(i){o.cols[i]=[],m(this).children().each(function(e){var t=m(this),a=t.attr("lay-data");try{a=new Function("return "+a)()}catch(l){return f.error(r+a)}t=m.extend({title:t.text(),colspan:t.attr("colspan")||1,rowspan:t.attr("rowspan")||1},a);t.colspan<2&&n.push(t),o.cols[i].push(t)})}),e.find("tbody>tr").each(function(e){var a=m(this),l={};a.children("td").each(function(e,t){var a=m(this),i=a.data("field");if(i)return l[i]=a.html()}),layui.each(n,function(e,t){e=a.children("td").eq(e);l[t.field]=e.html()}),o.data[e]=l}),x.render(o)}),this},p.that={},p.config={},function(a,i,e,l){var n,o;l.colGroup&&(n=0,a++,l.CHILD_COLS=[],o=e+(parseInt(l.rowspan)||1),layui.each(i[o],function(e,t){t.parentKey?t.parentKey===l.key&&(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),F(a,i,o,t)):t.PARENT_COL_INDEX||1<=n&&n==(l.colspan||1)||(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),n+=t.hide?0:parseInt(1<t.colspan?t.colspan:1),F(a,i,o,t))}))});x.eachCols=function(e,a,i){var e=p.config[e]||{},l=[],n=(i=m.extend(!0,[],i||e.cols),layui.each(i,function(a,e){if(a)return!0;layui.each(e,function(e,t){F(0,i,a,t),t.PARENT_COL_INDEX||l.push(t)})}),function(e){layui.each(e||l,function(e,t){if(t.CHILD_COLS)return n(t.CHILD_COLS);"function"==typeof a&&a(e,t)})});n()},x.checkStatus=function(e){var a=0,i=0,l=[],e=x.cache[e]||[];return layui.each(e,function(e,t){"array"===layui.type(t)?i++:t[x.config.checkName]&&(a++,t[x.config.disabledName]||l.push(x.clearCacheKey(t)))}),{data:l,isAll:!!e.length&&a===e.length-i}},x.getData=function(e){var a=[],e=x.cache[e]||[];return layui.each(e,function(e,t){"array"!==layui.type(t)&&a.push(x.clearCacheKey(t))}),a},x.exportFile=function(e,t,a){t=t||x.clearCacheKey(x.cache[e]);var r,i,l,c,n=(a="object"==typeof a?a:(n={},a&&(n.type=a),n)).type||"csv",d=p.that[e],o=p.config[e]||{},s={csv:"text/csv",xls:"application/vnd.ms-excel"}[n],u=document.createElement("a");if(h.ie)return f.error("IE_NOT_SUPPORT_EXPORTS");u.href="data:"+s+";charset=utf-8,\ufeff"+encodeURIComponent((r=[],i=[],l=[],c={},layui.each(t,function(l,n){var o=[];"object"==typeof e?(layui.each(e,function(e,t){0==l&&r.push(t||"")}),layui.each(x.clearCacheKey(n),function(e,t){o.push('"'+(t||"")+'"')})):x.eachCols(e,function(e,t){var a,i;t.field&&"normal"==t.type&&(t.hide?0==l&&(c[t.field]=!0):(a=n[t.field],i=d.layBody.find('tr[data-index="'+l+'"]>td'),a!==undefined&&null!==a||(a=""),0==l&&r.push(t.title||""),o.push('"'+k.call(d,{item3:t,content:a,tplData:n,text:"text",obj:d.commonMember.call(i.eq(0),{td:function(e){return i.filter('[data-field="'+e+'"]')}})})+'"')))}),i.push(o.join(","))}),d&&layui.each(d.dataTotal,function(e,t){c[e]||l.push(t)}),r.join(",")+"\r\n"+i.join("\r\n")+"\r\n"+l.join(","))),u.download=(a.title||o.title||"table_"+(o.index||""))+"."+n,document.body.appendChild(u),u.click(),document.body.removeChild(u)},x.resize=function(e){e?l(e)&&p.that[e].resize():layui.each(p.that,function(){this.resize()})},x.reload=function(e,t,a,i){if(l(e))return e=p.that[e],e.reload(t,a,i),p.call(e)},x.reloadData=function(){var a=m.extend([],arguments),i=(a[3]="reloadData",new RegExp("^("+["data","url","method","contentType","dataType","jsonpCallback","headers","where","page","limit","request","response","parseData","scrollPos"].join("|")+")$"));return layui.each(a[1],function(e,t){i.test(e)||delete a[1][e]}),x.reload.apply(null,a)},x.render=function(e){e=new i(e);return p.call(e)},x.clearCacheKey=function(e){return delete(e=m.extend({},e))[x.config.checkName],delete e[x.config.indexName],delete e[x.config.disabledName],e},m(function(){x.init()}),e(C,x)});layui.define("form",function(e){"use strict";var u=layui.$,i=layui.form,p=layui.layer,n="tree",a={config:{},index:layui[n]?layui[n].index+1e4:0,set:function(e){var i=this;return i.config=u.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,n,e,i)}},t=function(){var i=this,e=i.config,n=e.id||i.index;return t.that[n]=i,{config:t.config[n]=e,reload:function(e){i.reload.call(i,e)},getChecked:function(){return i.getChecked.call(i)},setChecked:function(e){return i.setChecked.call(i,e)}}},y="layui-hide",d="layui-disabled",f="layui-tree-set",C="layui-tree-iconClick",k="layui-icon-addition",v="layui-icon-subtraction",m="layui-tree-entry",x="layui-tree-main",b="layui-tree-txt",g="layui-tree-pack",w="layui-tree-spread",N="layui-tree-setLineShort",T="layui-tree-showLine",L="layui-tree-lineExtend",l=function(e){var i=this;i.index=++a.index,i.config=u.extend({},i.config,a.config,e),i.render()};l.prototype.config={data:[],showCheckbox:!1,showLine:!0,accordion:!1,onlyIconControl:!1,isJump:!1,edit:!1,text:{defaultNodeName:"\u672a\u547d\u540d",none:"\u65e0\u6570\u636e"}},l.prototype.reload=function(e){var n=this;layui.each(e,function(e,i){"array"===layui.type(i)&&delete n.config[e]}),n.config=u.extend(!0,{},n.config,e),n.render()},l.prototype.render=function(){var e=this,i=e.config,n=(e.checkids=[],u('<div class="layui-tree'+(i.showCheckbox?" layui-form":"")+(i.showLine?" layui-tree-line":"")+'" lay-filter="LAY-tree-'+e.index+'"></div>')),a=(e.tree(n),i.elem=u(i.elem));if(a[0]){if(e.key=i.id||e.index,e.elem=n,e.elemNone=u('<div class="layui-tree-emptyText">'+i.text.none+"</div>"),a.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);i.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=u(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(N),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(N)}),e.events()}},l.prototype.renderForm=function(e){i.render(e,"LAY-tree-"+this.index)},l.prototype.tree=function(l,e){var r=this,c=r.config,e=e||c.data;layui.each(e,function(e,i){var n=i.children&&0<i.children.length,a=u('<div class="layui-tree-pack" '+(i.spread?'style="display: block;"':"")+"></div>"),t=u(['<div data-id="'+i.id+'" class="layui-tree-set'+(i.spread?" layui-tree-spread":"")+(i.checked?" layui-tree-checkedFirst":"")+'">','<div class="layui-tree-entry">','<div class="layui-tree-main">',c.showLine?n?'<span class="layui-tree-iconClick layui-tree-icon"><i class="layui-icon '+(i.spread?"layui-icon-subtraction":"layui-icon-addition")+'"></i></span>':'<span class="layui-tree-iconClick"><i class="layui-icon layui-icon-file"></i></span>':'<span class="layui-tree-iconClick"><i class="layui-tree-iconArrow '+(n?"":y)+'"></i></span>',c.showCheckbox?'<input type="checkbox" name="'+(i.field||"layuiTreeCheck_"+i.id)+'" same="layuiTreeCheck" lay-skin="primary" '+(i.disabled?"disabled":"")+' value="'+i.id+'">':"",c.isJump&&i.href?'<a href="'+i.href+'" target="_blank" class="'+b+'">'+(i.title||i.label||c.text.defaultNodeName)+"</a>":'<span class="'+b+(i.disabled?" "+d:"")+'">'+(i.title||i.label||c.text.defaultNodeName)+"</span>","</div>",function(){if(!c.edit)return"";var n={add:'<i class="layui-icon layui-icon-add-1" data-type="add"></i>',update:'<i class="layui-icon layui-icon-edit" data-type="update"></i>',del:'<i class="layui-icon layui-icon-delete" data-type="del"></i>'},a=['<div class="layui-btn-group layui-tree-btnGroup">'];return!0===c.edit&&(c.edit=["update","del"]),"object"==typeof c.edit?(layui.each(c.edit,function(e,i){a.push(n[i]||"")}),a.join("")+"</div>"):void 0}(),"</div></div>"].join(""));n&&(t.append(a),r.tree(a,i.children)),l.append(t),t.prev("."+f)[0]&&t.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),n||t.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),r.spread(t,i),c.showCheckbox&&(i.checked&&r.checkids.push(i.id),r.checkClick(t,i)),c.edit&&r.operate(t,i)})},l.prototype.spread=function(a,e){var t=this.config,i=a.children("."+m),n=i.children("."+x),l=i.find("."+C),i=i.find("."+b),r=t.onlyIconControl?l:n,c="";r.on("click",function(e){var i=a.children("."+g),n=(r.children(".layui-icon")[0]?r:r.find(".layui-tree-icon")).children(".layui-icon");i[0]?a.hasClass(w)?(a.removeClass(w),i.slideUp(200),n.removeClass(v).addClass(k)):(a.addClass(w),i.slideDown(200),n.addClass(v).removeClass(k),t.accordion&&((i=a.siblings("."+f)).removeClass(w),i.children("."+g).slideUp(200),i.find(".layui-tree-icon").children(".layui-icon").removeClass(v).addClass(k))):c="normal"}),i.on("click",function(){u(this).hasClass(d)||(c=a.hasClass(w)?t.onlyIconControl?"open":"close":t.onlyIconControl?"close":"open",t.click&&t.click({elem:a,state:c,data:e}))})},l.prototype.setCheckbox=function(e,i,n){this.config;var t,l=n.prop("checked");n.prop("disabled")||("object"!=typeof i.children&&!e.find("."+g)[0]||e.find("."+g).find('input[same="layuiTreeCheck"]').each(function(){this.disabled||(this.checked=l)}),(t=function(e){var i,n,a;e.parents("."+f)[0]&&(n=(e=e.parent("."+g)).parent(),a=e.prev().find('input[same="layuiTreeCheck"]'),l?a.prop("checked",l):(e.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||a.prop("checked",!1)),t(n))})(e),this.renderForm("checkbox"))},l.prototype.checkClick=function(n,a){var t=this,l=t.config;n.children("."+m).children("."+x).on("click",'input[same="layuiTreeCheck"]+',function(e){layui.stope(e);var e=u(this).prev(),i=e.prop("checked");e.prop("disabled")||(t.setCheckbox(n,a,e),l.oncheck&&l.oncheck({elem:n,checked:i,data:a}))})},l.prototype.operate=function(c,d){var s=this,o=s.config,e=c.children("."+m),h=e.children("."+x);e.children(".layui-tree-btnGroup").on("click",".layui-icon",function(e){layui.stope(e);var i,e=u(this).data("type"),a=c.children("."+g),t={data:d,type:e,elem:c};if("add"==e){a[0]||(o.showLine?(h.find("."+C).addClass("layui-tree-icon"),h.find("."+C).children(".layui-icon").addClass(k).removeClass("layui-icon-file")):h.find(".layui-tree-iconArrow").removeClass(y),c.append('<div class="layui-tree-pack"></div>'));var n,l=o.operate&&o.operate(t),r={};if(r.title=o.text.defaultNodeName,r.id=l,s.tree(c.children("."+g),[r]),o.showLine&&(a[0]?(a.hasClass(L)||a.addClass(L),c.find("."+g).each(function(){u(this).children("."+f).last().addClass(N)}),(a.children("."+f).last().prev().hasClass(N)?a.children("."+f).last().prev():a.children("."+f).last()).removeClass(N),!c.parent("."+g)[0]&&c.next()[0]&&a.children("."+f).last().removeClass(N)):(l=c.siblings("."+f),n=1,r=c.parent("."+g),layui.each(l,function(e,i){u(i).children("."+g)[0]||(n=0)}),1==n?(l.children("."+g).addClass(T),l.children("."+g).children("."+f).removeClass(N),c.children("."+g).addClass(T),r.removeClass(L),r.children("."+f).last().children("."+g).children("."+f).last().addClass(N)):c.children("."+g).children("."+f).addClass(N))),!o.showCheckbox)return;h.find('input[same="layuiTreeCheck"]')[0].checked&&(c.children("."+g).children("."+f).last().find('input[same="layuiTreeCheck"]')[0].checked=!0),s.renderForm("checkbox")}else"update"==e?(l=h.children("."+b).html(),h.children("."+b).html(""),h.append('<input type="text" class="layui-tree-editInput">'),h.children(".layui-tree-editInput").val(l).focus(),i=function(e){var i=(i=e.val().trim())||o.text.defaultNodeName;e.remove(),h.children("."+b).html(i),t.data.title=i,o.operate&&o.operate(t)},h.children(".layui-tree-editInput").blur(function(){i(u(this))}),h.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),i(u(this)))})):p.confirm('\u786e\u8ba4\u5220\u9664\u8be5\u8282\u70b9 "<span style="color: #999;">'+(d.title||"")+'</span>" \u5417\uff1f',function(e){if(o.operate&&o.operate(t),t.status="remove",p.close(e),!c.prev("."+f)[0]&&!c.next("."+f)[0]&&!c.parent("."+g)[0])return c.remove(),void s.elem.append(s.elemNone);var l,n,i;c.siblings("."+f).children("."+m)[0]?(o.showCheckbox&&(l=function(e){var i,n,a,t;e.parents("."+f)[0]&&(i=e.siblings("."+f).children("."+m),n=(e=e.parent("."+g).prev()).find('input[same="layuiTreeCheck"]')[0],a=1,(t=0)==n.checked&&(i.each(function(e,i){i=u(i).find('input[same="layuiTreeCheck"]')[0];0!=i.checked||i.disabled||(a=0),i.disabled||(t=1)}),1==a&&1==t&&(n.checked=!0,s.renderForm("checkbox"),l(e.parent("."+f)))))})(c),o.showLine&&(e=c.siblings("."+f),n=1,i=c.parent("."+g),layui.each(e,function(e,i){u(i).children("."+g)[0]||(n=0)}),1==n?(a[0]||(i.removeClass(L),e.children("."+g).addClass(T),e.children("."+g).children("."+f).removeClass(N)),(c.next()[0]?i.children("."+f).last():c.prev()).children("."+g).children("."+f).last().addClass(N),c.next()[0]||c.parents("."+f)[1]||c.parents("."+f).eq(0).next()[0]||c.prev("."+f).addClass(N)):!c.next()[0]&&c.hasClass(N)&&c.prev().addClass(N))):(e=c.parent("."+g).prev(),o.showLine?(e.find("."+C).removeClass("layui-tree-icon"),e.find("."+C).children(".layui-icon").removeClass(v).addClass("layui-icon-file"),(i=e.parents("."+g).eq(0)).addClass(L),i.children("."+f).each(function(){u(this).children("."+g).children("."+f).last().addClass(N)})):e.find(".layui-tree-iconArrow").addClass(y),c.parents("."+f).eq(0).removeClass(w),c.parent("."+g).remove()),c.remove()})})},l.prototype.events=function(){var i=this,t=i.config;i.elem.find(".layui-tree-checkedFirst");i.setChecked(i.checkids),i.elem.find(".layui-tree-search").on("keyup",function(){var e=u(this),n=e.val(),e=e.nextAll(),a=[];e.find("."+b).each(function(){var i,e=u(this).parents("."+m);-1!=u(this).html().indexOf(n)&&(a.push(u(this).parent()),(i=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+g)[0]&&i(e.parent("."+g).parent("."+f))})(e.parent("."+f)))}),e.find("."+m).each(function(){var e=u(this).parent("."+f);e.hasClass("layui-tree-searchShow")||e.addClass(y)}),0==e.find(".layui-tree-searchShow").length&&i.elem.append(i.elemNone),t.onsearch&&t.onsearch({elem:a})}),i.elem.find(".layui-tree-search").on("keydown",function(){u(this).nextAll().find("."+m).each(function(){u(this).parent("."+f).removeClass("layui-tree-searchShow "+y)}),u(".layui-tree-emptyText")[0]&&u(".layui-tree-emptyText").remove()})},l.prototype.getChecked=function(){var e=this.config,i=[],n=[],t=(this.elem.find(".layui-form-checked").each(function(){i.push(u(this).prev()[0].value)}),function(e,a){layui.each(e,function(e,n){layui.each(i,function(e,i){if(n.id==i)return delete(i=u.extend({},n)).children,a.push(i),n.children&&(i.children=[],t(n.children,i.children)),!0})})});return t(u.extend({},e.data),n),n},l.prototype.setChecked=function(l){this.config;this.elem.find("."+f).each(function(e,i){var n=u(this).data("id"),a=u(i).children("."+m).find('input[same="layuiTreeCheck"]'),t=a.next();if("number"==typeof l){if(n==l)return a[0].checked||t.click(),!1}else"object"==typeof l&&layui.each(l,function(e,i){if(i==n&&!a[0].checked)return t.click(),!0})})},t.that={},t.config={},a.reload=function(e,i){e=t.that[e];return e.reload(i),t.call(e)},a.getChecked=function(e){return t.that[e].getChecked()},a.setChecked=function(e,i){return t.that[e].setChecked(i)},a.render=function(e){e=new l(e);return t.call(e)},e(n,a)});layui.define(["laytpl","form"],function(e){"use strict";var d=layui.$,n=layui.laytpl,t=layui.form,a="transfer",i={config:{},index:layui[a]?layui[a].index+1e4:0,set:function(e){var t=this;return t.config=d.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,a,e,t)}},l=function(){var t=this,e=t.config,a=e.id||t.index;return l.that[a]=t,{config:l.config[a]=e,reload:function(e){t.reload.call(t,e)},getData:function(){return t.getData.call(t)}}},s="layui-hide",h="layui-btn-disabled",r="layui-none",c="layui-transfer-box",u="layui-transfer-header",o="layui-transfer-search",f="layui-transfer-data",y=function(e){return['<div class="layui-transfer-box" data-index="'+(e=e||{}).index+'">','<div class="layui-transfer-header">','<input type="checkbox" name="'+e.checkAllName+'" lay-filter="layTransferCheckbox" lay-type="all" lay-skin="primary" title="{{ d.data.title['+e.index+"] || 'list"+(e.index+1)+"' }}\">","</div>","{{# if(d.data.showSearch){ }}",'<div class="layui-transfer-search">','<i class="layui-icon layui-icon-search"></i>','<input type="input" class="layui-input" placeholder="\u5173\u952e\u8bcd\u641c\u7d22">',"</div>","{{# } }}",'<ul class="layui-transfer-data"></ul>',"</div>"].join("")},p=['<div class="layui-transfer layui-form layui-border-box" lay-filter="LAY-transfer-{{ d.index }}">',y({index:0,checkAllName:"layTransferLeftCheckAll"}),'<div class="layui-transfer-active">','<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="0">','<i class="layui-icon layui-icon-next"></i>',"</button>",'<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="1">','<i class="layui-icon layui-icon-prev"></i>',"</button>","</div>",y({index:1,checkAllName:"layTransferRightCheckAll"}),"</div>"].join(""),v=function(e){var t=this;t.index=++i.index,t.config=d.extend({},t.config,i.config,e),t.render()};v.prototype.config={title:["\u5217\u8868\u4e00","\u5217\u8868\u4e8c"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"\u65e0\u6570\u636e",searchNone:"\u65e0\u5339\u914d\u6570\u636e"}},v.prototype.reload=function(e){var t=this;t.config=d.extend({},t.config,e),t.render()},v.prototype.render=function(){var e=this,t=e.config,a=e.elem=d(n(p).render({data:t,index:e.index})),i=t.elem=d(t.elem);i[0]&&(t.data=t.data||[],t.value=t.value||[],e.key=t.id||e.index,i.html(e.elem),e.layBox=e.elem.find("."+c),e.layHeader=e.elem.find("."+u),e.laySearch=e.elem.find("."+o),e.layData=a.find("."+f),e.layBtn=a.find(".layui-transfer-active .layui-btn"),e.layBox.css({width:t.width,height:t.height}),e.layData.css({height:(i=t.height-e.layHeader.outerHeight(),t.showSearch&&(i-=e.laySearch.outerHeight()),i-2)}),e.renderData(),e.events())},v.prototype.renderData=function(){var e=this,i=(e.config,[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}]);e.parseData(function(e){var t=e.selected?1:0,a=["<li>",'<input type="checkbox" name="'+i[t].checkName+'" lay-skin="primary" lay-filter="layTransferCheckbox" title="'+e.title+'"'+(e.disabled?" disabled":"")+(e.checked?" checked":"")+' value="'+e.value+'">',"</li>"].join("");i[t].views.push(a),delete e.selected}),e.layData.eq(0).html(i[0].views.join("")),e.layData.eq(1).html(i[1].views.join("")),e.renderCheckBtn()},v.prototype.renderForm=function(e){t.render(e,"LAY-transfer-"+this.index)},v.prototype.renderCheckBtn=function(r){var c=this,o=c.config;r=r||{},c.layBox.each(function(e){var t=d(this),a=t.find("."+f),t=t.find("."+u).find('input[type="checkbox"]'),i=a.find('input[type="checkbox"]'),n=0,l=!1;i.each(function(){var e=d(this).data("hide");(this.checked||this.disabled||e)&&n++,this.checked&&!e&&(l=!0)}),t.prop("checked",l&&n===i.length),c.layBtn.eq(e)[l?"removeClass":"addClass"](h),r.stopNone||(i=a.children("li:not(."+s+")").length,c.noneView(a,i?"":o.text.none))}),c.renderForm("checkbox")},v.prototype.noneView=function(e,t){var a=d('<p class="layui-none">'+(t||"")+"</p>");e.find("."+r)[0]&&e.find("."+r).remove(),t.replace(/\s/g,"")&&e.append(a)},v.prototype.setValue=function(){var e=this.config,t=[];return this.layBox.eq(1).find("."+f+' input[type="checkbox"]').each(function(){d(this).data("hide")||t.push(this.value)}),e.value=t,this},v.prototype.parseData=function(t){var i=this.config,n=[];return layui.each(i.data,function(e,a){a=("function"==typeof i.parseData?i.parseData(a):a)||a,n.push(a=d.extend({},a)),layui.each(i.value,function(e,t){t==a.value&&(a.selected=!0)}),t&&t(a)}),i.data=n,this},v.prototype.getData=function(e){var t=this.config,i=[];return this.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&i.push(t)})}),i},v.prototype.transfer=function(e,t){var a,i=this,n=i.config,l=i.layBox.eq(e),r=[],t=(t?((a=(t=t).find('input[type="checkbox"]'))[0].checked=!1,l.siblings("."+c).find("."+f).append(t.clone()),t.remove(),r.push(a[0].value),i.setValue()):l.each(function(e){d(this).find("."+f).children("li").each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=t.data("hide");t[0].checked&&!a&&(t[0].checked=!1,l.siblings("."+c).find("."+f).append(e.clone()),e.remove(),r.push(t[0].value)),i.setValue()})}),i.renderCheckBtn(),l.siblings("."+c).find("."+o+" input"));""!==t.val()&&t.trigger("keyup"),n.onchange&&n.onchange(i.getData(r),e)},v.prototype.events=function(){var n=this,a=n.config;n.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var e=d(this).prev(),t=e[0].checked,a=e.parents("."+c).eq(0).find("."+f);e[0].disabled||("all"===e.attr("lay-type")&&a.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=t)}),setTimeout(function(){n.renderCheckBtn({stopNone:!0})},0))}),n.elem.on("dblclick","."+f+">li",function(e){var t=d(this),a=t.children('input[type="checkbox"]'),i=t.parent().parent();a[0].disabled||n.transfer(i.data("index"),t)}),n.layBtn.on("click",function(){var e=d(this),t=e.data("index");e.hasClass(h)||n.transfer(t)}),n.laySearch.find("input").on("keyup",function(){var i=this.value,e=d(this).parents("."+o).eq(0).siblings("."+f),t=e.children("li"),t=(t.each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=-1!==t[0].title.indexOf(i);e[a?"removeClass":"addClass"](s),t.data("hide",!a)}),n.renderCheckBtn(),t.length===e.children("li."+s).length);n.noneView(e,t?a.text.searchNone:"")})},l.that={},l.config={},i.reload=function(e,t){e=l.that[e];return e.reload(t),l.call(e)},i.getData=function(e){return l.that[e].getData()},i.render=function(e){e=new v(e);return l.call(e)},e(a,i)});layui.define("jquery",function(e){"use strict";var a=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var i=this;return i.config=a.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,d,e,i)}}),d="carousel",r="layui-this",s="layui-carousel-left",u="layui-carousel-right",c="layui-carousel-prev",m="layui-carousel-next",t="layui-carousel-arrow",l="layui-carousel-ind",i=function(e){var i=this;i.config=a.extend({},i.config,n.config,e),i.render()};i.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},i.prototype.render=function(){var e=this,i=e.config;i.elem=a(i.elem),i.elem[0]&&(e.elemItem=i.elem.find(">*[carousel-item]>*"),i.index<0&&(i.index=0),i.index>=e.elemItem.length&&(i.index=e.elemItem.length-1),i.interval<800&&(i.interval=800),i.full?i.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):i.elem.css({width:i.width,height:i.height}),i.elem.attr("lay-anim",i.anim),e.elemItem.eq(i.index).addClass(r),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},i.prototype.reload=function(e){var i=this;clearInterval(i.timer),i.config=a.extend({},i.config,e),i.render()},i.prototype.prevIndex=function(){var e=this.config.index-1;return e=e<0?this.elemItem.length-1:e},i.prototype.nextIndex=function(){var e=this.config.index+1;return e=e>=this.elemItem.length?0:e},i.prototype.addIndex=function(e){var i=this.config;i.index=i.index+(e=e||1),i.index>=this.elemItem.length&&(i.index=0)},i.prototype.subIndex=function(e){var i=this.config;i.index=i.index-(e=e||1),i.index<0&&(i.index=this.elemItem.length-1)},i.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(clearInterval(e.timer),e.timer=setInterval(function(){e.slide()},i.interval))},i.prototype.arrow=function(){var i=this,e=i.config,n=a(['<button class="layui-icon '+t+'" lay-type="sub">'+("updown"===e.anim?"":"")+"</button>",'<button class="layui-icon '+t+'" lay-type="add">'+("updown"===e.anim?"":"")+"</button>"].join(""));e.elem.attr("lay-arrow",e.arrow),e.elem.find("."+t)[0]&&e.elem.find("."+t).remove(),e.elem.append(n),n.on("click",function(){var e=a(this).attr("lay-type");i.slide(e)})},i.prototype.indicator=function(){var i,n=this,t=n.config,e=n.elemInd=a(['<div class="'+l+'"><ul>',(i=[],layui.each(n.elemItem,function(e){i.push("<li"+(t.index===e?' class="layui-this"':"")+"></li>")}),i.join("")),"</ul></div>"].join(""));t.elem.attr("lay-indicator",t.indicator),t.elem.find("."+l)[0]&&t.elem.find("."+l).remove(),t.elem.append(e),"updown"===t.anim&&e.css("margin-top",-e.height()/2),e.find("li").on("hover"===t.trigger?"mouseover":t.trigger,function(){var e=a(this).index();e>t.index?n.slide("add",e-t.index):e<t.index&&n.slide("sub",t.index-e)})},i.prototype.slide=function(e,i){var n=this,t=n.elemItem,a=n.config,l=a.index,o=a.elem.attr("lay-filter");n.haveSlide||("sub"===e?(n.subIndex(i),t.eq(a.index).addClass(c),setTimeout(function(){t.eq(l).addClass(u),t.eq(a.index).addClass(u)},50)):(n.addIndex(i),t.eq(a.index).addClass(m),setTimeout(function(){t.eq(l).addClass(s),t.eq(a.index).addClass(s)},50)),setTimeout(function(){t.removeClass(r+" "+c+" "+m+" "+s+" "+u),t.eq(a.index).addClass(r),n.haveSlide=!1},300),n.elemInd.find("li").eq(a.index).addClass(r).siblings().removeClass(r),n.haveSlide=!0,e={index:a.index,prevIndex:l,item:t.eq(a.index)},"function"==typeof a.change&&a.change(e),layui.event.call(this,d,"change("+o+")",e))},i.prototype.events=function(){var e=this,i=e.config;i.elem.data("haveEvents")||(i.elem.on("mouseenter",function(){"always"!==e.config.autoplay&&clearInterval(e.timer)}).on("mouseleave",function(){"always"!==e.config.autoplay&&e.autoplay()}),i.elem.data("haveEvents",!0))},n.render=function(e){return new i(e)},e(d,n)});layui.define("jquery",function(e){"use strict";var u=layui.jquery,l={config:{},index:layui.rate?layui.rate.index+1e4:0,set:function(e){var a=this;return a.config=u.extend({},a.config,e),a},on:function(e,a){return layui.onevent.call(this,i,e,a)}},i="rate",c="layui-icon-rate",r="layui-icon-rate-solid",o="layui-icon-rate-half",s="layui-icon-rate-solid layui-icon-rate-half",f="layui-icon-rate layui-icon-rate-half",a=function(e){var a=this;a.index=++l.index,a.config=u.extend({},a.config,l.config,e),a.render()};a.prototype.config={length:5,text:!1,readonly:!1,half:!1,value:0,theme:""},a.prototype.render=function(){for(var e=this,a=e.config,l=a.theme?'style="color: '+a.theme+';"':"",i=(a.elem=u(a.elem),a.value>a.length&&(a.value=a.length),parseInt(a.value)===a.value||a.half||(a.value=Math.ceil(a.value)-a.value<.5?Math.ceil(a.value):Math.floor(a.value)),'<ul class="layui-rate" '+(a.readonly?"readonly":"")+">"),n=1;n<=a.length;n++){var t='<li class="layui-inline"><i class="layui-icon '+(n>Math.floor(a.value)?c:r)+'" '+l+"></i></li>";a.half&&parseInt(a.value)!==a.value&&n==Math.ceil(a.value)?i=i+'<li><i class="layui-icon layui-icon-rate-half" '+l+"></i></li>":i+=t}i+="</ul>"+(a.text?'<span class="layui-inline">'+a.value+"\u661f":"")+"</span>";var o=a.elem,s=o.next(".layui-rate");s[0]&&s.remove(),e.elemTemp=u(i),a.span=e.elemTemp.next("span"),a.setText&&a.setText(a.value),o.html(e.elemTemp),o.addClass("layui-inline"),a.readonly||e.action()},a.prototype.setvalue=function(e){this.config.value=e,this.render()},a.prototype.action=function(){var i=this.config,n=this.elemTemp,t=n.find("i").width();n.children("li").each(function(e){var a=e+1,l=u(this);l.on("click",function(e){i.value=a,i.half&&e.pageX-u(this).offset().left<=t/2&&(i.value=i.value-.5),i.text&&n.next("span").text(i.value+"\u661f"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),l.on("mousemove",function(e){n.find("i").each(function(){u(this).addClass(c).removeClass(s)}),n.find("i:lt("+a+")").each(function(){u(this).addClass(r).removeClass(f)}),i.half&&e.pageX-u(this).offset().left<=t/2&&l.children("i").addClass(o).removeClass(r)}),l.on("mouseleave",function(){n.find("i").each(function(){u(this).addClass(c).removeClass(s)}),n.find("i:lt("+Math.floor(i.value)+")").each(function(){u(this).addClass(r).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&n.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(o).removeClass("layui-icon-rate-solid layui-icon-rate")})})},a.prototype.events=function(){this.config},l.render=function(e){e=new a(e);return function(){var a=this;return{setvalue:function(e){a.setvalue.call(a,e)},config:a.config}}.call(e)},e(i,l)});layui.define("jquery",function(l){"use strict";var g=layui.$,e=function(l){};e.prototype.load=function(l){var t,i,n,e,r,o,a,c,m,s,u,f,y,d=this,p=0,h=g((l=l||{}).elem);if(h[0])return e=g(l.scrollElem||document),r=l.mb||50,o=!("isAuto"in l)||l.isAuto,a=l.end||"\u6ca1\u6709\u66f4\u591a\u4e86",c=l.scrollElem&&l.scrollElem!==document,m="<cite>\u52a0\u8f7d\u66f4\u591a</cite>",s=g('<div class="layui-flow-more"><a href="javascript:;">'+m+"</a></div>"),h.find(".layui-flow-more")[0]||h.append(s),u=function(l,e){l=g(l),s.before(l),(e=0==e||null)?s.html(a):s.find("a").html(m),i=e,t=null,y&&y()},f=function(){t=!0,s.find("a").html('<i class="layui-anim layui-anim-rotate layui-anim-loop layui-icon "></i>'),"function"==typeof l.done&&l.done(++p,u)},f(),s.find("a").on("click",function(){g(this);i||t||f()}),l.isLazyimg&&(y=d.lazyimg({elem:l.elem+" img",scrollElem:l.scrollElem})),o&&e.on("scroll",function(){var e=g(this),o=e.scrollTop();n&&clearTimeout(n),!i&&h.width()&&(n=setTimeout(function(){var l=(c?e:g(window)).height();(c?e.prop("scrollHeight"):document.documentElement.scrollHeight)-o-l<=r&&(t||f())},100))}),d},e.prototype.lazyimg=function(l){var e,c=this,m=0,s=g((l=l||{}).scrollElem||document),u=l.elem||"img",f=l.scrollElem&&l.scrollElem!==document,y=function(e,l){var o,t=s.scrollTop(),l=t+l,i=f?e.offset().top-s.offset().top+t:e.offset().top;t<=i&&i<=l&&e.attr("lay-src")&&(o=e.attr("lay-src"),layui.img(o,function(){var l=c.lazyimg.elem.eq(m);e.attr("src",o).removeAttr("lay-src"),l[0]&&n(l),m++},function(){c.lazyimg.elem.eq(m);e.removeAttr("lay-src")}))},n=function(l,e){var o=(f?e||s:g(window)).height(),t=s.scrollTop(),i=t+o;if(c.lazyimg.elem=g(u),l)y(l,o);else for(var n=0;n<c.lazyimg.elem.length;n++){var r=c.lazyimg.elem.eq(n),a=f?r.offset().top-s.offset().top+t:r.offset().top;if(y(r,o),m=n,i<a)break}};return n(),s.on("scroll",function(){var l=g(this);e&&clearTimeout(e),e=setTimeout(function(){n(null,l)},50)}),n},l("flow",new e)});layui.define(["layer","form"],function(t){"use strict";var u=layui.$,c=layui.layer,a=layui.form,d=(layui.hint(),layui.device()),i="layedit",y="layui-disabled",e=function(){this.index=0,this.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink"],hideTool:[],height:280}},f=(e.prototype.set=function(t){return u.extend(!0,this.config,t),this},e.prototype.on=function(t,e){return layui.onevent(i,t,e)},e.prototype.build=function(t,e){e=e||{};var i,l,a=this,n=a.config,o="layui-layedit",s=u("string"==typeof t?"#"+t:t),r="LAY_layedit_"+ ++a.index,c=s.next("."+o),n=u.extend({},n,e),e=(i=[],l={},layui.each(n.hideTool,function(t,e){l[e]=!0}),layui.each(n.tool,function(t,e){C[e]&&!l[e]&&i.push(C[e])}),i.join("")),o=u(['<div class="'+o+'">','<div class="layui-unselect layui-layedit-tool">'+e+"</div>",'<div class="layui-layedit-iframe">','<iframe id="'+r+'" name="'+r+'" textarea="'+t+'" frameborder="0"></iframe>',"</div>","</div>"].join(""));return d.ie&&d.ie<8?s.removeClass("layui-hide").addClass("layui-show"):(c[0]&&c.remove(),f.call(a,o,s[0],n),s.addClass("layui-hide").after(o),a.index)},e.prototype.getContent=function(t){t=n(t);if(t[0])return l(t[0].document.body.innerHTML)},e.prototype.getText=function(t){t=n(t);if(t[0])return u(t[0].document.body).text()},e.prototype.setContent=function(t,e,i){var l=n(t);l[0]&&(i?u(l[0].document.body).append(e):u(l[0].document.body).html(e),layedit.sync(t))},e.prototype.sync=function(t){t=n(t);t[0]&&u("#"+t[1].attr("textarea")).val(l(t[0].document.body.innerHTML))},e.prototype.getSelection=function(t){var t=n(t);if(t[0])return t=p(t[0].document),document.selection?t.text:t.toString()},function(a,n,o){var s=this,r=a.find("iframe");r.css({height:o.height}).on("load",function(){var t=r.contents(),e=r.prop("contentWindow"),i=t.find("head"),l=u(["<style>","*{margin: 0; padding: 0;}","body{padding: 10px; line-height: 20px; overflow-x: hidden; word-wrap: break-word; font: 14px Helvetica Neue,Helvetica,PingFang SC,Microsoft YaHei,Tahoma,Arial,sans-serif; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;}","a{color:#01AAED; text-decoration:none;}a:hover{color:#c00}","p{margin-bottom: 10px;}","img{display: inline-block; border: none; vertical-align: middle;}","pre{margin: 10px 0; padding: 10px; line-height: 20px; border: 1px solid #ddd; border-left-width: 6px; background-color: #F2F2F2; color: #333; font-family: Courier New; font-size: 12px;}","</style>"].join("")),t=t.find("body");i.append(l),t.attr("contenteditable","true").css({"min-height":o.height}).html(n.value||""),m.apply(s,[e,r,n,o]),g.call(s,e,a,o)})}),n=function(t){t=u("#LAY_layedit_"+t);return[t.prop("contentWindow"),t]},l=function(t){return t=8==d.ie?t.replace(/<.+>/g,function(t){return t.toLowerCase()}):t},m=function(e,t,i,l){var a=e.document,n=u(a.body);n.on("keydown",function(t){if(13===t.keyCode){var e=p(a);if("pre"===h(e).parentNode.tagName.toLowerCase())return t.shiftKey?void 0:(c.msg("\u8bf7\u6682\u65f6\u7528shift+enter"),!1);a.execCommand("formatBlock",!1,"<p>")}}),u(i).parents("form").on("submit",function(){var t=n.html();8==d.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),i.value=t}),n.on("paste",function(t){a.execCommand("formatBlock",!1,"<p>"),setTimeout(function(){o.call(e,n),i.value=n.html()},100)})},o=function(t){this.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),u(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},p=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},h=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,e,i){var l,a,n=this.document,o=document.createElement(t);for(l in e)o.setAttribute(l,e[l]);o.removeAttribute("text"),n.selection?(a=i.text||e.text,"a"===t&&!a||(a&&(o.innerHTML=a),i.pasteHTML(u(o).prop("outerHTML")),i.select())):(a=i.toString()||e.text,"a"===t&&!a||(a&&(o.innerHTML=a),i.deleteContents(),i.insertNode(o)))},b=function(e,t){var i=this.document,l="layedit-tool-active",i=h(p(i)),a=function(t){return e.find(".layedit-tool-"+t)};t&&t[t.hasClass(l)?"removeClass":"addClass"](l),e.find(">i").removeClass(l),a("unlink").addClass(y),u(i).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||a("b").addClass(l),"i"!==t&&"em"!==t||a("i").addClass(l),"u"===t&&a("u").addClass(l),"strike"===t&&a("d").addClass(l),"p"===t&&a("center"===e?"center":"right"===e?"right":"left").addClass(l),"a"===t&&(a("link").addClass(l),a("unlink").removeClass(y))})},g=function(a,t,e){var n=a.document,o=u(n.body),s={link:function(i){var t=h(i),l=u(t).parent();x.call(o,{href:l.attr("href"),target:l.attr("target")},function(t){var e=l[0];"A"===e.tagName?e.href=t.url:v.call(a,"a",{target:t.target,href:t.url,text:t.url},i)})},unlink:function(t){n.execCommand("unlink")},code:function(e){k.call(o,function(t){v.call(a,"pre",{text:t.code,"lay-lang":t.lang},e)})},help:function(){c.open({type:2,title:"\u5e2e\u52a9",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["","no"]})}},r=t.find(".layui-layedit-tool"),i=function(){var t,e=u(this),i=e.attr("layedit-event"),l=e.attr("lay-command");e.hasClass(y)||(o.focus(),(t=p(n)).commonAncestorContainer,l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"<p>"),setTimeout(function(){o.focus()},10)):s[i]&&s[i].call(this,t),b.call(a,r,e))},l=/image/;r.find(">i").on("mousedown",function(){var t=u(this).attr("layedit-event");l.test(t)||i.call(this)}).on("click",function(){var t=u(this).attr("layedit-event");l.test(t)&&i.call(this)}),o.on("click",function(){b.call(a,r)})},x=function(t,i){var l=this,t=c.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"\u8d85\u94fe\u63a5",skin:"layui-layer-msg",content:['<ul class="layui-form" style="margin: 15px;">','<li class="layui-form-item">','<label class="layui-form-label" style="width: 60px;">URL</label>','<div class="layui-input-block" style="margin-left: 90px">','<input name="url" lay-verify="url" value="'+(t.href||"")+'" autofocus="true" autocomplete="off" class="layui-input">',"</div>","</li>",'<li class="layui-form-item">','<label class="layui-form-label" style="width: 60px;">\u6253\u5f00\u65b9\u5f0f</label>','<div class="layui-input-block" style="margin-left: 90px">','<input type="radio" name="target" value="_self" class="layui-input" title="\u5f53\u524d\u7a97\u53e3"'+("_self"!==t.target&&t.target?"":"checked")+">",'<input type="radio" name="target" value="_blank" class="layui-input" title="\u65b0\u7a97\u53e3" '+("_blank"===t.target?"checked":"")+">","</div>","</li>",'<li class="layui-form-item" style="text-align: center;">','<button type="button" lay-submit lay-filter="layedit-link-yes" class="layui-btn"> \u786e\u5b9a </button>','<button style="margin-left: 20px;" type="button" class="layui-btn layui-btn-primary"> \u53d6\u6d88 </button>',"</li>","</ul>"].join(""),success:function(t,e){a.render("radio"),t.find(".layui-btn-primary").on("click",function(){c.close(e),l.focus()}),a.on("submit(layedit-link-yes)",function(t){c.close(x.index),i&&i(t.field)})}});x.index=t},k=function(i){var l=this,t=c.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"\u63d2\u5165\u4ee3\u7801",skin:"layui-layer-msg",content:['<ul class="layui-form layui-form-pane" style="margin: 15px;">','<li class="layui-form-item">','<label class="layui-form-label">\u8bf7\u9009\u62e9\u8bed\u8a00</label>','<div class="layui-input-block">','<select name="lang">','<option value="JavaScript">JavaScript</option>','<option value="HTML">HTML</option>','<option value="CSS">CSS</option>','<option value="Java">Java</option>','<option value="PHP">PHP</option>','<option value="C#">C#</option>','<option value="Python">Python</option>','<option value="Ruby">Ruby</option>','<option value="Go">Go</option>',"</select>","</div>","</li>",'<li class="layui-form-item layui-form-text">','<label class="layui-form-label">\u4ee3\u7801</label>','<div class="layui-input-block">','<textarea name="code" lay-verify="required" autofocus="true" class="layui-textarea" style="height: 200px;"></textarea>',"</div>","</li>",'<li class="layui-form-item" style="text-align: center;">','<button type="button" lay-submit lay-filter="layedit-code-yes" class="layui-btn"> \u786e\u5b9a </button>','<button style="margin-left: 20px;" type="button" class="layui-btn layui-btn-primary"> \u53d6\u6d88 </button>',"</li>","</ul>"].join(""),success:function(t,e){a.render("select"),t.find(".layui-btn-primary").on("click",function(){c.close(e),l.focus()}),a.on("submit(layedit-code-yes)",function(t){c.close(k.index),i&&i(t.field)})}});k.index=t},C={html:'<i class="layui-icon layedit-tool-html" title="HTML\u6e90\u4ee3\u7801" lay-command="html" layedit-event="html""></i><span class="layedit-tool-mid"></span>',strong:'<i class="layui-icon layedit-tool-b" title="\u52a0\u7c97" lay-command="Bold" layedit-event="b""></i>',italic:'<i class="layui-icon layedit-tool-i" title="\u659c\u4f53" lay-command="italic" layedit-event="i""></i>',underline:'<i class="layui-icon layedit-tool-u" title="\u4e0b\u5212\u7ebf" lay-command="underline" layedit-event="u""></i>',del:'<i class="layui-icon layedit-tool-d" title="\u5220\u9664\u7ebf" lay-command="strikeThrough" layedit-event="d""></i>',"|":'<span class="layedit-tool-mid"></span>',left:'<i class="layui-icon layedit-tool-left" title="\u5de6\u5bf9\u9f50" lay-command="justifyLeft" layedit-event="left""></i>',center:'<i class="layui-icon layedit-tool-center" title="\u5c45\u4e2d\u5bf9\u9f50" lay-command="justifyCenter" layedit-event="center""></i>',right:'<i class="layui-icon layedit-tool-right" title="\u53f3\u5bf9\u9f50" lay-command="justifyRight" layedit-event="right""></i>',link:'<i class="layui-icon layedit-tool-link" title="\u63d2\u5165\u94fe\u63a5" layedit-event="link""></i>',unlink:'<i class="layui-icon layedit-tool-unlink layui-disabled" title="\u6e05\u9664\u94fe\u63a5" lay-command="unlink" layedit-event="unlink""></i>',face:'<i class="layui-icon layedit-tool-face" title="\u8868\u60c5" layedit-event="face""></i>',image:'<i class="layui-icon layedit-tool-image" title="\u56fe\u7247" layedit-event="image"><input type="file" name="file"></i>',code:'<i class="layui-icon layedit-tool-code" title="\u63d2\u5165\u4ee3\u7801" layedit-event="code"></i>',help:'<i class="layui-icon layedit-tool-help" title="\u5e2e\u52a9" layedit-event="help"></i>'},e=new e;t(i,e)});layui.define(["lay","util"],function(e){"use strict";var d=layui.$,o=layui.util,u="layui-code-title",l={elem:".layui-code",title:"</>",about:"",ln:!0};e("code",function(e){var c=e=d.extend({},l,e);e.elem=d(e.elem),e.elem[0]&&layui.each(e.elem.get().reverse(),function(e,l){var t,a=d(l),i=(i=a.html(),d.trim(i).replace(/^\n|\n$/,"")),l=d.extend({},c,lay.options(l),(t={},layui.each(["title","height","encode","skin","about"],function(e,l){var i=a.attr("lay-"+l);"string"==typeof i&&(t[l]=i)}),t)),s=l.ln?"ol":"ul",s=d("<"+s+' class="layui-code-'+s+'">'),n=d('<div class="'+u+'">');a.addClass("layui-code-view layui-box"),l.skin&&("notepad"===l.skin&&(l.skin="dark"),a.addClass("layui-code-"+l.skin)),i=(i=l.encode?o.escape(i):i).replace(/[\r\t\n]+/g,"</li><li>"),a.html(s.html("<li>"+i+"</li>")),a.children("."+u)[0]||(n.html(l.title+(l.about?'<div class="layui-code-about">'+l.about+"</div>":"")),a.prepend(n)),0<(i=Math.floor(s.find("li").length/100))&&s.css("margin-left",i+"px"),l.height&&s.css("max-height",l.height)})})}).addcss("modules/code.css?v=3","skincodecss"); \ No newline at end of file diff --git a/view/templates/include/admin_header.html b/view/templates/include/admin_header.html new file mode 100644 index 0000000..384cf05 --- /dev/null +++ b/view/templates/include/admin_header.html @@ -0,0 +1,44 @@ +<div class="layui-header admin-layui-header"> + <div class="layui-logo layui-hide-xs layui-bg-black" style="box-shadow: unset !important;background-color: #1890FF !important;width: 105px;margin-left: 31px;"> + <img src="/images/admin_logo.png" alt="" style="width: 105px;height: 22px;vertical-align: middle;"> + </div> + <!-- 头部区域(可配合layui 已有的水平导航) --> + <ul class="layui-nav layui-layout-left"> + <!-- 移动端显示 --> + <li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-header-event="menuLeft"> + <i class="layui-icon layui-icon-spread-left"></i> + </li> + + <!-- <li class="layui-nav-item layui-hide-xs"><a href="">nav 1</a></li> + <li class="layui-nav-item layui-hide-xs"><a href="">nav 2</a></li> + <li class="layui-nav-item layui-hide-xs"><a href="">nav 3</a></li> + <li class="layui-nav-item"> + <a href="javascript:;">nav groups</a> + <dl class="layui-nav-child"> + <dd><a href="">menu 11</a></dd> + <dd><a href="">menu 22</a></dd> + <dd><a href="">menu 33</a></dd> + </dl> + </li> --> + + + </ul> + <ul class="layui-nav layui-layout-right header_user_info"> + <li class="layui-nav-item layui-hide layui-show-md-inline-block"> + <a href="javascript:;" style="color:#ffffff !important;"> + <img src="/images/header_user_logo.png" class="layui-nav-img admin-layui-nav-img"> + ID:88900006543 + </a> + <!-- <dl class="layui-nav-child"> + <dd><a href="">Your Profile</a></dd> + <dd><a href="">Settings</a></dd> + <dd><a href="">Sign out</a></dd> + </dl> --> + </li> + <!-- <li class="layui-nav-item" lay-header-event="menuRight" lay-unselect> + <a href="javascript:;"> + <i class="layui-icon layui-icon-more-vertical"></i> + </a> + </li> --> + </ul> + </div> \ No newline at end of file diff --git a/view/templates/include/admin_leftmenu.html b/view/templates/include/admin_leftmenu.html new file mode 100644 index 0000000..9c2ffa8 --- /dev/null +++ b/view/templates/include/admin_leftmenu.html @@ -0,0 +1,25 @@ +<div class="layui-side layui-bg-black admin-menu-list"> + <div class="layui-side-scroll admin-menu-layui-side-scroll"> + <ul class="layui-nav layui-nav-tree" lay-filter="test"> + <li class="layui-nav-item layui-nav-itemed"> + <a class="" href="javascript:;">menu group 1</a> + <dl class="layui-nav-child"> + <dd><a href="javascript:;">menu 1</a></dd> + <dd><a href="javascript:;">menu 2</a></dd> + <dd><a href="javascript:;">menu 3</a></dd> + <dd><a href="">the links</a></dd> + </dl> + </li> + <li class="layui-nav-item"> + <a href="javascript:;">menu group 2</a> + <dl class="layui-nav-child"> + <dd><a href="javascript:;">list 1</a></dd> + <dd><a href="javascript:;">list 2</a></dd> + <dd><a href="">超链接</a></dd> + </dl> + </li> + <li class="layui-nav-item"><a href="javascript:;">click menu item</a></li> + <li class="layui-nav-item"><a href="">the links</a></li> + </ul> + </div> + </div> \ No newline at end of file diff --git a/view/templates/tpl/home.html b/view/templates/tpl/home.html new file mode 100644 index 0000000..b8b7945 --- /dev/null +++ b/view/templates/tpl/home.html @@ -0,0 +1,95 @@ + +<!DOCTYPE html> +<html> +<head> + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> + <link href="/images/pdd_icon.png" rel="icon"> + <title>首页</title> + <link rel="stylesheet" href="/css/layui.css"/> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + {literal} + <style> + .admin-container-outer .admin-layui-header{ + height: 48px !important; + background-color: #1890FF !important; + } + .admin-container-outer .admin-layui-header *{ + line-height: 48px !important; + } + .admin-container-outer .admin-layui-nav-img{ + width: 24px !important; + height: 24px !important; + margin-right: 8px !important; + } + .header_user_name{ + color:#FFFFFF !important; + } + .admin-container-outer .header_user_info{ + padding: 0 33px !important; + } + .admin-container-outer .admin-menu-list{ + top: 48px !important; + width: 188px !important; + } + .admin-container-outer .admin-menu-layui-side-scroll{ + width: 188px !important; + } + @media screen and (max-width: 768px) { + .layui-layout-admin .layui-layout-left, + .layui-layout-admin .layui-body, + .layui-layout-admin .layui-footer{left: 0;} + .layui-layout-admin .layui-side{left: -300px;} + } + </style> + {/literal} +</head> +<body> + +<div class="layui-layout layui-layout-admin admin-container-outer"> + {include file="include/admin_header.html"} + {include file="include/admin_leftmenu.html"} + <div class="layui-body"> + <div style="padding: 15px;"> + 内容主体区域 + </div> + </div> + <div class="layui-footer"> + 底部固定区域 + </div> +</div> +<script src="/js/layui.js"></script> +{literal} +<script> +layui.use(['element', 'layer', 'util'], function(){ + var element = layui.element + ,layer = layui.layer + ,util = layui.util + ,$ = layui.$; + + util.event('lay-header-event', { + menuLeft: function(othis){ + layer.msg('展开左侧菜单的操作', {icon: 0}); + } + ,menuRight: function(){ + layer.open({ + type: 1 + ,title: '更多' + ,content: '<div style="padding: 15px;">处理右侧面板的操作</div>' + ,area: ['260px', '100%'] + ,offset: 'rt' + ,anim: 5 + ,shadeClose: true + ,scrollbar: false + }); + } + }); +}); +</script> +{/literal} +</body> +</html> From ddde9987016fdda2fe53d98d471cd48329e23399 Mon Sep 17 00:00:00 2001 From: Jason <1432334894@qq.com> Date: Fri, 29 Jul 2022 17:24:21 +0800 Subject: [PATCH 02/12] =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view.lnk | Bin 0 -> 1028 bytes view/css/admin_style.css | 161 +++++++++++++++++++++++++++++ view/images/admin_logo.png | Bin 4260 -> 12632 bytes view/images/admin_logo.svg | 16 +++ view/images/admin_menu_left_line.png | Bin 0 -> 175 bytes view/images/header_user_logo.png | Bin 1344 -> 9918 bytes view/images/left_menu_bule_1.png | Bin 0 -> 2686 bytes view/images/left_menu_bule_1.svg | 19 ++++ view/images/left_menu_bule_2.png | Bin 0 -> 1934 bytes view/images/left_menu_bule_2.svg | 16 +++ view/images/left_menu_bule_3.png | Bin 0 -> 2785 bytes view/images/left_menu_bule_3.svg | 23 +++++ view/images/left_menu_bule_4.png | Bin 0 -> 1735 bytes view/images/left_menu_bule_4.svg | 18 ++++ view/images/left_menu_grey_1.png | Bin 0 -> 2861 bytes view/images/left_menu_grey_1.svg | 19 ++++ view/images/left_menu_grey_2.png | Bin 0 -> 2041 bytes view/images/left_menu_grey_2.svg | 16 +++ view/images/left_menu_grey_3.png | Bin 0 -> 2967 bytes view/images/left_menu_grey_3.svg | 23 +++++ view/images/left_menu_grey_4.png | Bin 0 -> 1837 bytes view/images/left_menu_grey_4.svg | 18 ++++ view/images/logout.png | Bin 0 -> 933 bytes view/images/logout.svg | 18 ++++ view/templates/include/admin_header.html | 16 ++- view/templates/include/admin_leftmenu.html | 62 ++++++++--- view/templates/tpl/home.html | 122 ++++++++++++++++------ 27 files changed, 493 insertions(+), 54 deletions(-) create mode 100644 view.lnk create mode 100644 view/css/admin_style.css create mode 100644 view/images/admin_logo.svg create mode 100644 view/images/admin_menu_left_line.png create mode 100644 view/images/left_menu_bule_1.png create mode 100644 view/images/left_menu_bule_1.svg create mode 100644 view/images/left_menu_bule_2.png create mode 100644 view/images/left_menu_bule_2.svg create mode 100644 view/images/left_menu_bule_3.png create mode 100644 view/images/left_menu_bule_3.svg create mode 100644 view/images/left_menu_bule_4.png create mode 100644 view/images/left_menu_bule_4.svg create mode 100644 view/images/left_menu_grey_1.png create mode 100644 view/images/left_menu_grey_1.svg create mode 100644 view/images/left_menu_grey_2.png create mode 100644 view/images/left_menu_grey_2.svg create mode 100644 view/images/left_menu_grey_3.png create mode 100644 view/images/left_menu_grey_3.svg create mode 100644 view/images/left_menu_grey_4.png create mode 100644 view/images/left_menu_grey_4.svg create mode 100644 view/images/logout.png create mode 100644 view/images/logout.svg diff --git a/view.lnk b/view.lnk new file mode 100644 index 0000000000000000000000000000000000000000..40af31506d9969cccf0edfee2b58ef3b1e8fc90d GIT binary patch literal 1028 zcmeZaU|?VrVFHp23<tm@gIhNP2ZI2R{pkwN+n_}^7%O-uHhu-tJg4W~NCwgnWk7u} z29)+@6k(7Lc;J6Q;gwaUz@i%*4B7?;b0rz{U94izl!CZ<42EFQKOqaO1Q@bQ6EkyC zb4v5dQ}YbX%^3n1I2l+N-tU{}?<?^qgg;mhsI~^IJ{e3Rh!v+_F=R88G9)r&GUPC% z0&ywO>~bIrWP>>nGBC(7B*1OcvlC$O4t4bOajgS7zyoT}pOCp$e?rdtf$Z5fogYZD zBCG(j*dM#1*ptst#E=5Cr3ff1!QclsU(j2Cp)51CoPog#ZuVQC*`i=S#LfVj4GD0B z1z%PkW+(%?KNaY11_luz4gz8sAO;08h}H#S5C{ZfK_F%Z;@qgjN1%ve00uBx_(A#k zMJcI8F%Z|VG3YVGz->tYY6F_FAOfTx2vSmuvrF;|baM>SinC4g88YUc-0maQ<2cha zsotrqWmodLR4Z}5w}MMmSSG1?_ev9zUk-FQC(!&tpxK7O0l{w#_TF-4=yYHH<AU&# z;xwgDkewil<$+ich>@cZ5wr>n8VoMLfQ&(r$Bbf4kWpX&N+ci)4L+)FfA20Ou=FES zLeIR{Yh;1qTp$%73qf&<2yX@kQ6L`_FANSKVs#)m-Ae+QEFeBe2Z+(0`pwTW5~7+9 zB;f$W$ho2v$OqZIEGt>VcIqX;t=AY1_}`Sc0Mr9af<OQ=Nd<_B@e-<+5kZ28Ly(CK z43<C)vUH<ZuFKlq0*~b$4th&$D|$d4&HyR!0OHg63+mZ}MV+=CuH13Iv1m0&90mZz C4ciI; literal 0 HcmV?d00001 diff --git a/view/css/admin_style.css b/view/css/admin_style.css new file mode 100644 index 0000000..d594e1e --- /dev/null +++ b/view/css/admin_style.css @@ -0,0 +1,161 @@ +@media screen and (max-width: 1350px){ + .admin-container-outer .admin-layui-header{ + height: 48px !important; + background-color: #1890FF !important; + } + .admin-container-outer .admin-layui-header *{ + line-height: 48px !important; + } + .admin-container-outer .admin-layui-nav-img{ + width: 24px !important; + height: 24px !important; + margin-right: 8px !important; + } + .header_user_name{ + color:#FFFFFF !important; + } + .admin-container-outer .header_user_info{ + padding: 0 32px !important; + } + .admin-container-outer .admin-menu-list{ + top: 48px !important; + width: 188px !important; + background-color: #FFFFFF !important; + } + .admin-container-outer .admin-menu-layui-side-scroll{ + width: 188px !important; + } + .admin-container-outer .admin-layui-nav-tree{ + background-color:#FFFFFF !important; + width: 188px !important; + padding-left: 38px !important; + } + .admin-container-outer .admin-layui-nav-item-a{ + padding: 0px !important; + margin-right: 0px !important; + } + .admin-header-user-info{ + padding: 0px !important; + } + .admin_logout_img{ + width: 14px !important; + height: auto !important; + border-radius:unset !important; + margin-right: 0px !important; + } + @media screen and (max-width: 768px) { + .layui-layout-admin .layui-layout-left, + .layui-layout-admin .layui-body, + .layui-layout-admin .layui-footer{left: 0;} + .layui-layout-admin .layui-side{left: -300px;} + } + .layui-nav-itemed>.admin-layui-nav-child{ + background-color: #ffffff !important; + } + + .layui-nav-item>.admin-layui-nav-item-title-a{ + color: #000000 !important; + } +} + +body{ + background: #F0F2F5; +} +.admin-container-outer .admin-layui-header{ + background-color: #1890FF !important; +} +.admin_logout_img{ + width: 20px !important; + border-radius:unset !important; + height: auto !important; +} +.admin-container-outer .admin-layui-nav-tree{ + background-color:#FFFFFF !important; + color: #000000 !important; +} +/* .admin-menu-list a{ + color: black !important; +} */ +.admin-menu-list .layui-this a,.layui-nav-tree .layui-nav-child dd.layui-this{ + background-color:rgba(24, 144, 255, 0.13) !important; + color: rgba(24, 144, 255, 1) !important; +} +.admin-layui-nav-item-a-child{ + background-color: #FFFFFF !important; +} +.admin-menu-list .layui-nav-itemed>.layui-nav-child{ + background-color: #FFFFFF !important; +} +.admin-menu-list .layui-icon-down:before{ + content: ""; +} +.admin-menu-list .layui-nav-bar{ + left:196px !important; + background-color: rgba(24, 144, 255, 1) !important; + border-radius: 4px !important; + width: 4px !important; + height: 29px !important; + margin-top: 5.5px !important; + top:55px; +} +.admin-layui-nav-item-a-child-img{ + width: 16px; + height: auto; +} +.admin-select{ + display: none; +} +.admin-menu-list .layui-this .admin-select{ + display: inline-block !important; +} +.admin-menu-list .layui-this .admin-no-select{ + display: none !important; +} +.layui-nav-tree .layui-nav-child dd.layui-this::after{ + content: ""; + display: block; + position: absolute; + z-index: 8; + left:196px !important; + background-color: rgba(24, 144, 255, 1) !important; + border-radius: 4px !important; + width: 4px !important; + height: 29px !important; + margin-top: 5.5px !important; + top: 0px; +} +.admin_menu_line{ + height: 1px; + width: 62px; + margin-left: 20px; + margin-top: 5px; +} +.admin_menu_line img{ + width: 100%; + height: 1px; + vertical-align: top; +} +.admin-layui-nav-child{ + color:red !important; +} +a, article, aside, b, body, button, dd, div, dl, dt, figcaption, figure, footer, h1, h2, h3, h4, h5, h6, header, i, input, li, nav, p, section, select, span, textarea, ul { + padding: 0; + margin: 0; + list-style: none; + font-style: normal; + text-decoration: none; + border: none; + font-weight: 400; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-tap-highlight-color: transparent; + -webkit-font-smoothing: antialiased; +} +.admin-layui-nav-item-a-child{ + font-family: PingFangSC-Medium,Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif !important; + color: rgba(99, 108, 120, 1) !important; +} +.admin-layui-nav-item-title-a > span{ + font-family: PingFangSC-Medium,Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif !important; + color: rgba(0, 0, 0, 1) !important; +} \ No newline at end of file diff --git a/view/images/admin_logo.png b/view/images/admin_logo.png index 651908647f61377d54f928c7cb48791c8585e41c..43467486d92a3f62be9160e1d1fdf84fd7e27750 100644 GIT binary patch literal 12632 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 literal 4260 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 GLSTXd!3`(? diff --git a/view/images/admin_logo.svg b/view/images/admin_logo.svg new file mode 100644 index 0000000..109a090 --- /dev/null +++ b/view/images/admin_logo.svg @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="105px" height="23px" viewBox="0 0 105 23" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <title>编组 49</title> + <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="icon" transform="translate(-130.000000, -34.000000)" fill="#FFFFFF" fill-rule="nonzero"> + <g id="编组-49" transform="translate(130.000000, 34.049003)"> + <g id="编组-48" transform="translate(0.133351, 0.534620)"> + <path d="M12.1271557,5.27708866 C11.3322096,5.39548488 10.5203498,5.5477086 9.6915763,5.7337598 L8.49915722,3.22206856 C9.39558575,2.91762114 10.6133754,2.66391495 12.1525263,2.46095 C12.16944,1.76748643 12.1778969,1.04865223 12.1778969,0.304447423 L16.3133077,0.304447423 C16.3133077,0.94716976 16.3133077,1.55606461 16.3133077,2.13113196 C18.1399923,2.02964949 19.4592645,2.0550201 20.2711242,2.20724382 C21.2352078,2.39329502 21.8018182,2.84573772 21.9709557,3.56457191 C22.1400931,4.2834061 22.1823775,4.97264124 22.0978088,5.63227732 C21.9963263,6.57944709 21.8821585,7.39976375 21.7553054,8.09322733 C21.6284523,8.7866909 21.4804571,9.4716976 21.3113196,10.1482474 L22.7320742,10.1482474 L22.1231794,12.9897567 L15.831266,12.9897567 C15.4760773,14.8840962 15.0024925,16.3809627 14.4105114,17.4803562 C13.6832203,18.9518521 12.6091974,20.1019868 11.1884428,20.9307603 L8.42304537,19.7129706 C9.45478386,18.5120947 10.241273,17.2520206 10.7825129,15.9327485 C11.1207878,15.0194062 11.3998646,14.0384089 11.6197433,12.9897567 L8.67675155,12.9897567 L8.04248609,10.1482474 L11.974932,10.1482474 C12.0256732,9.26873265 12.0679576,7.94100362 12.1017851,6.16506031 C12.1186988,5.86061289 12.1271557,5.56462234 12.1271557,5.27708866 Z M16.3133077,4.79504691 C16.296394,7.24754004 16.2456528,9.03194021 16.161084,10.1482474 L20.8546485,10.1482474 L17.9877686,9.66620568 C18.156906,9.09113832 18.2837591,8.5076141 18.3683279,7.915633 C18.4528966,7.3236519 18.5290084,6.65555894 18.5966634,5.91135413 C18.6304909,5.50542423 18.4867241,5.20943368 18.1653629,5.02338248 C17.8440017,4.83733128 17.4549856,4.75276255 16.9983144,4.76967629 C16.761522,4.78659004 16.5331864,4.79504691 16.3133077,4.79504691 Z M7.66192681,8.06785671 L7.66192681,20.6516835 L3.62799846,20.6516835 L3.62799846,0.431300516 L7.66192681,0.431300516 L7.66192681,5.25171805 L7.66192681,8.06785671 Z M2.66391495,19.9413062 L0,19.9413062 L0,1.97483205 L2.66391495,1.16704845 L2.66391495,19.9413062 Z M22.2246619,18.089251 C22.2246619,18.7827146 21.9624988,19.3831526 21.4381727,19.890565 C20.9138466,20.3979773 20.2753527,20.6516835 19.522691,20.6516835 C18.7700293,20.6516835 18.127307,20.3979773 17.594524,19.890565 C17.061741,19.3831526 16.7953495,18.7827146 16.7953495,18.089251 C16.8122632,17.4634425 17.0828832,16.9095173 17.6072093,16.4274755 C18.1315354,15.9454338 18.7700293,15.7086413 19.522691,15.7170982 C20.2753527,15.7255551 20.9138466,15.966576 21.4381727,16.4401608 C21.9624988,16.9137457 22.2246619,17.4634425 22.2246619,18.089251 Z" id="形状"></path> + <path d="M36.6096082,8.93045774 C36.6096082,7.78032303 36.6096082,6.6386452 36.6096082,5.50542423 L40.6181659,5.50542423 C40.6181659,6.6386452 40.6181659,7.77186616 40.6181659,8.90508712 L49.726218,8.90508712 L48.9397288,11.7465964 L40.6181659,11.7465964 C40.6181659,13.7931596 40.6181659,15.7974385 40.6181659,17.759433 C40.6181659,18.2837591 40.4743991,18.8419127 40.1868654,19.4338938 C39.882418,19.9751337 39.3580918,20.2668958 38.613887,20.3091802 C37.8696822,20.3514645 36.9263418,20.2922664 34.5584174,20.3091802 L33.2353159,17.7086918 C34.6391568,17.7086918 35.5863266,17.6833212 36.0768252,17.6325799 C36.2459626,17.6325799 36.3812726,17.5437827 36.4827551,17.3661884 C36.5842376,17.1885941 36.6349788,16.896832 36.6349788,16.4909021 C36.618065,16.2202821 36.6096082,14.6473038 36.6096082,11.771967 L29.9371355,11.771967 C29.2605857,11.7550533 28.6220918,11.6493424 28.0216538,11.4548343 C27.4212158,11.2603262 27.1125399,10.6810304 27.0956262,9.71694692 L27.0956262,1.78173675 L31.1041839,0.811859795 L31.1041839,1.59834897 C33.1338334,1.56452148 35.1634829,1.52223711 37.1931324,1.47149588 C40.5927953,1.42075464 42.7323841,0.989454125 43.6118989,0.17759433 L48.5337989,0.17759433 C47.8403353,2.00427887 46.6817437,3.11212921 45.0580242,3.50114536 C43.4343046,3.89016152 42.0135499,4.13541083 40.7957602,4.2368933 C39.7301943,4.32146203 38.2290993,4.37643171 36.2924754,4.40180232 C34.3558516,4.42717294 32.8209291,4.43985825 31.6877082,4.43985825 L31.1041839,2.71465619 L31.0788133,8.93045774 L36.6096082,8.93045774 Z M46.9608206,12.8882742 C47.1468718,14.1398914 47.4217201,15.2900261 47.7853657,16.3386784 C48.1490112,17.3873306 48.795962,18.4359828 49.726218,19.4846351 L46.2504432,19.9976694 C45.0157398,19.0504996 44.3772459,18.4148407 43.8782904,17.2393353 C43.3793349,16.06383 43.0114609,14.6134763 42.7746685,12.8882742 L46.9608206,12.8882742 Z M29.4043525,12.9643861 L33.8188401,12.9643861 C33.429824,14.8079844 32.8885841,16.3217646 32.1951205,17.5057268 C31.4847432,18.7235165 30.8606474,19.4156641 29.6428577,20.1260414 L26.1822839,19.357782 C26.7911788,18.6474047 27.4169874,17.7509761 28.0597097,16.6684964 C28.6516908,15.501448 29.0999051,14.2667445 29.4043525,12.9643861 Z" id="形状"></path> + <path d="M74.437006,5.91135413 C74.7245397,5.92826787 75.037444,5.95363849 75.3757189,5.98746598 C76.1875787,6.08894846 76.6019655,6.62173145 76.6188792,7.58581496 L76.5935086,9.26027578 C76.5935086,10.2920143 76.200264,10.8839954 75.4137748,11.0362191 C74.6272857,11.1884428 73.8788524,11.2730115 73.1684751,11.2899253 L70.2001127,11.2645546 L70.2001127,11.8988201 L67.257121,11.8988201 L67.257121,12.2286382 C70.9274038,12.1271557 73.4475519,12.3385775 74.8175653,12.8629036 C75.5448564,13.1504373 75.9930706,13.5309966 76.1622081,14.0045815 C76.3313456,14.4781663 76.4074574,14.968665 76.3905437,15.4760773 C76.3905437,15.8650935 76.3905437,16.1864547 76.3905437,16.4401608 C76.3905437,16.693867 76.3905437,17.0744263 76.3905437,17.5818387 C76.3905437,18.4782672 76.2044925,19.1379033 75.8323901,19.5607469 C75.4602876,19.9835906 74.8344791,20.2034693 73.9549643,20.220383 L71.3417906,20.1260414 L70.2001127,17.4803562 L71.3417906,17.4803562 C71.7646342,17.4972699 72.043711,17.4338434 72.179021,17.2900766 C72.3143309,17.1463097 72.3819859,16.9137457 72.3819859,16.5923846 C72.3819859,16.3555921 72.3735291,16.1653125 72.3566153,16.0215456 C72.3397016,15.8777788 72.1536504,15.7382404 71.7984617,15.6029304 C71.2233943,15.3830517 69.7096141,15.3069399 67.257121,15.3745949 L67.257121,20.5755717 L63.2485632,20.5755717 L63.2485632,15.5775598 C61.6248436,15.7297835 60.1618046,15.9496622 58.8594462,16.2371959 L58.3012926,14.8418119 L58.3012926,19.9920474 L54.3181055,19.9920474 L54.3181055,12.6853093 L58.3012926,12.6853093 L58.3012926,13.2180923 C59.6374785,12.9136449 61.2865687,12.6599387 63.2485632,12.4569737 L63.2485632,11.1377016 L66.2676668,11.1377016 L66.2676668,0.608894846 L70.2001127,0.608894846 L70.2001127,1.87557004 C70.5553014,1.80791505 70.9189469,1.13322096 71.3417906,1.06556598 C72.1705641,0.94716976 73.0839064,0.727291066 74.0310761,0.811859795 C74.8429359,0.879514777 75.4602876,1.00636787 75.8831313,1.19241907 C76.2721474,1.36155653 76.500483,1.74211581 76.568138,2.33409691 L76.5173968,4.03392835 C76.5173968,4.91344313 76.2552337,5.44622612 75.7309076,5.63227732 C75.3926327,5.76758729 74.9613321,5.86061289 74.437006,5.91135413 Z M70.2001127,3.01910361 L70.2001127,4.82041753 C70.6906114,4.82041753 71.18111,4.82041753 71.6716086,4.82041753 C72.246676,4.83733128 72.5426665,4.70202131 72.5595803,4.41448763 L72.5595803,3.80559279 C72.5595803,3.53497286 72.4242703,3.38274914 72.1536504,3.34892165 C71.8322892,3.29818042 71.3502474,3.33200791 70.7075251,3.45040413 C70.6060426,3.46731787 70.5299308,3.48423162 70.4791895,3.50114536 L70.2001127,3.01910361 Z M70.2001127,6.76261833 L70.2001127,8.90508712 C70.7413526,8.92200087 71.2572218,8.92200087 71.7477205,8.90508712 C72.3227878,8.90508712 72.6103215,8.73594966 72.6103215,8.39767475 L72.6103215,7.81415052 C72.6103215,7.62809932 72.5934077,7.48433248 72.5595803,7.38285001 C72.4919253,7.28136753 72.3397016,7.21371255 72.1029091,7.17988506 C71.3978859,7.17988506 70.8691185,7.17988506 70.5166069,7.17988506 C70.4462749,7.17988506 70.3407768,7.04079615 70.2001127,6.76261833 Z M61.6248436,1.26853093 L65.6841426,1.26853093 L65.125989,3.72948093 L61.5487318,3.72948093 C61.5487318,3.8647909 61.5402749,4.05929897 61.5233612,4.31300516 L65.4050658,4.31300516 L64.8722828,6.34265465 L61.3457668,6.34265465 C61.3288531,6.44413712 61.3119394,6.52870585 61.2950256,6.59636083 C61.2611981,6.74858454 61.2273706,6.90080825 61.1935431,7.05303197 L65.7602545,7.05303197 L65.2021009,9.46324073 L60.2548302,9.46324073 C60.1195203,9.70003317 59.9672966,9.92836874 59.7981591,10.1482474 C59.0370406,11.1799859 58.0645002,11.974932 56.880538,12.5330856 L53.9375462,10.6197969 C54.6479235,9.99398833 55.3583009,10.1567043 55.8657132,9.46324073 L53.9375462,9.46324073 L53.4808751,7.05303197 L57.0073911,7.05303197 C57.0581323,6.86698076 57.1173304,6.63018832 57.1849854,6.34265465 L54.3942174,6.34265465 L53.9121756,4.31300516 L57.4894328,4.31300516 C57.5063466,4.19460894 57.5232603,4.01701461 57.5401741,3.78022217 C57.5401741,3.76330842 57.5401741,3.74639468 57.5401741,3.72948093 L54.216623,3.72948093 L53.7599519,1.26853093 L57.5909153,1.26853093 C57.5909153,0.997910997 57.5824584,0.718834193 57.5655447,0.431300516 L61.6248436,0.431300516 C61.6248436,0.65117921 61.6248436,0.930256015 61.6248436,1.26853093 Z" id="形状"></path> + <path d="M94.9362714,4.54134073 C94.9362714,5.2348043 94.9362714,5.93672475 94.9362714,6.64710207 L104.29803,6.64710207 L103.689135,9.5647232 L94.9362714,9.5647232 C94.9362714,10.444238 94.9362714,11.3322096 94.9362714,12.2286382 L104.399512,12.2286382 L103.815988,15.0701474 L94.9362714,15.0701474 C94.9362714,15.966576 94.9362714,16.8207201 94.9362714,17.6325799 C94.9193577,18.6135772 94.6656515,19.3324114 94.1751528,19.7890825 C93.6846542,20.2457536 92.8727944,20.4825461 91.7395735,20.4994598 L86.3863729,20.5248304 L85.7013662,17.759433 L89.5323296,17.759433 C90.0059145,17.759433 90.3780169,17.7002349 90.6486369,17.5818387 C90.8685156,17.4465287 90.9869118,17.0913401 91.0038255,16.5162727 L91.0038255,15.0701474 L81.6710699,15.0701474 L80.5003894,12.2286382 L91.0038255,12.2286382 L91.0038255,9.5647232 L81.6710699,9.5647232 L80.6272425,6.64710207 L91.0038255,6.64710207 L91.0038255,4.54134073 C90.0904833,4.55825447 89.1855979,4.56671134 88.2891693,4.56671134 C85.0924714,4.58362509 83.4493289,4.54134073 82.3330216,4.54134073 L81.0839137,1.72520206 C81.9634284,1.70828832 84.1749007,1.69137457 87.7183304,1.67446083 C91.2617601,1.65754708 93.6677405,1.64063333 94.9362714,1.62371959 C95.9510961,1.64063333 96.7164431,1.54760773 97.2323124,1.34464278 C97.7481816,1.14167784 98.2090812,0.701920447 98.6150111,0.0253706186 L102.851904,0 C102.158441,1.82668454 101.262012,3.04024579 100.162619,3.64068377 C99.0632254,4.24112174 97.6086432,4.54134073 95.7988724,4.54134073 C95.5113388,4.54134073 95.2238051,4.54134073 94.9362714,4.54134073 Z" id="路径"></path> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/view/images/admin_menu_left_line.png b/view/images/admin_menu_left_line.png new file mode 100644 index 0000000000000000000000000000000000000000..8daa87a76d7edbeab9cbb52515038884dffe8679 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^_CU<Y!3HEV^~;z*oZ=vNCx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1IU%(7!gH$s#emVCZNJ)CSIEHY@ rCfEG<u<*h9`29H&ZW2GfzrU}{u)mgb&jGoYNg&0Zu6{1-oD!M<dn_bX literal 0 HcmV?d00001 diff --git a/view/images/header_user_logo.png b/view/images/header_user_logo.png index a3f6ef85becfe2a4fd189eaaea10c4382b383927..00fc71000696b2d1d89b68c9430052b7b4c813cd 100644 GIT binary patch literal 9918 zcmV;vCPCSWP)<h;3K|Lk000e1NJLTq003eD003YJ1^@s7k!qKd00004XF*Lt006O% z3;baP0000uWmrjOO-%qQ0000800D<-00aO40096102%-Q00002paK8{000010001D zpaTE|000010001B00000UdQdT001U2Nkl<ZcmdTt2Yi#&_9y9Xnx>N$T4;f$t?WI@ zhO)P^#D%y}5%sC>?_NB`r}$j(1d*o?6$C_3L{`~D_A0YU>4uiBv`N|~ZJPf%H~qeR z*`o#i|NHwTcb$9g{O&mSoO1!}m_6C5r+-!&8#9!ukL^T*NEo<QVKfT;Lib#`h==7J z&Ju8mxrAa0u$SQc*_#|JZ*y=g5g#gWY+QF9?oSc~2%NqGH+;VIFdSbo7`o2Qfb3t# z38Q#-#?|t1;tXZwG%jR7vXnV9*QRqpHnzqmWIbyLuB;rykkDF)ZxzJ69j5Pq4?Z#H zIwT2#?bd1NQwLds^gRHf;lc3EVw0Z&+loZBHi=60055zn7AS`)tpVo0JQUhQ2Qwtx zA4|lw|GtcD7QW@br(w?Mw#<EWmjdpc--o$5I4&`>r!Ki<Oq#LN_{Ak7GwrACU~ckT z0NV3x&Z<*yQs`>z#qmQ3(Tdh7q0t^ttWVYKksZP|P#mkv&MegmYv4Ct*#Q;hwJd$H zLAHKlRy{UNQ-X4l>?s!0^tWN{1?Gx~H1!X8>P5bOWQ(mkk^)=BhQRgB<7~zn!CLgm z##P4{(8?z}P&(Ex%pv#_33ISFda-U6#v%ubOqrd*16;{f!|FWV%N!O%pF$!=bYT(6 z59|ZLE=y=12JmQ47Dj&-Blw-ycf-PWN5i*2U4+LUFeN0QXn*<#pdrGF#ElgK{``#{ zFey&NY!ev3+pq3|R-&?z<mc<aC8EF&pXp2%Ts?34_LZB)iqey!v5ZYcB8NTmXI9nk zDpBZUdvU_BU}IgywB(>jVVKa(k3TMOhq8K8g;9Dh=eK9)=BOYM8<2*a@T(?Re`u(m zA@^%)DN|~TOoV-J5BbRxh0wQOJVQ?L))@%Xv@%qTPfv~9L1C<Y4`o*;JIkP~w1y$h z#JP6s<|{n%@UjviUJLgvpNQ>Sv$Sm1VB@NwQF_e+!pig6#|PoJrD@Q$V<?NcQCi2o z9qUQZDjBFn!5t_}w9{ymlq*3a1bF+kU7*-FMi^w*{kP9AK;KE-?8b3{p-`)^81P&K zXX|tZ_<q$X$j_^U&;QmPrVPQE)yj07u?rFs!{LbqeXU|lUKwc5JI#bkMc;15D9&fH zsi`_FG_M!em)VXqg0%S(Ezy{KAHKJbEe**J?t}c|TDWJyG3fl<NtpfA02WTm2L0@r zHlpeY6z+5gpUYA~Tw)k}^U*$d^3@Uc@K}U#^9ThBX9Ei$&O^hw{j}{CzeT^4nARcu zr#M=M=-2P*BgX0fyu#cRzFSdgp5i!!uI!t2#>N}9CdAkeMsm|{_%nz2j9lTcXf9{K ze`INn*NFmp89*cs23<~gSWVBt(a~yWX(-NV2F_*xA!283Z#RRV6^)IJVBP=<kvVhQ z%ZOhOxP(+{XUMNzDP^F$w=1|Lylt<>78%$B;8Qm_)YUrX+P~MdL$Z#y#=$p{b%b?7 z^3z%|?}<JjlLfKPi;j`l17l%abFms6&QqJ#NQdC&2%58Q6jg&W<OID{QN!AhP3QUg zkc(y%wk|3;nU`N121}P5fcgf5%f(3zK}nQ`HIX~bL%@{LvR8V*gtS=lvaOTT)lXD; zzi5j>S6Ku8xSO$WHvW78vT@{`|H(AP(tec&@RkENpr%b5mxI}2uf}DeQR`vJ`+E^- zI!J?k;exUnx+R%bI}Qdv6j*<q^EtLHhA9X3NEctWWD;^R*2pPLj42Q8&mpH%V>g4; zS-YGj;v#o!yT&;k+IE|WgQnv~#!k~0OB-lwQ>m_p-t+dt2mc&v9mV_Y)_{v0k=~JQ zV?=(YrsBdmyZ@v6z$d_uAF^Dy(Dn@%Y4%kbLq-S#g>LQ}5Qd$&R0)d?)IqzaO}i3< zRtE+7RnWGbObEu@;_*q+kv5@L0dX_a_>kFe9EaD7!yzak3TW|<x}=1>@At!sum0j; zI0sD^_UqmRvF-P(ct#uto4-E|9X6Ii>!?5onlqdsrf{GintELWOrM<6l*-a#eZWmj zmQeul_n5xe>GOJnBqRW|aj`HWsE%bSgdH|96=;7eH1SZu<~P2RgGIVZA;6ON_d%Nk z^9TOKYa?L(tW=PO1q#7<_twpqcsDtQ$|En6&1WzzDKLTpIFp##igPmi<oc6Py#EsW zaS<o>nb(A;-%96#Ew(Rw1{6z8B^J?93m|=3XLc+q$~9FiDA1Rke7MsO!L-LhTsU4p zP6)twGS<y)kpThBNfL>5dAZ}sJ$6Pn*tqIAXmAzFIAPk(f4?oCW&Gt^yCAx?6uR{{ zo%dsXG<&U)6Aq^)r(Cs?+Y8a=>dGxWzc+gKfR^oz)?U$MIzz%Qna+Tm#U0L9^(oc` z9nyop{oZ$y*hgeEh8wFt9wQHX)d`r(D32?#OIh_rnK5*cOUzyZ1VinuY4YG0Pm;S; zi9K1W1tlWc*PbAD23uEWfTM?UVdUtJ&cGl9YVxPZB?(S}Fw$uywq<EfREZ?^PiL+$ z3*y)Pa1O3qz6I|uG0pQIyt@}7qk>_<!T|y($4(z;G|ra$*nGTP3cC?|uUB@beN%HP zu>Fr~@XvqjXZiFW*bWR0ChFRn)u*9Gt9QEsgunn|w#;wM(p+T-t^RB(@vB0oEjEOm zvx4*3n<S5f>Z&@HF0X0+q}4biG=QgGc#2dllBC$%lv)fYZ_hf`g`xFs%SOu`_Omaf zL7O<!ev!V3ufO~Yv>F|}`Mwn$z#5qYzi=++EAdN~UauGVF`A}>bS{IhT`hx@)F>WK zqrr{udo=zfP+q2mew`v<&AWZT-_JAvT#<NqL=GHWMcDec=X%w`5<~MUK>37+2f~L~ zXe}0g!k}3A>ZKm=gq^J@!Tz+P09rTo4Een=n-u!G`{e$CtS9V^GgnCICd5RcHp26B zlHmE-Ne+_~-l~O}uN{Yy3ez_d8yN_x-Q!^Nc)7zg?nY2=xLpaFZH^tzgB7p#gpqxs z9p+J`sRvnz>rvU<p~Mv+!l>RR-m9!0#05CBRTZ`H_|!zF6`=I)RDj?vuOEX4kDcUf zmeGM<f6=~zs-&BBp|;cy2dIDh^)j6JD<6Du?RjhpR;q6_^t~tC0krerF^djEF47KP zesw5Faq9KPNT9aR?cwB321FD7{Dp2X5kG2o4M$nc$HUariE`-GC(hlZ3@*}8^#Q9y zbJvIOzda54RrR1NR<WbLt5S4-AOp0zMu>lC82I8Di!*dOeDnQu2nsSC8n|$0HhtJ^ z!VXUonQl0pK|6_4Tq}jR83P!EzJVQfY@lCTevy%K((%eFdVV@2;(3`WP+y@1)yZs7 zoy~!ESg9XzaM(L%+aSb%P|%#FaMly#*sfG(-~ry_<@3{z4nlw=093e`)noa6!zC~x zApn;Dy$7L%(a#-*e2o#>J~#x7xPQuBwFis_1EZa{Zf8D}5-i<-MUUzV(%c*Hn1fpZ zf+IsmLpr^Yo38|U{!nNxR)fSXl3xQB=pFn9*cqM@HyJtxmZ=*+SFVP@m@tT))EjbF z?*Vz|SeQ81R51?Lo=p{TMtI}WaH}=>Eh<3)yA|d0OCe%4xgD7*l@31na6df%kFkzG zSgT5rX!_XShdG3?7eTw-uin|^up&XA*G`uQgb35xRDz2n)`>==Z6zt5#;kP@PzzF+ zR;_~^{6?&epPvt;bho^7xq9v<ghxvt#%lYK@#{s1kCniX;q5KZwDqrw7?KcXK`S8u zhtmKz-mJGIRDtK-ciaQ#kt~rGBZ5V<El+JUm0DNA$43OG4qb<db1a8h`n_FPPjZ!r z6;(enGD)_^qDBIb!%A>4+}QhFQCobiP#+T&BL&KwGY$2Pu<Ttkk+Vymc=-80$1EyQ zTB(D;K=W3lwx%Aotvv^YIpqw^4xbA!Xmqj#rOD4%Y{a}x+g&a*2e!F14gl;0ufMF` zz4E_V={03)_;KlA2oCgttJkaHu{VxF_kjs;{;xb({8VT7bgcqZNQWk~?}xFFldp#P z2xC1IxjaHdI`w0n0xgNuT;!dw^D3&oEY#HNKl?S8UE0a-+sV_9IJy$qDadEC^mKjW z&zIHv=q9)&%H~y1ILeqV*|kP^O>guaS8wzQZx9pXh)Cqq*wEl3YODz~)*ts1H+-F* z6u!j~4sXJnU5P&x)qko$%E*PD763PIHv*G_lE;cfT2Ipo;k~NFnVafpr8ekhgVD!F zh^#s8=tkAwMyG^-<_!*yE3r{g-%yVmac?qnCr!MsYWUFh;RoD-<zU>d#Ez`$KPp7h ziCn_lY5N=N^)r(F&D&cSnYlF&|Dvd`Z^;V$vfe3?8<6VaPmAo)f-<)b7cMKY4!0kA z@O8N;I%}-&zCC3TefCrlR5cOSEF!Etxpk3+d#<ZYv`?!zq1S08s5S8B)$JiCL@abG zuayC9#K>^AOy=HAK#4)NGecQ1M~Khb?XVKm1J=OJ@zX^inP06agYMwGWei_;pg_~r z5v<)xtXDJ`n%e``r?X0=mXM*L^w6Wd9hJvncu}3i#D-}H!ln{`W~mPtz%d!!4i1Mw zT<a46p2T4BTN!wrE{4=jj_FnokzvGog~9IVu&Bf-qtQ<#3K{AQktcCgm8RCGG{0=j zgu1#0So}|y->Jhah{V4`S+&+0z@ie_%0?5Dj5U;({x<P4Sh4IFOYM*AqdUh=S6NjU zL+`hS;VVHbVN_FV08jnIEcD$fMudP*KRN(~O&_$7g#Xu(e0DnYcIw!gRZ}1=7eD`( zL#QcdVXO!4cag!jzTUu6_~0isY3e;NaBu=E?3@RCfL?Ea)hkXwVL=rP>>3FJx<o>@ zvK*3<BR$B)1gaJV#S0VhEpL4c6#}{AzFDLOsVo3OLi~AfBJ<a1>wy*<GXHv^J4_p9 zI%mKA&1I+#ltTYB(<L~c$V~?klE)>7P9kvD6G*DLRPAPBM_{evq<mC$l@3;|IL_`V zhV+brZ(r{Xe!hHrF}SP9?A<xdl3#&G;D$rE4Puo*T2m)C(zyiLzV#X$KA3|A7Q?r1 z^nxKh%(q6?iBDargz57g$6LcY^Yh<?GazSi*Oe8p=0B&|_weBOcCg0I&Cq#86?B)& z7@9hLBMg1=0LYWQTPuWR*`cUhHclSC&=-YH7Tq!pSz)|WH&HmK;Phd}p`6Ly<%1zE zI>=#~WgD|$&&gXXo~{HMaLs!0P0v?t>kKqT$rBj1&{t>ld)PYCk)IgXINq`kp6(3y zf6~_ilxRzt>qdhFsUJeK>h)eiFZ6zRFWf58LMtcilokmbcxcN`QQ}&oe>Vp(7Qt*U zR8a+rO=C@hA!BT3m4hpX*;K#+Nt5Sac!#lm?Rk4qUWJK0x%T}xQo4PdtcRQkldF;p z>lFpXH<~*inseb-Y;(|^aRvJOAjd(=>~h?$#FXis*(C|_=eLCUXknM8E9B;5bIRXo zjh>E_|H4ZZx|`^o8V<A4<6%VaXow0kuhQ0OocU=YNE_AxCQeFr2Ie%5XvHFL@9T&K zA`?mTSyxLzi(E6DvB%8H#aY`)_w9tB4l$rr7Q<VM(~;=x`Le|-u|-i+QUgKWum4RY zBPQ|XpC5JW;*qP&58LzM<BW2M8rBK&zT4;3R-Gy#4l>s7=8$@87vxp33V4$K#m_Fl zJGcqdUN><^`h|xuhFwo^(7heOi^GCN&wG;49_)%`e?j5`ybX2ZRJ&<k5t|_Ps{@#1 z5J?C5;KgNVr+ANv2$Du^7OO=6_|S5D1#>rS?V58CF(`$N>%=y}PLuVWw+~)jd6gAD z64MBctY;!r8N~43n`W^_VZ1%J#J7Gng|jIZ$?kR!;Pw()hZW=_O*|zIv^gbEiWidh zOg-Lh(@bRO7zYVYjN(D)oT1Gwfr`V|Kz+3c;${zo1|%eum)Gzx&Kx5<gtKLzRU)!c z{j@V+XK`c4Cqw@C`yh6FPpH-)mt|&!1-QDV0a9k}g!tKmAR^5)l~x>AG8XWh<vT%w zch+5E{Gl`>lZE+80-+YuxH5Q+Z{j;bKsKkPCx?B5C%cud5?aTTNCnAi44aS&2au&9 ze$HTc@a@C=40Q|d>ITf;2kjmi4!+Vrpu($8Dxm}NP0wrMU*~Y@kdIxFR}HG1QiyNs z`o=31v}s&ge#Pck47dn)Y?29i;<b^`b5J6?Q7!!WFodV2LYMn9fEcx?0*OzgGgQR4 z5l~dh?(3#JWVx#)fI*|>tO7CzZ0^GHAeWYLv^@MQ7iMv0^yHkqbjd-GcWVu4m^o*- zn^fPBAZXCkLgG`S*)Y*&7sG-#MnPb(`399sBeZvHxByXjP9N_;vVemXN_kTl-xK5s z2lYm>T^S<FR94hjRDja>B7@@mSB9A?fD9<PD|bT}($wj;)Kvv2{kU1(*zuO!jtosg zoR~TXV^N9m^3Yk-Ra~Sa`;#RH;Nj<o*o_Vi3xZKoJ45c*yI{_OfiUy&es<v;1qR@K zHyxN9nOPmhHXAjIN>D<1M{s&WV=x#Qw{b)(^X+Xh(vq^Tn2w)>qiesmto38tn$Fb} z=B}AOuMd3x?Mb`f$S(YE-0m5yBW)_tM<l9`7FGS-8j$n<XXOb<pK6wVr||2@%TZRW zW+0bN7s16-g*HF>UaZa6i}zRu0ad(8#m}C6JTj)#jFrot<pTr`n@UjJ=%lbu!i?2h z1#rAGH>VQ1pftJAXshc$5^B0M+5KxKL}{uleg$Xp;LMR+VG`!n)z#aCQ2<fSiDJkZ zKas(JoHgdI=OUVHhkM@%$+9Wi73w3E5W>&L#3JP9Z<~ZTYeJ;vQ7Dw9p?n@)d>X>q zxSspDvZZv3h0OEC(7SIO_<*5tW|H&kHro<$n9v?Cmk!#gtopLt82TIqZ^m1mkyAP` z`5aCNNQxhFK#(6u1eFk=V9v|P_c3jZnL;Rxueha!69=+k+)OjQLf*ACTs)Z%1N%nT z&5#E;rUf-2a#{(38Ji?qglwl@65FXFs}v?a(i`sS*@iF2u1y!=%GpAvm7qP9u#&`1 zbYR;RhGWxzPD1~Y9eI4@km7w_w|MbdtiS^n5e_^qD?#Z-w3R8*5{+HBmv+1n6h>y_ zsuNI@YuYQFKAa0f#w9~gus@Vn=^;{PITI37S44CORFrC<eM&2M>h+PlsFn$v>7V3` z`o`;IQ`38yW(r}X1GmMB?EuCic*kXJ>+29u_{r<L#qTWa4r2zHsNC-@y8ye6+<*jm zG`u?}0lwaJ9Zp;}RdCe6*6{wK?l9rWJ<w~o9J&u^XMvOR#EVpK-`6R8G3R&J_P7!p z;@=LJN_%w;$@TF!OXlr9auYsSnF%6XF5h~l8;l$n%YpOup!+RZ?|g9uZtGJ$Z%Rt| z4?K{E4!4GrJ)BbqGqL?hiYw4)x;8ezhS7ssr@p)FJiBk|iLw&brW|**K6vdV73-?P zM73|<n;QP5HH<fYuY1Cq%v`0RyXrcf;R(IbXLOx0pd+Vf$5lFa;>CE?69D>Z<heSF zJXf0y9m7^Pmqp2)eBFh)D;;sTv{b6C^jlgB0W)gFf#G;ay({J58i_W>5@YS<AgKR% zl-&DIlf&nYeMcJLV6L{cR^Pa$S`;+0rFa#*sjMey0zsz^G1h)ECfV}|-;;be*xS|- zq`gfe4*sb|WL`wLO#i>xV%$QY0-=3US=}^u)WLXDzZUHXl1)<A`5)Gxz=1b~`TvlH zIwj1gUN=rIb8BPjZk<}BBj~tM384!eNh!EnnA-_=2KmG`HStcq^7=3c3wL=!aakOH z(AUYJ1_@SX@|Vj*4gkE~`Vl_v;9BmIyyGDE77SkX@8dux|2X8Xdgl3oHkdD8G|^%F z@nGE&oj@6oMut-GKeIv6&=@7sKI%-m!=^x10d~n8RxmbRQVB@3P9gQc2Ivk4bVy>y z0Vpc00+oPYkBXr{Ue+s@Ojl9EM_HbMTcVf^c&%S-4E^s$WkW-TvUG$uI6dl!-AdKV zBq-&MUPf;U<4zi4f;_PIIuLW1(8LR<j0H%E<V;zq7Jm5d4D+@{dA?yI+jCJZZlkP- z&n;ur-p!~Q;ZU9`+>;F4>ImX6-J-0kC^gDHx!dc&VPx>xwLJ@#eSU;j%SsjY5AfmZ z%_*d~lvx6weS8QE$dN>BRSTXQz{A{5M=kgV7wBabI~7&S-Oa~kN08j3A{%ry#sH6c z*xdqn3KuI7CoC^F6aG0}xrC2+L5X#8?Hbb+()h`#sI0EHr&%={9{F0I!LLJu*Q(}G z;sC4D#d^D<dP6BlXS%*?ae)0c1Xop>Y5h%l6<98(nzTNVXUi{_SXkPSM3^`wmAUWM zAATK@4cU$QgNpL5oDMB}WpTKD^+c4}9^%^(My%K$f3Od#@t%-GKYfv1RfC#WgeJCi zD9n4jw^Ka_%4_8iB=N%?R;V!PZFgH=k_t1l+Yx^#)TgQ;<j#M~O(moIo9oD-T2P>Z z{9F~>yg>`I?H;)m%I}i+#S!Eort3pet^4G&{e|^oi~5OU1#s@{4bbBqztFt!$`FVa zTsI2iZik!haa%+6#NkP@?bi5hI>KA+1lEYX^;4rS`|KztH#K}1YL-uI9}f3mgD0g# z<CkEbZb{85u@#evKs8sh?(Yt#QHRk5<bfl`3NoQM@@I^UgSlhdLWelhMc>O`X2P$? zq%>o8H|W{Nd_}|(+~z;x%8E3qdRrd?E!K#PEY*{@yigI*l4Wn*Mv8oMV_l;B?bl1F zx}|`Jt0=31^{Bm(8hy#91Nlbh0R#?C_JPz7-f2U-PLwF1k!EqU=R1O__Renn+RhAc zr^{-QA5A$|QOVoslSOziE9Hd?iJ^WGs$ZHlDjuIza8J;X5SQWo;g$n8SswD_mJxNZ zD6ktIyf_b}>3@=3+J^(@JEAdLv(;b>ak-u465bA*4r?^6oWVvXE<DbpCP-m6@(oXW ztt*5{opTp)Y3$iI%j;n3OMfwGpqck~L)E0-<Fbd}lQ3F?NvR*l@yEW+<Av3cIkh3B z&eUFel8HO8D%^$=A&y46s*+<<6v3cw5ik=QecXT;UY(me_(+j5DcvVS>jEhtlLR3P zy|#hzyy==aLlQegppa-UuXvx`DTgO8Qls|T<m3>xzh+;As>b+5qi|F12{t!iNji`k zoJM<H6B|tc${CCw7z4{*>;h?BZSRH&ZFZp+LQn^EOoW-!#Zh+ChP6RiH`BsPO4f*l zL65vh0sdlW8xss9bv5^`6F{7n-Y}p$%C|Y;TCpU#z-SDjr)}65(NYZVR47tbxOw9x z<lMi-&*#zM0j!Z`;(VSI?~p~wqE44{)G+1cqfFEH(Qk)Ckbs0?0qB8;lwz&VD1`K} zav%-X{}&9YHXEB7_9p8HZ^b3-RpbkNd+An*1~x7kfHEOr_CW4h7;$#@d1NoBQTNYF zuMPv@i$Hg)Q1o=jM0rRLG2N=Q<l3OdPoIn@JDEGx2qfwH@pC42%MJLd*Z&360OCk0 zhuB!#*sUcC^zi&%s4xf@-Nz5WFMEqx5_OB<8jG8Nama90kf#EYV!zu4CH5JYuxO96 zJgvkSaipaSL_4BCwp?K+TrnP;()+f8DMMQ`(Y2PC@0(LzO|1dtT=zf&%DDW`8zYe} zWyzP=9NeC!MOEWvsA@dg?i)>>B69^#3pnxQlK35|?4ZYItc?WKUM9o_vtKwiOsK?{ zZ9(b$Ks%q7HlO~efaROAd9<WHp?_LC7(Xcm8KLjoiJRWAnj{ZSW;wQms%O4NUOMP7 zSB_+gN)&yn!Nv60(R?UDR{1aR{jAA$-p}$f8;fKQzH<_eUMPp?(cK{+A_R)Jokj_d zIwT%OAo0*M!3Yb)9(Xvl5NxOgiS(wEkOv4_8kF|-M3xRk!J+N=d<%5~nS|EvZFfB_ z4{1>x+?}nHC>L}dN_L({Ik-U(gQ948$XZR$k8!%1JjLw^yl-RuGJ<CZx&TrA8l*Ax z_5?vo!xHIx`4>l-X7`YL;-EoU0*&<zPKkG(l%b?T2TOm-f=zpGU@{|!aViQ*h=x|9 zyFoxJ8TiVA@l`PqNIJ$qNOBv{WZi)CXKvnB>MZGR<6b1>Cqq|nG<i~KPhshz<~tM> z65|s<@pA^@@DM}(>b)qB9sno48{sKB9-dCuul@TH|I~`4eGEhnNd@0f3&JN4&p8^A z98$FLDAZSKAuLh?4?WxiVv#D`(k22_%Sp8e;pIDGm!jg?G6-j%NlRzw3g1VI_k$WG zkJ>$q`m3>#a#rj{jmie-+#wXUewyYgxlKHYqrd;{RTR}}grK%jO!Kl(FSbnr2LVQ; z{NCDej*0)qqQKB|FM3`U2dGg<u3kqk0dVm=^>vIqVmV%qKGRa#ceo7Pv7_+q2I>fH zUMa}Bwu8jSMnb{bLvRU&jXwPT8oWL)#U&b2g7efzXW-D;G7zKuLKIFpA#z&*4SLVF zwx}F5ikm1Tj?<ssz6cpT!zMum3E};c*aBXBqYAEPS3rl3_UU3S3upx(6KUoNgZM9k z3%t`iC}IZtX88%!z*x%_0VM6BAYw=-(4b&#<*_Uz`US#{F9z9tY=E9kd*r=Sa51|I z{G>q;JGC$Pg_$Mr=`k|Zxm>8eSO7*`bI63F>{2Q!olZdk->^tCEXCCzW#GGi9fW#) z1BCWSgn&pXl<mDl{Q~d&Bb~|55?pf(w^I`0u;~a=u3OY7x!TwQI@*L8S-TBL_gRe+ zp7f?nEV4=7JHH>}P14~ucE|ejkb}~0e!&53WS49|izBxI$rD}K4IJSjaqhWqokY8a zHCD{DzTg{VI+$q{#ZZ3a8WT3A*;n2*2Ko={2vPV1mpi5ox6i9T!Iu^>Pd`*hPisX> zU8_osHP<I6OKd2PHXT6)C1rW#AUoZXG$>&MknXM3D^IdfHvQ2)(5|Ct8!3b#Cb8ev zoPqr8GVntYbpKXT)ZlRoUl&I4Syc6wUt9x$Z6Y9ca&Hi$T6N9U8&G!eGV8D)i9ZY) zlMJ1E$Fn?yc-?iYQAGE<r3dg4CnHR`w-eAyO3gJ=V{PH&<lwgU@YwAL0;GpPi}b;n zEup<onDL(7O4z$gi4Vku!rW)laLXu+wRO|zT>s5+s6;WyK-^~1D+7LE5@>U8f2hO9 zEK2uef}uu-Uz0D4nB2)iUep$wXCb9G)$r4@BMkTdyg9sC_ZU*BRZf-%%N>=#VMkB` zVztay>TzuNTTY~ou(=4|y7@9YF(-G8g$Y)=^Iar`Vq`9+Cm-lbA)Pk$l^PT(6f@QJ zq=|y&@Y`XoT_}d_>(8Nz4H-PW$d=38ojfB%)$7J3$>utPb*uQO9(F%!R~_aIk*m1f zJC(3MLkY<!Mm=FpcURyJ<B#rEKs62x(q%$SVt2yq`Ry`fp2){nB09jhiOFtfNw3pI z8dMXwLz}aNZgm79po{KOgY=9yGH@5p6~p?U&Ovmn6drgE4{Q$1sY5w%c*iy9J){GZ z+I9eTSAti4v>%`TsDtPJHW*@Chqx?*@IKllFaq%B2v@*O+y*{7vs5c8#Ih&dl?0{R zI_d<{7BUN;iFanS$Vy3uUgYBpE!a8NOhP7Hm@AuJ+USd;*O@u^=T)YfV(9o(=ruUe z87PYzKItCVw(cw=?LYo>Ux)C1#)kS<LAu_<+J<C01hNz1c1Lh&$0mm@K=%T7AE*3f zovA$IW_L$57-lX#4xiB0ph^rfLbVu@Cgr$Gp6LR!N5>1nZQOtV>LOl76+(~`jTBrW zB3+PCxvA(%-X(@@FmkS!GgZm)R*xjJX-HHxH(eg_Gna=aw#Oa8A)lBW!sx_1l+~Lm zK|0;u7jo=q0TdNgK@z^7)E=3+ZX&M|X|bq9b$|_cxQfIrX<YjVNb1yzExa}O>5~Z- zd=b%cc!71g5Hho?u_L(L?c0}fs#!!UH_i)T$f8Mx9<XxP(E3(-vzpzla2?@~H3|38 zP8!uAY?r%u?7?~65gf8{Nul?Vo8F$S6iL3~-aR0Nl7DW!!YG>bpfVYno)Yna&|n;~ zwBso$tcGKIm26i+7c-n@r;rey1j9eCL?>rwhVGh3+cI6#M#nnm^49ANP}QUizc8nQ zy>!Ik_Qf*^smUS@RMsW|#lwzZa}%jUDyq$o45&#<Ya3N$4d;!&*&V@UIx0DA1-e%t zU#SS?Dt<qhshx;hO;JksHhcq<q9>uUr?`Z0=!OcOG)QM6{a?j}Chk6o@QYxLDnh!G z8aedvoa|tGaWu1>*XO+fx4DB+MGN64g;J-F<U;mkq${E15E)WMM9;Df94UuHWNeOc zlRaPR->AQDMC3zDpYOL}@^Xf%#r_;rtHtocyFXs~BDPoZvpOSE;?U@78{qdJ&OlLK z1<S+-8zn9#h{-yXl+}V3<H^t$Gh|#U^uQDCk6#{vvJy3H`)m;0lV~PW5Chp2{0jD* zDur*i<Uk#guV;=+WHhOt{<sdc_<AkfG4vVS9(trDSSb2onYi&M6W88q<*S=DLGIZD zHg2G{0J-fQA<S*V8FloZThFb|D`}kY<(vI|B9ZaTkvVkg7QFq{d8S0GHID3?d6kgf zuNB@cn0HYAIE}Q$dv4MqGiFd5=-i}^oWpqnuR&j2auT&C1;L{)4aLhK*VPRb)m6x# z?jQGd^6nWVE^kk5*Cq25qlfS}RH{CDgZO<P|9}xbzGnJ7hi1V$$00MTlJjE2OW^0v zhVXt@jwjzf2A32nnEPxRv=S&GBh64!QQb|cNdJQ*MYi~EYpS{H9pS7Y3rnk$l{d7b ze)=P~pQfgvlhFX}N>uugl=fkMFFoGH2RT2)B4oK>@(y^xj08G-;ij<x9eU)kEnE9r wc6MoH&3Pm$9!>2Mv1e*3)6e8A%exl$zb6*1ilFY%j{pDw07*qoM6N<$f(v2yTmS$7 delta 1331 zcmV-31<d-sO~48=iBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_y7O^0drDE zLIAGL9O(c607Q{BAAbX&0RRI4000310RRA?0ssU600031000=E0{{d700031000;O z0002uHFd2300gQ@L_t(Y4SiPMPg`{q|J=5;rR}AZQGS$;(ca1&An0NSEG8z#=*+U= z;u8iR7N_xP$^L?6@o9T-W-mTyGEIm)C=wQli!qtmvfyOG#(y%0gO(2ZyR^{u_V&kG zuHWyay}hjMPSW;#&yUafe$V%u^DTpy(6mpq=Q9`sgOkLJg9w{s&LBX3-DEwdZN%(H zcE(o^hN-2P+7NAG9+!yntSCZV%cd-27!*a|I-|wK@ot6&-bYmdrdGw%#9@+HvHL7v zSmbg=Xf!IQ)qgTXif|L-uP`^1rYhxPYE3*ZGMFK<y5M*ITt{Ljhg*NRkxXQj?kx4C z7)qfWptSR=B(JheX~^?=gaRo^wCUYOp|A^cvtDTe>Pt?4m130@5}1^8nwC1?)VNp> zv9uUKG?K>jPmeHi{2){+IXz{(a*#=iNrh4XdZC1`n}3#QIF028LB!%2`27id`o%HC zqdXS>+Nc2U=hzY^7^xJq@V=~CXx=Rr12%mLbg(LPnl<RN8*uk&8b?MQ`=LuKT3uQ_ zdNj1oN#5#~Vk((~z0(9S$>Y=@i`QK&Ty_&4dy*)uW@>^{A>A;=)<{i6A}EPoVA!8R zE}n#?VSg9z_BNs4*$ty!4R27uH@|qWu#&*=dwoi`YMwNxhDbT3CKeMge{%&B@7pmn zXobzHmv(E=?H#hG(}2%Ebila~#nO%dvqh(Lf05@@q;mG!zogpP&f>&y8$K9mlfbFC z-`NC`Q<*fRxnAQ~<hRqZtR_RSt7@KewO}Ks!GBjjd-3btFc$vZ!FoWb^6#=XVkery zz5Br`ol>A8cThDyoc$eW?(M>=Xv9r#5$7&HfG@JIYq7fv4E7js>+c}$KMX4|D?Gub zCvaCJ6|T|HfQ}9m+#vy0s}XH2m0ZV@&++|ln|R1Kz<m5LW+s=AC$p&rx#=Cu)lkSH zw|_T*t}YhkrhT%W!j&67{E#%`pMnu$LO|<VM{xUIRU&9t&#CA<r%fRvDwt4^2k(nx z{#gbyw?pvw)A({WfIGY%`bZ1|x;#eOH87=8V9Glv`AdyPvFZB9HSt>#?VJJ|Y5qAD z?)%|7YKQy3E%J#%*yf?@Zo`1X3<oI&HGdh`lpZZ?g0q=$$YH5KF!=6c7xS59K_3gE z*&CH56OSj37JD;vdNLM<I>7a{L1Wb8ozX71UTu}ZsreySD*_?D<SG56N|<}Yj=n_X zC=;ZjNNoVwYylC{aP4+8LYoQ1h_hL%!pN{4$#7DdtkjNA<VZD%XtFdyAeWrU6n{W5 zC|3D(lly?aL_~3c8brc8*aId!TiqfcS!~DC=riQ;$$$<=%|&UF(g5D4Q6$KOrPM@* zA!$+yenI)F$pNU*xQn^Qh&U4pq*F$-9zr^g$BTY4xERnX9N?PZAx#$vC9&a-5pV&X zClTrjt)U^6%N5R03`tP>A_1%E^myeJTaUBlk`RcU?dMqa{BjK4qz~FzHI_XI_`?|- z9_4V*bpR$-ODpiYZ*}Y9l`(5ot=0@s4tZ_bXFv9aWh@vGPJTVP!cClV+TMP%9ly`} p0&97L+tF*CV~UtPKUDv3%m1*=;gzg^FAx9#002ovPDHLkV1j<xYt#S$ diff --git a/view/images/left_menu_bule_1.png b/view/images/left_menu_bule_1.png new file mode 100644 index 0000000000000000000000000000000000000000..93a89c7f3015c1610047bf8dc998b3fa409bcd41 GIT binary patch literal 2686 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 literal 0 HcmV?d00001 diff --git a/view/images/left_menu_bule_1.svg b/view/images/left_menu_bule_1.svg new file mode 100644 index 0000000..6a1a513 --- /dev/null +++ b/view/images/left_menu_bule_1.svg @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="34px" height="34px" viewBox="0 0 34 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <title>编组 12</title> + <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="icon" transform="translate(-132.000000, -201.000000)" stroke="#1890FF"> + <g id="编组-12" transform="translate(132.000000, 201.000000)"> + <g id="编组-5" transform="translate(1.000000, 1.151936)"> + <path d="M27.909,16.875 L27.9113522,26.8857416 C27.9113522,27.8526763 27.5267954,28.7298504 26.9015679,29.3768277 C26.2720924,30.0282009 25.3992839,30.4467842 24.4273665,30.4920249 L24.4273665,30.4920249 L7.7494418,30.4961274 C6.76599361,30.4961274 5.87285385,30.114785 5.2144817,29.4916735 C4.56062095,28.8728317 4.13833802,28.0154482 4.09277395,27.0594309 L4.09277395,27.0594309 L4.08864783,16.8929304 C4.66405381,17.0126706 5.26353879,17.085799 5.87129207,17.085799 L5.87129207,17.085799 L8.03400129,17.0225045 L14.5124882,18.3888793 C15.043173,18.5014181 15.5736746,18.5415737 16.1045425,18.5415737 C16.6708823,18.5415737 17.1998208,18.4693616 17.7223979,18.3585251 L17.7223979,18.3585251 L24.3100529,16.9976923 L25.836125,17.085799 C26.5547633,17.085799 27.199701,17.0231247 27.7892289,16.9027514 L27.909,16.875 Z" id="形状结合" stroke-width="2.4" fill-rule="nonzero"></path> + <path d="M24.3870797,1.2 C25.5405891,1.2 26.6008676,1.53759508 27.4255981,2.13159112 C28.2002265,2.68950213 28.7642412,3.47547921 28.9723256,4.4082024 L28.9723256,4.4082024 L30.7288226,12.2462717 C30.9416983,13.2900537 30.674526,14.4028921 29.9732695,15.2644682 C29.1033795,16.3532142 27.6642056,16.9607037 26.1638514,16.9655069 L26.1638514,16.9655069 L24.0284337,16.8984189 L17.2306954,18.2891792 C16.864041,18.3669332 16.4975701,18.4213103 16.1045425,18.4213103 C15.740001,18.4213103 15.3750933,18.3981712 15.0061845,18.319947 L15.0061845,18.319947 L8.18222619,16.8982225 L6.10841446,16.9655112 C4.38471005,16.9610007 2.9182058,16.3331158 2.03526322,15.253733 C1.3138942,14.3968782 1.04743263,13.2958128 1.2860461,12.2567265 L1.2860461,12.2567265 L3.04513676,4.40708105 C3.2529704,3.47547921 3.81698511,2.68950213 4.59161357,2.13159112 C5.41634409,1.53759508 6.4766226,1.2 7.630132,1.2 L7.630132,1.2 Z" id="路径" stroke-width="2.4" fill-rule="nonzero"></path> + <g id="编组-4" transform="translate(7.867676, 6.325148)" fill="#1890FF" stroke-width="2"> + <rect id="矩形" transform="translate(1.762601, 3.502437) rotate(10.000000) translate(-1.762601, -3.502437) " x="1.56260084" y="1.15756164" width="1" height="4.68975101" rx="0.5"></rect> + <rect id="矩形备份" transform="translate(14.502047, 3.502437) scale(-1, 1) rotate(10.000000) translate(-14.502047, -3.502437) " x="14.3020473" y="1.15756164" width="1" height="4.68975101" rx="0.5"></rect> + <rect id="矩形备份-2" transform="translate(8.381574, 3.502437) scale(-1, 1) translate(-8.381574, -3.502437) " x="8.18157371" y="1.15756164" width="1" height="4.68975101" rx="0.5"></rect> + </g> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/view/images/left_menu_bule_2.png b/view/images/left_menu_bule_2.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba51f8ca1666c24efe3fe8afa876a23a872f320 GIT binary patch literal 1934 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 Uaw%?3^#A|>07*qoM6N<$f~tS5i2wiq literal 0 HcmV?d00001 diff --git a/view/images/left_menu_bule_2.svg b/view/images/left_menu_bule_2.svg new file mode 100644 index 0000000..e5a2c9b --- /dev/null +++ b/view/images/left_menu_bule_2.svg @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="34px" height="34px" viewBox="0 0 34 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <title>编组 13</title> + <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="icon" transform="translate(-204.000000, -201.000000)" stroke="#1890FF"> + <g id="编组-13" transform="translate(204.000000, 201.000000)"> + <g id="编组-2" transform="translate(1.000000, 1.720119)"> + <path d="M27.392,1.2 C28.3265792,1.2 29.1767973,1.58922277 29.7939041,2.21265303 C30.4139857,2.83908853 30.8,3.70300765 30.8,4.65521778 L30.8,4.65521778 L30.8,23.8777837 C30.8,24.8332665 30.4191033,25.7008716 29.798039,26.3282999 C29.1840647,26.9485656 28.3351555,27.3330015 27.392,27.3330015 L27.392,27.3330015 L3.2,27.3330015 C2.64856924,27.3330015 2.14746808,27.1094162 1.78409396,26.7498104 C1.4252837,26.3947211 1.2,25.9056536 1.2,25.3661867 L1.2,25.3661867 L1.2,13.8389807 C1.2,12.7516403 1.72909396,11.7141312 2.58313719,11.0567447 L2.58313719,11.0567447 L8.336,6.6747032 L8.336,4.65521778 C8.336,3.699735 8.71689668,2.83212987 9.33796101,2.20470154 C9.95193533,1.58443588 10.8008445,1.2 11.744,1.2 L11.744,1.2 Z" id="路径" stroke-width="2.4" fill-rule="nonzero"></path> + <path d="M9.51043663,23.8427259 C10.2846777,23.8427259 10.9864403,24.1528759 11.4943427,24.6555111 C11.9976923,25.1536409 12.3104366,25.8413108 12.3104366,26.6012444 C12.3104366,27.3611781 11.9976923,28.048848 11.4943427,28.5469778 C10.9864403,29.049613 10.2846777,29.359763 9.51043663,29.359763 C8.73619553,29.359763 8.03443299,29.049613 7.52653059,28.5469778 C7.02318092,28.048848 6.71043663,27.3611781 6.71043663,26.6012444 C6.71043663,25.8413108 7.02318092,25.1536409 7.52653059,24.6555111 C8.03443299,24.1528759 8.73619553,23.8427259 9.51043663,23.8427259 Z" id="路径" stroke-width="2.4" fill="#1890FF" fill-rule="nonzero"></path> + <path d="M22.5005982,23.8427259 C23.2748393,23.8427259 23.9766018,24.1528759 24.4845042,24.6555111 C24.9878539,25.1536409 25.3005982,25.8413108 25.3005982,26.6012444 C25.3005982,27.3611781 24.9878539,28.048848 24.4845042,28.5469778 C23.9766018,29.049613 23.2748393,29.359763 22.5005982,29.359763 C21.7263571,29.359763 21.0245946,29.049613 20.5166922,28.5469778 C20.0133425,28.048848 19.7005982,27.3611781 19.7005982,26.6012444 C19.7005982,25.8413108 20.0133425,25.1536409 20.5166922,24.6555111 C21.0245946,24.1528759 21.7263571,23.8427259 22.5005982,23.8427259 Z" id="路径" stroke-width="2.4" fill="#1890FF" fill-rule="nonzero"></path> + <rect id="矩形备份-3" stroke-width="2" fill="#1890FF" transform="translate(12.962182, 12.921625) scale(-1, 1) translate(-12.962182, -12.921625) " x="12.7621818" y="10.5767497" width="1" height="4.68975101" rx="0.5"></rect> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/view/images/left_menu_bule_3.png b/view/images/left_menu_bule_3.png new file mode 100644 index 0000000000000000000000000000000000000000..0f00ac71713c0e9fa9cc35f7fc19fee2584bc633 GIT binary patch literal 2785 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 literal 0 HcmV?d00001 diff --git a/view/images/left_menu_bule_3.svg b/view/images/left_menu_bule_3.svg new file mode 100644 index 0000000..c32042d --- /dev/null +++ b/view/images/left_menu_bule_3.svg @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="36px" height="34px" viewBox="0 0 36 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <title>编组 14</title> + <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="icon" transform="translate(-275.000000, -201.000000)"> + <g id="编组-14" transform="translate(276.000000, 201.000000)"> + <g id="编组-9" transform="translate(1.078502, 2.893071)"> + <g id="编组-7" transform="translate(9.286361, 6.916072)" fill="#1890FF" stroke="#1890FF" stroke-width="2"> + <rect id="矩形备份-4" transform="translate(3.213712, 3.213712) scale(-1, 1) rotate(45.000000) translate(-3.213712, -3.213712) " x="3.01371229" y="0.868836784" width="1" height="4.68975101" rx="0.5"></rect> + <rect id="矩形备份-4" transform="translate(6.427425, 3.213712) rotate(45.000000) translate(-6.427425, -3.213712) " x="6.22742458" y="0.868836784" width="1" height="4.68975101" rx="0.5"></rect> + <rect id="矩形备份-5" transform="translate(4.729410, 6.427425) rotate(90.000000) translate(-4.729410, -6.427425) " x="4.5294104" y="3.57205285" width="1" height="5.71074345" rx="0.5"></rect> + <rect id="矩形备份-6" transform="translate(4.729410, 10.526342) rotate(90.000000) translate(-4.729410, -10.526342) " x="4.5294104" y="7.67097063" width="1" height="5.71074345" rx="0.5"></rect> + <rect id="矩形备份-7" transform="translate(4.729410, 10.526342) rotate(180.000000) translate(-4.729410, -10.526342) " x="4.5294104" y="7.67097063" width="1" height="5.71074345" rx="0.5"></rect> + </g> + <g id="编组-8"> + <path d="M27.6247188,18.1540879 C28.0079822,16.8721121 28.2138581,15.513563 28.2138581,14.106929 C28.2138581,6.31588726 21.8979708,0 14.106929,0 C6.31588726,0 0,6.31588726 0,14.106929 C0,21.8979708 6.31588726,28.2138581 14.106929,28.2138581 C17.6009106,28.2138581 20.7982125,26.9436218 23.2622323,24.8397518" id="路径" stroke="#1890FF" stroke-width="2.4" stroke-linecap="round"></path> + <path d="M26.2326281,21.4351711 C26.0551194,21.4351711 25.9071954,21.4058931 25.7296867,21.3473371 C25.3154996,21.2009472 24.990067,20.8788894 24.842143,20.4982756 L23.3629036,16.6921377 C23.0670557,15.9309101 23.4516579,15.0818485 24.2208624,14.7890687 C24.990067,14.4962888 25.8480259,14.8769026 26.1438738,15.6381302 L27.0018326,17.863257 L29.6348789,16.3700798 C30.3449138,15.9601881 31.2620423,16.2236899 31.6466446,16.9263615 C32.0608316,17.6290331 31.7945685,18.5366507 31.0845336,18.9172644 L26.9426631,21.2595032 C26.7355695,21.3766151 26.4988912,21.4351711 26.2326281,21.4351711 Z" id="路径" fill="#1890FF" fill-rule="nonzero"></path> + </g> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/view/images/left_menu_bule_4.png b/view/images/left_menu_bule_4.png new file mode 100644 index 0000000000000000000000000000000000000000..8db81dc96de198e479237dbf95601fa5150a10af GIT binary patch literal 1735 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 literal 0 HcmV?d00001 diff --git a/view/images/left_menu_bule_4.svg b/view/images/left_menu_bule_4.svg new file mode 100644 index 0000000..4d783a1 --- /dev/null +++ b/view/images/left_menu_bule_4.svg @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="34px" height="34px" viewBox="0 0 34 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <title>编组 15</title> + <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="icon" transform="translate(-348.000000, -201.000000)"> + <g id="编组-15" transform="translate(348.000000, 201.000000)"> + <g id="编组-2" transform="translate(1.000000, 1.832887)"> + <path d="M28.032,3.03289273 C28.7923902,3.03289273 29.4849588,3.34398788 29.987906,3.8417194 C30.4862805,4.3349255 30.8,5.01345712 30.8,5.75974311 L30.8,5.75974311 L30.8,26.4073757 C30.8,27.1536617 30.4862805,27.8321933 29.987906,28.3253994 C29.4849588,28.8231309 28.7923902,29.1342261 28.032,29.1342261 L28.032,29.1342261 L3.968,29.1342261 C3.2076098,29.1342261 2.51504123,28.8231309 2.01209396,28.3253994 C1.51371954,27.8321933 1.2,27.1536617 1.2,26.4073757 L1.2,26.4073757 L1.2,5.75974311 C1.2,5.01345712 1.51371954,4.3349255 2.01209396,3.8417194 C2.51504123,3.34398788 3.2076098,3.03289273 3.968,3.03289273 L3.968,3.03289273 Z" id="路径" stroke="#1890FF" stroke-width="2.4" fill-rule="nonzero"></path> + <path d="M19.84,0 L12.16,0 C9.856,0 8,1.14271606 8,2.56126014 C8,3.97980422 9.856,5.12252028 12.16,5.12252028 L19.84,5.12252028 C22.144,5.12252028 24,3.97980422 24,2.56126014 C24,1.14271606 22.144,0 19.84,0 Z" id="路径" fill="#1890FF" fill-rule="nonzero"></path> + <g id="编组" transform="translate(8.113513, 10.060753)" fill="#1890FF" stroke="#1890FF" stroke-width="2"> + <rect id="矩形备份-4" transform="translate(3.919996, 6.853153) scale(-1, 1) rotate(47.000000) translate(-3.919996, -6.853153) " x="3.71999625" y="3.61225226" width="1" height="6.48180082" rx="0.5"></rect> + <rect id="矩形备份-4" transform="translate(10.268972, 5.393430) rotate(47.000000) translate(-10.268972, -5.393430) " x="10.068972" y="-0.228001598" width="1" height="11.2428628" rx="0.5"></rect> + </g> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/view/images/left_menu_grey_1.png b/view/images/left_menu_grey_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0f3f3328f68decb1c7e656c03623f2e7258d2ac0 GIT binary patch literal 2861 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 LNkvXXu0mjfp_5yt literal 0 HcmV?d00001 diff --git a/view/images/left_menu_grey_1.svg b/view/images/left_menu_grey_1.svg new file mode 100644 index 0000000..da1f497 --- /dev/null +++ b/view/images/left_menu_grey_1.svg @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="34px" height="34px" viewBox="0 0 34 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <title>编组 3</title> + <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="icon" transform="translate(-132.000000, -81.000000)" stroke="#636C78"> + <g id="编组-3" transform="translate(132.000000, 81.000000)"> + <g id="编组-5" transform="translate(1.000000, 1.151936)"> + <path d="M27.909,16.875 L27.9113522,26.8857416 C27.9113522,27.8526763 27.5267954,28.7298504 26.9015679,29.3768277 C26.2720924,30.0282009 25.3992839,30.4467842 24.4273665,30.4920249 L24.4273665,30.4920249 L7.7494418,30.4961274 C6.76599361,30.4961274 5.87285385,30.114785 5.2144817,29.4916735 C4.56062095,28.8728317 4.13833802,28.0154482 4.09277395,27.0594309 L4.09277395,27.0594309 L4.08864783,16.8929304 C4.66405381,17.0126706 5.26353879,17.085799 5.87129207,17.085799 L5.87129207,17.085799 L8.03400129,17.0225045 L14.5124882,18.3888793 C15.043173,18.5014181 15.5736746,18.5415737 16.1045425,18.5415737 C16.6708823,18.5415737 17.1998208,18.4693616 17.7223979,18.3585251 L17.7223979,18.3585251 L24.3100529,16.9976923 L25.836125,17.085799 C26.5547633,17.085799 27.199701,17.0231247 27.7892289,16.9027514 L27.909,16.875 Z" id="形状结合" stroke-width="2.4" fill-rule="nonzero"></path> + <path d="M24.3870797,1.2 C25.5405891,1.2 26.6008676,1.53759508 27.4255981,2.13159112 C28.2002265,2.68950213 28.7642412,3.47547921 28.9723256,4.4082024 L28.9723256,4.4082024 L30.7288226,12.2462717 C30.9416983,13.2900537 30.674526,14.4028921 29.9732695,15.2644682 C29.1033795,16.3532142 27.6642056,16.9607037 26.1638514,16.9655069 L26.1638514,16.9655069 L24.0284337,16.8984189 L17.2306954,18.2891792 C16.864041,18.3669332 16.4975701,18.4213103 16.1045425,18.4213103 C15.740001,18.4213103 15.3750933,18.3981712 15.0061845,18.319947 L15.0061845,18.319947 L8.18222619,16.8982225 L6.10841446,16.9655112 C4.38471005,16.9610007 2.9182058,16.3331158 2.03526322,15.253733 C1.3138942,14.3968782 1.04743263,13.2958128 1.2860461,12.2567265 L1.2860461,12.2567265 L3.04513676,4.40708105 C3.2529704,3.47547921 3.81698511,2.68950213 4.59161357,2.13159112 C5.41634409,1.53759508 6.4766226,1.2 7.630132,1.2 L7.630132,1.2 Z" id="路径" stroke-width="2.4" fill-rule="nonzero"></path> + <g id="编组-4" transform="translate(7.867676, 6.325148)" fill="#636C78" stroke-width="2"> + <rect id="矩形" transform="translate(1.762601, 3.502437) rotate(10.000000) translate(-1.762601, -3.502437) " x="1.56260084" y="1.15756164" width="1" height="4.68975101" rx="0.5"></rect> + <rect id="矩形备份" transform="translate(14.502047, 3.502437) scale(-1, 1) rotate(10.000000) translate(-14.502047, -3.502437) " x="14.3020473" y="1.15756164" width="1" height="4.68975101" rx="0.5"></rect> + <rect id="矩形备份-2" transform="translate(8.381574, 3.502437) scale(-1, 1) translate(-8.381574, -3.502437) " x="8.18157371" y="1.15756164" width="1" height="4.68975101" rx="0.5"></rect> + </g> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/view/images/left_menu_grey_2.png b/view/images/left_menu_grey_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3e9704f7dc1a570f28297219fd2b9c645be6456d GIT binary patch literal 2041 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 Xl^8{VJhhh*00000NkvXXu0mjfTsGIe literal 0 HcmV?d00001 diff --git a/view/images/left_menu_grey_2.svg b/view/images/left_menu_grey_2.svg new file mode 100644 index 0000000..4d49548 --- /dev/null +++ b/view/images/left_menu_grey_2.svg @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="34px" height="34px" viewBox="0 0 34 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <title>编组 6</title> + <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="icon" transform="translate(-204.000000, -81.000000)" stroke="#636C78"> + <g id="编组-6" transform="translate(204.000000, 81.000000)"> + <g id="编组-2" transform="translate(1.000000, 1.720119)"> + <path d="M27.392,1.2 C28.3265792,1.2 29.1767973,1.58922277 29.7939041,2.21265303 C30.4139857,2.83908853 30.8,3.70300765 30.8,4.65521778 L30.8,4.65521778 L30.8,23.8777837 C30.8,24.8332665 30.4191033,25.7008716 29.798039,26.3282999 C29.1840647,26.9485656 28.3351555,27.3330015 27.392,27.3330015 L27.392,27.3330015 L3.2,27.3330015 C2.64856924,27.3330015 2.14746808,27.1094162 1.78409396,26.7498104 C1.4252837,26.3947211 1.2,25.9056536 1.2,25.3661867 L1.2,25.3661867 L1.2,13.8389807 C1.2,12.7516403 1.72909396,11.7141312 2.58313719,11.0567447 L2.58313719,11.0567447 L8.336,6.6747032 L8.336,4.65521778 C8.336,3.699735 8.71689668,2.83212987 9.33796101,2.20470154 C9.95193533,1.58443588 10.8008445,1.2 11.744,1.2 L11.744,1.2 Z" id="路径" stroke-width="2.4" fill-rule="nonzero"></path> + <path d="M9.51043663,23.8427259 C10.2846777,23.8427259 10.9864403,24.1528759 11.4943427,24.6555111 C11.9976923,25.1536409 12.3104366,25.8413108 12.3104366,26.6012444 C12.3104366,27.3611781 11.9976923,28.048848 11.4943427,28.5469778 C10.9864403,29.049613 10.2846777,29.359763 9.51043663,29.359763 C8.73619553,29.359763 8.03443299,29.049613 7.52653059,28.5469778 C7.02318092,28.048848 6.71043663,27.3611781 6.71043663,26.6012444 C6.71043663,25.8413108 7.02318092,25.1536409 7.52653059,24.6555111 C8.03443299,24.1528759 8.73619553,23.8427259 9.51043663,23.8427259 Z" id="路径" stroke-width="2.4" fill="#636C78" fill-rule="nonzero"></path> + <path d="M22.5005982,23.8427259 C23.2748393,23.8427259 23.9766018,24.1528759 24.4845042,24.6555111 C24.9878539,25.1536409 25.3005982,25.8413108 25.3005982,26.6012444 C25.3005982,27.3611781 24.9878539,28.048848 24.4845042,28.5469778 C23.9766018,29.049613 23.2748393,29.359763 22.5005982,29.359763 C21.7263571,29.359763 21.0245946,29.049613 20.5166922,28.5469778 C20.0133425,28.048848 19.7005982,27.3611781 19.7005982,26.6012444 C19.7005982,25.8413108 20.0133425,25.1536409 20.5166922,24.6555111 C21.0245946,24.1528759 21.7263571,23.8427259 22.5005982,23.8427259 Z" id="路径" stroke-width="2.4" fill="#636C78" fill-rule="nonzero"></path> + <rect id="矩形备份-3" stroke-width="2" fill="#636C78" transform="translate(12.962182, 12.921625) scale(-1, 1) translate(-12.962182, -12.921625) " x="12.7621818" y="10.5767497" width="1" height="4.68975101" rx="0.5"></rect> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/view/images/left_menu_grey_3.png b/view/images/left_menu_grey_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d159e255844fecb6be9038a3e8c6ca8bf840471e GIT binary patch literal 2967 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 N002ovPDHLkV1h?#sjvV5 literal 0 HcmV?d00001 diff --git a/view/images/left_menu_grey_3.svg b/view/images/left_menu_grey_3.svg new file mode 100644 index 0000000..966f571 --- /dev/null +++ b/view/images/left_menu_grey_3.svg @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="36px" height="34px" viewBox="0 0 36 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <title>编组 10</title> + <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="icon" transform="translate(-275.000000, -81.000000)"> + <g id="编组-10" transform="translate(276.000000, 81.000000)"> + <g id="编组-9" transform="translate(1.078502, 2.893071)"> + <g id="编组-7" transform="translate(9.286361, 6.916072)" fill="#636C78" stroke="#636C78" stroke-width="2"> + <rect id="矩形备份-4" transform="translate(3.213712, 3.213712) scale(-1, 1) rotate(45.000000) translate(-3.213712, -3.213712) " x="3.01371229" y="0.868836784" width="1" height="4.68975101" rx="0.5"></rect> + <rect id="矩形备份-4" transform="translate(6.427425, 3.213712) rotate(45.000000) translate(-6.427425, -3.213712) " x="6.22742458" y="0.868836784" width="1" height="4.68975101" rx="0.5"></rect> + <rect id="矩形备份-5" transform="translate(4.729410, 6.427425) rotate(90.000000) translate(-4.729410, -6.427425) " x="4.5294104" y="3.57205285" width="1" height="5.71074345" rx="0.5"></rect> + <rect id="矩形备份-6" transform="translate(4.729410, 10.526342) rotate(90.000000) translate(-4.729410, -10.526342) " x="4.5294104" y="7.67097063" width="1" height="5.71074345" rx="0.5"></rect> + <rect id="矩形备份-7" transform="translate(4.729410, 10.526342) rotate(180.000000) translate(-4.729410, -10.526342) " x="4.5294104" y="7.67097063" width="1" height="5.71074345" rx="0.5"></rect> + </g> + <g id="编组-8"> + <path d="M27.6247188,18.1540879 C28.0079822,16.8721121 28.2138581,15.513563 28.2138581,14.106929 C28.2138581,6.31588726 21.8979708,0 14.106929,0 C6.31588726,0 0,6.31588726 0,14.106929 C0,21.8979708 6.31588726,28.2138581 14.106929,28.2138581 C17.6009106,28.2138581 20.7982125,26.9436218 23.2622323,24.8397518" id="路径" stroke="#636C78" stroke-width="2.4" stroke-linecap="round"></path> + <path d="M26.2326281,21.4351711 C26.0551194,21.4351711 25.9071954,21.4058931 25.7296867,21.3473371 C25.3154996,21.2009472 24.990067,20.8788894 24.842143,20.4982756 L23.3629036,16.6921377 C23.0670557,15.9309101 23.4516579,15.0818485 24.2208624,14.7890687 C24.990067,14.4962888 25.8480259,14.8769026 26.1438738,15.6381302 L27.0018326,17.863257 L29.6348789,16.3700798 C30.3449138,15.9601881 31.2620423,16.2236899 31.6466446,16.9263615 C32.0608316,17.6290331 31.7945685,18.5366507 31.0845336,18.9172644 L26.9426631,21.2595032 C26.7355695,21.3766151 26.4988912,21.4351711 26.2326281,21.4351711 Z" id="路径" fill="#636C78" fill-rule="nonzero"></path> + </g> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/view/images/left_menu_grey_4.png b/view/images/left_menu_grey_4.png new file mode 100644 index 0000000000000000000000000000000000000000..c436ce0c89251398e00a6110664d264a07d971bd GIT binary patch literal 1837 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 bBq09*26qdA+KGVP00000NkvXXu0mjfe}-d| literal 0 HcmV?d00001 diff --git a/view/images/left_menu_grey_4.svg b/view/images/left_menu_grey_4.svg new file mode 100644 index 0000000..e54c6b5 --- /dev/null +++ b/view/images/left_menu_grey_4.svg @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="34px" height="34px" viewBox="0 0 34 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <title>编组 11</title> + <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="icon" transform="translate(-348.000000, -81.000000)"> + <g id="编组-11" transform="translate(348.000000, 81.000000)"> + <g id="编组-2" transform="translate(1.000000, 1.832887)"> + <path d="M28.032,3.03289273 C28.7923902,3.03289273 29.4849588,3.34398788 29.987906,3.8417194 C30.4862805,4.3349255 30.8,5.01345712 30.8,5.75974311 L30.8,5.75974311 L30.8,26.4073757 C30.8,27.1536617 30.4862805,27.8321933 29.987906,28.3253994 C29.4849588,28.8231309 28.7923902,29.1342261 28.032,29.1342261 L28.032,29.1342261 L3.968,29.1342261 C3.2076098,29.1342261 2.51504123,28.8231309 2.01209396,28.3253994 C1.51371954,27.8321933 1.2,27.1536617 1.2,26.4073757 L1.2,26.4073757 L1.2,5.75974311 C1.2,5.01345712 1.51371954,4.3349255 2.01209396,3.8417194 C2.51504123,3.34398788 3.2076098,3.03289273 3.968,3.03289273 L3.968,3.03289273 Z" id="路径" stroke="#636C78" stroke-width="2.4" fill-rule="nonzero"></path> + <path d="M19.84,0 L12.16,0 C9.856,0 8,1.14271606 8,2.56126014 C8,3.97980422 9.856,5.12252028 12.16,5.12252028 L19.84,5.12252028 C22.144,5.12252028 24,3.97980422 24,2.56126014 C24,1.14271606 22.144,0 19.84,0 Z" id="路径" fill="#636C78" fill-rule="nonzero"></path> + <g id="编组" transform="translate(8.113513, 10.060753)" fill="#636C78" stroke="#636C78" stroke-width="2"> + <rect id="矩形备份-4" transform="translate(3.919996, 6.853153) scale(-1, 1) rotate(47.000000) translate(-3.919996, -6.853153) " x="3.71999625" y="3.61225226" width="1" height="6.48180082" rx="0.5"></rect> + <rect id="矩形备份-4" transform="translate(10.268972, 5.393430) rotate(47.000000) translate(-10.268972, -5.393430) " x="10.068972" y="-0.228001598" width="1" height="11.2428628" rx="0.5"></rect> + </g> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/view/images/logout.png b/view/images/logout.png new file mode 100644 index 0000000000000000000000000000000000000000..1934d6be1cca09664b265df0cb42b83383c92fc4 GIT binary patch literal 933 zcmV;W16urvP)<h;3K|Lk000e1NJLTq002Ay002A)1^@s6I{evk00001b5ch_0Itp) z=>Px&Ur9tkRA@u(+e@fTQ5?td@6RLew@?(xKomp7z$0%N+)@ZB6GYTCxJoD`Q6d?b zd4$r9P#$F>d6c3|q(t82J-~>+R_%LRci(f}bN1uhv-b6$oI0(u*8j8DK6|gd*4m<z zg*us+cEM&g2v`iv0!9Htp#9&KaUfp-+a*0NqikkH+60@~0GAN31?ZVsi!Cd9Bx!O^ zb(gHRB-qR*0GENWIVbZ~(%_uiXi<GDu$heq?g9gIPUH_zFX>Ru?X(Rxv%bJXU|cMT zcfc{=9`FgU43c~+>3s(ER8&Qa9yYUG!0uQLr-99qzE)IojTUYOn^`a51JKXQwNcWt z8qGaXT0VFwaM7#fBQQ~t`z%cO-~+%mPj*mJePN^##0Q@NR(QablFk+xd=*&W0T)WT zR%Ecl&G&!{Bwhax4*UrC|KXbLVKb`(_5ojj4U*j8C{ffr*vxuF(B6^o8!%7O{UqWL zz<mIR?B)RzqiY`QkY?r{Q}@PtG!Z%oaD?6i>`03a2AmZ-C~y|&;J|6oL4wnug9Rr= z2Mtbw4jx=7Ix}!I0hrhPbvdKR1~&^DEBGCl>kmUygUzfva2{AvPF5XI<~L9$>5^+Z z3$UByJJ$h_N}7BjX-rn&g}{|cTJM0ePb9eohV(rgT{PST;PM>TpvpZ)ZXqFl9r*>! zkn|ukaJkv!RnE-104IP|u{K@;GbKH5`abo4I4?xG^;UunzK1Kt1`SSv4Hldf8zeXl zHaKuvY*63`dmLEZ-mT|fSNI@qOIcxq>0vWF3T#Z%v%w5J%&b4)9`pQYHG(R4pi=Xv zw3)dT2e+waXoO0P4e6Ag2DlA3pMeHRZWmvosQDgFr25B?IyE@H<zbN|_g$gF@8OfN zoBA3_rwXNw&3L%wNVhE66vrg3FEV%zaKi)s047O#RwT54O1t~r8(^3Rya~*f<aWLm zBI27%HvvatvfIE~Nl%L)j)UE#`Ym8e4EGagjJ6NEn|~JDhhIx_`?9MVr8bC<h+w0u zkjY_5TdUAca}#a70x%r70JtGtp7BGHn@g@*lmxrh&8#c14%i8d%qgQglBVZWcgbqo z1UHqA9=@kWukko|R<H56JHmcR?n$U>(Jr`ZnN+EvP6z%AZq(dNc4djE00000NkvXX Hu0mjf_jII8 literal 0 HcmV?d00001 diff --git a/view/images/logout.svg b/view/images/logout.svg new file mode 100644 index 0000000..0d703a5 --- /dev/null +++ b/view/images/logout.svg @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <title>编组 16</title> + <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="icon" transform="translate(-134.000000, -278.000000)"> + <g id="编组-16" transform="translate(134.000000, 278.000000)"> + <g id="编组-79" transform="translate(1.000000, 1.000000)"> + <rect id="矩形备份-13" fill="#FFFFFF" opacity="0" x="0" y="0" width="28" height="28"></rect> + <g id="编组" transform="translate(1.139899, 1.099267)" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"> + <path d="M12.8611879,0 L4,0 C1.790861,4.05812251e-16 -2.705415e-16,1.790861 0,4 L0,21.7342421 C-1.69156808e-15,23.9433811 1.790861,25.7342421 4,25.7342421 L12.8671211,25.7342421 L12.8671211,25.7342421" id="路径"></path> + <polyline id="路径" points="19.3006816 19.3006816 25.7342421 12.8671211 19.3006816 6.43356053"></polyline> + <line x1="7.14840059" y1="12.8611879" x2="25.7342421" y2="12.8611879" id="路径"></line> + </g> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/view/templates/include/admin_header.html b/view/templates/include/admin_header.html index 384cf05..d228d58 100644 --- a/view/templates/include/admin_header.html +++ b/view/templates/include/admin_header.html @@ -1,6 +1,6 @@ -<div class="layui-header admin-layui-header"> +<div class="layui-header admin-layui-header layui-anim layui-anim-up"> <div class="layui-logo layui-hide-xs layui-bg-black" style="box-shadow: unset !important;background-color: #1890FF !important;width: 105px;margin-left: 31px;"> - <img src="/images/admin_logo.png" alt="" style="width: 105px;height: 22px;vertical-align: middle;"> + <img src="/images/admin_logo.svg" alt="" style="width: 105px;vertical-align: middle;"> </div> <!-- 头部区域(可配合layui 已有的水平导航) --> <ul class="layui-nav layui-layout-left"> @@ -25,17 +25,25 @@ </ul> <ul class="layui-nav layui-layout-right header_user_info"> <li class="layui-nav-item layui-hide layui-show-md-inline-block"> - <a href="javascript:;" style="color:#ffffff !important;"> + <a href="javascript:;" style="color:#ffffff !important;" class="admin-header-user-info"> <img src="/images/header_user_logo.png" class="layui-nav-img admin-layui-nav-img"> ID:88900006543 </a> + <!-- <dl class="layui-nav-child"> <dd><a href="">Your Profile</a></dd> <dd><a href="">Settings</a></dd> <dd><a href="">Sign out</a></dd> </dl> --> </li> - <!-- <li class="layui-nav-item" lay-header-event="menuRight" lay-unselect> + + <li class="layui-nav-item layui-hide layui-show-md-inline-block" style="margin-left: 39px !important;"> + <a href="javascript:;" style="color:rgba(255,255,255,0.8) !important;padding: 0px !important;margin-left: 0px !important;"> + <img src="/images/logout.svg" class="layui-nav-img admin_logout_img"> + 退出 + </a> + </li> + <!-- <li class="layui-nav-item" lay-header-event="menuRight" lay-unselect>left_menu_bule_1.png <a href="javascript:;"> <i class="layui-icon layui-icon-more-vertical"></i> </a> diff --git a/view/templates/include/admin_leftmenu.html b/view/templates/include/admin_leftmenu.html index 9c2ffa8..d6bd0ef 100644 --- a/view/templates/include/admin_leftmenu.html +++ b/view/templates/include/admin_leftmenu.html @@ -1,25 +1,53 @@ -<div class="layui-side layui-bg-black admin-menu-list"> +<div class="layui-side layui-bg-black admin-menu-list layui-anim layui-anim-up" style="background-color: #FFFFFF !important;color:#000000 !important;"> <div class="layui-side-scroll admin-menu-layui-side-scroll"> - <ul class="layui-nav layui-nav-tree" lay-filter="test"> - <li class="layui-nav-item layui-nav-itemed"> - <a class="" href="javascript:;">menu group 1</a> - <dl class="layui-nav-child"> - <dd><a href="javascript:;">menu 1</a></dd> - <dd><a href="javascript:;">menu 2</a></dd> - <dd><a href="javascript:;">menu 3</a></dd> - <dd><a href="">the links</a></dd> + <ul class="layui-nav layui-nav-tree admin-layui-nav-tree" lay-filter="test" lay-bar="disabled"> + <li class="layui-nav-item layui-nav-itemed layui-menu-item-down"> + <a href="javascript:;" class="admin-layui-nav-item-a admin-layui-nav-item-title-a"> + <span>首页</span> + </a> + <dl class="layui-nav-child admin-layui-nav-child"> + <dd class="layui-this"> + <a href="javascript:;" class="admin-layui-nav-item-a admin-layui-nav-item-a-child"> + <img src="/images/left_menu_grey_1.svg" alt="" class="admin-layui-nav-item-a-child-img admin-no-select"> + <img src="/images/left_menu_bule_1.svg" alt="" class="admin-layui-nav-item-a-child-img admin-select"> + 首页 + </a> + </dd> </dl> </li> - <li class="layui-nav-item"> - <a href="javascript:;">menu group 2</a> - <dl class="layui-nav-child"> - <dd><a href="javascript:;">list 1</a></dd> - <dd><a href="javascript:;">list 2</a></dd> - <dd><a href="">超链接</a></dd> + + <li class="admin_menu_line" style=""> + <img src="/images/admin_menu_left_line.png"> + </li> + + <li class="layui-nav-item layui-menu-item-down layui-nav-itemed"> + <a href="javascript:;" class="admin-layui-nav-item-a admin-layui-nav-item-title-a"> + <span>常用功能</span> + </a> + <dl class="layui-nav-child admin-layui-nav-child"> + <dd> + <a href="javascript:;" class="admin-layui-nav-item-a admin-layui-nav-item-a-child"> + <img src="/images/left_menu_grey_2.svg" alt="" class="admin-layui-nav-item-a-child-img admin-no-select"> + <img src="/images/left_menu_bule_2.svg" alt="" class="admin-layui-nav-item-a-child-img admin-select"> + 发货提醒 + </a> + </dd> + <dd> + <a href="javascript:;" class="admin-layui-nav-item-a admin-layui-nav-item-a-child"> + <img src="/images/left_menu_grey_3.svg" alt="" class="admin-layui-nav-item-a-child-img admin-no-select"> + <img src="/images/left_menu_bule_3.svg" alt="" class="admin-layui-nav-item-a-child-img admin-select"> + 售后监控 + </a> + </dd> + <dd> + <a href="javascript:;" class="admin-layui-nav-item-a admin-layui-nav-item-a-child"> + <img src="/images/left_menu_grey_4.svg" alt="" class="admin-layui-nav-item-a-child-img admin-no-select"> + <img src="/images/left_menu_bule_4.svg" alt="" class="admin-layui-nav-item-a-child-img admin-select"> + 订单列表 + </a> + </dd> </dl> </li> - <li class="layui-nav-item"><a href="javascript:;">click menu item</a></li> - <li class="layui-nav-item"><a href="">the links</a></li> </ul> </div> </div> \ No newline at end of file diff --git a/view/templates/tpl/home.html b/view/templates/tpl/home.html index b8b7945..36f2bb8 100644 --- a/view/templates/tpl/home.html +++ b/view/templates/tpl/home.html @@ -8,42 +8,37 @@ <link href="/images/pdd_icon.png" rel="icon"> <title>首页</title> <link rel="stylesheet" href="/css/layui.css"/> + <link rel="stylesheet" href="/css/admin_style.css"/> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> {literal} <style> - .admin-container-outer .admin-layui-header{ - height: 48px !important; - background-color: #1890FF !important; - } - .admin-container-outer .admin-layui-header *{ - line-height: 48px !important; - } - .admin-container-outer .admin-layui-nav-img{ - width: 24px !important; - height: 24px !important; - margin-right: 8px !important; - } - .header_user_name{ - color:#FFFFFF !important; - } - .admin-container-outer .header_user_info{ - padding: 0 33px !important; - } - .admin-container-outer .admin-menu-list{ - top: 48px !important; - width: 188px !important; - } - .admin-container-outer .admin-menu-layui-side-scroll{ - width: 188px !important; - } - @media screen and (max-width: 768px) { - .layui-layout-admin .layui-layout-left, - .layui-layout-admin .layui-body, - .layui-layout-admin .layui-footer{left: 0;} - .layui-layout-admin .layui-side{left: -300px;} + .admin-index-top-item{ + width: 100%; + height: 373px; + background: #FFFFFF; + box-shadow: 0px 2px 8px 0px rgba(217,221,229,0.5000); + border-radius: 3px; + } + .admin-layui-body{ + padding:12px; + } + .admin-index-bottom-item{ + width: 100%; + height: 260px; + background: #FFFFFF; + box-shadow: 0px 2px 8px 0px rgba(217,221,229,0.5000); + border-radius: 3px; + } + .bottom-layui-row{ + margin-top: 20px; + } + .admin-index-top-item-title{ + width: 100%; + height: 46px; + } </style> {/literal} @@ -53,11 +48,72 @@ <div class="layui-layout layui-layout-admin admin-container-outer"> {include file="include/admin_header.html"} {include file="include/admin_leftmenu.html"} - <div class="layui-body"> - <div style="padding: 15px;"> - 内容主体区域 + <div class="layui-body admin-layui-body layui-anim layui-anim-fadein"> + <div class="layui-row layui-col-space12"> + <div class="layui-col-lg2"> + <div class="admin-index-top-item"> + <div class="admin-index-top-item-title">今日动态</div> + + <div class="admin-index-top-item-list-title">发货动态</div> + <div class="admin-index-top-item-list-item"> + <div class="admin-index-top-item-list-item-child"> + <div>催发订单:</div> + <div>323,234</div> + </div> + + <div class="admin-index-top-item-list-item-child"> + <div>倒计时订单:</div> + <div>234</div> + </div> + + <div class="admin-index-top-item-list-item-child"> + <div>待发货订单:</div> + <div>809,1</div> + </div> + </div> + + <div class="admin-index-top-item-list-title">售后动态</div> + <div class="admin-index-top-item-list-item"> + <div class="admin-index-top-item-list-item-child"> + <div>平台介入中:</div> + <div>809,1</div> + </div> + + <div class="admin-index-top-item-list-item-child"> + <div>待售后订单:</div> + <div>891</div> + </div> + </div> + + </div> + </div> + <div class="layui-col-lg10"> + <div class="admin-index-top-item">2</div> + </div> + </div> + + <div class="layui-row layui-col-space20 bottom-layui-row"> + <div class="layui-col-lg2"> + <div class="admin-index-bottom-item">1</div> + </div> + <div class="layui-col-lg2"> + <div class="admin-index-bottom-item">2</div> + </div> + <div class="layui-col-lg2"> + <div class="admin-index-bottom-item">2</div> + </div> + + <div class="layui-col-lg2"> + <div class="admin-index-bottom-item">2</div> + </div> + + <div class="layui-col-lg2"> + <div class="admin-index-bottom-item">2</div> + </div> </div> + </div> + <div class="layui-footer"> 底部固定区域 </div> From 104480cd270635d0ebe8de1c4469d0da3df04cb1 Mon Sep 17 00:00:00 2001 From: Jason <1432334894@qq.com> Date: Fri, 29 Jul 2022 19:34:33 +0800 Subject: [PATCH 03/12] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view/css/admin_style.css | 6 +- view/css/common.css | 55 +++++++ view/font/icomoon.eot | Bin 0 -> 3348 bytes view/font/icomoon.svg | 17 +++ view/font/icomoon.ttf | Bin 0 -> 3184 bytes view/font/icomoon.woff | Bin 0 -> 3260 bytes view/images/admin_index_dashed_line.png | Bin 0 -> 184 bytes view/images/right_arr.png | Bin 0 -> 443 bytes view/templates/include/admin_leftmenu.html | 2 +- view/templates/tpl/home.html | 238 ++++++++++++++++++++++++++--- 10 files changed, 296 insertions(+), 22 deletions(-) create mode 100644 view/font/icomoon.eot create mode 100644 view/font/icomoon.svg create mode 100644 view/font/icomoon.ttf create mode 100644 view/font/icomoon.woff create mode 100644 view/images/admin_index_dashed_line.png create mode 100644 view/images/right_arr.png diff --git a/view/css/admin_style.css b/view/css/admin_style.css index d594e1e..d694db3 100644 --- a/view/css/admin_style.css +++ b/view/css/admin_style.css @@ -1,4 +1,4 @@ -@media screen and (max-width: 1350px){ +@media screen and (max-width: 950px){ .admin-container-outer .admin-layui-header{ height: 48px !important; background-color: #1890FF !important; @@ -152,10 +152,10 @@ a, article, aside, b, body, button, dd, div, dl, dt, figcaption, figure, footer, -webkit-font-smoothing: antialiased; } .admin-layui-nav-item-a-child{ - font-family: PingFangSC-Medium,Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif !important; + font-family: PingFangSC-Medium; color: rgba(99, 108, 120, 1) !important; } .admin-layui-nav-item-title-a > span{ - font-family: PingFangSC-Medium,Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif !important; + font-family: PingFangSC-Medium; color: rgba(0, 0, 0, 1) !important; } \ No newline at end of file diff --git a/view/css/common.css b/view/css/common.css index e69de29..88c9601 100644 --- a/view/css/common.css +++ b/view/css/common.css @@ -0,0 +1,55 @@ +@font-face { + font-family: 'icomoon'; + src: url('/font/icomoon.eot?mle4db'); + src: url('/font/icomoon.eot?mle4db#iefix') format('embedded-opentype'), + url('/font/icomoon.ttf?mle4db') format('truetype'), + url('/font/icomoon.woff?mle4db') format('woff'), + url('/font/icomoon.svg?mle4db#icomoon') format('svg'); + font-weight: normal; + font-style: normal; + font-display: block; + } + + [class^="icon-"], [class*=" icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'icomoon' !important; + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + .icon-uniE9001:before { + content: "\e907"; + color: #c4c7cc; + } + .icon--:before { + content: "\e906"; + color: #c4c7cc; + } + .icon--1:before { + content: "\e902"; + color: #c4c7cc; + } + .icon-1:before { + content: "\e903"; + color: #c4c7cc; + } + .icon--2:before { + content: "\e904"; + color: #31b927; + } + .icon-2:before { + content: "\e905"; + color: #f21019; + } + .icon-uniE900:before { + content: "\e901"; + color: #c4c7cc; + } diff --git a/view/font/icomoon.eot b/view/font/icomoon.eot new file mode 100644 index 0000000000000000000000000000000000000000..1ee249437dbcde392dcea9ff74776281a086ab4e GIT binary patch literal 3348 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 QZSQwv6jp-Yl0O0d51sDBbpQYW literal 0 HcmV?d00001 diff --git a/view/font/icomoon.svg b/view/font/icomoon.svg new file mode 100644 index 0000000..af70308 --- /dev/null +++ b/view/font/icomoon.svg @@ -0,0 +1,17 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata>Generated by IcoMoon</metadata> +<defs> +<font id="icomoon" horiz-adv-x="1024"> +<font-face units-per-em="1024" ascent="960" descent="-64" /> +<missing-glyph horiz-adv-x="1024" /> +<glyph unicode=" " horiz-adv-x="512" d="" /> +<glyph unicode="" glyph-name="uniE900" d="M533.753 840.353c-232.659 0-421.647-188.988-421.647-421.647s188.988-421.647 421.647-421.647c232.659 0 421.647 188.988 421.647 421.647s-188.988 421.647-421.647 421.647zM713.706 271.883l-201.788 116.706h-8.282v271.059h60.235v-231.906l179.953-103.906-30.118-51.953z" /> +<glyph unicode="" glyph-name="-1" d="M276.96 820.899c80.432 0 145.636-65.205 145.636-145.638 0-80.43-65.202-145.635-145.636-145.635s-145.638 65.205-145.638 145.635c0 80.433 65.205 145.638 145.638 145.638zM349.569 689.057v55.777l-93.497-83.367-51.721 46.277v-55.777l51.721-46.278 93.497 83.368zM929.327 329.803c-5.321-0.29-11.528-0.442-18.626-0.442h-163.14c-4.138 0-8.276 2.071-12.414 6.207-4.138 4.143-6.208 7.686-6.208 10.644v0.885c-0.585 28.967-0.89 55.267-0.89 78.918v80.681c0 6.503 2.668 12.565 7.985 18.177 5.319 5.616 11.819 8.417 19.506 8.417 0.591 0 5.024 0.3 13.304 0.892 8.275 0.593 18.469 0.151 30.591-1.327 12.119-1.475 24.973-4.731 38.568-9.753 13.592-5.024 26.301-13.153 38.126-24.386 18.325-18.918 31.328-41.822 39.012-68.715 7.686-26.893 14.783-54.824 21.278-83.787 0-1.183 0.154-2.071 0.445-2.664 0.296-0.587 0.44-1.478 0.44-2.66 0-7.099-2.654-10.793-7.976-11.087l-0.001 0.001zM998.928 319.164c-4.434 33.397-12.267 67.537-23.496 102.41-11.238 34.875-28.078 67.688-50.544 98.413-12.409 17.145-27.777 31.922-46.108 44.333-18.222 12.367-37.869 22.492-58.516 30.155-20.691 7.685-41.675 13.147-62.956 16.398-21.279 3.251-41.675 3.988-61.181 2.216-6.497-0.587-11.968-5.175-16.402-13.742s-6.648-16.107-6.648-22.607v-427.376c0-10.644 3.84-19.803 11.526-27.486s16.84-11.524 27.484-11.524h15.962c0 14.775 2.807 28.819 8.424 42.118 5.619 13.301 13.3 24.966 23.054 35.018 9.756 10.051 21.129 18.036 34.136 23.944 13.002 5.911 27.187 8.869 42.554 8.869 15.373 0 29.999-2.071 43.894-6.209 13.892-4.137 26.014-10.638 36.348-19.504 10.348-8.869 18.625-20.393 24.832-34.581 6.202-14.188 9.304-31.334 9.304-51.428h36.358c3.544 0 6.357 1.775 8.427 5.318 2.061 3.55 3.84 7.835 5.312 12.864 1.465 4.925 2.504 9.967 3.106 15.070 0.593 5.026 0.887 9.314 0.887 12.858 0 18.324 0.15 41.973 0.442 70.936 0.301 28.954-1.773 60.135-6.207 93.534l0.008 0.001zM840.657 164.444c15.366 0 28.669-5.615 39.9-16.85 11.233-11.233 16.847-24.524 16.847-39.9 0-15.956-5.616-29.552-16.847-40.778-11.231-11.236-24.529-16.851-39.9-16.851-15.955 0-29.408 5.615-40.344 16.851-10.935 11.231-16.402 24.822-16.402 40.778 0 15.374 5.468 28.668 16.402 39.9 10.936 11.235 24.383 16.85 40.344 16.85v0zM230.634 165.325c-15.96 0-29.413-5.615-40.344-16.841-10.938-11.232-16.402-24.824-16.402-40.792 0-15.358 5.464-28.662 16.402-39.896 10.934-11.233 24.384-16.848 40.344-16.848s29.407 5.616 40.344 16.847c10.938 11.235 16.399 24.533 16.399 39.897 0 15.96-5.465 29.562-16.399 40.792-10.936 11.226-24.384 16.841-40.344 16.841zM457.159 721.268c4.402-15.663 6.623-31.958 6.623-48.882 0-25.814-4.91-49.953-14.736-72.402-9.821-22.449-23.15-42.091-39.983-58.927-16.838-16.833-36.472-30.028-58.927-39.565-22.453-9.538-46.298-14.308-71.558-14.308-25.816 0-49.948 4.77-72.396 14.308-22.45 9.539-42.089 22.732-58.927 39.565-16.838 16.836-30.165 36.478-39.984 58.927-9.824 22.449-14.736 46.584-14.736 72.402 0 2.821 0.073 5.62 0.189 8.407-8.449-10.369-15.1-21.7-19.92-34.006-5.323-13.592-7.981-27.486-7.981-41.673v-461.065c0-11.233 3.251-19.804 9.752-25.713 6.507-5.905 14.78-8.868 24.828-8.868h20.395c0 37.83 9.609 66.057 28.817 84.675 19.205 18.621 46.844 27.936 82.9 27.936 37.835 0 65.621-10.050 83.349-30.152 17.733-20.097 26.603-47.585 26.603-82.458h242.055c9.464 0 17.582 3.251 24.384 9.756 6.796 6.499 10.198 14.772 10.198 24.823l-1.774 577.222h-159.171z" /> +<glyph unicode="" glyph-name="1" d="M725.823 434.567v96.274h-98.681l76.538 76.538-68.355 67.873-102.051-102.051-102.051 102.051-68.355-67.873 76.538-76.538h-98.681v-96.274h144.412v-48.137h-144.412v-96.274h144.412v-96.274h96.274v96.274h144.412v96.274h-144.412v48.137h144.412zM918.371 434.567c0.273-178.936-122.742-334.486-296.925-375.455s-353.638 43.437-433.155 203.734c-79.518 160.297-38.145 354.248 99.861 468.144s336.283 117.728 478.587 9.248l-64.985-64.985h192.549v192.549l-59.209-59.209c-175.186 140.999-424.651 141.917-600.87 2.212s-232.229-382.804-134.909-585.533c97.321-202.73 322.037-311.064 541.259-260.938s374.526 245.355 374.073 470.234h-96.275z" /> +<glyph unicode="" glyph-name="-2" d="M500.15-20.166l453.437 453.437-267.983-0.061 0.043 453.497h-370.994l-0.079-453.497-267.861 0.061 453.437-453.437z" /> +<glyph unicode="" glyph-name="2" d="M500.15 897.58l453.437-453.437-267.983 0.061 0.043-453.497h-370.994l-0.079 453.497-267.861-0.061 453.437 453.437z" /> +<glyph unicode="" glyph-name="-" d="M666.8 58.083c5.295 0 5.295-5.295-5.295-15.886-5.295-10.591-15.886-21.182-31.772-37.068-15.886-10.591-31.772-26.477-47.659-37.068-21.182-10.591-37.068-15.886-58.25-15.886s-37.068 5.295-52.954 15.886c-15.886 10.591-31.772 21.182-47.659 37.068-15.886 10.591-21.182 26.477-31.772 37.068-5.295 10.591-10.591 15.886-5.295 15.886h280.657zM931.57 148.105c5.295-5.295 5.295-10.591 5.295-21.182 0-5.295 0-10.591-5.295-15.886l-10.591-10.591c-5.295 0-10.591-5.295-10.591-5.295h-773.13c-10.591 0-15.886 5.295-21.182 10.591-5.295 15.886-5.295 26.477 0 37.068 10.591 21.182 26.477 42.363 42.363 68.84s31.772 52.954 47.659 84.727c15.886 31.772 26.477 63.545 37.068 95.317s15.886 68.84 15.886 105.908c0 37.068 5.295 68.84 15.886 95.317s21.182 52.954 37.068 74.136c15.886 21.182 31.772 37.068 52.954 52.954 26.477 15.886 47.659 26.477 68.84 37.068-10.591 15.886-15.886 37.068-15.886 58.25 0 26.477 10.591 52.954 31.772 74.136 15.886 15.886 42.363 26.477 68.84 26.477s52.954-10.591 74.136-31.772c21.182-21.182 31.772-42.363 31.772-74.136 0-10.591 0-21.182-5.295-31.772l-10.591-21.182c26.477-5.295 47.659-21.182 68.84-31.772 21.182-15.886 42.363-31.772 58.25-52.954s26.477-47.659 37.068-74.136c10.591-26.477 15.886-58.25 15.886-95.317s5.295-68.84 15.886-105.908c10.591-31.772 21.182-68.84 37.068-95.317 15.886-31.772 31.772-58.25 47.659-84.727 10.591-26.477 26.477-52.954 42.363-68.84zM476.165 815.326c0-10.591 5.295-21.182 10.591-26.477 5.295-10.591 15.886-10.591 26.477-10.591s21.182 5.295 26.477 10.591c5.295 5.295 10.591 15.886 10.591 26.477s-5.295 21.182-10.591 31.772c0 5.295-10.591 5.295-21.182 5.295s-21.182-5.295-31.772-10.591c-5.295-5.295-10.591-15.886-10.591-26.477v0z" /> +<glyph unicode="" glyph-name="uniE9001" d="M537.919 155.534c4.865 0 9.826 0.289 14.787 0.819 47.733 5.539 88.289 37.811 103.221 82.268 1.102 3.345-0.555 6.975-3.805 8.333-3.28 1.427-7.11 0.239-9.007-2.794-0.193-0.241-19.17-29.863-92.961-39.497-11.078-1.445-21.819-2.216-32.031-2.216-51.731 0-74.803 18.881-74.995 19.074-2.663 2.24-6.539 2.281-9.248 0.096-2.665-2.157-3.286-5.971-1.445-8.863 23.232-35.675 62.912-57.2 105.485-57.222v0zM934.956 597.895c-0.674 0-1.252-0.145-1.878-0.145-43.254 181.106-208.561 316.165-406.767 316.165-203.648 0-372.809-142.573-410.283-331.097-36.414-6.358-64.158-37.329-64.158-74.755v-149.894c0-42.001 34.824-76.055 77.885-76.055 24.276 0 45.662 11.078 59.919 28.081 34.439-88.048 104.521-158.998 193.244-196.471 1.13 2.154 2.452 4.201 3.95 6.117 1.397 1.734 2.938 3.179 4.287 3.179 1.344-0.018 2.653-0.437 3.757-1.204-20.519 14.739-94.695 90.698-110.783 196.712-7.032 46.673 29.141 92.48 71.238 100.042 67.578 12.138 134.818 26.010 202.396 37.955 42.965 7.562 72.346 30.345 90.312 68.3 4.19 8.863 10.259 26.781 13.053 52.646 0.723 3.949 4.174 6.811 8.188 6.791 2.794 0 5.154-1.349 6.743-3.372l1.83 1.156c26.636-37.425 79.475-120.176 87.085-207.502 8.67-99.801 3.853-168.101-75.188-238.039-1.314-1.158-2.068-2.824-2.071-4.576 0-2.167 1.156-3.998 2.89-5.106l1.927-0.867c0.578-0.144 1.060-0.289 1.589-0.289 0.578 0 1.012 0.144 1.493 0.289l3.275 1.782c79.956 42.579 141.224 113.673 169.546 199.121 11.512-16.473 29.43-28.322 50.286-32.464-33.428-147.053-169.161-239.147-337.262-253.115-11.089 25.414-36.336 41.702-64.062 41.327-38.003 0-68.878-29.093-68.878-65.025 0-35.884 30.875-64.977 68.878-64.977 30.73 0 56.403 19.026 65.314 45.228 194.593 15.269 350.653 127.112 383.213 300.848 28.755 11.656 48.985 38.919 48.985 70.805v151.58c0 42.387-35.788 76.777-79.956 76.777v0.048zM863.188 554.305c-50.768 132.94-182.31 227.876-337.070 227.876-154.085 0-285.146-94.166-336.395-226.19-2.505 2.986-5.539 5.587-8.429 8.188 28.996 160.924 172.244 283.268 345.017 283.268 171.955 0 314.72-121.139 344.68-280.956-2.938-3.853-5.684-7.851-7.851-12.186h0.048z" /> +</font></defs></svg> \ No newline at end of file diff --git a/view/font/icomoon.ttf b/view/font/icomoon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..27835e1c5d09836d32892b2f23aa43739aa004ad GIT binary patch literal 3184 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 Lz(-zRKDPZ2bGNjE literal 0 HcmV?d00001 diff --git a/view/font/icomoon.woff b/view/font/icomoon.woff new file mode 100644 index 0000000000000000000000000000000000000000..43771b1cb4cf3f731904bc6135cfee354c02d547 GIT binary patch literal 3260 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 literal 0 HcmV?d00001 diff --git a/view/images/admin_index_dashed_line.png b/view/images/admin_index_dashed_line.png new file mode 100644 index 0000000000000000000000000000000000000000..1d75ac2a0648465883cef64b72a1ab3a9df3d698 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^-+`EsgAGVBxm$#TIK@HkP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(=9eE~C^4N}d}pr@Y;q?9~e978lj zlWRUcI$F=BF=4`lgqDr&M->$frT7*<Gzj_3${;v#`A*yG%cDTLJYD@<);T3K0RX41 BB<uhH literal 0 HcmV?d00001 diff --git a/view/images/right_arr.png b/view/images/right_arr.png new file mode 100644 index 0000000000000000000000000000000000000000..5b03f8bb9b3d22847ad9d4cebed14fea3555d5d1 GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1&TfmH9gB0%lVEGHEOx4rHF+@W& zIYB|#K<Tyj>6KT096xd4%%MXe28;K9)!ZawHJdZCp||_5@Zoy4)A#rPmpi4mZkqcv z=k&!lI3}IZSrhQ<YkQ)8K+{Wm?&i;T{`FbEnB`C-BJId@`M34Ejhl^b8~#cEbM(XP zhYBZtDioG9EEHUl5EcJASxwB%dcj)x|Av3;XM{zp_MYN4VNs;;t$CXZ3M>o^jQ0Kb z{``DnPZJw!%Groqm#~KJvpwEQYZrKZdcXeu@5WC_K5N$a8LOMzbqebiT%~Yw&7!QE z@%#V1{eAw!{O*~J7b~w#`6hj0mO~DYwBp5&{~45(nYo#@n;*~dl+`dh$m8%a*)OvB z%KQ60?G2p|<gKMQ%dWFv$#lE;<MnNSJ2tnr$7>E$%(->@mq40TXeL9qZ-hDjJMHzL Ofb(?qb6Mw<&;$UHq^j@$ literal 0 HcmV?d00001 diff --git a/view/templates/include/admin_leftmenu.html b/view/templates/include/admin_leftmenu.html index d6bd0ef..a00c4ca 100644 --- a/view/templates/include/admin_leftmenu.html +++ b/view/templates/include/admin_leftmenu.html @@ -16,7 +16,7 @@ </dl> </li> - <li class="admin_menu_line" style=""> + <li class="admin_menu_line"> <img src="/images/admin_menu_left_line.png"> </li> diff --git a/view/templates/tpl/home.html b/view/templates/tpl/home.html index 36f2bb8..54a07aa 100644 --- a/view/templates/tpl/home.html +++ b/view/templates/tpl/home.html @@ -9,6 +9,7 @@ <title>首页</title> <link rel="stylesheet" href="/css/layui.css"/> <link rel="stylesheet" href="/css/admin_style.css"/> + <link rel="stylesheet" href="/css/common.css"/> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> @@ -38,7 +39,164 @@ .admin-index-top-item-title{ width: 100%; height: 46px; - + line-height: 46px; + padding-left: 18px; + color: rgba(0, 0, 0, 0.65); + font-size: 16px; + font-family: PingFangSC-Regular; + text-align: left; + white-space: nowrap; + } + .admin-index-top-item-title-line{ + width: 100%; + height: 1px; + background-color: rgba(232, 232, 232, 1); + } + .admin-index-top-item-list-title{ + width: 56px; + height: 22px; + color: rgba(0, 0, 0, 0.85); + font-size: 14px; + font-family: PingFangSC-Medium; + text-align: left; + white-space: nowrap; + line-height: 22px; + margin: 18px 0 0 18px; + } + .admin-dashed-line{ + width: 100%; + height: 1px; + } + .admin-index-top-item-list-item-child{ + line-height: 1px; + padding-left: 18px; + } + .fl{ + float: left; + } + .fr{ + float: right; + } + .clear{ + clear: both; + width: 0px; + height: 0px; + } + .admin-index-top-item-list-item-child div:first-child{ + width: 70px; + height: 22px; + color: rgba(99, 108, 120, 1); + font-size: 14px; + font-family: PingFangSC-Regular; + text-align: left; + white-space: nowrap; + line-height: 25px; + margin-left: 4px; + } + .admin-index-top-item-list-item-child div:nth-child(2){ + height: 22px; + color: rgba(105, 113, 125, 1); + font-size: 14px; + font-family: PingFangSC-Regular; + text-align: left; + white-space: nowrap; + line-height: 25px; + margin-left: 51px; + padding-right: 28px; + } + .admin-index-top-item-list-item-child-icon1,.admin-index-top-item-list-item-child-icon2,.admin-index-top-item-list-item-child-icon3,.admin-index-top-item-list-item-child-icon4,.admin-index-top-item-list-item-child-icon5{ + font-size: 16px; + margin-right: 5px; + } + .admin-index-top-item-list-item-child-dot-red,.admin-index-top-item-list-item-child-dot-grey{ + margin-right: 5px; + } + .admin-index-top-item-list-item-child-dot1{ + margin-right: 0px !important; + } + .admin-index-top-item-list-item-child-dot-grey::after{ + content: ''; + display: inline-block; + width: 6px; + height: 6px; + background: #C3C6CB; + border-radius: 50%; + position: relative; + top: -4px; + } + .admin-index-top-item-list-item-child-dot-red::after{ + content: ''; + display: inline-block; + width: 6px; + height: 6px; + background: #F21019; + border-radius: 50%; + position: relative; + top: -4px; + } + .admin-card-text-1{ + width: 100%; + height: 16px; + font-size: 16px; + font-family: PingFangSC-Regular; + color: #636C78; + margin-top: 21px; + } + .admin-card-text-2{ + height: 28px; + font-size: 28px; + font-family: DINAlternate-Bold; + font-weight: bold; + color: #000000; + margin-top: 39px; + } + .admin-card-text-2 span{ + width: 14px; + height: 14px; + font-size: 14px; + font-family: PingFangSC-Regular; + color: #636C78; + line-height: 14px; + } + .admin-card-text-3{ + height: 12px; + font-size: 12px; + font-family: PingFangSC-Regular; + color: #5F5F5F; + margin-top: 39px; + } + .admin-card-text-4{ + height: 12px; + font-size: 12px; + font-family: PingFangSC-Regular; + color: #5F5F5F; + margin-top: 21px; + } + .admin-card-text-5{ + height: 14px; + font-size: 14px; + font-family: PingFangSC-Regular; + color: #F21019; + margin-top: 25px; + } + .admin-index-bottom-item{ + overflow: hidden; + } + .admin-index-bottom-item div{ + padding-left: 22px; + } + .admin-index-top-item-list-item-child-dot-red2{ + margin-right: 5px; + } + .admin-index-top-item-list-item-child-dot-red2::after{ + content: ''; + display: inline-block; + width: 6px; + height: 6px; + background: #F21019; + border-radius: 50%; + position: relative; + top: -2px; } </style> {/literal} @@ -50,65 +208,109 @@ {include file="include/admin_leftmenu.html"} <div class="layui-body admin-layui-body layui-anim layui-anim-fadein"> <div class="layui-row layui-col-space12"> - <div class="layui-col-lg2"> + <div class="layui-col-lg3"> <div class="admin-index-top-item"> <div class="admin-index-top-item-title">今日动态</div> + <div class="admin-index-top-item-title-line"></div> <div class="admin-index-top-item-list-title">发货动态</div> + <img class="admin-dashed-line" src="/images/admin_index_dashed_line.png"> + <div class="admin-index-top-item-list-item"> <div class="admin-index-top-item-list-item-child"> - <div>催发订单:</div> - <div>323,234</div> + <div class="fl"><i class="admin-index-top-item-list-item-child-dot-red admin-index-top-item-list-item-child-dot1"></i> <span class="icon-- admin-index-top-item-list-item-child-icon1"></span>催发订单:</div> + <div class="fr">323,234</div> + <div class="clear"></div> </div> + <img class="admin-dashed-line" src="/images/admin_index_dashed_line.png"> <div class="admin-index-top-item-list-item-child"> - <div>倒计时订单:</div> - <div>234</div> + <div class="fl"><i class="admin-index-top-item-list-item-child-dot-red"></i><span class="icon-uniE900 admin-index-top-item-list-item-child-icon2"></span>倒计时订单:</div> + <div class="fr">234</div> + <div class="clear"></div> </div> + <img class="admin-dashed-line" src="/images/admin_index_dashed_line.png"> <div class="admin-index-top-item-list-item-child"> - <div>待发货订单:</div> - <div>809,1</div> + <div class="fl"><i class="admin-index-top-item-list-item-child-dot-grey"></i><span class="icon--1 admin-index-top-item-list-item-child-icon3"></span>待发货订单:</div> + <div class="fr">809,1</div> + <div class="clear"></div> </div> + <img class="admin-dashed-line" src="/images/admin_index_dashed_line.png"> </div> <div class="admin-index-top-item-list-title">售后动态</div> + <img class="admin-dashed-line" src="/images/admin_index_dashed_line.png"> <div class="admin-index-top-item-list-item"> <div class="admin-index-top-item-list-item-child"> - <div>平台介入中:</div> - <div>809,1</div> + <div class="fl"><i class="admin-index-top-item-list-item-child-dot-red"></i><span class="icon-uniE9001 admin-index-top-item-list-item-child-icon4"></span>平台介入中:</div> + <div class="fr">809,1</div> + <div class="clear"></div> </div> + <img class="admin-dashed-line" src="/images/admin_index_dashed_line.png"> <div class="admin-index-top-item-list-item-child"> - <div>待售后订单:</div> - <div>891</div> + <div class="fl"><i class="admin-index-top-item-list-item-child-dot-grey"></i><span class="icon-1 admin-index-top-item-list-item-child-icon4"></span>待售后订单:</div> + <div class="fr">891</div> + <div class="clear"></div> </div> + <img class="admin-dashed-line" src="/images/admin_index_dashed_line.png"> </div> </div> </div> - <div class="layui-col-lg10"> + <div class="layui-col-lg9"> <div class="admin-index-top-item">2</div> </div> </div> <div class="layui-row layui-col-space20 bottom-layui-row"> <div class="layui-col-lg2"> - <div class="admin-index-bottom-item">1</div> + <div class="admin-index-bottom-item"> + <div class="admin-card-text-1">催发货订单(总) ></div> + <div class="admin-card-text-2">761<span>单</span></div> + <div class="admin-card-text-3">日增长:+0.61%</div> + <div class="admin-card-text-4">周减少:-0.61%</div> + <div class="admin-card-text-5"><i class="admin-index-top-item-list-item-child-dot-red2"></i>这些顾客在催促发货咯</div> + </div> </div> <div class="layui-col-lg2"> - <div class="admin-index-bottom-item">2</div> + <div class="admin-index-bottom-item"> + <div class="admin-card-text-1">催发货订单(总) ></div> + <div class="admin-card-text-2">761<span>单</span></div> + <div class="admin-card-text-3">日增长:+0.61%</div> + <div class="admin-card-text-4">周减少:-0.61%</div> + <div class="admin-card-text-5"><i class="admin-index-top-item-list-item-child-dot-red2"></i>这些顾客在催促发货咯</div> + </div> </div> <div class="layui-col-lg2"> - <div class="admin-index-bottom-item">2</div> + <div class="admin-index-bottom-item"> + <div class="admin-card-text-1">催发货订单(总) ></div> + <div class="admin-card-text-2">761<span>单</span></div> + <div class="admin-card-text-3">日增长:+0.61%</div> + <div class="admin-card-text-4">周减少:-0.61%</div> + <div class="admin-card-text-5"><i class="admin-index-top-item-list-item-child-dot-red2"></i>这些顾客在催促发货咯</div> + </div> </div> <div class="layui-col-lg2"> - <div class="admin-index-bottom-item">2</div> + <div class="admin-index-bottom-item"> + <div class="admin-card-text-1">催发货订单(总) ></div> + <div class="admin-card-text-2">761<span>单</span></div> + <div class="admin-card-text-3">日增长:+0.61%</div> + <div class="admin-card-text-4">周减少:-0.61%</div> + <div class="admin-card-text-5"><i class="admin-index-top-item-list-item-child-dot-red2"></i>这些顾客在催促发货咯</div> + </div> </div> <div class="layui-col-lg2"> - <div class="admin-index-bottom-item">2</div> + <div class="admin-index-bottom-item"> + <div class="admin-card-text-1">催发货订单(总) ></div> + <div class="admin-card-text-2">761<span>单</span></div> + <div class="admin-card-text-3">日增长:+0.61%</div> + <div class="admin-card-text-4">周减少:-0.61%</div> + <div class="admin-card-text-5"><i class="admin-index-top-item-list-item-child-dot-red2"></i>这些顾客在催促发货咯</div> + </div> </div> </div> From 94203a2dc2ae08fc42c9835bd685b9159a110e8d Mon Sep 17 00:00:00 2001 From: Jason <1432334894@qq.com> Date: Mon, 1 Aug 2022 12:36:16 +0800 Subject: [PATCH 04/12] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view/css/admin_style.css | 25 ++++--- view/templates/tpl/home.html | 164 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 145 insertions(+), 44 deletions(-) diff --git a/view/css/admin_style.css b/view/css/admin_style.css index d694db3..920f007 100644 --- a/view/css/admin_style.css +++ b/view/css/admin_style.css @@ -1,5 +1,5 @@ @media screen and (max-width: 950px){ - .admin-container-outer .admin-layui-header{ + /* .admin-container-outer .admin-layui-header{ height: 48px !important; background-color: #1890FF !important; } @@ -43,23 +43,25 @@ border-radius:unset !important; margin-right: 0px !important; } - @media screen and (max-width: 768px) { - .layui-layout-admin .layui-layout-left, - .layui-layout-admin .layui-body, - .layui-layout-admin .layui-footer{left: 0;} - .layui-layout-admin .layui-side{left: -300px;} - } + .layui-nav-itemed>.admin-layui-nav-child{ background-color: #ffffff !important; } .layui-nav-item>.admin-layui-nav-item-title-a{ color: #000000 !important; - } + } */ } +@media screen and (max-width: 768px) { + .layui-layout-admin .layui-layout-left, + .layui-layout-admin .layui-body, + .layui-layout-admin .layui-footer{left: 0;} + .layui-layout-admin .layui-side{left: -300px;} +} body{ background: #F0F2F5; + font: 14px PingFangSC-Regular, Roboto, Helvetica Neue, Helvetica, Tahoma, Arial, PingFang SC-Light, Microsoft YaHei !important; } .admin-container-outer .admin-layui-header{ background-color: #1890FF !important; @@ -139,7 +141,7 @@ body{ color:red !important; } a, article, aside, b, body, button, dd, div, dl, dt, figcaption, figure, footer, h1, h2, h3, h4, h5, h6, header, i, input, li, nav, p, section, select, span, textarea, ul { - padding: 0; + /* padding: 0; margin: 0; list-style: none; font-style: normal; @@ -149,7 +151,7 @@ a, article, aside, b, body, button, dd, div, dl, dt, figcaption, figure, footer, -webkit-box-sizing: border-box; box-sizing: border-box; -webkit-tap-highlight-color: transparent; - -webkit-font-smoothing: antialiased; + -webkit-font-smoothing: antialiased; */ } .admin-layui-nav-item-a-child{ font-family: PingFangSC-Medium; @@ -158,4 +160,7 @@ a, article, aside, b, body, button, dd, div, dl, dt, figcaption, figure, footer, .admin-layui-nav-item-title-a > span{ font-family: PingFangSC-Medium; color: rgba(0, 0, 0, 1) !important; +} +*{ + -webkit-tap-highlight-color:unset !important; } \ No newline at end of file diff --git a/view/templates/tpl/home.html b/view/templates/tpl/home.html index 54a07aa..5b21730 100644 --- a/view/templates/tpl/home.html +++ b/view/templates/tpl/home.html @@ -32,6 +32,7 @@ background: #FFFFFF; box-shadow: 0px 2px 8px 0px rgba(217,221,229,0.5000); border-radius: 3px; + padding-bottom: 22px; } .bottom-layui-row{ margin-top: 20px; @@ -146,7 +147,6 @@ height: 28px; font-size: 28px; font-family: DINAlternate-Bold; - font-weight: bold; color: #000000; margin-top: 39px; } @@ -173,17 +173,19 @@ margin-top: 21px; } .admin-card-text-5{ - height: 14px; + max-height: 55px; font-size: 14px; font-family: PingFangSC-Regular; color: #F21019; margin-top: 25px; + overflow-y: auto; } .admin-index-bottom-item{ overflow: hidden; } .admin-index-bottom-item div{ padding-left: 22px; + padding-right: 6px; } .admin-index-top-item-list-item-child-dot-red2{ margin-right: 5px; @@ -198,6 +200,100 @@ position: relative; top: -2px; } + .admin-card-text-3 span,.admin-card-text-4 span{ + font-size: 11px; + margin-left: 5px; + } + .primary-msg{ + color: #69717D; + } + @media screen and (min-width:1270px) and (max-width:1440px){ + + .admin-layui-col-top-right{ + min-width: 788px; + } + .admin-layui-col-top-left{ + min-width: 259px; + } + .admin-menu-layui-side-scroll{ + width: 188px !important; + } + .admin-menu-list .layui-nav-tree{ + width: 188px !important; + } + .admin-menu-list.layui-side{ + width: 188px !important; + } + .layui-nav-tree .layui-nav-child dd.layui-this::after { + content: ""; + display: block; + position: absolute; + z-index: 8; + left: 184px !important; + background-color: rgba(24, 144, 255, 1) !important; + border-radius: 4px !important; + width: 4px !important; + height: 29px !important; + margin-top: 5.5px !important; + top: 0px; + } + .admin-menu-list .layui-nav-bar{ + top: 184px !important; + } + .admin-layui-body{ + padding: 12px 12px 12px 0px; + } + .admin-layui-col-bottom-list{ + min-width: 217px; + } + .admin-layui-col-bottom-list-last{ + padding-right: 0px !important; + min-width: 207px !important; + } + } + @media screen and (min-width:1200px) and (max-width:1260px){ + .admin-layui-col-top-right{ + max-width: 724px !important; + } + .admin-layui-col-top-left{ + min-width: 259px; + } + .admin-menu-layui-side-scroll{ + width: 188px !important; + } + .admin-menu-list .layui-nav-tree{ + width: 188px !important; + } + .admin-menu-list.layui-side{ + width: 188px !important; + } + .layui-nav-tree .layui-nav-child dd.layui-this::after { + content: ""; + display: block; + position: absolute; + z-index: 8; + left: 184px !important; + background-color: rgba(24, 144, 255, 1) !important; + border-radius: 4px !important; + width: 4px !important; + height: 29px !important; + margin-top: 5.5px !important; + top: 0px; + } + .admin-menu-list .layui-nav-bar{ + top: 184px !important; + } + .admin-layui-body{ + padding: 12px 12px 12px 0px; + } + .admin-layui-col-bottom-list{ + min-width: 217px; + } + .admin-layui-col-bottom-list-last{ + padding-right: 0px !important; + min-width: 207px !important; + } + } </style> {/literal} </head> @@ -208,7 +304,7 @@ {include file="include/admin_leftmenu.html"} <div class="layui-body admin-layui-body layui-anim layui-anim-fadein"> <div class="layui-row layui-col-space12"> - <div class="layui-col-lg3"> + <div class="layui-col-lg3 admin-layui-col-top-left"> <div class="admin-index-top-item"> <div class="admin-index-top-item-title">今日动态</div> <div class="admin-index-top-item-title-line"></div> @@ -259,66 +355,66 @@ </div> </div> - <div class="layui-col-lg9"> + <div class="layui-col-lg9 admin-layui-col-top-right"> <div class="admin-index-top-item">2</div> </div> </div> <div class="layui-row layui-col-space20 bottom-layui-row"> - <div class="layui-col-lg2"> + <div class="layui-col-lg2 admin-layui-col-bottom-list"> <div class="admin-index-bottom-item"> <div class="admin-card-text-1">催发货订单(总) ></div> - <div class="admin-card-text-2">761<span>单</span></div> - <div class="admin-card-text-3">日增长:+0.61%</div> - <div class="admin-card-text-4">周减少:-0.61%</div> + <div class="admin-card-text-2">888<span> 单</span></div> + <div class="admin-card-text-3">日增长:+0.61%<span class="icon--2"></span></div> + <div class="admin-card-text-4">周减少:-0.61%<span class="icon-2"></span></div> <div class="admin-card-text-5"><i class="admin-index-top-item-list-item-child-dot-red2"></i>这些顾客在催促发货咯</div> </div> </div> - <div class="layui-col-lg2"> + <div class="layui-col-lg2 admin-layui-col-bottom-list"> <div class="admin-index-bottom-item"> - <div class="admin-card-text-1">催发货订单(总) ></div> - <div class="admin-card-text-2">761<span>单</span></div> - <div class="admin-card-text-3">日增长:+0.61%</div> - <div class="admin-card-text-4">周减少:-0.61%</div> - <div class="admin-card-text-5"><i class="admin-index-top-item-list-item-child-dot-red2"></i>这些顾客在催促发货咯</div> + <div class="admin-card-text-1">倒计时订单(总) ></div> + <div class="admin-card-text-2">888<span> 单</span></div> + <div class="admin-card-text-3">日增长:+0.61%<span class="icon--2"></span></div> + <div class="admin-card-text-4">周减少:-0.61%<span class="icon-2"></span></div> + <div class="admin-card-text-5"><i class="admin-index-top-item-list-item-child-dot-red2"></i>这些订单还有12h超时!</div> </div> </div> - <div class="layui-col-lg2"> + <div class="layui-col-lg2 admin-layui-col-bottom-list"> <div class="admin-index-bottom-item"> - <div class="admin-card-text-1">催发货订单(总) ></div> - <div class="admin-card-text-2">761<span>单</span></div> - <div class="admin-card-text-3">日增长:+0.61%</div> - <div class="admin-card-text-4">周减少:-0.61%</div> - <div class="admin-card-text-5"><i class="admin-index-top-item-list-item-child-dot-red2"></i>这些顾客在催促发货咯</div> + <div class="admin-card-text-1">待发货订单(总) ></div> + <div class="admin-card-text-2">888<span> 单</span></div> + <div class="admin-card-text-3">日增长:+0.61%<span class="icon--2"></span></div> + <div class="admin-card-text-4">周减少:-0.61%<span class="icon-2"></span></div> + <div class="admin-card-text-5 primary-msg"><i class="admin-index-top-item-list-item-child-dot-red2"></i>有新增的订单啦</div> </div> </div> - <div class="layui-col-lg2"> + <div class="layui-col-lg2 admin-layui-col-bottom-list"> <div class="admin-index-bottom-item"> - <div class="admin-card-text-1">催发货订单(总) ></div> - <div class="admin-card-text-2">761<span>单</span></div> - <div class="admin-card-text-3">日增长:+0.61%</div> - <div class="admin-card-text-4">周减少:-0.61%</div> - <div class="admin-card-text-5"><i class="admin-index-top-item-list-item-child-dot-red2"></i>这些顾客在催促发货咯</div> + <div class="admin-card-text-1">平台介入中订单(总) ></div> + <div class="admin-card-text-2">888<span> 单</span></div> + <div class="admin-card-text-3">日增长:+0.61%<span class="icon--2"></span></div> + <div class="admin-card-text-4">周减少:-0.61%<span class="icon-2"></span></div> + <div class="admin-card-text-5"><i class="admin-index-top-item-list-item-child-dot-red2"></i>这些订单官方客服已介入</div> </div> </div> - <div class="layui-col-lg2"> + <div class="layui-col-lg2 admin-layui-col-bottom-list admin-layui-col-bottom-list-last"> <div class="admin-index-bottom-item"> - <div class="admin-card-text-1">催发货订单(总) ></div> - <div class="admin-card-text-2">761<span>单</span></div> - <div class="admin-card-text-3">日增长:+0.61%</div> - <div class="admin-card-text-4">周减少:-0.61%</div> - <div class="admin-card-text-5"><i class="admin-index-top-item-list-item-child-dot-red2"></i>这些顾客在催促发货咯</div> + <div class="admin-card-text-1">待售后订单(总) ></div> + <div class="admin-card-text-2">888<span> 单</span></div> + <div class="admin-card-text-3">日增长:+0.61%<span class="icon--2"></span></div> + <div class="admin-card-text-4">周减少:-0.61%<span class="icon-2"></span></div> + <div class="admin-card-text-5 primary-msg"><i class="admin-index-top-item-list-item-child-dot-red2"></i>这些顾客想要退款</div> </div> </div> </div> </div> - <div class="layui-footer"> + <!-- <div class="layui-footer"> 底部固定区域 - </div> + </div> --> </div> <script src="/js/layui.js"></script> {literal} From 4a1dfd52b8865f87c6b0ba2433abc574a39725e4 Mon Sep 17 00:00:00 2001 From: Jason <1432334894@qq.com> Date: Mon, 1 Aug 2022 14:44:17 +0800 Subject: [PATCH 05/12] =?UTF-8?q?=E5=9B=BE=E6=A0=87=E6=8D=A2=E6=88=90?= =?UTF-8?q?=E5=AD=97=E4=BD=93=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view/css/admin_style.css | 71 -------------- view/css/common.css | 146 +++++++++++++++++++---------- view/font/icomoon.eot | Bin 3348 -> 9856 bytes view/font/icomoon.svg | 15 ++- view/font/icomoon.ttf | Bin 3184 -> 9692 bytes view/font/icomoon.woff | Bin 3260 -> 9768 bytes view/templates/include/admin_leftmenu.html | 16 ++-- view/templates/tpl/home.html | 45 ++++++--- 8 files changed, 150 insertions(+), 143 deletions(-) diff --git a/view/css/admin_style.css b/view/css/admin_style.css index 920f007..d626916 100644 --- a/view/css/admin_style.css +++ b/view/css/admin_style.css @@ -1,58 +1,3 @@ -@media screen and (max-width: 950px){ - /* .admin-container-outer .admin-layui-header{ - height: 48px !important; - background-color: #1890FF !important; - } - .admin-container-outer .admin-layui-header *{ - line-height: 48px !important; - } - .admin-container-outer .admin-layui-nav-img{ - width: 24px !important; - height: 24px !important; - margin-right: 8px !important; - } - .header_user_name{ - color:#FFFFFF !important; - } - .admin-container-outer .header_user_info{ - padding: 0 32px !important; - } - .admin-container-outer .admin-menu-list{ - top: 48px !important; - width: 188px !important; - background-color: #FFFFFF !important; - } - .admin-container-outer .admin-menu-layui-side-scroll{ - width: 188px !important; - } - .admin-container-outer .admin-layui-nav-tree{ - background-color:#FFFFFF !important; - width: 188px !important; - padding-left: 38px !important; - } - .admin-container-outer .admin-layui-nav-item-a{ - padding: 0px !important; - margin-right: 0px !important; - } - .admin-header-user-info{ - padding: 0px !important; - } - .admin_logout_img{ - width: 14px !important; - height: auto !important; - border-radius:unset !important; - margin-right: 0px !important; - } - - .layui-nav-itemed>.admin-layui-nav-child{ - background-color: #ffffff !important; - } - - .layui-nav-item>.admin-layui-nav-item-title-a{ - color: #000000 !important; - } */ -} - @media screen and (max-width: 768px) { .layui-layout-admin .layui-layout-left, .layui-layout-admin .layui-body, @@ -75,9 +20,6 @@ body{ background-color:#FFFFFF !important; color: #000000 !important; } -/* .admin-menu-list a{ - color: black !important; -} */ .admin-menu-list .layui-this a,.layui-nav-tree .layui-nav-child dd.layui-this{ background-color:rgba(24, 144, 255, 0.13) !important; color: rgba(24, 144, 255, 1) !important; @@ -140,19 +82,6 @@ body{ .admin-layui-nav-child{ color:red !important; } -a, article, aside, b, body, button, dd, div, dl, dt, figcaption, figure, footer, h1, h2, h3, h4, h5, h6, header, i, input, li, nav, p, section, select, span, textarea, ul { - /* padding: 0; - margin: 0; - list-style: none; - font-style: normal; - text-decoration: none; - border: none; - font-weight: 400; - -webkit-box-sizing: border-box; - box-sizing: border-box; - -webkit-tap-highlight-color: transparent; - -webkit-font-smoothing: antialiased; */ -} .admin-layui-nav-item-a-child{ font-family: PingFangSC-Medium; color: rgba(99, 108, 120, 1) !important; diff --git a/view/css/common.css b/view/css/common.css index 88c9601..62d9ac9 100644 --- a/view/css/common.css +++ b/view/css/common.css @@ -1,55 +1,99 @@ @font-face { - font-family: 'icomoon'; - src: url('/font/icomoon.eot?mle4db'); - src: url('/font/icomoon.eot?mle4db#iefix') format('embedded-opentype'), - url('/font/icomoon.ttf?mle4db') format('truetype'), - url('/font/icomoon.woff?mle4db') format('woff'), - url('/font/icomoon.svg?mle4db#icomoon') format('svg'); - font-weight: normal; - font-style: normal; - font-display: block; - } + font-family: 'icomoon'; + src: url('/font/icomoon.eot?myxkk3'); + src: url('/font/icomoon.eot?myxkk3#iefix') format('embedded-opentype'), + url('/font/icomoon.ttf?myxkk3') format('truetype'), + url('/font/icomoon.woff?myxkk3') format('woff'), + url('/font/icomoon.svg?myxkk3#icomoon') format('svg'); + font-weight: normal; + font-style: normal; + font-display: block; +} - [class^="icon-"], [class*=" icon-"] { - /* use !important to prevent issues with browser extensions that change fonts */ - font-family: 'icomoon' !important; - speak: never; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; +[class^="icon-"], [class*=" icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'icomoon' !important; + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; - /* Better Font Rendering =========== */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - } + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} - .icon-uniE9001:before { - content: "\e907"; - color: #c4c7cc; - } - .icon--:before { - content: "\e906"; - color: #c4c7cc; - } - .icon--1:before { - content: "\e902"; - color: #c4c7cc; - } - .icon-1:before { - content: "\e903"; - color: #c4c7cc; - } - .icon--2:before { - content: "\e904"; - color: #31b927; - } - .icon-2:before { - content: "\e905"; - color: #f21019; - } - .icon-uniE900:before { - content: "\e901"; - color: #c4c7cc; - } +.icon--6:before { + content: "\e900"; + color: #636c78; +} +.icon--6-2:before { + content: "\e908"; + color: #1890ff; +} +.icon--8:before { + content: "\e90e"; + color: #fff; +} +.icon-1-2:before { + content: "\e909"; + color: #636c78; +} +.icon-uniE90A:before { + content: "\e90a"; + color: #636c78; +} +.icon-1:before { + content: "\e90b"; + color: #1890ff; +} +.icon-2:before { + content: "\e90c"; + color: #636c78; +} +.icon-3:before { + content: "\e90d"; + color: #1890ff; +} +.icon-dingd:before { + content: "\e90f"; + color: #636c78; +} +.icon-dingd1:before { + content: "\e910"; + color: #1890ff; +} +.icon-LOGO:before { + content: "\e911"; + color: #fff; +} +.icon-uniE9001:before { + content: "\e907"; + color: #c4c7cc; +} +.icon--:before { + content: "\e906"; + color: #c4c7cc; +} +.icon--1:before { + content: "\e902"; + color: #c4c7cc; +} +.icon-11:before { + content: "\e903"; + color: #c4c7cc; +} +.icon--2:before { + content: "\e904"; + color: #31b927; +} +.icon-21:before { + content: "\e905"; + color: #f21019; +} +.icon-uniE900:before { + content: "\e901"; + color: #c4c7cc; +} \ No newline at end of file diff --git a/view/font/icomoon.eot b/view/font/icomoon.eot index 1ee249437dbcde392dcea9ff74776281a086ab4e..282cb778cc2b62cf73e7e9cbbb1741065a745fdb 100644 GIT binary patch literal 9856 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 delta 400 zcmZqhog&31!pp!=z%!A}jOA^)g1|(FG9lKF3=9l=fH)yJH?crG^iu!C6EgKJH`nMg zFfdjyFmO!BNKH&p)DUrGVBq2asx!*~3b5~FJ_F=C0Qo8zxg`}!42<u9{1hNxCnrBS zk-dX656GVY<V)lxRunJ@GXnK;tpM^B@)C1XXL@n|2J%k;?Px2=FD_wV2Fft-1c2lj zn3)+5Oip36XJntegwb1^{r}(p|3T6W3NIPKY{vhO#hE9wF@<jSW(nfZW&}$z2q=`l zjpw)d%D~M67P!xu{sF{*(El$me`lUDNkyz4BFp@p0jdw88%RR+LHJBS3aGLGh#i60 z9EkOyxCBU>fK_oZh%m@8L@}OVa$|~NDq^-_@c^63&B(^U4psp&1{F*UVA*_EWicZF DjQdV3 diff --git a/view/font/icomoon.svg b/view/font/icomoon.svg index af70308..d00d82a 100644 --- a/view/font/icomoon.svg +++ b/view/font/icomoon.svg @@ -7,11 +7,22 @@ <font-face units-per-em="1024" ascent="960" descent="-64" /> <missing-glyph horiz-adv-x="1024" /> <glyph unicode=" " horiz-adv-x="512" d="" /> +<glyph unicode="" glyph-name="-6" d="M961.863 366.096c-10.625 14.698-31.166 18.062-46.041 7.437l-58.613-42.145c10.093 37.010 15.406 75.259 15.406 114.039 0 236.755-192.662 429.239-429.239 429.239-236.755 0-429.239-192.485-429.239-429.239s192.662-429.239 429.239-429.239c74.904 0 148.215 19.656 212.849 56.665 3.542 0.708 6.906 1.771 10.093 3.719 18.416 10.979 36.124 23.374 52.592 37.010 13.989 11.51 16.114 32.228 4.427 46.395-11.51 13.989-32.228 16.114-46.395 4.427-12.927-10.625-26.916-20.187-41.259-29.041-2.125-0.708-4.427-1.062-6.552-2.302-55.957-33.468-120.237-50.999-185.933-50.999-200.453 0-363.366 163.090-363.366 363.366s163.090 363.366 363.543 363.366c200.453 0 363.366-162.913 363.366-363.366 0-45.509-8.5-90.133-24.791-131.924l-46.572 111.914c-7.083 16.823-26.385 24.614-43.030 17.708-16.823-6.906-24.791-26.208-17.708-43.030l74.196-177.964c0.708-1.948 1.948-3.364 3.010-5.135 0.354-0.531 0.354-1.062 0.708-1.417 0.177-0.177 0.354-0.177 0.354-0.354 2.833-3.719 6.375-6.729 10.448-9.031 0.708-0.354 1.417-0.708 2.125-1.062 3.364-1.594 7.083-2.833 10.979-3.187 0.708 0 1.24 0.177 1.948 0 0.354 0 0.531-0.177 0.885-0.177 0.708 0 1.417 0.177 2.125 0.354 2.479 0.177 4.958 0.531 7.26 1.062 0.531 0.177 1.062 0.354 1.417 0.531 2.656 0.885 5.135 2.125 7.437 3.719 0.354 0.177 0.708 0.354 1.062 0.531l155.829 112.091c14.698 10.802 18.062 31.343 7.437 46.041zM571.403 587.976c13.104 12.573 13.458 33.468 0.708 46.572-12.573 13.104-33.468 13.458-46.572 0.708l-82.165-79.331-81.988 79.331c-13.104 12.573-33.999 12.396-46.572-0.708s-12.396-33.999 0.708-46.572l92.435-89.248v-19.302h-65.873c-18.239 0-32.937-14.698-32.937-32.937s14.698-32.937 32.937-32.937h65.873v-32.937h-65.873c-18.239 0-32.937-14.698-32.937-32.937s14.698-32.937 32.937-32.937h65.873v-69.238c0-18.239 14.698-32.937 32.937-32.937s32.937 14.698 32.937 32.937v69.238h65.873c18.239 0 32.937 14.698 32.937 32.937s-14.698 32.937-32.937 32.937h-65.873v32.937h65.873c18.239 0 32.937 14.698 32.937 32.937s-14.698 32.937-32.937 32.937h-65.873v14.166l97.571 94.383z" /> <glyph unicode="" glyph-name="uniE900" d="M533.753 840.353c-232.659 0-421.647-188.988-421.647-421.647s188.988-421.647 421.647-421.647c232.659 0 421.647 188.988 421.647 421.647s-188.988 421.647-421.647 421.647zM713.706 271.883l-201.788 116.706h-8.282v271.059h60.235v-231.906l179.953-103.906-30.118-51.953z" /> <glyph unicode="" glyph-name="-1" d="M276.96 820.899c80.432 0 145.636-65.205 145.636-145.638 0-80.43-65.202-145.635-145.636-145.635s-145.638 65.205-145.638 145.635c0 80.433 65.205 145.638 145.638 145.638zM349.569 689.057v55.777l-93.497-83.367-51.721 46.277v-55.777l51.721-46.278 93.497 83.368zM929.327 329.803c-5.321-0.29-11.528-0.442-18.626-0.442h-163.14c-4.138 0-8.276 2.071-12.414 6.207-4.138 4.143-6.208 7.686-6.208 10.644v0.885c-0.585 28.967-0.89 55.267-0.89 78.918v80.681c0 6.503 2.668 12.565 7.985 18.177 5.319 5.616 11.819 8.417 19.506 8.417 0.591 0 5.024 0.3 13.304 0.892 8.275 0.593 18.469 0.151 30.591-1.327 12.119-1.475 24.973-4.731 38.568-9.753 13.592-5.024 26.301-13.153 38.126-24.386 18.325-18.918 31.328-41.822 39.012-68.715 7.686-26.893 14.783-54.824 21.278-83.787 0-1.183 0.154-2.071 0.445-2.664 0.296-0.587 0.44-1.478 0.44-2.66 0-7.099-2.654-10.793-7.976-11.087l-0.001 0.001zM998.928 319.164c-4.434 33.397-12.267 67.537-23.496 102.41-11.238 34.875-28.078 67.688-50.544 98.413-12.409 17.145-27.777 31.922-46.108 44.333-18.222 12.367-37.869 22.492-58.516 30.155-20.691 7.685-41.675 13.147-62.956 16.398-21.279 3.251-41.675 3.988-61.181 2.216-6.497-0.587-11.968-5.175-16.402-13.742s-6.648-16.107-6.648-22.607v-427.376c0-10.644 3.84-19.803 11.526-27.486s16.84-11.524 27.484-11.524h15.962c0 14.775 2.807 28.819 8.424 42.118 5.619 13.301 13.3 24.966 23.054 35.018 9.756 10.051 21.129 18.036 34.136 23.944 13.002 5.911 27.187 8.869 42.554 8.869 15.373 0 29.999-2.071 43.894-6.209 13.892-4.137 26.014-10.638 36.348-19.504 10.348-8.869 18.625-20.393 24.832-34.581 6.202-14.188 9.304-31.334 9.304-51.428h36.358c3.544 0 6.357 1.775 8.427 5.318 2.061 3.55 3.84 7.835 5.312 12.864 1.465 4.925 2.504 9.967 3.106 15.070 0.593 5.026 0.887 9.314 0.887 12.858 0 18.324 0.15 41.973 0.442 70.936 0.301 28.954-1.773 60.135-6.207 93.534l0.008 0.001zM840.657 164.444c15.366 0 28.669-5.615 39.9-16.85 11.233-11.233 16.847-24.524 16.847-39.9 0-15.956-5.616-29.552-16.847-40.778-11.231-11.236-24.529-16.851-39.9-16.851-15.955 0-29.408 5.615-40.344 16.851-10.935 11.231-16.402 24.822-16.402 40.778 0 15.374 5.468 28.668 16.402 39.9 10.936 11.235 24.383 16.85 40.344 16.85v0zM230.634 165.325c-15.96 0-29.413-5.615-40.344-16.841-10.938-11.232-16.402-24.824-16.402-40.792 0-15.358 5.464-28.662 16.402-39.896 10.934-11.233 24.384-16.848 40.344-16.848s29.407 5.616 40.344 16.847c10.938 11.235 16.399 24.533 16.399 39.897 0 15.96-5.465 29.562-16.399 40.792-10.936 11.226-24.384 16.841-40.344 16.841zM457.159 721.268c4.402-15.663 6.623-31.958 6.623-48.882 0-25.814-4.91-49.953-14.736-72.402-9.821-22.449-23.15-42.091-39.983-58.927-16.838-16.833-36.472-30.028-58.927-39.565-22.453-9.538-46.298-14.308-71.558-14.308-25.816 0-49.948 4.77-72.396 14.308-22.45 9.539-42.089 22.732-58.927 39.565-16.838 16.836-30.165 36.478-39.984 58.927-9.824 22.449-14.736 46.584-14.736 72.402 0 2.821 0.073 5.62 0.189 8.407-8.449-10.369-15.1-21.7-19.92-34.006-5.323-13.592-7.981-27.486-7.981-41.673v-461.065c0-11.233 3.251-19.804 9.752-25.713 6.507-5.905 14.78-8.868 24.828-8.868h20.395c0 37.83 9.609 66.057 28.817 84.675 19.205 18.621 46.844 27.936 82.9 27.936 37.835 0 65.621-10.050 83.349-30.152 17.733-20.097 26.603-47.585 26.603-82.458h242.055c9.464 0 17.582 3.251 24.384 9.756 6.796 6.499 10.198 14.772 10.198 24.823l-1.774 577.222h-159.171z" /> -<glyph unicode="" glyph-name="1" d="M725.823 434.567v96.274h-98.681l76.538 76.538-68.355 67.873-102.051-102.051-102.051 102.051-68.355-67.873 76.538-76.538h-98.681v-96.274h144.412v-48.137h-144.412v-96.274h144.412v-96.274h96.274v96.274h144.412v96.274h-144.412v48.137h144.412zM918.371 434.567c0.273-178.936-122.742-334.486-296.925-375.455s-353.638 43.437-433.155 203.734c-79.518 160.297-38.145 354.248 99.861 468.144s336.283 117.728 478.587 9.248l-64.985-64.985h192.549v192.549l-59.209-59.209c-175.186 140.999-424.651 141.917-600.87 2.212s-232.229-382.804-134.909-585.533c97.321-202.73 322.037-311.064 541.259-260.938s374.526 245.355 374.073 470.234h-96.275z" /> +<glyph unicode="" glyph-name="11" d="M725.823 434.567v96.274h-98.681l76.538 76.538-68.355 67.873-102.051-102.051-102.051 102.051-68.355-67.873 76.538-76.538h-98.681v-96.274h144.412v-48.137h-144.412v-96.274h144.412v-96.274h96.274v96.274h144.412v96.274h-144.412v48.137h144.412zM918.371 434.567c0.273-178.936-122.742-334.486-296.925-375.455s-353.638 43.437-433.155 203.734c-79.518 160.297-38.145 354.248 99.861 468.144s336.283 117.728 478.587 9.248l-64.985-64.985h192.549v192.549l-59.209-59.209c-175.186 140.999-424.651 141.917-600.87 2.212s-232.229-382.804-134.909-585.533c97.321-202.73 322.037-311.064 541.259-260.938s374.526 245.355 374.073 470.234h-96.275z" /> <glyph unicode="" glyph-name="-2" d="M500.15-20.166l453.437 453.437-267.983-0.061 0.043 453.497h-370.994l-0.079-453.497-267.861 0.061 453.437-453.437z" /> -<glyph unicode="" glyph-name="2" d="M500.15 897.58l453.437-453.437-267.983 0.061 0.043-453.497h-370.994l-0.079 453.497-267.861-0.061 453.437 453.437z" /> +<glyph unicode="" glyph-name="21" d="M500.15 897.58l453.437-453.437-267.983 0.061 0.043-453.497h-370.994l-0.079 453.497-267.861-0.061 453.437 453.437z" /> <glyph unicode="" glyph-name="-" d="M666.8 58.083c5.295 0 5.295-5.295-5.295-15.886-5.295-10.591-15.886-21.182-31.772-37.068-15.886-10.591-31.772-26.477-47.659-37.068-21.182-10.591-37.068-15.886-58.25-15.886s-37.068 5.295-52.954 15.886c-15.886 10.591-31.772 21.182-47.659 37.068-15.886 10.591-21.182 26.477-31.772 37.068-5.295 10.591-10.591 15.886-5.295 15.886h280.657zM931.57 148.105c5.295-5.295 5.295-10.591 5.295-21.182 0-5.295 0-10.591-5.295-15.886l-10.591-10.591c-5.295 0-10.591-5.295-10.591-5.295h-773.13c-10.591 0-15.886 5.295-21.182 10.591-5.295 15.886-5.295 26.477 0 37.068 10.591 21.182 26.477 42.363 42.363 68.84s31.772 52.954 47.659 84.727c15.886 31.772 26.477 63.545 37.068 95.317s15.886 68.84 15.886 105.908c0 37.068 5.295 68.84 15.886 95.317s21.182 52.954 37.068 74.136c15.886 21.182 31.772 37.068 52.954 52.954 26.477 15.886 47.659 26.477 68.84 37.068-10.591 15.886-15.886 37.068-15.886 58.25 0 26.477 10.591 52.954 31.772 74.136 15.886 15.886 42.363 26.477 68.84 26.477s52.954-10.591 74.136-31.772c21.182-21.182 31.772-42.363 31.772-74.136 0-10.591 0-21.182-5.295-31.772l-10.591-21.182c26.477-5.295 47.659-21.182 68.84-31.772 21.182-15.886 42.363-31.772 58.25-52.954s26.477-47.659 37.068-74.136c10.591-26.477 15.886-58.25 15.886-95.317s5.295-68.84 15.886-105.908c10.591-31.772 21.182-68.84 37.068-95.317 15.886-31.772 31.772-58.25 47.659-84.727 10.591-26.477 26.477-52.954 42.363-68.84zM476.165 815.326c0-10.591 5.295-21.182 10.591-26.477 5.295-10.591 15.886-10.591 26.477-10.591s21.182 5.295 26.477 10.591c5.295 5.295 10.591 15.886 10.591 26.477s-5.295 21.182-10.591 31.772c0 5.295-10.591 5.295-21.182 5.295s-21.182-5.295-31.772-10.591c-5.295-5.295-10.591-15.886-10.591-26.477v0z" /> <glyph unicode="" glyph-name="uniE9001" d="M537.919 155.534c4.865 0 9.826 0.289 14.787 0.819 47.733 5.539 88.289 37.811 103.221 82.268 1.102 3.345-0.555 6.975-3.805 8.333-3.28 1.427-7.11 0.239-9.007-2.794-0.193-0.241-19.17-29.863-92.961-39.497-11.078-1.445-21.819-2.216-32.031-2.216-51.731 0-74.803 18.881-74.995 19.074-2.663 2.24-6.539 2.281-9.248 0.096-2.665-2.157-3.286-5.971-1.445-8.863 23.232-35.675 62.912-57.2 105.485-57.222v0zM934.956 597.895c-0.674 0-1.252-0.145-1.878-0.145-43.254 181.106-208.561 316.165-406.767 316.165-203.648 0-372.809-142.573-410.283-331.097-36.414-6.358-64.158-37.329-64.158-74.755v-149.894c0-42.001 34.824-76.055 77.885-76.055 24.276 0 45.662 11.078 59.919 28.081 34.439-88.048 104.521-158.998 193.244-196.471 1.13 2.154 2.452 4.201 3.95 6.117 1.397 1.734 2.938 3.179 4.287 3.179 1.344-0.018 2.653-0.437 3.757-1.204-20.519 14.739-94.695 90.698-110.783 196.712-7.032 46.673 29.141 92.48 71.238 100.042 67.578 12.138 134.818 26.010 202.396 37.955 42.965 7.562 72.346 30.345 90.312 68.3 4.19 8.863 10.259 26.781 13.053 52.646 0.723 3.949 4.174 6.811 8.188 6.791 2.794 0 5.154-1.349 6.743-3.372l1.83 1.156c26.636-37.425 79.475-120.176 87.085-207.502 8.67-99.801 3.853-168.101-75.188-238.039-1.314-1.158-2.068-2.824-2.071-4.576 0-2.167 1.156-3.998 2.89-5.106l1.927-0.867c0.578-0.144 1.060-0.289 1.589-0.289 0.578 0 1.012 0.144 1.493 0.289l3.275 1.782c79.956 42.579 141.224 113.673 169.546 199.121 11.512-16.473 29.43-28.322 50.286-32.464-33.428-147.053-169.161-239.147-337.262-253.115-11.089 25.414-36.336 41.702-64.062 41.327-38.003 0-68.878-29.093-68.878-65.025 0-35.884 30.875-64.977 68.878-64.977 30.73 0 56.403 19.026 65.314 45.228 194.593 15.269 350.653 127.112 383.213 300.848 28.755 11.656 48.985 38.919 48.985 70.805v151.58c0 42.387-35.788 76.777-79.956 76.777v0.048zM863.188 554.305c-50.768 132.94-182.31 227.876-337.070 227.876-154.085 0-285.146-94.166-336.395-226.19-2.505 2.986-5.539 5.587-8.429 8.188 28.996 160.924 172.244 283.268 345.017 283.268 171.955 0 314.72-121.139 344.68-280.956-2.938-3.853-5.684-7.851-7.851-12.186h0.048z" /> +<glyph unicode="" glyph-name="-6-2" d="M979.151 407.756c-10.625 14.698-31.166 18.062-46.041 7.437l-58.613-42.145c10.093 37.010 15.406 75.259 15.406 114.039 0 236.755-192.662 429.239-429.239 429.239-236.755 0-429.239-192.485-429.239-429.239s192.662-429.239 429.239-429.239c74.904 0 148.215 19.656 212.849 56.665 3.542 0.708 6.906 1.771 10.093 3.719 18.416 10.979 36.124 23.374 52.592 37.010 13.989 11.51 16.114 32.228 4.427 46.395-11.51 13.989-32.228 16.114-46.395 4.427-12.927-10.625-26.916-20.187-41.259-29.041-2.125-0.708-4.427-1.062-6.552-2.302-55.957-33.468-120.237-50.999-185.933-50.999-200.453 0-363.366 163.090-363.366 363.366s163.090 363.366 363.543 363.366c200.453 0 363.366-162.913 363.366-363.366 0-45.509-8.5-90.133-24.791-131.924l-46.572 111.914c-7.083 16.823-26.385 24.614-43.030 17.708-16.823-6.906-24.791-26.208-17.708-43.030l74.196-177.964c0.708-1.948 1.948-3.364 3.010-5.135 0.354-0.531 0.354-1.062 0.708-1.417 0.177-0.177 0.354-0.177 0.354-0.354 2.833-3.719 6.375-6.729 10.448-9.031 0.708-0.354 1.417-0.708 2.125-1.062 3.364-1.594 7.083-2.833 10.979-3.187 0.708 0 1.24 0.177 1.948 0 0.354 0 0.531-0.177 0.885-0.177 0.708 0 1.417 0.177 2.125 0.354 2.479 0.177 4.958 0.531 7.26 1.062 0.531 0.177 1.062 0.354 1.417 0.531 2.656 0.885 5.135 2.125 7.437 3.719 0.354 0.177 0.708 0.354 1.062 0.531l155.829 112.091c14.698 10.802 18.062 31.343 7.437 46.041zM588.692 629.636c13.104 12.573 13.458 33.468 0.708 46.572-12.573 13.104-33.468 13.458-46.572 0.708l-82.165-79.331-81.988 79.331c-13.104 12.573-33.999 12.396-46.572-0.708s-12.396-33.999 0.708-46.572l92.435-89.248v-19.302h-65.873c-18.239 0-32.937-14.698-32.937-32.937s14.698-32.937 32.937-32.937h65.873v-32.937h-65.873c-18.239 0-32.937-14.698-32.937-32.937s14.698-32.937 32.937-32.937h65.873v-69.238c0-18.239 14.698-32.937 32.937-32.937s32.937 14.698 32.937 32.937v69.238h65.873c18.239 0 32.937 14.698 32.937 32.937s-14.698 32.937-32.937 32.937h-65.873v32.937h65.873c18.239 0 32.937 14.698 32.937 32.937s-14.698 32.937-32.937 32.937h-65.873v14.166l97.571 94.383z" /> +<glyph unicode="" glyph-name="1-2" d="M629.963 448.024l-347.949-336.348c-20.508-19.858-20.508-51.997 0-71.792 20.507-19.827 53.779-19.827 74.286 0l385.062 372.252c20.477 19.826 20.477 51.982 0 71.745l-385.062 372.237c-10.285 9.914-23.728 14.87-37.174 14.87s-26.889-4.957-37.112-14.901c-20.508-19.827-20.508-51.919 0-71.746l347.949-336.316z" /> +<glyph unicode="" glyph-name="uniE90A" d="M876.8 14.72h-774.4c-0.005 0-0.012 0-0.018 0-56.554 0-102.4 45.846-102.4 102.4 0 0.675 0.007 1.349 0.020 2.021l-0.002-0.101v366.080c0.468 48.602 23.531 91.722 59.174 119.422l0.346 0.258 168.96 128v46.080c-0.022 0.959-0.035 2.089-0.035 3.221 0 40.881 16.38 77.936 42.936 104.96l-0.021-0.022c26.58 26.876 63.458 43.52 104.224 43.52 0.034 0 0.068 0 0.101 0h501.115c0.157 0.001 0.344 0.001 0.53 0.001 40.429 0 76.966-16.661 103.121-43.491l0.029-0.030c26.896-27.067 43.52-64.368 43.52-105.552 0-0.017 0-0.034 0-0.051v0.003-617.6c0.008-0.571 0.013-1.245 0.013-1.92 0-81.296-65.904-147.2-147.2-147.2-0.004 0-0.009 0-0.013 0v0zM375.68 851.2c-19.24-0.102-36.638-7.906-49.283-20.483l0.003 0.003c-13.051-12.985-21.127-30.958-21.127-50.818 0-0.359 0.003-0.718 0.008-1.076l-0.001 0.054v-83.84l-199.040-151.68c-17.865-13.381-29.332-34.46-29.44-58.223v-366.097c0-0.049-0.001-0.108-0.001-0.166 0-6.675 2.689-12.721 7.042-17.116l-0.002 0.002c4.877-4.54 11.359-7.412 18.508-7.678l0.052-0.002h774.4c1.252-0.082 2.714-0.128 4.186-0.128 18.219 0 34.777 7.115 47.046 18.718l-0.032-0.030c13.022 13.145 21.080 31.228 21.12 51.192v615.048c-0.040 19.972-8.098 38.055-21.126 51.206l0.006-0.006c-12.485 12.924-29.928 20.988-49.255 21.12h-0.025zM304.64 165.12c24.938-0.040 47.53-10.049 64.013-26.253l-0.013 0.013c16.233-15.727 26.308-37.727 26.308-62.080s-10.076-46.353-26.285-62.058l-0.023-0.022c-16.349-16.444-38.986-26.622-64-26.622s-47.651 10.178-63.996 26.618l-0.004 0.004c-15.762 15.945-25.499 37.875-25.499 62.080s9.737 46.135 25.507 62.088l-0.008-0.008c16.504 16.136 39.074 26.127 63.978 26.24h0.022zM304.64-49.92c-0.22-0.001-0.48-0.002-0.74-0.002-35.163 0-67.014 14.179-90.148 37.13l0.008-0.008c-22.625 23.069-36.59 54.704-36.59 89.6s13.964 66.531 36.61 89.621l-0.020-0.021c23.564 22.308 55.46 36.024 90.56 36.024s66.996-13.716 90.621-36.081l-0.061 0.057c22.625-23.069 36.59-54.704 36.59-89.6s-13.964-66.531-36.61-89.621l0.020 0.021c-23.126-22.942-54.976-37.12-90.138-37.12-0.036 0-0.072 0-0.108 0h0.006zM304.64 126.72c-0.241 0.004-0.526 0.007-0.811 0.007-13.921 0-26.528-5.626-35.671-14.728l0.002 0.002c-9.047-8.998-14.664-21.438-14.72-35.189v-0.011c-0.001-0.1-0.001-0.219-0.001-0.338 0-13.666 5.636-26.016 14.71-34.852l0.011-0.010c9.493-8.984 22.342-14.507 36.48-14.507s26.987 5.524 36.505 14.53l-0.025-0.023c8.883 9.101 14.448 21.475 14.719 35.148l0.001 0.052c-0.359 27.649-22.856 49.924-50.556 49.924-0.226 0-0.453-0.001-0.678-0.004h0.034zM720 165.12c0.191 0.001 0.418 0.002 0.644 0.002 24.742 0 47.142-10.028 63.356-26.242v0c16.233-15.727 26.308-37.727 26.308-62.080s-10.076-46.353-26.285-62.058l-0.023-0.022c-16.276-16.602-38.936-26.893-64-26.893s-47.724 10.291-63.986 26.878l-0.014 0.015c-16.233 15.727-26.308 37.727-26.308 62.080s10.076 46.353 26.285 62.058l0.023 0.022c16.214 16.214 38.614 26.242 63.356 26.242 0.226 0 0.453-0.001 0.679-0.003h-0.035zM720-49.92c-0.030 0-0.066 0-0.102 0-35.162 0-67.012 14.178-90.146 37.128l0.008-0.008c-22.625 23.069-36.59 54.704-36.59 89.6s13.964 66.531 36.61 89.621l-0.020-0.021c23.136 23.003 55.028 37.221 90.24 37.221s67.104-14.219 90.246-37.228l-0.006 0.006c22.625-23.069 36.59-54.704 36.59-89.6s-13.964-66.531-36.61-89.621l0.020 0.021c-23.126-22.942-54.976-37.12-90.138-37.12-0.036 0-0.072 0-0.108 0h0.006zM720 126.72c-0.087 0.001-0.19 0.001-0.292 0.001-14.084 0-26.856-5.616-36.198-14.731l0.011 0.010c-9.047-8.998-14.664-21.438-14.72-35.189v-0.011c-0.001-0.1-0.001-0.219-0.001-0.338 0-13.666 5.636-26.016 14.71-34.852l0.011-0.010c9.493-8.984 22.342-14.507 36.48-14.507s26.987 5.524 36.505 14.53l-0.025-0.023c9.085 8.846 14.721 21.196 14.721 34.862 0 0.119 0 0.238-0.001 0.356v-0.018c-0.056 13.762-5.673 26.202-14.718 35.198l-0.002 0.002c-9.141 9.1-21.748 14.727-35.669 14.727-0.285 0-0.57-0.002-0.854-0.007l0.043 0.001zM389.12 626.56v0c-23.133-2.314-41.045-21.679-41.045-45.227 0-0.976 0.031-1.944 0.091-2.904l-0.007 0.131v-128c-0.080-1.004-0.126-2.174-0.126-3.354 0-23.435 17.994-42.667 40.919-44.634l0.166-0.012c23.092 1.979 41.086 21.211 41.086 44.646 0 1.18-0.046 2.35-0.135 3.508l0.010-0.153v128c0.054 0.829 0.085 1.797 0.085 2.773 0 23.548-17.912 42.912-40.854 45.211l-0.19 0.015z" /> +<glyph unicode="" glyph-name="1" d="M876.8 12.16h-774.4c-28.691 0.071-54.562 12.080-72.922 31.32l-0.038 0.040c-18.204 18.474-29.446 43.853-29.446 71.857 0 0.388 0.002 0.775 0.006 1.162l-0.001-0.059v366.080c0.669 48.557 23.674 91.607 59.183 119.426l0.337 0.254 168.96 128v46.080c-0.015 0.806-0.024 1.757-0.024 2.71 0 41.041 16.369 78.259 42.934 105.481l-0.030-0.030c26.481 26.872 63.275 43.52 103.957 43.52 0.128 0 0.256 0 0.383 0h501.1c0.157 0.001 0.344 0.001 0.53 0.001 40.429 0 76.966-16.661 103.121-43.491l0.029-0.030c26.889-26.873 43.521-64.006 43.521-105.024 0-0.203 0-0.405-0.001-0.608v0.031-617.6c0.014-0.762 0.022-1.661 0.022-2.561 0-80.943-65.617-146.56-146.56-146.56-0.233 0-0.466 0.001-0.698 0.002h0.036zM375.68 848.64c-19.215-0.246-36.569-8.016-49.292-20.491l0.012 0.011c-13.056-13.363-21.113-31.66-21.12-51.839v-83.841l-199.040-151.68c-17.933-13.188-29.441-34.206-29.441-57.913 0-0.115 0-0.23 0.001-0.345v0.018-366.080c0.026-6.723 2.706-12.814 7.046-17.286l-0.006 0.006c4.877-4.54 11.359-7.412 18.508-7.678l0.052-0.002h774.4c1.323-0.092 2.868-0.144 4.424-0.144 18.147 0 34.629 7.125 46.803 18.73l-0.027-0.026c13.022 13.145 21.080 31.228 21.12 51.192v615.048c-0.040 19.972-8.098 38.055-21.126 51.206l0.006-0.006c-12.446 12.983-29.914 21.067-49.27 21.12h-0.010zM304.64 162.56c24.914-0.185 47.463-10.159 64.022-26.261l-0.022 0.021c16.233-15.727 26.308-37.727 26.308-62.080s-10.076-46.353-26.285-62.058l-0.023-0.022c-16.224-16.712-38.901-27.082-64-27.082-49.243 0-89.162 39.919-89.162 89.162 0 24.144 9.597 46.047 25.183 62.102l-0.021-0.022c16.537 16.081 39.086 26.055 63.964 26.24h0.036zM304.64-52.48c-0.22-0.001-0.48-0.002-0.74-0.002-35.163 0-67.014 14.179-90.148 37.13l0.008-0.008c-22.625 23.069-36.59 54.704-36.59 89.6s13.964 66.531 36.61 89.621l-0.020-0.021c23.564 22.308 55.46 36.024 90.56 36.024s66.996-13.716 90.621-36.081l-0.061 0.057c21.897-22.928 35.374-54.061 35.374-88.342 0-69.853-55.955-126.638-125.488-127.976l-0.125-0.002zM304.64 124.16c-0.087 0.001-0.19 0.001-0.292 0.001-14.084 0-26.856-5.616-36.198-14.731l0.011 0.010c-9.085-8.846-14.721-21.196-14.721-34.862 0-0.119 0-0.238 0.001-0.356v0.018c-0.002-0.18-0.004-0.393-0.004-0.607 0-13.582 5.641-25.847 14.709-34.579l0.015-0.014c9.493-8.984 22.342-14.507 36.48-14.507s26.987 5.524 36.505 14.53l-0.025-0.023c8.883 9.101 14.448 21.475 14.719 35.148l0.001 0.052c-0.897 13.113-6.603 24.743-15.349 33.27l-0.011 0.010c-9.346 8.724-21.933 14.080-35.771 14.080-0.024 0-0.048 0-0.072 0h0.004zM720 162.56c0.113 0.001 0.247 0.001 0.381 0.001 24.825 0 47.308-10.024 63.623-26.245l-0.004 0.004c16.233-15.727 26.308-37.727 26.308-62.080s-10.076-46.353-26.285-62.058l-0.023-0.022c-16.276-16.602-38.936-26.893-64-26.893s-47.724 10.291-63.986 26.878l-0.014 0.015c-16.233 15.727-26.308 37.727-26.308 62.080s10.076 46.353 26.285 62.058l0.023 0.022c16.537 16.081 39.086 26.055 63.964 26.24h0.036zM720-52.48c-69.658 1.34-125.614 58.124-125.614 127.978 0 34.281 13.476 65.415 35.42 88.392l-0.047-0.049c23.355 24.454 56.215 39.658 92.626 39.658 70.692 0 128-57.308 128-128s-57.308-128-128-128c-0.839 0-1.676 0.008-2.512 0.024l0.125-0.002zM720 124.16c-0.087 0.001-0.19 0.001-0.292 0.001-14.084 0-26.856-5.616-36.198-14.731l0.011 0.010c-9.085-8.846-14.721-21.196-14.721-34.862 0-0.119 0-0.238 0.001-0.356v0.018c-0.002-0.18-0.004-0.393-0.004-0.607 0-13.582 5.641-25.847 14.709-34.579l0.015-0.014c9.493-8.984 22.342-14.507 36.48-14.507s26.987 5.524 36.505 14.53l-0.025-0.023c9.082 8.746 14.724 21.011 14.724 34.593 0 0.213-0.001 0.426-0.004 0.639v-0.032c0.001 0.1 0.001 0.219 0.001 0.338 0 13.666-5.636 26.016-14.71 34.852l-0.011 0.010c-9.332 9.105-22.104 14.721-36.188 14.721-0.103 0-0.205 0-0.308-0.001h0.016zM389.12 624v0c-23.175-2.639-41.013-22.137-41.013-45.801 0-0.774 0.019-1.543 0.057-2.307l-0.004 0.108v-128c-0.080-1.004-0.126-2.174-0.126-3.354 0-23.435 17.994-42.667 40.919-44.634l0.166-0.012c23.092 1.979 41.086 21.211 41.086 44.646 0 1.18-0.046 2.35-0.135 3.508l0.010-0.153v128c0.033 0.657 0.053 1.426 0.053 2.199 0 23.664-17.838 43.162-40.801 45.781l-0.212 0.020z" /> +<glyph unicode="" glyph-name="2" horiz-adv-x="1034" d="M250.67-63.354c-41.535 0.073-79.394 15.75-108.041 41.48l0.15-0.132c-26.21 26.456-43.228 62.058-45.845 101.597l-0.025 0.48v382.466l47.162-10.337c13.512-2.129 29.366-3.526 45.48-3.87l0.39-0.007h69.128l217.721-44.578c13.205-2.936 28.372-4.618 43.932-4.618s30.727 1.682 45.329 4.875l-1.397-0.256 212.553 44.578h58.791c21.036 0.833 40.842 2.916 60.241 6.198l-2.742-0.383 46.516 10.337v-371.483c-0.089-41.139-16.32-78.469-42.693-106.009l0.053 0.056c-26.221-27.542-62.076-45.702-102.141-49.061l-0.582-0.039zM171.205 370.15v-287.495c2.284-18.863 11.275-35.287 24.478-47.099l0.072-0.063c13.874-13.203 32.689-21.325 53.402-21.325 0.305 0 0.609 0.002 0.913 0.005h541.996c39.756 4.042 70.584 37.11 71.066 77.478v278.499h-78.819l-203.508-41.994c-17.963-3.992-38.594-6.28-59.76-6.28s-41.797 2.287-61.661 6.628l1.9-0.348-209.322 43.286h-60.729zM520.076 326.218c-0.968-0.019-2.109-0.030-3.253-0.030-14.196 0-28.005 1.659-41.244 4.794l1.211-0.242-215.783 44.578h-64.606c-2.189-0.083-4.759-0.13-7.34-0.13-60.777 0-115.447 26.144-153.379 67.8l-0.149 0.166c-21.925 25.894-35.255 59.674-35.255 96.568 0 11.57 1.311 22.834 3.792 33.651l-0.194-1.007 56.853 253.254c9.648 40.078 32.737 73.68 64.131 96.579l0.475 0.33c33.221 23.057 74.398 36.835 118.792 36.835 0.71 0 1.42-0.004 2.129-0.011l-0.108 0.001h541.396c0.836 0.012 1.823 0.019 2.811 0.019 44.135 0 85.050-13.787 118.673-37.289l-0.671 0.444c31.996-23.111 55.13-56.764 64.382-95.79l0.224-1.119 56.853-252.608c1.945-9.213 3.058-19.799 3.058-30.645 0-37.556-13.353-71.994-35.569-98.825l0.208 0.259c-36.362-42.435-90.012-69.154-149.903-69.154-1.129 0-2.257 0.010-3.381 0.028l0.169-0.002h-64.606l-215.137-43.932c-13.393-2.856-28.787-4.501-44.562-4.522h-0.016zM267.468 455.43l225.474-47.162c8.341-2.139 17.918-3.367 27.78-3.367s19.439 1.228 28.584 3.539l-0.803-0.172 224.182 45.87 73.65-5.815c36.387 0.317 68.808 17.022 90.286 43.083l0.162 0.202c11.295 13.461 18.157 30.975 18.157 50.091 0 5.133-0.495 10.151-1.439 15.008l0.080-0.493-55.561 253.254c-4.976 21.151-17.536 38.767-34.589 50.204l-0.298 0.188c-20.434 14.17-45.757 22.637-73.058 22.637-0.89 0-1.778-0.009-2.663-0.027l0.132 0.002h-541.396c-0.565 0.009-1.232 0.014-1.901 0.014-27.294 0-52.611-8.463-73.471-22.907l0.429 0.281c-17.351-11.626-29.911-29.242-34.775-49.831l-0.112-0.561-56.853-253.9c-1.373-5.245-2.161-11.266-2.161-17.471 0-18.083 6.693-34.603 17.737-47.217l-0.071 0.083c23.75-26.332 57.988-42.811 96.076-42.811 2.338 0 4.662 0.062 6.97 0.185l-0.322-0.014zM349.517 713.206v0c15.404-2.962 26.883-16.333 26.883-32.386 0-1.795-0.144-3.557-0.42-5.274l0.025 0.189-15.505-85.926c-2.297-15.057-15.154-26.458-30.675-26.458-2.177 0-4.301 0.224-6.352 0.651l0.201-0.035c-15.409 2.309-27.091 15.453-27.091 31.326 0 2.175 0.219 4.298 0.637 6.349l-0.035-0.204 14.859 85.279c2.962 15.404 16.333 26.883 32.386 26.883 1.795 0 3.557-0.144 5.274-0.42l-0.189 0.025zM684.174 713.206v0c-15.404-2.962-26.883-16.333-26.883-32.386 0-1.795 0.144-3.557 0.42-5.274l-0.025 0.189 15.505-85.926c2.297-15.057 15.154-26.458 30.675-26.458 2.177 0 4.301 0.224 6.352 0.651l-0.201-0.035c15.409 2.309 27.091 15.453 27.091 31.326 0 2.175-0.219 4.298-0.637 6.349l0.035-0.204-14.859 85.279c-2.962 15.404-16.333 26.883-32.386 26.883-1.795 0-3.557-0.144-5.274-0.42l0.189 0.025zM516.845 710.622v0c-17.84 0-32.303-14.462-32.303-32.303v0-87.218c0-17.84 14.462-32.303 32.303-32.303v0 0c17.84 0 32.303 14.462 32.303 32.303v0 87.218c0 17.84-14.462 32.303-32.303 32.303v0z" /> +<glyph unicode="" glyph-name="3" horiz-adv-x="1034" d="M250.987-64.647c-41.541 0.392-79.358 16.019-108.203 41.552l0.175-0.152c-26.102 26.578-43.1 62.173-45.899 101.691l-0.029 0.515v382.949l47.222-10.35c15.525 0 30.403-3.234 45.928-3.881h69.215l217.996-44.634c13.224-2.776 28.42-4.365 43.987-4.365s30.763 1.589 45.434 4.614l-1.447-0.249 212.821 44.634h58.865c19.406 0 38.812 3.234 57.572 5.822l46.575 10.35v-371.952c0-0.134 0.001-0.293 0.001-0.452 0-41.472-16.261-79.146-42.756-106.994l0.061 0.065c-26.255-27.576-62.155-45.76-102.27-49.123l-0.583-0.039zM171.421 369.405v-287.858c2.286-18.887 11.289-35.331 24.509-47.158l0.072-0.063c14.255-13.144 33.341-21.239 54.315-21.347h542.748c39.669 4.332 70.373 37.274 71.155 77.546l0.001 0.078v278.802h-78.919l-203.765-42.047c-17.99-3.701-38.665-5.82-59.836-5.82s-41.846 2.119-61.826 6.156l1.991-0.336-209.587 45.281h-60.806zM520.733 325.418c-0.485-0.004-1.058-0.007-1.632-0.007-14.78 0-29.173 1.652-43.007 4.782l1.299-0.247-216.056 42.694h-64.687c-1.177-0.024-2.565-0.037-3.956-0.037-62.264 0-118.245 26.902-156.953 69.716l-0.163 0.183c-21.983 25.854-35.354 59.625-35.354 96.518 0 11.647 1.333 22.983 3.854 33.864l-0.197-1.008 56.925 253.574c9.488 40.195 32.651 73.891 64.204 96.698l0.483 0.333c32.926 23.087 73.827 36.894 117.953 36.894 1.059 0 2.117-0.008 3.173-0.024l-0.16 0.002h542.080c0.896 0.014 1.953 0.022 3.013 0.022 44.126 0 85.027-13.807 118.619-37.336l-0.666 0.442c32.21-22.977 55.437-56.745 64.475-95.938l0.212-1.093 56.925-252.927c1.887-9.121 2.968-19.602 2.968-30.336 0-37.701-13.328-72.29-35.528-99.311l0.217 0.272c-36.666-43.248-91.035-70.515-151.772-70.515-0.54 0-1.080 0.002-1.62 0.006l0.083-0.001h-64.687l-215.409-43.987c-13.304-1.932-28.77-3.104-44.484-3.233l-0.15-0.001zM267.805 454.792l225.759-47.222c8.361-1.848 17.965-2.907 27.816-2.907s19.455 1.059 28.703 3.068l-0.888-0.162 224.465 45.928 73.744-5.822c36.392 0.506 68.79 17.18 90.405 43.147l0.157 0.194c11.31 13.478 18.18 31.014 18.18 50.154 0 5.14-0.495 10.164-1.441 15.027l0.080-0.493-55.631 253.574c-4.917 21.204-17.512 38.862-34.63 50.268l-0.301 0.189c-20.058 14.198-45.027 22.695-71.98 22.695-1.303 0-2.6-0.020-3.893-0.059l0.189 0.005h-542.080c-0.976 0.027-2.125 0.043-3.278 0.043-26.879 0-51.774-8.494-72.147-22.944l0.387 0.261c-17.419-11.594-30.014-29.252-34.822-49.901l-0.109-0.555-56.925-254.221c-1.374-5.251-2.164-11.28-2.164-17.493 0-18.106 6.702-34.647 17.76-47.277l-0.071 0.083c23.78-26.365 58.062-42.865 96.197-42.865 2.341 0 4.668 0.062 6.978 0.185l-0.323-0.014zM349.958 712.895v0c15.424-2.966 26.917-16.354 26.917-32.427 0-1.798-0.144-3.561-0.42-5.281l0.025 0.189-15.525-86.034c-1.378-8.616-6.133-15.918-12.839-20.634l-0.099-0.066c-5.337-3.476-11.867-5.542-18.881-5.542-1.783 0-3.535 0.134-5.246 0.391l0.193-0.024c-8.856 1.663-16.334 6.602-21.278 13.484l-0.069 0.1c-3.673 4.82-5.884 10.926-5.884 17.548 0 2.264 0.258 4.467 0.747 6.582l-0.038-0.196 14.878 85.387c2.648 15.424 15.921 27.013 31.901 27.013 1.985 0 3.928-0.179 5.815-0.521l-0.197 0.030zM685.039 712.895v0c-15.424-2.966-26.917-16.354-26.917-32.427 0-1.798 0.144-3.561 0.42-5.281l-0.025 0.189 15.525-86.034c1.378-8.616 6.133-15.918 12.839-20.634l0.099-0.066c5.337-3.476 11.867-5.542 18.881-5.542 1.783 0 3.535 0.134 5.246 0.391l-0.193-0.024c8.856 1.663 16.334 6.602 21.278 13.484l0.069 0.1c3.673 4.82 5.884 10.926 5.884 17.548 0 2.264-0.258 4.467-0.747 6.582l0.038-0.196-14.878 85.387c-2.648 15.424-15.921 27.013-31.901 27.013-1.985 0-3.928-0.179-5.815-0.521l0.197 0.030zM517.498 710.307v0c-17.863 0-32.344-14.481-32.344-32.344v0-87.328c0-17.863 14.481-32.344 32.344-32.344v0 0c17.863 0 32.344 14.481 32.344 32.344v0 87.328c0 17.863-14.481 32.344-32.344 32.344v0z" /> +<glyph unicode="" glyph-name="-8" horiz-adv-x="1000" d="M744.795 720.468l242.526-234.292c3.567-3.235 6.372-7.243 8.16-11.764l0.074-0.213c2.538-4.858 4.027-10.61 4.027-16.71 0-10.139-4.114-19.317-10.764-25.956v0l-244.772-254.503c-6.864-6.661-16.239-10.767-26.573-10.767s-19.709 4.106-26.583 10.776l0.010-0.009c-6.838 6.784-11.071 16.184-11.071 26.573s4.233 19.79 11.068 26.571l0.002 0.002 173.661 180.398h-604.070c-20.503 0.411-37.016 16.924-37.426 37.388l-0.001 0.039c0 20.67 16.757 37.427 37.427 37.427v0h619.789l-187.135 181.146c-8.336 6.915-13.606 17.276-13.606 28.868 0 20.67 16.757 37.427 37.427 37.427 11.032 0 20.949-4.773 27.799-12.367l0.029-0.033zM486.55 960c20.67 0 37.427-16.757 37.427-37.427v0c-0.411-20.503-16.924-37.016-37.388-37.426l-0.039-0.001h-411.696v-873.544h411.696c20.503-0.411 37.016-16.924 37.426-37.388l0.001-0.039c0-20.67-16.757-37.427-37.427-37.427v0h-449.123c-20.67 0-37.427 16.757-37.427 37.427v0c-0.501 2.25-0.788 4.834-0.788 7.485s0.287 5.235 0.832 7.723l-0.044-0.238c-0.574 2.134-0.903 4.584-0.903 7.111s0.33 4.977 0.948 7.31l-0.045-0.198v919.205c0 20.67 16.757 37.427 37.427 37.427v0z" /> +<glyph unicode="" glyph-name="dingd" horiz-adv-x="1080" d="M946.373-63.325h-810.020c-74.56 0-135.003 60.443-135.003 135.003v0 693.917c0.349 36.634 15.236 69.724 39.16 93.836l-0.009-0.009c24.26 24.068 57.623 38.991 94.472 39.151h810.051c36.88-0.16 70.243-15.083 94.511-39.16l-0.009 0.009c24.411-23.929 39.767-57.016 40.499-93.691l0.002-0.137v-696.617c0-74.56-60.443-135.003-135.003-135.003v0zM136.353 814.196c-14.451-0.428-27.461-6.265-37.146-15.544l0.020 0.019c-9.508-9.258-15.434-22.154-15.525-36.434v-693.259c0-0.049 0-0.107 0-0.166 0-14.051 5.963-26.71 15.496-35.583l0.030-0.027c9.49-9.542 22.611-15.466 37.115-15.525h810.031c14.515 0.059 27.636 5.983 37.124 15.523l0.002 0.002c9.563 8.901 15.526 21.559 15.526 35.61 0 0.058 0 0.116 0 0.175v-0.009 696.617c-0.092 14.297-6.018 27.193-15.514 36.44l-0.011 0.011c-9.665 9.261-22.675 15.097-37.043 15.523l-0.082 0.002zM669.616 960h-259.206c-77.627 0-140.403-39.151-140.403-86.402s62.777-87.752 140.403-87.752h259.206c77.627 0 140.403 38.476 140.403 86.402s-62.777 87.752-140.403 87.752zM296.766 482.075l9.207 9.874c12.712 13.632 34.069 14.378 47.702 1.666l159.951-149.157c13.632-12.712 14.378-34.069 1.666-47.702l-9.207-9.874c-12.712-13.632-34.069-14.378-47.702-1.666l-159.951 149.157c-13.632 12.712-14.378 34.069-1.666 47.702zM454.015 338.741l277.446 258.722c13.632 12.712 34.989 11.967 47.702-1.666l9.207-9.874c12.712-13.632 11.967-34.989-1.666-47.702l-277.446-258.722c-13.632-12.712-34.989-11.967-47.702 1.666l-9.207 9.874c-12.712 13.632-11.967 34.989 1.666 47.702z" /> +<glyph unicode="" glyph-name="dingd1" horiz-adv-x="1077" d="M943.832-61.305h-808.421c-74.413 0-134.737 60.324-134.737 134.737v0 692.547c0 74.413 60.324 134.737 134.737 134.737v0h808.421c74.413 0 134.737-60.324 134.737-134.737v0-695.242c0-74.413-60.324-134.737-134.737-134.737v0zM135.411 814.484c-14.366-0.748-27.261-6.501-37.096-15.534l0.043 0.039c-9.37-9.316-15.246-22.138-15.494-36.332l-0.001-0.047v-691.874c0-0.049 0-0.107 0-0.165 0-14.023 5.951-26.657 15.466-35.513l0.029-0.027c9.472-9.523 22.566-15.436 37.041-15.495h808.432c0.19-0.003 0.414-0.004 0.639-0.004 14.297 0 27.207 5.938 36.399 15.483l0.015 0.016c9.544 8.883 15.495 21.516 15.495 35.54 0 0.058 0 0.116 0 0.174v-0.009 695.242c0 0.076 0.001 0.166 0.001 0.256 0 14.205-5.941 27.023-15.475 36.104l-0.020 0.019c-9.707 9.139-22.653 14.934-36.944 15.491l-0.108 0.003zM666.947 960h-258.695c-77.474 0-138.105-39.074-138.105-86.232s62.653-87.579 140.126-87.579h258.695c72.758 0 140.126 38.4 140.126 86.232s-67.368 87.579-142.147 87.579zM294.667 483.591l9.189 9.854c12.687 13.606 34.002 14.35 47.608 1.662l159.635-148.862c13.606-12.687 14.35-34.002 1.662-47.608l-9.189-9.854c-12.687-13.606-34.002-14.35-47.608-1.662l-159.635 148.862c-13.606 12.687-14.35 34.002-1.662 47.608zM452.162 339.713l276.898 258.212c13.606 12.687 34.92 11.943 47.608-1.662l9.189-9.854c12.687-13.606 11.943-34.92-1.662-47.608l-276.898-258.212c-13.606-12.687-34.92-11.943-47.608 1.662l-9.189 9.854c-12.687 13.606-11.943 34.92 1.662 47.608z" /> +<glyph unicode="" glyph-name="LOGO" horiz-adv-x="5105" d="M592.688 701.799c-39.121-5.868-78.243-13.692-119.32-22.495l-57.704 123.232c51.159 16.587 111.477 29.654 173.606 36.757l4.395 0.408c0 33.253 0 68.462 0 105.628h203.431v-89.979c29.349 3.47 63.345 5.45 97.803 5.45s68.453-1.98 101.879-5.832l-4.076 0.382c46.946-8.802 75.309-30.319 83.133-65.528 5.352-20.453 8.424-43.933 8.424-68.132 0-10.452-0.573-20.77-1.69-30.925l0.112 1.253c-5.868-45.968-10.758-86.067-17.605-120.298s-12.714-67.484-21.517-97.803h69.44l-29.341-138.881h-308.080c-13.072-84.79-38.036-161.132-73.416-231.324l2.019 4.42c-35.106-71.656-89.124-129.446-155.603-168.198l-1.86-1.002-134.968 59.66c46.038 52.102 84.766 112.14 113.664 177.495l1.744 4.419c15.105 39.439 29.264 87.571 39.865 137.023l1.212 6.748h-143.771l-31.297 138.881h195.606c0 43.033 0 108.562 6.846 195.606-2.934 14.67-2.934 29.341-2.934 43.033zM797.096 725.272c0-120.298 0-207.343-6.846-262.113h228.86l-139.859 24.451c7.95 24.239 14.46 53.016 18.32 82.626l0.262 2.462c0 29.341 7.824 61.616 11.736 97.803 0.257 1.786 0.403 3.849 0.403 5.946 0 16.17-8.72 30.303-21.714 37.953l-0.206 0.112c-14.198 7.575-31.051 12.023-48.943 12.023-2.739 0-5.453-0.104-8.14-0.309l0.357 0.022zM374.586 564.875v-615.182h-195.606v988.791h195.606v-373.608zM130.078-15.098h-130.078v880.229l130.078 37.165zM1086.594 74.881c-0.082-34.673-14.701-65.915-38.083-87.967l-0.060-0.056c-24.696-22.928-57.895-36.997-94.38-36.997s-69.684 14.069-94.468 37.078l0.088-0.081c-23.713 22.033-38.644 53.239-39.12 87.936l-0.001 0.087c1.5 32.641 16.694 61.459 39.93 81.038l0.17 0.139c23.105 21.988 54.438 35.514 88.93 35.514 3.122 0 6.219-0.111 9.285-0.329l-0.412 0.024c1.254 0.040 2.729 0.062 4.208 0.062 35.94 0 68.757-13.369 93.75-35.405l-0.155 0.134c18.87-19.218 30.518-45.583 30.518-74.669 0-2.29-0.072-4.562-0.214-6.816l0.016 0.308zM1789.799 522.819v172.134h195.606v-166.266h445.005l-38.143-139.859h-405.883v-293.41c-1.16-30.184-8.984-58.29-22.030-83.232l0.513 1.078c-15.153-25.931-42.854-43.076-74.561-43.076-0.951 0-1.898 0.015-2.841 0.046l0.137-0.004c-36.187 0-82.155 0-195.606 0l-65.528 127.144c69.44 0 115.408 0 139.859 0 8.79 0.465 16.203 5.91 19.505 13.547l0.056 0.146c4.519 10.245 7.15 22.19 7.15 34.75 0 2.571-0.11 5.117-0.326 7.632l0.023-0.327c0 13.692 0 89.979 0 230.816h-332.531c-35.015 0.217-68.622 5.925-100.105 16.306l2.302-0.657c-29.341 9.78-44.989 38.143-45.968 85.089v391.213l195.606 46.946v-38.143l293.41 5.868c166.266 0 270.915 23.473 313.948 63.572h240.596c-22.237-76.992-80.472-136.84-154.81-160.907l-1.675-0.469c-59.579-15.924-130.811-28.696-203.715-35.75l-5.584-0.437c-51.836 0-125.188-6.846-220.057-7.824s-169.2 0-224.947 0l-28.363 84.111v-310.036zM2296.42 327.213c10.692-63.196 25.979-119.090 46.105-172.615l-2.094 6.35c22.917-59.784 56.125-110.907 97.885-153.635l-0.082 0.084-170.178-25.429c-53.839 31.695-96.206 77.836-122.442 133.118l-0.79 1.851c-25.624 61.68-44.858 133.345-54.337 208.054l-0.433 4.179zM1437.708 327.213h218.101c-17.049-82.601-45.489-155.916-84.055-222.644l1.901 3.565c-28.158-54.612-70.704-98.416-122.67-127.336l-1.54-0.787-169.2 30.319c32.488 38.562 62.864 81.399 89.546 126.673l2.389 4.383c26.989 53.053 49.522 114.724 64.45 179.306l1.079 5.542zM3640.237 670.502h44.989c40.099 0 60.638-30.319 61.616-77.265v-82.155c0-50.858-18.583-79.221-57.704-87.045-32.407-7.019-70.093-11.595-108.649-12.694l-0.891-0.020h-144.749v-31.297h-145.727v-16.627c28.382 2.562 61.391 4.022 94.742 4.022 97.675 0 192.423-12.527 282.727-36.061l-7.773 1.72c28.892-9.172 52.081-29.175 65.241-55.123l0.287-0.624c6.89-19.564 10.871-42.122 10.871-65.611 0-2.379-0.041-4.748-0.122-7.107l0.009 0.343v-104.649c0.392-3.957 0.616-8.552 0.616-13.2 0-31.873-10.515-61.29-28.265-84.972l0.264 0.368c-21.609-20.211-50.733-32.623-82.756-32.623-3.231 0-6.432 0.126-9.598 0.374l0.419-0.026-127.144 4.89-55.748 133.012h55.748c2.922-0.543 6.284-0.854 9.719-0.854 11.71 0 22.576 3.61 31.547 9.779l-0.189-0.123c6.167 8.74 9.856 19.612 9.856 31.345 0 1.015-0.028 2.024-0.082 3.025l0.006-0.139c0.317 4.243 0.497 9.191 0.497 14.181s-0.181 9.938-0.535 14.838l0.038-0.656c0 6.846-9.78 13.692-26.407 20.539-40.143 6.877-86.38 10.808-133.534 10.808-31.86 0-63.3-1.794-94.226-5.287l3.791 0.348v-254.288h-195.606v246.464c-82.114-7.762-155.197-19.156-226.796-34.546l12.607 2.271-27.385 68.462v-252.332h-195.606v357.96h195.606v-26.407c66.76 15.199 149.15 28.316 232.988 36.488l8.586 0.677v64.55h146.705v514.445h195.606v-61.616c16.627 0 35.209 36.187 55.748 40.099 36.228 7.493 77.863 11.783 120.499 11.783 2.68 0 5.357-0.017 8.029-0.051l-0.406 0.004c32.635-1.033 63.412-7.763 91.771-19.222l-1.792 0.64c19.915-10.482 33.262-31.034 33.262-54.704 0-0.367-0.003-0.733-0.010-1.098l0.001 0.055v-83.133c0-43.033-13.692-68.462-39.121-78.243-18.654-7.017-40.265-11.887-62.751-13.641l-0.822-0.052zM3432.894 812.317v-88.023h71.396c28.363 0 43.033 5.868 44.011 19.561v30.319c-0.522 10.385-9.069 18.608-19.537 18.608-0.352 0-0.702-0.009-1.050-0.028l0.049 0.002c-6.231 0.652-13.462 1.024-20.78 1.024-17.617 0-34.731-2.157-51.092-6.22l1.453 0.305h-10.758zM3432.894 629.425v-104.649h75.309c28.363 0 42.055 7.824 42.055 24.451v28.363c0.32 3.225 0.503 6.97 0.503 10.758s-0.183 7.534-0.539 11.228l0.037-0.47c-5.825 5.726-13.698 9.384-22.421 9.778l-0.074 0.003h-78.243s-9.78 6.846-16.627 20.539zM3013.318 897.406h195.606l-27.385-120.298h-172.134c0-5.868 0-15.649 0-28.363h189.738l-26.407-97.803h-173.112c0.101-1.898 0.159-4.121 0.159-6.357s-0.058-4.459-0.172-6.666l0.013 0.309-4.89-22.495h225.926l-32.275-116.386h-242.552c-6.886-13.116-14.023-24.317-21.977-34.868l0.46 0.637c-37.194-49.54-85.133-89.020-140.511-115.407l-2.282-0.979-147.683 91.935c34.231 30.319 69.44 22.495 97.803 56.726h-97.803l-22.495 117.364h172.134c3.117 9.379 6.164 21.211 8.495 33.299l0.307 1.911h-136.925l-23.473 97.803h175.068q0 8.802 0 26.407v0h-156.485l-16.627 123.232h186.804c0 13.692 0 27.385 0 41.077h195.606zM4641.742 737.987v-103.671h458.697l-30.319-141.815h-428.378v-131.056h463.587l-26.407-138.881h-437.181v-125.188c0.3-3.397 0.47-7.349 0.47-11.34 0-36.567-14.334-69.786-37.69-94.345l0.055 0.058c-29.351-21.646-66.235-34.644-106.155-34.644-4.288 0-8.541 0.15-12.755 0.445l0.567-0.032h-262.113l-33.253 134.968h186.804c1.871-0.092 4.063-0.145 6.267-0.145 17.438 0 34.108 3.283 49.428 9.265l-0.925-0.318c10.758 5.868 16.627 23.473 17.605 51.836v69.44h-456.741l-56.726 138.881h513.467v131.056h-456.741l-50.858 141.815h507.599v103.671h-133.012c-156.485 0-236.684 0-293.41 0l-60.638 137.903h676.798c6.173-0.463 13.372-0.726 20.632-0.726 33.568 0 65.82 5.637 95.86 16.016l-2.062-0.62c29.921 14.47 53.421 38.285 67.121 67.597l0.363 0.865h207.343c-21.742-74.788-68.254-136.539-129.878-177.27l-1.178-0.732c-56.15-27.395-122.169-43.411-191.929-43.411-6.453 0-12.874 0.137-19.26 0.408l0.912-0.031z" /> </font></defs></svg> \ No newline at end of file diff --git a/view/font/icomoon.ttf b/view/font/icomoon.ttf index 27835e1c5d09836d32892b2f23aa43739aa004ad..7fa868102ede363a6d510df5d509b199683df814 100644 GIT binary patch literal 9692 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 Uh7;HlO#nJZzf4;CRDMPNUxMyU`~Uy| delta 391 zcmccP{XwFhfsuiMft#U$ftkU;KUm+0Ux@W1P-G7fCnV=47Kn#l>SthJlmYTX(i4jd zfV2RR5288Jb1KtXZm!V<@+*Mc2^p!0DT*2*jtmT396))q44?q}PUbT}z5|f2l95|d zp~S%W4#-ad@^y0ZlN}S;J2>-z0uz7&61j;L1q{NBK+Rk$fP96##N5=GUYx&y{1ZS+ z+6wZEOMngq0-gYnJOeZHfr$s~8QCW>dW*CF|NH+xNRC0_B_o*4`2Vpu^W-GP(9O%4 zgE+E5J_P~+h4Q!Y{5D@1xLLsb`<&??Knw`|{{r)O<|#lf2LlsW8fY&A1M`9Z2N)P2 z>Y2ZTL{I?KB#0PD+vEkxGD=`B7lR0c977c22_`qD7^Wg-8x{|+c5X&C2KLQzD*G4# DQXNlk diff --git a/view/font/icomoon.woff b/view/font/icomoon.woff index 43771b1cb4cf3f731904bc6135cfee354c02d547..0d6317d9a9fcc0656b9cc3d08061a81c2abbe427 100644 GIT binary patch literal 9768 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 delta 464 zcmZ4Cvqw^-+~3WOfsp|Sc=j-GgXx0Ff@<OuwT0_hKPKlU7BDa{W&p)QKv+EVQh$14 zF-U9=kk0|d0_i!GX+W_fK%ogB+;Ve`ZboWi3IhWdNS_%9D{6>1W&j0&Vm&~<3JA0B zWImITTT%fO+W_S2fUpt+<GY;v<U|I42Ch3m0SORh@8HbKO{@S~%=HDxR{&#SMvlD1 z+*AezZV{m6Z6G|;i}QCuesKxVJ9FUbn1L*2<^z*?80{I^C;KpZi?jd#`~N>s6ll^* zMlhT4|6_6H$?F(HH-Bah;;09Q2m^zFLiyWxew(ih+$><#_c_x)fEW<^{{`mn%u|3| z4hAN$G|&Y=n-2Uxz`y`e&-@)Ef&!o>LBv4XfGP`s*b#`$fmk1eC#i5~fK_lYh%m@8 kL@}OVa$|~NDq^-_@c^61&B(^U4pzYgj4k2K%_>V70kvvY?*IS* diff --git a/view/templates/include/admin_leftmenu.html b/view/templates/include/admin_leftmenu.html index a00c4ca..e6888b1 100644 --- a/view/templates/include/admin_leftmenu.html +++ b/view/templates/include/admin_leftmenu.html @@ -8,8 +8,8 @@ <dl class="layui-nav-child admin-layui-nav-child"> <dd class="layui-this"> <a href="javascript:;" class="admin-layui-nav-item-a admin-layui-nav-item-a-child"> - <img src="/images/left_menu_grey_1.svg" alt="" class="admin-layui-nav-item-a-child-img admin-no-select"> - <img src="/images/left_menu_bule_1.svg" alt="" class="admin-layui-nav-item-a-child-img admin-select"> + <span class="icon-2 admin-no-select menu-left-icon-img menu-left-icon-img-15"></span> + <span class="icon-3 admin-select menu-left-icon-img menu-left-icon-img-15"></span> 首页 </a> </dd> @@ -27,22 +27,22 @@ <dl class="layui-nav-child admin-layui-nav-child"> <dd> <a href="javascript:;" class="admin-layui-nav-item-a admin-layui-nav-item-a-child"> - <img src="/images/left_menu_grey_2.svg" alt="" class="admin-layui-nav-item-a-child-img admin-no-select"> - <img src="/images/left_menu_bule_2.svg" alt="" class="admin-layui-nav-item-a-child-img admin-select"> + <span class="icon-uniE90A admin-no-select menu-left-icon-img menu-left-icon-img-15"></span> + <span class="icon-1 admin-select menu-left-icon-img menu-left-icon-img-15"></span> 发货提醒 </a> </dd> <dd> <a href="javascript:;" class="admin-layui-nav-item-a admin-layui-nav-item-a-child"> - <img src="/images/left_menu_grey_3.svg" alt="" class="admin-layui-nav-item-a-child-img admin-no-select"> - <img src="/images/left_menu_bule_3.svg" alt="" class="admin-layui-nav-item-a-child-img admin-select"> + <span class="icon--6 admin-no-select menu-left-icon-img menu-left-icon-img-16"></span> + <span class="icon--6-2 admin-select menu-left-icon-img menu-left-icon-img-16"></span> 售后监控 </a> </dd> <dd> <a href="javascript:;" class="admin-layui-nav-item-a admin-layui-nav-item-a-child"> - <img src="/images/left_menu_grey_4.svg" alt="" class="admin-layui-nav-item-a-child-img admin-no-select"> - <img src="/images/left_menu_bule_4.svg" alt="" class="admin-layui-nav-item-a-child-img admin-select"> + <span class="icon-dingd admin-no-select menu-left-icon-img"></span> + <span class="icon-dingd1 admin-select menu-left-icon-img"></span> 订单列表 </a> </dd> diff --git a/view/templates/tpl/home.html b/view/templates/tpl/home.html index 5b21730..36656f5 100644 --- a/view/templates/tpl/home.html +++ b/view/templates/tpl/home.html @@ -207,6 +207,29 @@ .primary-msg{ color: #69717D; } + .admin-right-arrow{ + font-size: 14px; + position: relative; + top: 1px; + } + .menu-left-icon-img{ + font-size: 14px; + } + .menu-left-icon-img-16.admin-select{ + display: none !important; + } + .menu-left-icon-img-16{ + font-size: 18px !important; + margin-right: -4px; + margin-top: -1px; + display: inline-block; + position: relative; + top: 3px; + right: 1px; + } + .menu-left-icon-img-15{ + font-size: 15px !important; + } @media screen and (min-width:1270px) and (max-width:1440px){ .admin-layui-col-top-right{ @@ -346,7 +369,7 @@ <img class="admin-dashed-line" src="/images/admin_index_dashed_line.png"> <div class="admin-index-top-item-list-item-child"> - <div class="fl"><i class="admin-index-top-item-list-item-child-dot-grey"></i><span class="icon-1 admin-index-top-item-list-item-child-icon4"></span>待售后订单:</div> + <div class="fl"><i class="admin-index-top-item-list-item-child-dot-grey"></i><span class="icon-11 admin-index-top-item-list-item-child-icon4"></span>待售后订单:</div> <div class="fr">891</div> <div class="clear"></div> </div> @@ -363,48 +386,48 @@ <div class="layui-row layui-col-space20 bottom-layui-row"> <div class="layui-col-lg2 admin-layui-col-bottom-list"> <div class="admin-index-bottom-item"> - <div class="admin-card-text-1">催发货订单(总) ></div> + <div class="admin-card-text-1">催发货订单(总) <span class="icon-1-2 admin-right-arrow"></span></div> <div class="admin-card-text-2">888<span> 单</span></div> <div class="admin-card-text-3">日增长:+0.61%<span class="icon--2"></span></div> - <div class="admin-card-text-4">周减少:-0.61%<span class="icon-2"></span></div> + <div class="admin-card-text-4">周减少:-0.61%<span class="icon-21"></span></div> <div class="admin-card-text-5"><i class="admin-index-top-item-list-item-child-dot-red2"></i>这些顾客在催促发货咯</div> </div> </div> <div class="layui-col-lg2 admin-layui-col-bottom-list"> <div class="admin-index-bottom-item"> - <div class="admin-card-text-1">倒计时订单(总) ></div> + <div class="admin-card-text-1">倒计时订单(总) <span class="icon-1-2 admin-right-arrow"></span></div> <div class="admin-card-text-2">888<span> 单</span></div> <div class="admin-card-text-3">日增长:+0.61%<span class="icon--2"></span></div> - <div class="admin-card-text-4">周减少:-0.61%<span class="icon-2"></span></div> + <div class="admin-card-text-4">周减少:-0.61%<span class="icon-21"></span></div> <div class="admin-card-text-5"><i class="admin-index-top-item-list-item-child-dot-red2"></i>这些订单还有12h超时!</div> </div> </div> <div class="layui-col-lg2 admin-layui-col-bottom-list"> <div class="admin-index-bottom-item"> - <div class="admin-card-text-1">待发货订单(总) ></div> + <div class="admin-card-text-1">待发货订单(总) <span class="icon-1-2 admin-right-arrow"></span></div> <div class="admin-card-text-2">888<span> 单</span></div> <div class="admin-card-text-3">日增长:+0.61%<span class="icon--2"></span></div> - <div class="admin-card-text-4">周减少:-0.61%<span class="icon-2"></span></div> + <div class="admin-card-text-4">周减少:-0.61%<span class="icon-21"></span></div> <div class="admin-card-text-5 primary-msg"><i class="admin-index-top-item-list-item-child-dot-red2"></i>有新增的订单啦</div> </div> </div> <div class="layui-col-lg2 admin-layui-col-bottom-list"> <div class="admin-index-bottom-item"> - <div class="admin-card-text-1">平台介入中订单(总) ></div> + <div class="admin-card-text-1">平台介入中订单(总) <span class="icon-1-2 admin-right-arrow"></span></div> <div class="admin-card-text-2">888<span> 单</span></div> <div class="admin-card-text-3">日增长:+0.61%<span class="icon--2"></span></div> - <div class="admin-card-text-4">周减少:-0.61%<span class="icon-2"></span></div> + <div class="admin-card-text-4">周减少:-0.61%<span class="icon-21"></span></div> <div class="admin-card-text-5"><i class="admin-index-top-item-list-item-child-dot-red2"></i>这些订单官方客服已介入</div> </div> </div> <div class="layui-col-lg2 admin-layui-col-bottom-list admin-layui-col-bottom-list-last"> <div class="admin-index-bottom-item"> - <div class="admin-card-text-1">待售后订单(总) ></div> + <div class="admin-card-text-1">待售后订单(总) <span class="icon-1-2 admin-right-arrow"></span></div> <div class="admin-card-text-2">888<span> 单</span></div> <div class="admin-card-text-3">日增长:+0.61%<span class="icon--2"></span></div> - <div class="admin-card-text-4">周减少:-0.61%<span class="icon-2"></span></div> + <div class="admin-card-text-4">周减少:-0.61%<span class="icon-21"></span></div> <div class="admin-card-text-5 primary-msg"><i class="admin-index-top-item-list-item-child-dot-red2"></i>这些顾客想要退款</div> </div> </div> From b459814be10a12d60d27d692d0ef80aef29ef88b Mon Sep 17 00:00:00 2001 From: Jason <1432334894@qq.com> Date: Mon, 1 Aug 2022 14:47:14 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=8A=BD=E7=A6=BB=E5=88=B0=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view/css/admin_style.css | 303 ++++++++++++++++++++++++++++++++++++++++++- view/templates/tpl/home.html | 301 ------------------------------------------ 2 files changed, 302 insertions(+), 302 deletions(-) diff --git a/view/css/admin_style.css b/view/css/admin_style.css index d626916..c016bc0 100644 --- a/view/css/admin_style.css +++ b/view/css/admin_style.css @@ -92,4 +92,305 @@ body{ } *{ -webkit-tap-highlight-color:unset !important; -} \ No newline at end of file +} +.admin-index-top-item{ + width: 100%; + height: 373px; + background: #FFFFFF; + box-shadow: 0px 2px 8px 0px rgba(217,221,229,0.5000); + border-radius: 3px; + } + .admin-layui-body{ + padding:12px; + } + .admin-index-bottom-item{ + width: 100%; + height: 260px; + background: #FFFFFF; + box-shadow: 0px 2px 8px 0px rgba(217,221,229,0.5000); + border-radius: 3px; + padding-bottom: 22px; + } + .bottom-layui-row{ + margin-top: 20px; + } + .admin-index-top-item-title{ + width: 100%; + height: 46px; + line-height: 46px; + padding-left: 18px; + color: rgba(0, 0, 0, 0.65); + font-size: 16px; + font-family: PingFangSC-Regular; + text-align: left; + white-space: nowrap; + } + .admin-index-top-item-title-line{ + width: 100%; + height: 1px; + background-color: rgba(232, 232, 232, 1); + } + .admin-index-top-item-list-title{ + width: 56px; + height: 22px; + color: rgba(0, 0, 0, 0.85); + font-size: 14px; + font-family: PingFangSC-Medium; + text-align: left; + white-space: nowrap; + line-height: 22px; + margin: 18px 0 0 18px; + } + .admin-dashed-line{ + width: 100%; + height: 1px; + } + .admin-index-top-item-list-item-child{ + line-height: 1px; + padding-left: 18px; + } + .fl{ + float: left; + } + .fr{ + float: right; + } + .clear{ + clear: both; + width: 0px; + height: 0px; + } + .admin-index-top-item-list-item-child div:first-child{ + width: 70px; + height: 22px; + color: rgba(99, 108, 120, 1); + font-size: 14px; + font-family: PingFangSC-Regular; + text-align: left; + white-space: nowrap; + line-height: 25px; + margin-left: 4px; + } + .admin-index-top-item-list-item-child div:nth-child(2){ + height: 22px; + color: rgba(105, 113, 125, 1); + font-size: 14px; + font-family: PingFangSC-Regular; + text-align: left; + white-space: nowrap; + line-height: 25px; + margin-left: 51px; + padding-right: 28px; + } + .admin-index-top-item-list-item-child-icon1,.admin-index-top-item-list-item-child-icon2,.admin-index-top-item-list-item-child-icon3,.admin-index-top-item-list-item-child-icon4,.admin-index-top-item-list-item-child-icon5{ + font-size: 16px; + margin-right: 5px; + } + .admin-index-top-item-list-item-child-dot-red,.admin-index-top-item-list-item-child-dot-grey{ + margin-right: 5px; + } + .admin-index-top-item-list-item-child-dot1{ + margin-right: 0px !important; + } + .admin-index-top-item-list-item-child-dot-grey::after{ + content: ''; + display: inline-block; + width: 6px; + height: 6px; + background: #C3C6CB; + border-radius: 50%; + position: relative; + top: -4px; + } + .admin-index-top-item-list-item-child-dot-red::after{ + content: ''; + display: inline-block; + width: 6px; + height: 6px; + background: #F21019; + border-radius: 50%; + position: relative; + top: -4px; + } + .admin-card-text-1{ + width: 100%; + height: 16px; + font-size: 16px; + font-family: PingFangSC-Regular; + color: #636C78; + margin-top: 21px; + } + .admin-card-text-2{ + height: 28px; + font-size: 28px; + font-family: DINAlternate-Bold; + color: #000000; + margin-top: 39px; + } + .admin-card-text-2 span{ + width: 14px; + height: 14px; + font-size: 14px; + font-family: PingFangSC-Regular; + color: #636C78; + line-height: 14px; + } + .admin-card-text-3{ + height: 12px; + font-size: 12px; + font-family: PingFangSC-Regular; + color: #5F5F5F; + margin-top: 39px; + } + .admin-card-text-4{ + height: 12px; + font-size: 12px; + font-family: PingFangSC-Regular; + color: #5F5F5F; + margin-top: 21px; + } + .admin-card-text-5{ + max-height: 55px; + font-size: 14px; + font-family: PingFangSC-Regular; + color: #F21019; + margin-top: 25px; + overflow-y: auto; + } + .admin-index-bottom-item{ + overflow: hidden; + } + .admin-index-bottom-item div{ + padding-left: 22px; + padding-right: 6px; + } + .admin-index-top-item-list-item-child-dot-red2{ + margin-right: 5px; + } + .admin-index-top-item-list-item-child-dot-red2::after{ + content: ''; + display: inline-block; + width: 6px; + height: 6px; + background: #F21019; + border-radius: 50%; + position: relative; + top: -2px; + } + .admin-card-text-3 span,.admin-card-text-4 span{ + font-size: 11px; + margin-left: 5px; + } + .primary-msg{ + color: #69717D; + } + .admin-right-arrow{ + font-size: 14px; + position: relative; + top: 1px; + } + .menu-left-icon-img{ + font-size: 14px; + } + .menu-left-icon-img-16.admin-select{ + display: none !important; + } + .menu-left-icon-img-16{ + font-size: 18px !important; + margin-right: -4px; + margin-top: -1px; + display: inline-block; + position: relative; + top: 3px; + right: 1px; + } + .menu-left-icon-img-15{ + font-size: 15px !important; + } + @media screen and (min-width:1270px) and (max-width:1440px){ + + .admin-layui-col-top-right{ + min-width: 788px; + } + .admin-layui-col-top-left{ + min-width: 259px; + } + .admin-menu-layui-side-scroll{ + width: 188px !important; + } + .admin-menu-list .layui-nav-tree{ + width: 188px !important; + } + .admin-menu-list.layui-side{ + width: 188px !important; + } + .layui-nav-tree .layui-nav-child dd.layui-this::after { + content: ""; + display: block; + position: absolute; + z-index: 8; + left: 184px !important; + background-color: rgba(24, 144, 255, 1) !important; + border-radius: 4px !important; + width: 4px !important; + height: 29px !important; + margin-top: 5.5px !important; + top: 0px; + } + .admin-menu-list .layui-nav-bar{ + top: 184px !important; + } + .admin-layui-body{ + padding: 12px 12px 12px 0px; + } + .admin-layui-col-bottom-list{ + min-width: 217px; + } + .admin-layui-col-bottom-list-last{ + padding-right: 0px !important; + min-width: 207px !important; + } + } + @media screen and (min-width:1200px) and (max-width:1260px){ + .admin-layui-col-top-right{ + max-width: 724px !important; + } + .admin-layui-col-top-left{ + min-width: 259px; + } + .admin-menu-layui-side-scroll{ + width: 188px !important; + } + .admin-menu-list .layui-nav-tree{ + width: 188px !important; + } + .admin-menu-list.layui-side{ + width: 188px !important; + } + .layui-nav-tree .layui-nav-child dd.layui-this::after { + content: ""; + display: block; + position: absolute; + z-index: 8; + left: 184px !important; + background-color: rgba(24, 144, 255, 1) !important; + border-radius: 4px !important; + width: 4px !important; + height: 29px !important; + margin-top: 5.5px !important; + top: 0px; + } + .admin-menu-list .layui-nav-bar{ + top: 184px !important; + } + .admin-layui-body{ + padding: 12px 12px 12px 0px; + } + .admin-layui-col-bottom-list{ + min-width: 217px; + } + .admin-layui-col-bottom-list-last{ + padding-right: 0px !important; + min-width: 207px !important; + } + } \ No newline at end of file diff --git a/view/templates/tpl/home.html b/view/templates/tpl/home.html index 36656f5..12b4ed6 100644 --- a/view/templates/tpl/home.html +++ b/view/templates/tpl/home.html @@ -16,307 +16,6 @@ <![endif]--> {literal} <style> - .admin-index-top-item{ - width: 100%; - height: 373px; - background: #FFFFFF; - box-shadow: 0px 2px 8px 0px rgba(217,221,229,0.5000); - border-radius: 3px; - } - .admin-layui-body{ - padding:12px; - } - .admin-index-bottom-item{ - width: 100%; - height: 260px; - background: #FFFFFF; - box-shadow: 0px 2px 8px 0px rgba(217,221,229,0.5000); - border-radius: 3px; - padding-bottom: 22px; - } - .bottom-layui-row{ - margin-top: 20px; - } - .admin-index-top-item-title{ - width: 100%; - height: 46px; - line-height: 46px; - padding-left: 18px; - color: rgba(0, 0, 0, 0.65); - font-size: 16px; - font-family: PingFangSC-Regular; - text-align: left; - white-space: nowrap; - } - .admin-index-top-item-title-line{ - width: 100%; - height: 1px; - background-color: rgba(232, 232, 232, 1); - } - .admin-index-top-item-list-title{ - width: 56px; - height: 22px; - color: rgba(0, 0, 0, 0.85); - font-size: 14px; - font-family: PingFangSC-Medium; - text-align: left; - white-space: nowrap; - line-height: 22px; - margin: 18px 0 0 18px; - } - .admin-dashed-line{ - width: 100%; - height: 1px; - } - .admin-index-top-item-list-item-child{ - line-height: 1px; - padding-left: 18px; - } - .fl{ - float: left; - } - .fr{ - float: right; - } - .clear{ - clear: both; - width: 0px; - height: 0px; - } - .admin-index-top-item-list-item-child div:first-child{ - width: 70px; - height: 22px; - color: rgba(99, 108, 120, 1); - font-size: 14px; - font-family: PingFangSC-Regular; - text-align: left; - white-space: nowrap; - line-height: 25px; - margin-left: 4px; - } - .admin-index-top-item-list-item-child div:nth-child(2){ - height: 22px; - color: rgba(105, 113, 125, 1); - font-size: 14px; - font-family: PingFangSC-Regular; - text-align: left; - white-space: nowrap; - line-height: 25px; - margin-left: 51px; - padding-right: 28px; - } - .admin-index-top-item-list-item-child-icon1,.admin-index-top-item-list-item-child-icon2,.admin-index-top-item-list-item-child-icon3,.admin-index-top-item-list-item-child-icon4,.admin-index-top-item-list-item-child-icon5{ - font-size: 16px; - margin-right: 5px; - } - .admin-index-top-item-list-item-child-dot-red,.admin-index-top-item-list-item-child-dot-grey{ - margin-right: 5px; - } - .admin-index-top-item-list-item-child-dot1{ - margin-right: 0px !important; - } - .admin-index-top-item-list-item-child-dot-grey::after{ - content: ''; - display: inline-block; - width: 6px; - height: 6px; - background: #C3C6CB; - border-radius: 50%; - position: relative; - top: -4px; - } - .admin-index-top-item-list-item-child-dot-red::after{ - content: ''; - display: inline-block; - width: 6px; - height: 6px; - background: #F21019; - border-radius: 50%; - position: relative; - top: -4px; - } - .admin-card-text-1{ - width: 100%; - height: 16px; - font-size: 16px; - font-family: PingFangSC-Regular; - color: #636C78; - margin-top: 21px; - } - .admin-card-text-2{ - height: 28px; - font-size: 28px; - font-family: DINAlternate-Bold; - color: #000000; - margin-top: 39px; - } - .admin-card-text-2 span{ - width: 14px; - height: 14px; - font-size: 14px; - font-family: PingFangSC-Regular; - color: #636C78; - line-height: 14px; - } - .admin-card-text-3{ - height: 12px; - font-size: 12px; - font-family: PingFangSC-Regular; - color: #5F5F5F; - margin-top: 39px; - } - .admin-card-text-4{ - height: 12px; - font-size: 12px; - font-family: PingFangSC-Regular; - color: #5F5F5F; - margin-top: 21px; - } - .admin-card-text-5{ - max-height: 55px; - font-size: 14px; - font-family: PingFangSC-Regular; - color: #F21019; - margin-top: 25px; - overflow-y: auto; - } - .admin-index-bottom-item{ - overflow: hidden; - } - .admin-index-bottom-item div{ - padding-left: 22px; - padding-right: 6px; - } - .admin-index-top-item-list-item-child-dot-red2{ - margin-right: 5px; - } - .admin-index-top-item-list-item-child-dot-red2::after{ - content: ''; - display: inline-block; - width: 6px; - height: 6px; - background: #F21019; - border-radius: 50%; - position: relative; - top: -2px; - } - .admin-card-text-3 span,.admin-card-text-4 span{ - font-size: 11px; - margin-left: 5px; - } - .primary-msg{ - color: #69717D; - } - .admin-right-arrow{ - font-size: 14px; - position: relative; - top: 1px; - } - .menu-left-icon-img{ - font-size: 14px; - } - .menu-left-icon-img-16.admin-select{ - display: none !important; - } - .menu-left-icon-img-16{ - font-size: 18px !important; - margin-right: -4px; - margin-top: -1px; - display: inline-block; - position: relative; - top: 3px; - right: 1px; - } - .menu-left-icon-img-15{ - font-size: 15px !important; - } - @media screen and (min-width:1270px) and (max-width:1440px){ - - .admin-layui-col-top-right{ - min-width: 788px; - } - .admin-layui-col-top-left{ - min-width: 259px; - } - .admin-menu-layui-side-scroll{ - width: 188px !important; - } - .admin-menu-list .layui-nav-tree{ - width: 188px !important; - } - .admin-menu-list.layui-side{ - width: 188px !important; - } - .layui-nav-tree .layui-nav-child dd.layui-this::after { - content: ""; - display: block; - position: absolute; - z-index: 8; - left: 184px !important; - background-color: rgba(24, 144, 255, 1) !important; - border-radius: 4px !important; - width: 4px !important; - height: 29px !important; - margin-top: 5.5px !important; - top: 0px; - } - .admin-menu-list .layui-nav-bar{ - top: 184px !important; - } - .admin-layui-body{ - padding: 12px 12px 12px 0px; - } - .admin-layui-col-bottom-list{ - min-width: 217px; - } - .admin-layui-col-bottom-list-last{ - padding-right: 0px !important; - min-width: 207px !important; - } - } - @media screen and (min-width:1200px) and (max-width:1260px){ - .admin-layui-col-top-right{ - max-width: 724px !important; - } - .admin-layui-col-top-left{ - min-width: 259px; - } - .admin-menu-layui-side-scroll{ - width: 188px !important; - } - .admin-menu-list .layui-nav-tree{ - width: 188px !important; - } - .admin-menu-list.layui-side{ - width: 188px !important; - } - .layui-nav-tree .layui-nav-child dd.layui-this::after { - content: ""; - display: block; - position: absolute; - z-index: 8; - left: 184px !important; - background-color: rgba(24, 144, 255, 1) !important; - border-radius: 4px !important; - width: 4px !important; - height: 29px !important; - margin-top: 5.5px !important; - top: 0px; - } - .admin-menu-list .layui-nav-bar{ - top: 184px !important; - } - .admin-layui-body{ - padding: 12px 12px 12px 0px; - } - .admin-layui-col-bottom-list{ - min-width: 217px; - } - .admin-layui-col-bottom-list-last{ - padding-right: 0px !important; - min-width: 207px !important; - } - } </style> {/literal} </head> From b9052c59f28f5caeb82d77cadb7d79a07365e2f1 Mon Sep 17 00:00:00 2001 From: Jason <1432334894@qq.com> Date: Mon, 1 Aug 2022 17:29:34 +0800 Subject: [PATCH 07/12] =?UTF-8?q?=E9=A6=96=E9=A1=B5echarts=E5=9B=BE?= =?UTF-8?q?=E8=A1=A8=E4=BA=A4=E4=BA=92=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view/js/echarts_5.5.3.js | 95211 +++++++++++++++++++++++++++++++++++++++++ view/js/echarts_5.5.3.min.js | 45 + view/templates/tpl/home.html | 168 +- 3 files changed, 95422 insertions(+), 2 deletions(-) create mode 100644 view/js/echarts_5.5.3.js create mode 100644 view/js/echarts_5.5.3.min.js diff --git a/view/js/echarts_5.5.3.js b/view/js/echarts_5.5.3.js new file mode 100644 index 0000000..43e9ed6 --- /dev/null +++ b/view/js/echarts_5.5.3.js @@ -0,0 +1,95211 @@ + +/* +* 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. +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.echarts = {})); +}(this, (function (exports) { 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + /* global Reflect, Promise */ + + var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + var Browser = (function () { + function Browser() { + this.firefox = false; + this.ie = false; + this.edge = false; + this.newEdge = false; + this.weChat = false; + } + return Browser; + }()); + var Env = (function () { + function Env() { + this.browser = new Browser(); + this.node = false; + this.wxa = false; + this.worker = false; + this.svgSupported = false; + this.touchEventsSupported = false; + this.pointerEventsSupported = false; + this.domSupported = false; + this.transformSupported = false; + this.transform3dSupported = false; + this.hasGlobalWindow = typeof window !== 'undefined'; + } + return Env; + }()); + var env = new Env(); + if (typeof wx === 'object' && typeof wx.getSystemInfoSync === 'function') { + env.wxa = true; + env.touchEventsSupported = true; + } + else if (typeof document === 'undefined' && typeof self !== 'undefined') { + env.worker = true; + } + else if (typeof navigator === 'undefined') { + env.node = true; + env.svgSupported = true; + } + else { + detect(navigator.userAgent, env); + } + function detect(ua, env) { + var browser = env.browser; + var firefox = ua.match(/Firefox\/([\d.]+)/); + var ie = ua.match(/MSIE\s([\d.]+)/) + || ua.match(/Trident\/.+?rv:(([\d.]+))/); + var edge = ua.match(/Edge?\/([\d.]+)/); + var weChat = (/micromessenger/i).test(ua); + if (firefox) { + browser.firefox = true; + browser.version = firefox[1]; + } + if (ie) { + browser.ie = true; + browser.version = ie[1]; + } + if (edge) { + browser.edge = true; + browser.version = edge[1]; + browser.newEdge = +edge[1].split('.')[0] > 18; + } + if (weChat) { + browser.weChat = true; + } + env.svgSupported = typeof SVGRect !== 'undefined'; + env.touchEventsSupported = 'ontouchstart' in window && !browser.ie && !browser.edge; + env.pointerEventsSupported = 'onpointerdown' in window + && (browser.edge || (browser.ie && +browser.version >= 11)); + env.domSupported = typeof document !== 'undefined'; + var style = document.documentElement.style; + env.transform3dSupported = ((browser.ie && 'transition' in style) + || browser.edge + || (('WebKitCSSMatrix' in window) && ('m11' in new WebKitCSSMatrix())) + || 'MozPerspective' in style) + && !('OTransition' in style); + env.transformSupported = env.transform3dSupported + || (browser.ie && +browser.version >= 9); + } + + var DEFAULT_FONT_SIZE = 12; + var DEFAULT_FONT_FAMILY = 'sans-serif'; + var DEFAULT_FONT = DEFAULT_FONT_SIZE + "px " + DEFAULT_FONT_FAMILY; + var OFFSET = 20; + var SCALE = 100; + var defaultWidthMapStr = "007LLmW'55;N0500LLLLLLLLLL00NNNLzWW\\\\WQb\\0FWLg\\bWb\\WQ\\WrWWQ000CL5LLFLL0LL**F*gLLLL5F0LF\\FFF5.5N"; + function getTextWidthMap(mapStr) { + var map = {}; + if (typeof JSON === 'undefined') { + return map; + } + for (var i = 0; i < mapStr.length; i++) { + var char = String.fromCharCode(i + 32); + var size = (mapStr.charCodeAt(i) - OFFSET) / SCALE; + map[char] = size; + } + return map; + } + var DEFAULT_TEXT_WIDTH_MAP = getTextWidthMap(defaultWidthMapStr); + var platformApi = { + createCanvas: function () { + return typeof document !== 'undefined' + && document.createElement('canvas'); + }, + measureText: (function () { + var _ctx; + var _cachedFont; + return function (text, font) { + if (!_ctx) { + var canvas = platformApi.createCanvas(); + _ctx = canvas && canvas.getContext('2d'); + } + if (_ctx) { + if (_cachedFont !== font) { + _cachedFont = _ctx.font = font || DEFAULT_FONT; + } + return _ctx.measureText(text); + } + else { + text = text || ''; + font = font || DEFAULT_FONT; + var res = /^([0-9]*?)px$/.exec(font); + var fontSize = +(res && res[1]) || DEFAULT_FONT_SIZE; + var width = 0; + if (font.indexOf('mono') >= 0) { + width = fontSize * text.length; + } + else { + for (var i = 0; i < text.length; i++) { + var preCalcWidth = DEFAULT_TEXT_WIDTH_MAP[text[i]]; + width += preCalcWidth == null ? fontSize : (preCalcWidth * fontSize); + } + } + return { width: width }; + } + }; + })(), + loadImage: function (src, onload, onerror) { + var image = new Image(); + image.onload = onload; + image.onerror = onerror; + image.src = src; + return image; + } + }; + function setPlatformAPI(newPlatformApis) { + for (var key in platformApi) { + if (newPlatformApis[key]) { + platformApi[key] = newPlatformApis[key]; + } + } + } + + var BUILTIN_OBJECT = reduce([ + 'Function', + 'RegExp', + 'Date', + 'Error', + 'CanvasGradient', + 'CanvasPattern', + 'Image', + 'Canvas' + ], function (obj, val) { + obj['[object ' + val + ']'] = true; + return obj; + }, {}); + var TYPED_ARRAY = reduce([ + 'Int8', + 'Uint8', + 'Uint8Clamped', + 'Int16', + 'Uint16', + 'Int32', + 'Uint32', + 'Float32', + 'Float64' + ], function (obj, val) { + obj['[object ' + val + 'Array]'] = true; + return obj; + }, {}); + var objToString = Object.prototype.toString; + var arrayProto = Array.prototype; + var nativeForEach = arrayProto.forEach; + var nativeFilter = arrayProto.filter; + var nativeSlice = arrayProto.slice; + var nativeMap = arrayProto.map; + var ctorFunction = function () { }.constructor; + var protoFunction = ctorFunction ? ctorFunction.prototype : null; + var protoKey = '__proto__'; + var idStart = 0x0907; + function guid() { + return idStart++; + } + function logError() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (typeof console !== 'undefined') { + console.error.apply(console, args); + } + } + function clone(source) { + if (source == null || typeof source !== 'object') { + return source; + } + var result = source; + var typeStr = objToString.call(source); + if (typeStr === '[object Array]') { + if (!isPrimitive(source)) { + result = []; + for (var i = 0, len = source.length; i < len; i++) { + result[i] = clone(source[i]); + } + } + } + else if (TYPED_ARRAY[typeStr]) { + if (!isPrimitive(source)) { + var Ctor = source.constructor; + if (Ctor.from) { + result = Ctor.from(source); + } + else { + result = new Ctor(source.length); + for (var i = 0, len = source.length; i < len; i++) { + result[i] = source[i]; + } + } + } + } + else if (!BUILTIN_OBJECT[typeStr] && !isPrimitive(source) && !isDom(source)) { + result = {}; + for (var key in source) { + if (source.hasOwnProperty(key) && key !== protoKey) { + result[key] = clone(source[key]); + } + } + } + return result; + } + function merge(target, source, overwrite) { + if (!isObject(source) || !isObject(target)) { + return overwrite ? clone(source) : target; + } + for (var key in source) { + if (source.hasOwnProperty(key) && key !== protoKey) { + var targetProp = target[key]; + var sourceProp = source[key]; + if (isObject(sourceProp) + && isObject(targetProp) + && !isArray(sourceProp) + && !isArray(targetProp) + && !isDom(sourceProp) + && !isDom(targetProp) + && !isBuiltInObject(sourceProp) + && !isBuiltInObject(targetProp) + && !isPrimitive(sourceProp) + && !isPrimitive(targetProp)) { + merge(targetProp, sourceProp, overwrite); + } + else if (overwrite || !(key in target)) { + target[key] = clone(source[key]); + } + } + } + return target; + } + function mergeAll(targetAndSources, overwrite) { + var result = targetAndSources[0]; + for (var i = 1, len = targetAndSources.length; i < len; i++) { + result = merge(result, targetAndSources[i], overwrite); + } + return result; + } + function extend(target, source) { + if (Object.assign) { + Object.assign(target, source); + } + else { + for (var key in source) { + if (source.hasOwnProperty(key) && key !== protoKey) { + target[key] = source[key]; + } + } + } + return target; + } + function defaults(target, source, overlay) { + var keysArr = keys(source); + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + if ((overlay ? source[key] != null : target[key] == null)) { + target[key] = source[key]; + } + } + return target; + } + var createCanvas = platformApi.createCanvas; + function indexOf(array, value) { + if (array) { + if (array.indexOf) { + return array.indexOf(value); + } + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + } + return -1; + } + function inherits(clazz, baseClazz) { + var clazzPrototype = clazz.prototype; + function F() { } + F.prototype = baseClazz.prototype; + clazz.prototype = new F(); + for (var prop in clazzPrototype) { + if (clazzPrototype.hasOwnProperty(prop)) { + clazz.prototype[prop] = clazzPrototype[prop]; + } + } + clazz.prototype.constructor = clazz; + clazz.superClass = baseClazz; + } + function mixin(target, source, override) { + target = 'prototype' in target ? target.prototype : target; + source = 'prototype' in source ? source.prototype : source; + if (Object.getOwnPropertyNames) { + var keyList = Object.getOwnPropertyNames(source); + for (var i = 0; i < keyList.length; i++) { + var key = keyList[i]; + if (key !== 'constructor') { + if ((override ? source[key] != null : target[key] == null)) { + target[key] = source[key]; + } + } + } + } + else { + defaults(target, source, override); + } + } + function isArrayLike(data) { + if (!data) { + return false; + } + if (typeof data === 'string') { + return false; + } + return typeof data.length === 'number'; + } + function each(arr, cb, context) { + if (!(arr && cb)) { + return; + } + if (arr.forEach && arr.forEach === nativeForEach) { + arr.forEach(cb, context); + } + else if (arr.length === +arr.length) { + for (var i = 0, len = arr.length; i < len; i++) { + cb.call(context, arr[i], i, arr); + } + } + else { + for (var key in arr) { + if (arr.hasOwnProperty(key)) { + cb.call(context, arr[key], key, arr); + } + } + } + } + function map(arr, cb, context) { + if (!arr) { + return []; + } + if (!cb) { + return slice(arr); + } + if (arr.map && arr.map === nativeMap) { + return arr.map(cb, context); + } + else { + var result = []; + for (var i = 0, len = arr.length; i < len; i++) { + result.push(cb.call(context, arr[i], i, arr)); + } + return result; + } + } + function reduce(arr, cb, memo, context) { + if (!(arr && cb)) { + return; + } + for (var i = 0, len = arr.length; i < len; i++) { + memo = cb.call(context, memo, arr[i], i, arr); + } + return memo; + } + function filter(arr, cb, context) { + if (!arr) { + return []; + } + if (!cb) { + return slice(arr); + } + if (arr.filter && arr.filter === nativeFilter) { + return arr.filter(cb, context); + } + else { + var result = []; + for (var i = 0, len = arr.length; i < len; i++) { + if (cb.call(context, arr[i], i, arr)) { + result.push(arr[i]); + } + } + return result; + } + } + function find(arr, cb, context) { + if (!(arr && cb)) { + return; + } + for (var i = 0, len = arr.length; i < len; i++) { + if (cb.call(context, arr[i], i, arr)) { + return arr[i]; + } + } + } + function keys(obj) { + if (!obj) { + return []; + } + if (Object.keys) { + return Object.keys(obj); + } + var keyList = []; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + keyList.push(key); + } + } + return keyList; + } + function bindPolyfill(func, context) { + var args = []; + for (var _i = 2; _i < arguments.length; _i++) { + args[_i - 2] = arguments[_i]; + } + return function () { + return func.apply(context, args.concat(nativeSlice.call(arguments))); + }; + } + var bind = (protoFunction && isFunction(protoFunction.bind)) + ? protoFunction.call.bind(protoFunction.bind) + : bindPolyfill; + function curry(func) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + return function () { + return func.apply(this, args.concat(nativeSlice.call(arguments))); + }; + } + function isArray(value) { + if (Array.isArray) { + return Array.isArray(value); + } + return objToString.call(value) === '[object Array]'; + } + function isFunction(value) { + return typeof value === 'function'; + } + function isString(value) { + return typeof value === 'string'; + } + function isStringSafe(value) { + return objToString.call(value) === '[object String]'; + } + function isNumber(value) { + return typeof value === 'number'; + } + function isObject(value) { + var type = typeof value; + return type === 'function' || (!!value && type === 'object'); + } + function isBuiltInObject(value) { + return !!BUILTIN_OBJECT[objToString.call(value)]; + } + function isTypedArray(value) { + return !!TYPED_ARRAY[objToString.call(value)]; + } + function isDom(value) { + return typeof value === 'object' + && typeof value.nodeType === 'number' + && typeof value.ownerDocument === 'object'; + } + function isGradientObject(value) { + return value.colorStops != null; + } + function isImagePatternObject(value) { + return value.image != null; + } + function isRegExp(value) { + return objToString.call(value) === '[object RegExp]'; + } + function eqNaN(value) { + return value !== value; + } + function retrieve() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + for (var i = 0, len = args.length; i < len; i++) { + if (args[i] != null) { + return args[i]; + } + } + } + function retrieve2(value0, value1) { + return value0 != null + ? value0 + : value1; + } + function retrieve3(value0, value1, value2) { + return value0 != null + ? value0 + : value1 != null + ? value1 + : value2; + } + function slice(arr) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + return nativeSlice.apply(arr, args); + } + function normalizeCssArray(val) { + if (typeof (val) === 'number') { + return [val, val, val, val]; + } + var len = val.length; + if (len === 2) { + return [val[0], val[1], val[0], val[1]]; + } + else if (len === 3) { + return [val[0], val[1], val[2], val[1]]; + } + return val; + } + function assert(condition, message) { + if (!condition) { + throw new Error(message); + } + } + function trim(str) { + if (str == null) { + return null; + } + else if (typeof str.trim === 'function') { + return str.trim(); + } + else { + return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + } + } + var primitiveKey = '__ec_primitive__'; + function setAsPrimitive(obj) { + obj[primitiveKey] = true; + } + function isPrimitive(obj) { + return obj[primitiveKey]; + } + var HashMap = (function () { + function HashMap(obj) { + this.data = {}; + var isArr = isArray(obj); + this.data = {}; + var thisMap = this; + (obj instanceof HashMap) + ? obj.each(visit) + : (obj && each(obj, visit)); + function visit(value, key) { + isArr ? thisMap.set(value, key) : thisMap.set(key, value); + } + } + HashMap.prototype.get = function (key) { + return this.data.hasOwnProperty(key) ? this.data[key] : null; + }; + HashMap.prototype.set = function (key, value) { + return (this.data[key] = value); + }; + HashMap.prototype.each = function (cb, context) { + for (var key in this.data) { + if (this.data.hasOwnProperty(key)) { + cb.call(context, this.data[key], key); + } + } + }; + HashMap.prototype.keys = function () { + return keys(this.data); + }; + HashMap.prototype.removeKey = function (key) { + delete this.data[key]; + }; + return HashMap; + }()); + function createHashMap(obj) { + return new HashMap(obj); + } + function concatArray(a, b) { + var newArray = new a.constructor(a.length + b.length); + for (var i = 0; i < a.length; i++) { + newArray[i] = a[i]; + } + var offset = a.length; + for (var i = 0; i < b.length; i++) { + newArray[i + offset] = b[i]; + } + return newArray; + } + function createObject(proto, properties) { + var obj; + if (Object.create) { + obj = Object.create(proto); + } + else { + var StyleCtor = function () { }; + StyleCtor.prototype = proto; + obj = new StyleCtor(); + } + if (properties) { + extend(obj, properties); + } + return obj; + } + function disableUserSelect(dom) { + var domStyle = dom.style; + domStyle.webkitUserSelect = 'none'; + domStyle.userSelect = 'none'; + domStyle.webkitTapHighlightColor = 'rgba(0,0,0,0)'; + domStyle['-webkit-touch-callout'] = 'none'; + } + function hasOwn(own, prop) { + return own.hasOwnProperty(prop); + } + function noop() { } + var RADIAN_TO_DEGREE = 180 / Math.PI; + + var util = /*#__PURE__*/Object.freeze({ + __proto__: null, + guid: guid, + logError: logError, + clone: clone, + merge: merge, + mergeAll: mergeAll, + extend: extend, + defaults: defaults, + createCanvas: createCanvas, + indexOf: indexOf, + inherits: inherits, + mixin: mixin, + isArrayLike: isArrayLike, + each: each, + map: map, + reduce: reduce, + filter: filter, + find: find, + keys: keys, + bind: bind, + curry: curry, + isArray: isArray, + isFunction: isFunction, + isString: isString, + isStringSafe: isStringSafe, + isNumber: isNumber, + isObject: isObject, + isBuiltInObject: isBuiltInObject, + isTypedArray: isTypedArray, + isDom: isDom, + isGradientObject: isGradientObject, + isImagePatternObject: isImagePatternObject, + isRegExp: isRegExp, + eqNaN: eqNaN, + retrieve: retrieve, + retrieve2: retrieve2, + retrieve3: retrieve3, + slice: slice, + normalizeCssArray: normalizeCssArray, + assert: assert, + trim: trim, + setAsPrimitive: setAsPrimitive, + isPrimitive: isPrimitive, + HashMap: HashMap, + createHashMap: createHashMap, + concatArray: concatArray, + createObject: createObject, + disableUserSelect: disableUserSelect, + hasOwn: hasOwn, + noop: noop, + RADIAN_TO_DEGREE: RADIAN_TO_DEGREE + }); + + function create(x, y) { + if (x == null) { + x = 0; + } + if (y == null) { + y = 0; + } + return [x, y]; + } + function copy(out, v) { + out[0] = v[0]; + out[1] = v[1]; + return out; + } + function clone$1(v) { + return [v[0], v[1]]; + } + function set(out, a, b) { + out[0] = a; + out[1] = b; + return out; + } + function add(out, v1, v2) { + out[0] = v1[0] + v2[0]; + out[1] = v1[1] + v2[1]; + return out; + } + function scaleAndAdd(out, v1, v2, a) { + out[0] = v1[0] + v2[0] * a; + out[1] = v1[1] + v2[1] * a; + return out; + } + function sub(out, v1, v2) { + out[0] = v1[0] - v2[0]; + out[1] = v1[1] - v2[1]; + return out; + } + function len(v) { + return Math.sqrt(lenSquare(v)); + } + var length = len; + function lenSquare(v) { + return v[0] * v[0] + v[1] * v[1]; + } + var lengthSquare = lenSquare; + function mul(out, v1, v2) { + out[0] = v1[0] * v2[0]; + out[1] = v1[1] * v2[1]; + return out; + } + function div(out, v1, v2) { + out[0] = v1[0] / v2[0]; + out[1] = v1[1] / v2[1]; + return out; + } + function dot(v1, v2) { + return v1[0] * v2[0] + v1[1] * v2[1]; + } + function scale(out, v, s) { + out[0] = v[0] * s; + out[1] = v[1] * s; + return out; + } + function normalize(out, v) { + var d = len(v); + if (d === 0) { + out[0] = 0; + out[1] = 0; + } + else { + out[0] = v[0] / d; + out[1] = v[1] / d; + } + return out; + } + function distance(v1, v2) { + return Math.sqrt((v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1])); + } + var dist = distance; + function distanceSquare(v1, v2) { + return (v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1]); + } + var distSquare = distanceSquare; + function negate(out, v) { + out[0] = -v[0]; + out[1] = -v[1]; + return out; + } + function lerp(out, v1, v2, t) { + out[0] = v1[0] + t * (v2[0] - v1[0]); + out[1] = v1[1] + t * (v2[1] - v1[1]); + return out; + } + function applyTransform(out, v, m) { + var x = v[0]; + var y = v[1]; + out[0] = m[0] * x + m[2] * y + m[4]; + out[1] = m[1] * x + m[3] * y + m[5]; + return out; + } + function min(out, v1, v2) { + out[0] = Math.min(v1[0], v2[0]); + out[1] = Math.min(v1[1], v2[1]); + return out; + } + function max(out, v1, v2) { + out[0] = Math.max(v1[0], v2[0]); + out[1] = Math.max(v1[1], v2[1]); + return out; + } + + var vector = /*#__PURE__*/Object.freeze({ + __proto__: null, + create: create, + copy: copy, + clone: clone$1, + set: set, + add: add, + scaleAndAdd: scaleAndAdd, + sub: sub, + len: len, + length: length, + lenSquare: lenSquare, + lengthSquare: lengthSquare, + mul: mul, + div: div, + dot: dot, + scale: scale, + normalize: normalize, + distance: distance, + dist: dist, + distanceSquare: distanceSquare, + distSquare: distSquare, + negate: negate, + lerp: lerp, + applyTransform: applyTransform, + min: min, + max: max + }); + + var Param = (function () { + function Param(target, e) { + this.target = target; + this.topTarget = e && e.topTarget; + } + return Param; + }()); + var Draggable = (function () { + function Draggable(handler) { + this.handler = handler; + handler.on('mousedown', this._dragStart, this); + handler.on('mousemove', this._drag, this); + handler.on('mouseup', this._dragEnd, this); + } + Draggable.prototype._dragStart = function (e) { + var draggingTarget = e.target; + while (draggingTarget && !draggingTarget.draggable) { + draggingTarget = draggingTarget.parent || draggingTarget.__hostTarget; + } + if (draggingTarget) { + this._draggingTarget = draggingTarget; + draggingTarget.dragging = true; + this._x = e.offsetX; + this._y = e.offsetY; + this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragstart', e.event); + } + }; + Draggable.prototype._drag = function (e) { + var draggingTarget = this._draggingTarget; + if (draggingTarget) { + var x = e.offsetX; + var y = e.offsetY; + var dx = x - this._x; + var dy = y - this._y; + this._x = x; + this._y = y; + draggingTarget.drift(dx, dy, e); + this.handler.dispatchToElement(new Param(draggingTarget, e), 'drag', e.event); + var dropTarget = this.handler.findHover(x, y, draggingTarget).target; + var lastDropTarget = this._dropTarget; + this._dropTarget = dropTarget; + if (draggingTarget !== dropTarget) { + if (lastDropTarget && dropTarget !== lastDropTarget) { + this.handler.dispatchToElement(new Param(lastDropTarget, e), 'dragleave', e.event); + } + if (dropTarget && dropTarget !== lastDropTarget) { + this.handler.dispatchToElement(new Param(dropTarget, e), 'dragenter', e.event); + } + } + } + }; + Draggable.prototype._dragEnd = function (e) { + var draggingTarget = this._draggingTarget; + if (draggingTarget) { + draggingTarget.dragging = false; + } + this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragend', e.event); + if (this._dropTarget) { + this.handler.dispatchToElement(new Param(this._dropTarget, e), 'drop', e.event); + } + this._draggingTarget = null; + this._dropTarget = null; + }; + return Draggable; + }()); + + var Eventful = (function () { + function Eventful(eventProcessors) { + if (eventProcessors) { + this._$eventProcessor = eventProcessors; + } + } + Eventful.prototype.on = function (event, query, handler, context) { + if (!this._$handlers) { + this._$handlers = {}; + } + var _h = this._$handlers; + if (typeof query === 'function') { + context = handler; + handler = query; + query = null; + } + if (!handler || !event) { + return this; + } + var eventProcessor = this._$eventProcessor; + if (query != null && eventProcessor && eventProcessor.normalizeQuery) { + query = eventProcessor.normalizeQuery(query); + } + if (!_h[event]) { + _h[event] = []; + } + for (var i = 0; i < _h[event].length; i++) { + if (_h[event][i].h === handler) { + return this; + } + } + var wrap = { + h: handler, + query: query, + ctx: (context || this), + callAtLast: handler.zrEventfulCallAtLast + }; + var lastIndex = _h[event].length - 1; + var lastWrap = _h[event][lastIndex]; + (lastWrap && lastWrap.callAtLast) + ? _h[event].splice(lastIndex, 0, wrap) + : _h[event].push(wrap); + return this; + }; + Eventful.prototype.isSilent = function (eventName) { + var _h = this._$handlers; + return !_h || !_h[eventName] || !_h[eventName].length; + }; + Eventful.prototype.off = function (eventType, handler) { + var _h = this._$handlers; + if (!_h) { + return this; + } + if (!eventType) { + this._$handlers = {}; + return this; + } + if (handler) { + if (_h[eventType]) { + var newList = []; + for (var i = 0, l = _h[eventType].length; i < l; i++) { + if (_h[eventType][i].h !== handler) { + newList.push(_h[eventType][i]); + } + } + _h[eventType] = newList; + } + if (_h[eventType] && _h[eventType].length === 0) { + delete _h[eventType]; + } + } + else { + delete _h[eventType]; + } + return this; + }; + Eventful.prototype.trigger = function (eventType) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + if (!this._$handlers) { + return this; + } + var _h = this._$handlers[eventType]; + var eventProcessor = this._$eventProcessor; + if (_h) { + var argLen = args.length; + var len = _h.length; + for (var i = 0; i < len; i++) { + var hItem = _h[i]; + if (eventProcessor + && eventProcessor.filter + && hItem.query != null + && !eventProcessor.filter(eventType, hItem.query)) { + continue; + } + switch (argLen) { + case 0: + hItem.h.call(hItem.ctx); + break; + case 1: + hItem.h.call(hItem.ctx, args[0]); + break; + case 2: + hItem.h.call(hItem.ctx, args[0], args[1]); + break; + default: + hItem.h.apply(hItem.ctx, args); + break; + } + } + } + eventProcessor && eventProcessor.afterTrigger + && eventProcessor.afterTrigger(eventType); + return this; + }; + Eventful.prototype.triggerWithContext = function (type) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + if (!this._$handlers) { + return this; + } + var _h = this._$handlers[type]; + var eventProcessor = this._$eventProcessor; + if (_h) { + var argLen = args.length; + var ctx = args[argLen - 1]; + var len = _h.length; + for (var i = 0; i < len; i++) { + var hItem = _h[i]; + if (eventProcessor + && eventProcessor.filter + && hItem.query != null + && !eventProcessor.filter(type, hItem.query)) { + continue; + } + switch (argLen) { + case 0: + hItem.h.call(ctx); + break; + case 1: + hItem.h.call(ctx, args[0]); + break; + case 2: + hItem.h.call(ctx, args[0], args[1]); + break; + default: + hItem.h.apply(ctx, args.slice(1, argLen - 1)); + break; + } + } + } + eventProcessor && eventProcessor.afterTrigger + && eventProcessor.afterTrigger(type); + return this; + }; + return Eventful; + }()); + + var LN2 = Math.log(2); + function determinant(rows, rank, rowStart, rowMask, colMask, detCache) { + var cacheKey = rowMask + '-' + colMask; + var fullRank = rows.length; + if (detCache.hasOwnProperty(cacheKey)) { + return detCache[cacheKey]; + } + if (rank === 1) { + var colStart = Math.round(Math.log(((1 << fullRank) - 1) & ~colMask) / LN2); + return rows[rowStart][colStart]; + } + var subRowMask = rowMask | (1 << rowStart); + var subRowStart = rowStart + 1; + while (rowMask & (1 << subRowStart)) { + subRowStart++; + } + var sum = 0; + for (var j = 0, colLocalIdx = 0; j < fullRank; j++) { + var colTag = 1 << j; + if (!(colTag & colMask)) { + sum += (colLocalIdx % 2 ? -1 : 1) * rows[rowStart][j] + * determinant(rows, rank - 1, subRowStart, subRowMask, colMask | colTag, detCache); + colLocalIdx++; + } + } + detCache[cacheKey] = sum; + return sum; + } + function buildTransformer(src, dest) { + var mA = [ + [src[0], src[1], 1, 0, 0, 0, -dest[0] * src[0], -dest[0] * src[1]], + [0, 0, 0, src[0], src[1], 1, -dest[1] * src[0], -dest[1] * src[1]], + [src[2], src[3], 1, 0, 0, 0, -dest[2] * src[2], -dest[2] * src[3]], + [0, 0, 0, src[2], src[3], 1, -dest[3] * src[2], -dest[3] * src[3]], + [src[4], src[5], 1, 0, 0, 0, -dest[4] * src[4], -dest[4] * src[5]], + [0, 0, 0, src[4], src[5], 1, -dest[5] * src[4], -dest[5] * src[5]], + [src[6], src[7], 1, 0, 0, 0, -dest[6] * src[6], -dest[6] * src[7]], + [0, 0, 0, src[6], src[7], 1, -dest[7] * src[6], -dest[7] * src[7]] + ]; + var detCache = {}; + var det = determinant(mA, 8, 0, 0, 0, detCache); + if (det === 0) { + return; + } + var vh = []; + for (var i = 0; i < 8; i++) { + for (var j = 0; j < 8; j++) { + vh[j] == null && (vh[j] = 0); + vh[j] += ((i + j) % 2 ? -1 : 1) + * determinant(mA, 7, i === 0 ? 1 : 0, 1 << i, 1 << j, detCache) + / det * dest[i]; + } + } + return function (out, srcPointX, srcPointY) { + var pk = srcPointX * vh[6] + srcPointY * vh[7] + 1; + out[0] = (srcPointX * vh[0] + srcPointY * vh[1] + vh[2]) / pk; + out[1] = (srcPointX * vh[3] + srcPointY * vh[4] + vh[5]) / pk; + }; + } + + var EVENT_SAVED_PROP = '___zrEVENTSAVED'; + var _calcOut = []; + function transformLocalCoord(out, elFrom, elTarget, inX, inY) { + return transformCoordWithViewport(_calcOut, elFrom, inX, inY, true) + && transformCoordWithViewport(out, elTarget, _calcOut[0], _calcOut[1]); + } + function transformCoordWithViewport(out, el, inX, inY, inverse) { + if (el.getBoundingClientRect && env.domSupported && !isCanvasEl(el)) { + var saved = el[EVENT_SAVED_PROP] || (el[EVENT_SAVED_PROP] = {}); + var markers = prepareCoordMarkers(el, saved); + var transformer = preparePointerTransformer(markers, saved, inverse); + if (transformer) { + transformer(out, inX, inY); + return true; + } + } + return false; + } + function prepareCoordMarkers(el, saved) { + var markers = saved.markers; + if (markers) { + return markers; + } + markers = saved.markers = []; + var propLR = ['left', 'right']; + var propTB = ['top', 'bottom']; + for (var i = 0; i < 4; i++) { + var marker = document.createElement('div'); + var stl = marker.style; + var idxLR = i % 2; + var idxTB = (i >> 1) % 2; + stl.cssText = [ + 'position: absolute', + 'visibility: hidden', + 'padding: 0', + 'margin: 0', + 'border-width: 0', + 'user-select: none', + 'width:0', + 'height:0', + propLR[idxLR] + ':0', + propTB[idxTB] + ':0', + propLR[1 - idxLR] + ':auto', + propTB[1 - idxTB] + ':auto', + '' + ].join('!important;'); + el.appendChild(marker); + markers.push(marker); + } + return markers; + } + function preparePointerTransformer(markers, saved, inverse) { + var transformerName = inverse ? 'invTrans' : 'trans'; + var transformer = saved[transformerName]; + var oldSrcCoords = saved.srcCoords; + var srcCoords = []; + var destCoords = []; + var oldCoordTheSame = true; + for (var i = 0; i < 4; i++) { + var rect = markers[i].getBoundingClientRect(); + var ii = 2 * i; + var x = rect.left; + var y = rect.top; + srcCoords.push(x, y); + oldCoordTheSame = oldCoordTheSame && oldSrcCoords && x === oldSrcCoords[ii] && y === oldSrcCoords[ii + 1]; + destCoords.push(markers[i].offsetLeft, markers[i].offsetTop); + } + return (oldCoordTheSame && transformer) + ? transformer + : (saved.srcCoords = srcCoords, + saved[transformerName] = inverse + ? buildTransformer(destCoords, srcCoords) + : buildTransformer(srcCoords, destCoords)); + } + function isCanvasEl(el) { + return el.nodeName.toUpperCase() === 'CANVAS'; + } + + var MOUSE_EVENT_REG = /^(?:mouse|pointer|contextmenu|drag|drop)|click/; + var _calcOut$1 = []; + var firefoxNotSupportOffsetXY = env.browser.firefox + && +env.browser.version.split('.')[0] < 39; + function clientToLocal(el, e, out, calculate) { + out = out || {}; + if (calculate) { + calculateZrXY(el, e, out); + } + else if (firefoxNotSupportOffsetXY + && e.layerX != null + && e.layerX !== e.offsetX) { + out.zrX = e.layerX; + out.zrY = e.layerY; + } + else if (e.offsetX != null) { + out.zrX = e.offsetX; + out.zrY = e.offsetY; + } + else { + calculateZrXY(el, e, out); + } + return out; + } + function calculateZrXY(el, e, out) { + if (env.domSupported && el.getBoundingClientRect) { + var ex = e.clientX; + var ey = e.clientY; + if (isCanvasEl(el)) { + var box = el.getBoundingClientRect(); + out.zrX = ex - box.left; + out.zrY = ey - box.top; + return; + } + else { + if (transformCoordWithViewport(_calcOut$1, el, ex, ey)) { + out.zrX = _calcOut$1[0]; + out.zrY = _calcOut$1[1]; + return; + } + } + } + out.zrX = out.zrY = 0; + } + function getNativeEvent(e) { + return e + || window.event; + } + function normalizeEvent(el, e, calculate) { + e = getNativeEvent(e); + if (e.zrX != null) { + return e; + } + var eventType = e.type; + var isTouch = eventType && eventType.indexOf('touch') >= 0; + if (!isTouch) { + clientToLocal(el, e, e, calculate); + var wheelDelta = getWheelDeltaMayPolyfill(e); + e.zrDelta = wheelDelta ? wheelDelta / 120 : -(e.detail || 0) / 3; + } + else { + var touch = eventType !== 'touchend' + ? e.targetTouches[0] + : e.changedTouches[0]; + touch && clientToLocal(el, touch, e, calculate); + } + var button = e.button; + if (e.which == null && button !== undefined && MOUSE_EVENT_REG.test(e.type)) { + e.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0))); + } + return e; + } + function getWheelDeltaMayPolyfill(e) { + var rawWheelDelta = e.wheelDelta; + if (rawWheelDelta) { + return rawWheelDelta; + } + var deltaX = e.deltaX; + var deltaY = e.deltaY; + if (deltaX == null || deltaY == null) { + return rawWheelDelta; + } + var delta = deltaY !== 0 ? Math.abs(deltaY) : Math.abs(deltaX); + var sign = deltaY > 0 ? -1 + : deltaY < 0 ? 1 + : deltaX > 0 ? -1 + : 1; + return 3 * delta * sign; + } + function addEventListener(el, name, handler, opt) { + el.addEventListener(name, handler, opt); + } + function removeEventListener(el, name, handler, opt) { + el.removeEventListener(name, handler, opt); + } + var stop = function (e) { + e.preventDefault(); + e.stopPropagation(); + e.cancelBubble = true; + }; + function isMiddleOrRightButtonOnMouseUpDown(e) { + return e.which === 2 || e.which === 3; + } + + var GestureMgr = (function () { + function GestureMgr() { + this._track = []; + } + GestureMgr.prototype.recognize = function (event, target, root) { + this._doTrack(event, target, root); + return this._recognize(event); + }; + GestureMgr.prototype.clear = function () { + this._track.length = 0; + return this; + }; + GestureMgr.prototype._doTrack = function (event, target, root) { + var touches = event.touches; + if (!touches) { + return; + } + var trackItem = { + points: [], + touches: [], + target: target, + event: event + }; + for (var i = 0, len = touches.length; i < len; i++) { + var touch = touches[i]; + var pos = clientToLocal(root, touch, {}); + trackItem.points.push([pos.zrX, pos.zrY]); + trackItem.touches.push(touch); + } + this._track.push(trackItem); + }; + GestureMgr.prototype._recognize = function (event) { + for (var eventName in recognizers) { + if (recognizers.hasOwnProperty(eventName)) { + var gestureInfo = recognizers[eventName](this._track, event); + if (gestureInfo) { + return gestureInfo; + } + } + } + }; + return GestureMgr; + }()); + function dist$1(pointPair) { + var dx = pointPair[1][0] - pointPair[0][0]; + var dy = pointPair[1][1] - pointPair[0][1]; + return Math.sqrt(dx * dx + dy * dy); + } + function center(pointPair) { + return [ + (pointPair[0][0] + pointPair[1][0]) / 2, + (pointPair[0][1] + pointPair[1][1]) / 2 + ]; + } + var recognizers = { + pinch: function (tracks, event) { + var trackLen = tracks.length; + if (!trackLen) { + return; + } + var pinchEnd = (tracks[trackLen - 1] || {}).points; + var pinchPre = (tracks[trackLen - 2] || {}).points || pinchEnd; + if (pinchPre + && pinchPre.length > 1 + && pinchEnd + && pinchEnd.length > 1) { + var pinchScale = dist$1(pinchEnd) / dist$1(pinchPre); + !isFinite(pinchScale) && (pinchScale = 1); + event.pinchScale = pinchScale; + var pinchCenter = center(pinchEnd); + event.pinchX = pinchCenter[0]; + event.pinchY = pinchCenter[1]; + return { + type: 'pinch', + target: tracks[0].target, + event: event + }; + } + } + }; + + var SILENT = 'silent'; + function makeEventPacket(eveType, targetInfo, event) { + return { + type: eveType, + event: event, + target: targetInfo.target, + topTarget: targetInfo.topTarget, + cancelBubble: false, + offsetX: event.zrX, + offsetY: event.zrY, + gestureEvent: event.gestureEvent, + pinchX: event.pinchX, + pinchY: event.pinchY, + pinchScale: event.pinchScale, + wheelDelta: event.zrDelta, + zrByTouch: event.zrByTouch, + which: event.which, + stop: stopEvent + }; + } + function stopEvent() { + stop(this.event); + } + var EmptyProxy = (function (_super) { + __extends(EmptyProxy, _super); + function EmptyProxy() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.handler = null; + return _this; + } + EmptyProxy.prototype.dispose = function () { }; + EmptyProxy.prototype.setCursor = function () { }; + return EmptyProxy; + }(Eventful)); + var HoveredResult = (function () { + function HoveredResult(x, y) { + this.x = x; + this.y = y; + } + return HoveredResult; + }()); + var handlerNames = [ + 'click', 'dblclick', 'mousewheel', 'mouseout', + 'mouseup', 'mousedown', 'mousemove', 'contextmenu' + ]; + var Handler = (function (_super) { + __extends(Handler, _super); + function Handler(storage, painter, proxy, painterRoot) { + var _this = _super.call(this) || this; + _this._hovered = new HoveredResult(0, 0); + _this.storage = storage; + _this.painter = painter; + _this.painterRoot = painterRoot; + proxy = proxy || new EmptyProxy(); + _this.proxy = null; + _this.setHandlerProxy(proxy); + _this._draggingMgr = new Draggable(_this); + return _this; + } + Handler.prototype.setHandlerProxy = function (proxy) { + if (this.proxy) { + this.proxy.dispose(); + } + if (proxy) { + each(handlerNames, function (name) { + proxy.on && proxy.on(name, this[name], this); + }, this); + proxy.handler = this; + } + this.proxy = proxy; + }; + Handler.prototype.mousemove = function (event) { + var x = event.zrX; + var y = event.zrY; + var isOutside = isOutsideBoundary(this, x, y); + var lastHovered = this._hovered; + var lastHoveredTarget = lastHovered.target; + if (lastHoveredTarget && !lastHoveredTarget.__zr) { + lastHovered = this.findHover(lastHovered.x, lastHovered.y); + lastHoveredTarget = lastHovered.target; + } + var hovered = this._hovered = isOutside ? new HoveredResult(x, y) : this.findHover(x, y); + var hoveredTarget = hovered.target; + var proxy = this.proxy; + proxy.setCursor && proxy.setCursor(hoveredTarget ? hoveredTarget.cursor : 'default'); + if (lastHoveredTarget && hoveredTarget !== lastHoveredTarget) { + this.dispatchToElement(lastHovered, 'mouseout', event); + } + this.dispatchToElement(hovered, 'mousemove', event); + if (hoveredTarget && hoveredTarget !== lastHoveredTarget) { + this.dispatchToElement(hovered, 'mouseover', event); + } + }; + Handler.prototype.mouseout = function (event) { + var eventControl = event.zrEventControl; + if (eventControl !== 'only_globalout') { + this.dispatchToElement(this._hovered, 'mouseout', event); + } + if (eventControl !== 'no_globalout') { + this.trigger('globalout', { type: 'globalout', event: event }); + } + }; + Handler.prototype.resize = function () { + this._hovered = new HoveredResult(0, 0); + }; + Handler.prototype.dispatch = function (eventName, eventArgs) { + var handler = this[eventName]; + handler && handler.call(this, eventArgs); + }; + Handler.prototype.dispose = function () { + this.proxy.dispose(); + this.storage = null; + this.proxy = null; + this.painter = null; + }; + Handler.prototype.setCursorStyle = function (cursorStyle) { + var proxy = this.proxy; + proxy.setCursor && proxy.setCursor(cursorStyle); + }; + Handler.prototype.dispatchToElement = function (targetInfo, eventName, event) { + targetInfo = targetInfo || {}; + var el = targetInfo.target; + if (el && el.silent) { + return; + } + var eventKey = ('on' + eventName); + var eventPacket = makeEventPacket(eventName, targetInfo, event); + while (el) { + el[eventKey] + && (eventPacket.cancelBubble = !!el[eventKey].call(el, eventPacket)); + el.trigger(eventName, eventPacket); + el = el.__hostTarget ? el.__hostTarget : el.parent; + if (eventPacket.cancelBubble) { + break; + } + } + if (!eventPacket.cancelBubble) { + this.trigger(eventName, eventPacket); + if (this.painter && this.painter.eachOtherLayer) { + this.painter.eachOtherLayer(function (layer) { + if (typeof (layer[eventKey]) === 'function') { + layer[eventKey].call(layer, eventPacket); + } + if (layer.trigger) { + layer.trigger(eventName, eventPacket); + } + }); + } + } + }; + Handler.prototype.findHover = function (x, y, exclude) { + var list = this.storage.getDisplayList(); + var out = new HoveredResult(x, y); + for (var i = list.length - 1; i >= 0; i--) { + var hoverCheckResult = void 0; + if (list[i] !== exclude + && !list[i].ignore + && (hoverCheckResult = isHover(list[i], x, y))) { + !out.topTarget && (out.topTarget = list[i]); + if (hoverCheckResult !== SILENT) { + out.target = list[i]; + break; + } + } + } + return out; + }; + Handler.prototype.processGesture = function (event, stage) { + if (!this._gestureMgr) { + this._gestureMgr = new GestureMgr(); + } + var gestureMgr = this._gestureMgr; + stage === 'start' && gestureMgr.clear(); + var gestureInfo = gestureMgr.recognize(event, this.findHover(event.zrX, event.zrY, null).target, this.proxy.dom); + stage === 'end' && gestureMgr.clear(); + if (gestureInfo) { + var type = gestureInfo.type; + event.gestureEvent = type; + var res = new HoveredResult(); + res.target = gestureInfo.target; + this.dispatchToElement(res, type, gestureInfo.event); + } + }; + return Handler; + }(Eventful)); + each(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick', 'contextmenu'], function (name) { + Handler.prototype[name] = function (event) { + var x = event.zrX; + var y = event.zrY; + var isOutside = isOutsideBoundary(this, x, y); + var hovered; + var hoveredTarget; + if (name !== 'mouseup' || !isOutside) { + hovered = this.findHover(x, y); + hoveredTarget = hovered.target; + } + if (name === 'mousedown') { + this._downEl = hoveredTarget; + this._downPoint = [event.zrX, event.zrY]; + this._upEl = hoveredTarget; + } + else if (name === 'mouseup') { + this._upEl = hoveredTarget; + } + else if (name === 'click') { + if (this._downEl !== this._upEl + || !this._downPoint + || dist(this._downPoint, [event.zrX, event.zrY]) > 4) { + return; + } + this._downPoint = null; + } + this.dispatchToElement(hovered, name, event); + }; + }); + function isHover(displayable, x, y) { + if (displayable[displayable.rectHover ? 'rectContain' : 'contain'](x, y)) { + var el = displayable; + var isSilent = void 0; + var ignoreClip = false; + while (el) { + if (el.ignoreClip) { + ignoreClip = true; + } + if (!ignoreClip) { + var clipPath = el.getClipPath(); + if (clipPath && !clipPath.contain(x, y)) { + return false; + } + if (el.silent) { + isSilent = true; + } + } + var hostEl = el.__hostTarget; + el = hostEl ? hostEl : el.parent; + } + return isSilent ? SILENT : true; + } + return false; + } + function isOutsideBoundary(handlerInstance, x, y) { + var painter = handlerInstance.painter; + return x < 0 || x > painter.getWidth() || y < 0 || y > painter.getHeight(); + } + + var DEFAULT_MIN_MERGE = 32; + var DEFAULT_MIN_GALLOPING = 7; + function minRunLength(n) { + var r = 0; + while (n >= DEFAULT_MIN_MERGE) { + r |= n & 1; + n >>= 1; + } + return n + r; + } + function makeAscendingRun(array, lo, hi, compare) { + var runHi = lo + 1; + if (runHi === hi) { + return 1; + } + if (compare(array[runHi++], array[lo]) < 0) { + while (runHi < hi && compare(array[runHi], array[runHi - 1]) < 0) { + runHi++; + } + reverseRun(array, lo, runHi); + } + else { + while (runHi < hi && compare(array[runHi], array[runHi - 1]) >= 0) { + runHi++; + } + } + return runHi - lo; + } + function reverseRun(array, lo, hi) { + hi--; + while (lo < hi) { + var t = array[lo]; + array[lo++] = array[hi]; + array[hi--] = t; + } + } + function binaryInsertionSort(array, lo, hi, start, compare) { + if (start === lo) { + start++; + } + for (; start < hi; start++) { + var pivot = array[start]; + var left = lo; + var right = start; + var mid; + while (left < right) { + mid = left + right >>> 1; + if (compare(pivot, array[mid]) < 0) { + right = mid; + } + else { + left = mid + 1; + } + } + var n = start - left; + switch (n) { + case 3: + array[left + 3] = array[left + 2]; + case 2: + array[left + 2] = array[left + 1]; + case 1: + array[left + 1] = array[left]; + break; + default: + while (n > 0) { + array[left + n] = array[left + n - 1]; + n--; + } + } + array[left] = pivot; + } + } + function gallopLeft(value, array, start, length, hint, compare) { + var lastOffset = 0; + var maxOffset = 0; + var offset = 1; + if (compare(value, array[start + hint]) > 0) { + maxOffset = length - hint; + while (offset < maxOffset && compare(value, array[start + hint + offset]) > 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + lastOffset += hint; + offset += hint; + } + else { + maxOffset = hint + 1; + while (offset < maxOffset && compare(value, array[start + hint - offset]) <= 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + var tmp = lastOffset; + lastOffset = hint - offset; + offset = hint - tmp; + } + lastOffset++; + while (lastOffset < offset) { + var m = lastOffset + (offset - lastOffset >>> 1); + if (compare(value, array[start + m]) > 0) { + lastOffset = m + 1; + } + else { + offset = m; + } + } + return offset; + } + function gallopRight(value, array, start, length, hint, compare) { + var lastOffset = 0; + var maxOffset = 0; + var offset = 1; + if (compare(value, array[start + hint]) < 0) { + maxOffset = hint + 1; + while (offset < maxOffset && compare(value, array[start + hint - offset]) < 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + var tmp = lastOffset; + lastOffset = hint - offset; + offset = hint - tmp; + } + else { + maxOffset = length - hint; + while (offset < maxOffset && compare(value, array[start + hint + offset]) >= 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + lastOffset += hint; + offset += hint; + } + lastOffset++; + while (lastOffset < offset) { + var m = lastOffset + (offset - lastOffset >>> 1); + if (compare(value, array[start + m]) < 0) { + offset = m; + } + else { + lastOffset = m + 1; + } + } + return offset; + } + function TimSort(array, compare) { + var minGallop = DEFAULT_MIN_GALLOPING; + var length = 0; + var runStart; + var runLength; + var stackSize = 0; + length = array.length; + var tmp = []; + runStart = []; + runLength = []; + function pushRun(_runStart, _runLength) { + runStart[stackSize] = _runStart; + runLength[stackSize] = _runLength; + stackSize += 1; + } + function mergeRuns() { + while (stackSize > 1) { + var n = stackSize - 2; + if ((n >= 1 && runLength[n - 1] <= runLength[n] + runLength[n + 1]) + || (n >= 2 && runLength[n - 2] <= runLength[n] + runLength[n - 1])) { + if (runLength[n - 1] < runLength[n + 1]) { + n--; + } + } + else if (runLength[n] > runLength[n + 1]) { + break; + } + mergeAt(n); + } + } + function forceMergeRuns() { + while (stackSize > 1) { + var n = stackSize - 2; + if (n > 0 && runLength[n - 1] < runLength[n + 1]) { + n--; + } + mergeAt(n); + } + } + function mergeAt(i) { + var start1 = runStart[i]; + var length1 = runLength[i]; + var start2 = runStart[i + 1]; + var length2 = runLength[i + 1]; + runLength[i] = length1 + length2; + if (i === stackSize - 3) { + runStart[i + 1] = runStart[i + 2]; + runLength[i + 1] = runLength[i + 2]; + } + stackSize--; + var k = gallopRight(array[start2], array, start1, length1, 0, compare); + start1 += k; + length1 -= k; + if (length1 === 0) { + return; + } + length2 = gallopLeft(array[start1 + length1 - 1], array, start2, length2, length2 - 1, compare); + if (length2 === 0) { + return; + } + if (length1 <= length2) { + mergeLow(start1, length1, start2, length2); + } + else { + mergeHigh(start1, length1, start2, length2); + } + } + function mergeLow(start1, length1, start2, length2) { + var i = 0; + for (i = 0; i < length1; i++) { + tmp[i] = array[start1 + i]; + } + var cursor1 = 0; + var cursor2 = start2; + var dest = start1; + array[dest++] = array[cursor2++]; + if (--length2 === 0) { + for (i = 0; i < length1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + return; + } + if (length1 === 1) { + for (i = 0; i < length2; i++) { + array[dest + i] = array[cursor2 + i]; + } + array[dest + length2] = tmp[cursor1]; + return; + } + var _minGallop = minGallop; + var count1; + var count2; + var exit; + while (1) { + count1 = 0; + count2 = 0; + exit = false; + do { + if (compare(array[cursor2], tmp[cursor1]) < 0) { + array[dest++] = array[cursor2++]; + count2++; + count1 = 0; + if (--length2 === 0) { + exit = true; + break; + } + } + else { + array[dest++] = tmp[cursor1++]; + count1++; + count2 = 0; + if (--length1 === 1) { + exit = true; + break; + } + } + } while ((count1 | count2) < _minGallop); + if (exit) { + break; + } + do { + count1 = gallopRight(array[cursor2], tmp, cursor1, length1, 0, compare); + if (count1 !== 0) { + for (i = 0; i < count1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + dest += count1; + cursor1 += count1; + length1 -= count1; + if (length1 <= 1) { + exit = true; + break; + } + } + array[dest++] = array[cursor2++]; + if (--length2 === 0) { + exit = true; + break; + } + count2 = gallopLeft(tmp[cursor1], array, cursor2, length2, 0, compare); + if (count2 !== 0) { + for (i = 0; i < count2; i++) { + array[dest + i] = array[cursor2 + i]; + } + dest += count2; + cursor2 += count2; + length2 -= count2; + if (length2 === 0) { + exit = true; + break; + } + } + array[dest++] = tmp[cursor1++]; + if (--length1 === 1) { + exit = true; + break; + } + _minGallop--; + } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING); + if (exit) { + break; + } + if (_minGallop < 0) { + _minGallop = 0; + } + _minGallop += 2; + } + minGallop = _minGallop; + minGallop < 1 && (minGallop = 1); + if (length1 === 1) { + for (i = 0; i < length2; i++) { + array[dest + i] = array[cursor2 + i]; + } + array[dest + length2] = tmp[cursor1]; + } + else if (length1 === 0) { + throw new Error(); + } + else { + for (i = 0; i < length1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + } + } + function mergeHigh(start1, length1, start2, length2) { + var i = 0; + for (i = 0; i < length2; i++) { + tmp[i] = array[start2 + i]; + } + var cursor1 = start1 + length1 - 1; + var cursor2 = length2 - 1; + var dest = start2 + length2 - 1; + var customCursor = 0; + var customDest = 0; + array[dest--] = array[cursor1--]; + if (--length1 === 0) { + customCursor = dest - (length2 - 1); + for (i = 0; i < length2; i++) { + array[customCursor + i] = tmp[i]; + } + return; + } + if (length2 === 1) { + dest -= length1; + cursor1 -= length1; + customDest = dest + 1; + customCursor = cursor1 + 1; + for (i = length1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + array[dest] = tmp[cursor2]; + return; + } + var _minGallop = minGallop; + while (true) { + var count1 = 0; + var count2 = 0; + var exit = false; + do { + if (compare(tmp[cursor2], array[cursor1]) < 0) { + array[dest--] = array[cursor1--]; + count1++; + count2 = 0; + if (--length1 === 0) { + exit = true; + break; + } + } + else { + array[dest--] = tmp[cursor2--]; + count2++; + count1 = 0; + if (--length2 === 1) { + exit = true; + break; + } + } + } while ((count1 | count2) < _minGallop); + if (exit) { + break; + } + do { + count1 = length1 - gallopRight(tmp[cursor2], array, start1, length1, length1 - 1, compare); + if (count1 !== 0) { + dest -= count1; + cursor1 -= count1; + length1 -= count1; + customDest = dest + 1; + customCursor = cursor1 + 1; + for (i = count1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + if (length1 === 0) { + exit = true; + break; + } + } + array[dest--] = tmp[cursor2--]; + if (--length2 === 1) { + exit = true; + break; + } + count2 = length2 - gallopLeft(array[cursor1], tmp, 0, length2, length2 - 1, compare); + if (count2 !== 0) { + dest -= count2; + cursor2 -= count2; + length2 -= count2; + customDest = dest + 1; + customCursor = cursor2 + 1; + for (i = 0; i < count2; i++) { + array[customDest + i] = tmp[customCursor + i]; + } + if (length2 <= 1) { + exit = true; + break; + } + } + array[dest--] = array[cursor1--]; + if (--length1 === 0) { + exit = true; + break; + } + _minGallop--; + } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING); + if (exit) { + break; + } + if (_minGallop < 0) { + _minGallop = 0; + } + _minGallop += 2; + } + minGallop = _minGallop; + if (minGallop < 1) { + minGallop = 1; + } + if (length2 === 1) { + dest -= length1; + cursor1 -= length1; + customDest = dest + 1; + customCursor = cursor1 + 1; + for (i = length1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + array[dest] = tmp[cursor2]; + } + else if (length2 === 0) { + throw new Error(); + } + else { + customCursor = dest - (length2 - 1); + for (i = 0; i < length2; i++) { + array[customCursor + i] = tmp[i]; + } + } + } + return { + mergeRuns: mergeRuns, + forceMergeRuns: forceMergeRuns, + pushRun: pushRun + }; + } + function sort(array, compare, lo, hi) { + if (!lo) { + lo = 0; + } + if (!hi) { + hi = array.length; + } + var remaining = hi - lo; + if (remaining < 2) { + return; + } + var runLength = 0; + if (remaining < DEFAULT_MIN_MERGE) { + runLength = makeAscendingRun(array, lo, hi, compare); + binaryInsertionSort(array, lo, hi, lo + runLength, compare); + return; + } + var ts = TimSort(array, compare); + var minRun = minRunLength(remaining); + do { + runLength = makeAscendingRun(array, lo, hi, compare); + if (runLength < minRun) { + var force = remaining; + if (force > minRun) { + force = minRun; + } + binaryInsertionSort(array, lo, lo + force, lo + runLength, compare); + runLength = force; + } + ts.pushRun(lo, runLength); + ts.mergeRuns(); + remaining -= runLength; + lo += runLength; + } while (remaining !== 0); + ts.forceMergeRuns(); + } + + var REDRAW_BIT = 1; + var STYLE_CHANGED_BIT = 2; + var SHAPE_CHANGED_BIT = 4; + + var invalidZErrorLogged = false; + function logInvalidZError() { + if (invalidZErrorLogged) { + return; + } + invalidZErrorLogged = true; + console.warn('z / z2 / zlevel of displayable is invalid, which may cause unexpected errors'); + } + function shapeCompareFunc(a, b) { + if (a.zlevel === b.zlevel) { + if (a.z === b.z) { + return a.z2 - b.z2; + } + return a.z - b.z; + } + return a.zlevel - b.zlevel; + } + var Storage = (function () { + function Storage() { + this._roots = []; + this._displayList = []; + this._displayListLen = 0; + this.displayableSortFunc = shapeCompareFunc; + } + Storage.prototype.traverse = function (cb, context) { + for (var i = 0; i < this._roots.length; i++) { + this._roots[i].traverse(cb, context); + } + }; + Storage.prototype.getDisplayList = function (update, includeIgnore) { + includeIgnore = includeIgnore || false; + var displayList = this._displayList; + if (update || !displayList.length) { + this.updateDisplayList(includeIgnore); + } + return displayList; + }; + Storage.prototype.updateDisplayList = function (includeIgnore) { + this._displayListLen = 0; + var roots = this._roots; + var displayList = this._displayList; + for (var i = 0, len = roots.length; i < len; i++) { + this._updateAndAddDisplayable(roots[i], null, includeIgnore); + } + displayList.length = this._displayListLen; + sort(displayList, shapeCompareFunc); + }; + Storage.prototype._updateAndAddDisplayable = function (el, clipPaths, includeIgnore) { + if (el.ignore && !includeIgnore) { + return; + } + el.beforeUpdate(); + el.update(); + el.afterUpdate(); + var userSetClipPath = el.getClipPath(); + if (el.ignoreClip) { + clipPaths = null; + } + else if (userSetClipPath) { + if (clipPaths) { + clipPaths = clipPaths.slice(); + } + else { + clipPaths = []; + } + var currentClipPath = userSetClipPath; + var parentClipPath = el; + while (currentClipPath) { + currentClipPath.parent = parentClipPath; + currentClipPath.updateTransform(); + clipPaths.push(currentClipPath); + parentClipPath = currentClipPath; + currentClipPath = currentClipPath.getClipPath(); + } + } + if (el.childrenRef) { + var children = el.childrenRef(); + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (el.__dirty) { + child.__dirty |= REDRAW_BIT; + } + this._updateAndAddDisplayable(child, clipPaths, includeIgnore); + } + el.__dirty = 0; + } + else { + var disp = el; + if (clipPaths && clipPaths.length) { + disp.__clipPaths = clipPaths; + } + else if (disp.__clipPaths && disp.__clipPaths.length > 0) { + disp.__clipPaths = []; + } + if (isNaN(disp.z)) { + logInvalidZError(); + disp.z = 0; + } + if (isNaN(disp.z2)) { + logInvalidZError(); + disp.z2 = 0; + } + if (isNaN(disp.zlevel)) { + logInvalidZError(); + disp.zlevel = 0; + } + this._displayList[this._displayListLen++] = disp; + } + var decalEl = el.getDecalElement && el.getDecalElement(); + if (decalEl) { + this._updateAndAddDisplayable(decalEl, clipPaths, includeIgnore); + } + var textGuide = el.getTextGuideLine(); + if (textGuide) { + this._updateAndAddDisplayable(textGuide, clipPaths, includeIgnore); + } + var textEl = el.getTextContent(); + if (textEl) { + this._updateAndAddDisplayable(textEl, clipPaths, includeIgnore); + } + }; + Storage.prototype.addRoot = function (el) { + if (el.__zr && el.__zr.storage === this) { + return; + } + this._roots.push(el); + }; + Storage.prototype.delRoot = function (el) { + if (el instanceof Array) { + for (var i = 0, l = el.length; i < l; i++) { + this.delRoot(el[i]); + } + return; + } + var idx = indexOf(this._roots, el); + if (idx >= 0) { + this._roots.splice(idx, 1); + } + }; + Storage.prototype.delAllRoots = function () { + this._roots = []; + this._displayList = []; + this._displayListLen = 0; + return; + }; + Storage.prototype.getRoots = function () { + return this._roots; + }; + Storage.prototype.dispose = function () { + this._displayList = null; + this._roots = null; + }; + return Storage; + }()); + + var requestAnimationFrame; + requestAnimationFrame = (env.hasGlobalWindow + && ((window.requestAnimationFrame && window.requestAnimationFrame.bind(window)) + || (window.msRequestAnimationFrame && window.msRequestAnimationFrame.bind(window)) + || window.mozRequestAnimationFrame + || window.webkitRequestAnimationFrame)) || function (func) { + return setTimeout(func, 16); + }; + var requestAnimationFrame$1 = requestAnimationFrame; + + var easingFuncs = { + linear: function (k) { + return k; + }, + quadraticIn: function (k) { + return k * k; + }, + quadraticOut: function (k) { + return k * (2 - k); + }, + quadraticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k; + } + return -0.5 * (--k * (k - 2) - 1); + }, + cubicIn: function (k) { + return k * k * k; + }, + cubicOut: function (k) { + return --k * k * k + 1; + }, + cubicInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k; + } + return 0.5 * ((k -= 2) * k * k + 2); + }, + quarticIn: function (k) { + return k * k * k * k; + }, + quarticOut: function (k) { + return 1 - (--k * k * k * k); + }, + quarticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k; + } + return -0.5 * ((k -= 2) * k * k * k - 2); + }, + quinticIn: function (k) { + return k * k * k * k * k; + }, + quinticOut: function (k) { + return --k * k * k * k * k + 1; + }, + quinticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k * k; + } + return 0.5 * ((k -= 2) * k * k * k * k + 2); + }, + sinusoidalIn: function (k) { + return 1 - Math.cos(k * Math.PI / 2); + }, + sinusoidalOut: function (k) { + return Math.sin(k * Math.PI / 2); + }, + sinusoidalInOut: function (k) { + return 0.5 * (1 - Math.cos(Math.PI * k)); + }, + exponentialIn: function (k) { + return k === 0 ? 0 : Math.pow(1024, k - 1); + }, + exponentialOut: function (k) { + return k === 1 ? 1 : 1 - Math.pow(2, -10 * k); + }, + exponentialInOut: function (k) { + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if ((k *= 2) < 1) { + return 0.5 * Math.pow(1024, k - 1); + } + return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2); + }, + circularIn: function (k) { + return 1 - Math.sqrt(1 - k * k); + }, + circularOut: function (k) { + return Math.sqrt(1 - (--k * k)); + }, + circularInOut: function (k) { + if ((k *= 2) < 1) { + return -0.5 * (Math.sqrt(1 - k * k) - 1); + } + return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); + }, + elasticIn: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; + s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return -(a * Math.pow(2, 10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p)); + }, + elasticOut: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; + s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return (a * Math.pow(2, -10 * k) + * Math.sin((k - s) * (2 * Math.PI) / p) + 1); + }, + elasticInOut: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; + s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + if ((k *= 2) < 1) { + return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + backIn: function (k) { + var s = 1.70158; + return k * k * ((s + 1) * k - s); + }, + backOut: function (k) { + var s = 1.70158; + return --k * k * ((s + 1) * k + s) + 1; + }, + backInOut: function (k) { + var s = 1.70158 * 1.525; + if ((k *= 2) < 1) { + return 0.5 * (k * k * ((s + 1) * k - s)); + } + return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); + }, + bounceIn: function (k) { + return 1 - easingFuncs.bounceOut(1 - k); + }, + bounceOut: function (k) { + if (k < (1 / 2.75)) { + return 7.5625 * k * k; + } + else if (k < (2 / 2.75)) { + return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; + } + else if (k < (2.5 / 2.75)) { + return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; + } + else { + return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; + } + }, + bounceInOut: function (k) { + if (k < 0.5) { + return easingFuncs.bounceIn(k * 2) * 0.5; + } + return easingFuncs.bounceOut(k * 2 - 1) * 0.5 + 0.5; + } + }; + + var mathPow = Math.pow; + var mathSqrt = Math.sqrt; + var EPSILON = 1e-8; + var EPSILON_NUMERIC = 1e-4; + var THREE_SQRT = mathSqrt(3); + var ONE_THIRD = 1 / 3; + var _v0 = create(); + var _v1 = create(); + var _v2 = create(); + function isAroundZero(val) { + return val > -EPSILON && val < EPSILON; + } + function isNotAroundZero(val) { + return val > EPSILON || val < -EPSILON; + } + function cubicAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return onet * onet * (onet * p0 + 3 * t * p1) + + t * t * (t * p3 + 3 * onet * p2); + } + function cubicDerivativeAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return 3 * (((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet + + (p3 - p2) * t * t); + } + function cubicRootAt(p0, p1, p2, p3, val, roots) { + var a = p3 + 3 * (p1 - p2) - p0; + var b = 3 * (p2 - p1 * 2 + p0); + var c = 3 * (p1 - p0); + var d = p0 - val; + var A = b * b - 3 * a * c; + var B = b * c - 9 * a * d; + var C = c * c - 3 * b * d; + var n = 0; + if (isAroundZero(A) && isAroundZero(B)) { + if (isAroundZero(b)) { + roots[0] = 0; + } + else { + var t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } + else { + var disc = B * B - 4 * A * C; + if (isAroundZero(disc)) { + var K = B / A; + var t1 = -b / a + K; + var t2 = -K / 2; + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } + else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var Y1 = A * b + 1.5 * a * (-B + discSqrt); + var Y2 = A * b + 1.5 * a * (-B - discSqrt); + if (Y1 < 0) { + Y1 = -mathPow(-Y1, ONE_THIRD); + } + else { + Y1 = mathPow(Y1, ONE_THIRD); + } + if (Y2 < 0) { + Y2 = -mathPow(-Y2, ONE_THIRD); + } + else { + Y2 = mathPow(Y2, ONE_THIRD); + } + var t1 = (-b - (Y1 + Y2)) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + else { + var T = (2 * A * b - 3 * a * B) / (2 * mathSqrt(A * A * A)); + var theta = Math.acos(T) / 3; + var ASqrt = mathSqrt(A); + var tmp = Math.cos(theta); + var t1 = (-b - 2 * ASqrt * tmp) / (3 * a); + var t2 = (-b + ASqrt * (tmp + THREE_SQRT * Math.sin(theta))) / (3 * a); + var t3 = (-b + ASqrt * (tmp - THREE_SQRT * Math.sin(theta))) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + if (t3 >= 0 && t3 <= 1) { + roots[n++] = t3; + } + } + } + return n; + } + function cubicExtrema(p0, p1, p2, p3, extrema) { + var b = 6 * p2 - 12 * p1 + 6 * p0; + var a = 9 * p1 + 3 * p3 - 3 * p0 - 9 * p2; + var c = 3 * p1 - 3 * p0; + var n = 0; + if (isAroundZero(a)) { + if (isNotAroundZero(b)) { + var t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + extrema[n++] = t1; + } + } + } + else { + var disc = b * b - 4 * a * c; + if (isAroundZero(disc)) { + extrema[0] = -b / (2 * a); + } + else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var t1 = (-b + discSqrt) / (2 * a); + var t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + extrema[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + extrema[n++] = t2; + } + } + } + return n; + } + function cubicSubdivide(p0, p1, p2, p3, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p23 = (p3 - p2) * t + p2; + var p012 = (p12 - p01) * t + p01; + var p123 = (p23 - p12) * t + p12; + var p0123 = (p123 - p012) * t + p012; + out[0] = p0; + out[1] = p01; + out[2] = p012; + out[3] = p0123; + out[4] = p0123; + out[5] = p123; + out[6] = p23; + out[7] = p3; + } + function cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, out) { + var t; + var interval = 0.005; + var d = Infinity; + var prev; + var next; + var d1; + var d2; + _v0[0] = x; + _v0[1] = y; + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = cubicAt(x0, x1, x2, x3, _t); + _v1[1] = cubicAt(y0, y1, y2, y3, _t); + d1 = distSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + prev = t - interval; + next = t + interval; + _v1[0] = cubicAt(x0, x1, x2, x3, prev); + _v1[1] = cubicAt(y0, y1, y2, y3, prev); + d1 = distSquare(_v1, _v0); + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } + else { + _v2[0] = cubicAt(x0, x1, x2, x3, next); + _v2[1] = cubicAt(y0, y1, y2, y3, next); + d2 = distSquare(_v2, _v0); + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } + else { + interval *= 0.5; + } + } + } + if (out) { + out[0] = cubicAt(x0, x1, x2, x3, t); + out[1] = cubicAt(y0, y1, y2, y3, t); + } + return mathSqrt(d); + } + function cubicLength(x0, y0, x1, y1, x2, y2, x3, y3, iteration) { + var px = x0; + var py = y0; + var d = 0; + var step = 1 / iteration; + for (var i = 1; i <= iteration; i++) { + var t = i * step; + var x = cubicAt(x0, x1, x2, x3, t); + var y = cubicAt(y0, y1, y2, y3, t); + var dx = x - px; + var dy = y - py; + d += Math.sqrt(dx * dx + dy * dy); + px = x; + py = y; + } + return d; + } + function quadraticAt(p0, p1, p2, t) { + var onet = 1 - t; + return onet * (onet * p0 + 2 * t * p1) + t * t * p2; + } + function quadraticDerivativeAt(p0, p1, p2, t) { + return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1)); + } + function quadraticRootAt(p0, p1, p2, val, roots) { + var a = p0 - 2 * p1 + p2; + var b = 2 * (p1 - p0); + var c = p0 - val; + var n = 0; + if (isAroundZero(a)) { + if (isNotAroundZero(b)) { + var t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } + else { + var disc = b * b - 4 * a * c; + if (isAroundZero(disc)) { + var t1 = -b / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var t1 = (-b + discSqrt) / (2 * a); + var t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } + } + return n; + } + function quadraticExtremum(p0, p1, p2) { + var divider = p0 + p2 - 2 * p1; + if (divider === 0) { + return 0.5; + } + else { + return (p0 - p1) / divider; + } + } + function quadraticSubdivide(p0, p1, p2, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p012 = (p12 - p01) * t + p01; + out[0] = p0; + out[1] = p01; + out[2] = p012; + out[3] = p012; + out[4] = p12; + out[5] = p2; + } + function quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, out) { + var t; + var interval = 0.005; + var d = Infinity; + _v0[0] = x; + _v0[1] = y; + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = quadraticAt(x0, x1, x2, _t); + _v1[1] = quadraticAt(y0, y1, y2, _t); + var d1 = distSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + var prev = t - interval; + var next = t + interval; + _v1[0] = quadraticAt(x0, x1, x2, prev); + _v1[1] = quadraticAt(y0, y1, y2, prev); + var d1 = distSquare(_v1, _v0); + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } + else { + _v2[0] = quadraticAt(x0, x1, x2, next); + _v2[1] = quadraticAt(y0, y1, y2, next); + var d2 = distSquare(_v2, _v0); + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } + else { + interval *= 0.5; + } + } + } + if (out) { + out[0] = quadraticAt(x0, x1, x2, t); + out[1] = quadraticAt(y0, y1, y2, t); + } + return mathSqrt(d); + } + function quadraticLength(x0, y0, x1, y1, x2, y2, iteration) { + var px = x0; + var py = y0; + var d = 0; + var step = 1 / iteration; + for (var i = 1; i <= iteration; i++) { + var t = i * step; + var x = quadraticAt(x0, x1, x2, t); + var y = quadraticAt(y0, y1, y2, t); + var dx = x - px; + var dy = y - py; + d += Math.sqrt(dx * dx + dy * dy); + px = x; + py = y; + } + return d; + } + + var regexp = /cubic-bezier\(([0-9,\.e ]+)\)/; + function createCubicEasingFunc(cubicEasingStr) { + var cubic = cubicEasingStr && regexp.exec(cubicEasingStr); + if (cubic) { + var points = cubic[1].split(','); + var a_1 = +trim(points[0]); + var b_1 = +trim(points[1]); + var c_1 = +trim(points[2]); + var d_1 = +trim(points[3]); + if (isNaN(a_1 + b_1 + c_1 + d_1)) { + return; + } + var roots_1 = []; + return function (p) { + return p <= 0 + ? 0 : p >= 1 + ? 1 + : cubicRootAt(0, a_1, c_1, 1, p, roots_1) && cubicAt(0, b_1, d_1, 1, roots_1[0]); + }; + } + } + + var Clip = (function () { + function Clip(opts) { + this._inited = false; + this._startTime = 0; + this._pausedTime = 0; + this._paused = false; + this._life = opts.life || 1000; + this._delay = opts.delay || 0; + this.loop = opts.loop || false; + this.onframe = opts.onframe || noop; + this.ondestroy = opts.ondestroy || noop; + this.onrestart = opts.onrestart || noop; + opts.easing && this.setEasing(opts.easing); + } + Clip.prototype.step = function (globalTime, deltaTime) { + if (!this._inited) { + this._startTime = globalTime + this._delay; + this._inited = true; + } + if (this._paused) { + this._pausedTime += deltaTime; + return; + } + var life = this._life; + var elapsedTime = globalTime - this._startTime - this._pausedTime; + var percent = elapsedTime / life; + if (percent < 0) { + percent = 0; + } + percent = Math.min(percent, 1); + var easingFunc = this.easingFunc; + var schedule = easingFunc ? easingFunc(percent) : percent; + this.onframe(schedule); + if (percent === 1) { + if (this.loop) { + var remainder = elapsedTime % life; + this._startTime = globalTime - remainder; + this._pausedTime = 0; + this.onrestart(); + } + else { + return true; + } + } + return false; + }; + Clip.prototype.pause = function () { + this._paused = true; + }; + Clip.prototype.resume = function () { + this._paused = false; + }; + Clip.prototype.setEasing = function (easing) { + this.easing = easing; + this.easingFunc = isFunction(easing) + ? easing + : easingFuncs[easing] || createCubicEasingFunc(easing); + }; + return Clip; + }()); + + var Entry = (function () { + function Entry(val) { + this.value = val; + } + return Entry; + }()); + var LinkedList = (function () { + function LinkedList() { + this._len = 0; + } + LinkedList.prototype.insert = function (val) { + var entry = new Entry(val); + this.insertEntry(entry); + return entry; + }; + LinkedList.prototype.insertEntry = function (entry) { + if (!this.head) { + this.head = this.tail = entry; + } + else { + this.tail.next = entry; + entry.prev = this.tail; + entry.next = null; + this.tail = entry; + } + this._len++; + }; + LinkedList.prototype.remove = function (entry) { + var prev = entry.prev; + var next = entry.next; + if (prev) { + prev.next = next; + } + else { + this.head = next; + } + if (next) { + next.prev = prev; + } + else { + this.tail = prev; + } + entry.next = entry.prev = null; + this._len--; + }; + LinkedList.prototype.len = function () { + return this._len; + }; + LinkedList.prototype.clear = function () { + this.head = this.tail = null; + this._len = 0; + }; + return LinkedList; + }()); + var LRU = (function () { + function LRU(maxSize) { + this._list = new LinkedList(); + this._maxSize = 10; + this._map = {}; + this._maxSize = maxSize; + } + LRU.prototype.put = function (key, value) { + var list = this._list; + var map = this._map; + var removed = null; + if (map[key] == null) { + var len = list.len(); + var entry = this._lastRemovedEntry; + if (len >= this._maxSize && len > 0) { + var leastUsedEntry = list.head; + list.remove(leastUsedEntry); + delete map[leastUsedEntry.key]; + removed = leastUsedEntry.value; + this._lastRemovedEntry = leastUsedEntry; + } + if (entry) { + entry.value = value; + } + else { + entry = new Entry(value); + } + entry.key = key; + list.insertEntry(entry); + map[key] = entry; + } + return removed; + }; + LRU.prototype.get = function (key) { + var entry = this._map[key]; + var list = this._list; + if (entry != null) { + if (entry !== list.tail) { + list.remove(entry); + list.insertEntry(entry); + } + return entry.value; + } + }; + LRU.prototype.clear = function () { + this._list.clear(); + this._map = {}; + }; + LRU.prototype.len = function () { + return this._list.len(); + }; + return LRU; + }()); + + var kCSSColorTable = { + 'transparent': [0, 0, 0, 0], 'aliceblue': [240, 248, 255, 1], + 'antiquewhite': [250, 235, 215, 1], 'aqua': [0, 255, 255, 1], + 'aquamarine': [127, 255, 212, 1], 'azure': [240, 255, 255, 1], + 'beige': [245, 245, 220, 1], 'bisque': [255, 228, 196, 1], + 'black': [0, 0, 0, 1], 'blanchedalmond': [255, 235, 205, 1], + 'blue': [0, 0, 255, 1], 'blueviolet': [138, 43, 226, 1], + 'brown': [165, 42, 42, 1], 'burlywood': [222, 184, 135, 1], + 'cadetblue': [95, 158, 160, 1], 'chartreuse': [127, 255, 0, 1], + 'chocolate': [210, 105, 30, 1], 'coral': [255, 127, 80, 1], + 'cornflowerblue': [100, 149, 237, 1], 'cornsilk': [255, 248, 220, 1], + 'crimson': [220, 20, 60, 1], 'cyan': [0, 255, 255, 1], + 'darkblue': [0, 0, 139, 1], 'darkcyan': [0, 139, 139, 1], + 'darkgoldenrod': [184, 134, 11, 1], 'darkgray': [169, 169, 169, 1], + 'darkgreen': [0, 100, 0, 1], 'darkgrey': [169, 169, 169, 1], + 'darkkhaki': [189, 183, 107, 1], 'darkmagenta': [139, 0, 139, 1], + 'darkolivegreen': [85, 107, 47, 1], 'darkorange': [255, 140, 0, 1], + 'darkorchid': [153, 50, 204, 1], 'darkred': [139, 0, 0, 1], + 'darksalmon': [233, 150, 122, 1], 'darkseagreen': [143, 188, 143, 1], + 'darkslateblue': [72, 61, 139, 1], 'darkslategray': [47, 79, 79, 1], + 'darkslategrey': [47, 79, 79, 1], 'darkturquoise': [0, 206, 209, 1], + 'darkviolet': [148, 0, 211, 1], 'deeppink': [255, 20, 147, 1], + 'deepskyblue': [0, 191, 255, 1], 'dimgray': [105, 105, 105, 1], + 'dimgrey': [105, 105, 105, 1], 'dodgerblue': [30, 144, 255, 1], + 'firebrick': [178, 34, 34, 1], 'floralwhite': [255, 250, 240, 1], + 'forestgreen': [34, 139, 34, 1], 'fuchsia': [255, 0, 255, 1], + 'gainsboro': [220, 220, 220, 1], 'ghostwhite': [248, 248, 255, 1], + 'gold': [255, 215, 0, 1], 'goldenrod': [218, 165, 32, 1], + 'gray': [128, 128, 128, 1], 'green': [0, 128, 0, 1], + 'greenyellow': [173, 255, 47, 1], 'grey': [128, 128, 128, 1], + 'honeydew': [240, 255, 240, 1], 'hotpink': [255, 105, 180, 1], + 'indianred': [205, 92, 92, 1], 'indigo': [75, 0, 130, 1], + 'ivory': [255, 255, 240, 1], 'khaki': [240, 230, 140, 1], + 'lavender': [230, 230, 250, 1], 'lavenderblush': [255, 240, 245, 1], + 'lawngreen': [124, 252, 0, 1], 'lemonchiffon': [255, 250, 205, 1], + 'lightblue': [173, 216, 230, 1], 'lightcoral': [240, 128, 128, 1], + 'lightcyan': [224, 255, 255, 1], 'lightgoldenrodyellow': [250, 250, 210, 1], + 'lightgray': [211, 211, 211, 1], 'lightgreen': [144, 238, 144, 1], + 'lightgrey': [211, 211, 211, 1], 'lightpink': [255, 182, 193, 1], + 'lightsalmon': [255, 160, 122, 1], 'lightseagreen': [32, 178, 170, 1], + 'lightskyblue': [135, 206, 250, 1], 'lightslategray': [119, 136, 153, 1], + 'lightslategrey': [119, 136, 153, 1], 'lightsteelblue': [176, 196, 222, 1], + 'lightyellow': [255, 255, 224, 1], 'lime': [0, 255, 0, 1], + 'limegreen': [50, 205, 50, 1], 'linen': [250, 240, 230, 1], + 'magenta': [255, 0, 255, 1], 'maroon': [128, 0, 0, 1], + 'mediumaquamarine': [102, 205, 170, 1], 'mediumblue': [0, 0, 205, 1], + 'mediumorchid': [186, 85, 211, 1], 'mediumpurple': [147, 112, 219, 1], + 'mediumseagreen': [60, 179, 113, 1], 'mediumslateblue': [123, 104, 238, 1], + 'mediumspringgreen': [0, 250, 154, 1], 'mediumturquoise': [72, 209, 204, 1], + 'mediumvioletred': [199, 21, 133, 1], 'midnightblue': [25, 25, 112, 1], + 'mintcream': [245, 255, 250, 1], 'mistyrose': [255, 228, 225, 1], + 'moccasin': [255, 228, 181, 1], 'navajowhite': [255, 222, 173, 1], + 'navy': [0, 0, 128, 1], 'oldlace': [253, 245, 230, 1], + 'olive': [128, 128, 0, 1], 'olivedrab': [107, 142, 35, 1], + 'orange': [255, 165, 0, 1], 'orangered': [255, 69, 0, 1], + 'orchid': [218, 112, 214, 1], 'palegoldenrod': [238, 232, 170, 1], + 'palegreen': [152, 251, 152, 1], 'paleturquoise': [175, 238, 238, 1], + 'palevioletred': [219, 112, 147, 1], 'papayawhip': [255, 239, 213, 1], + 'peachpuff': [255, 218, 185, 1], 'peru': [205, 133, 63, 1], + 'pink': [255, 192, 203, 1], 'plum': [221, 160, 221, 1], + 'powderblue': [176, 224, 230, 1], 'purple': [128, 0, 128, 1], + 'red': [255, 0, 0, 1], 'rosybrown': [188, 143, 143, 1], + 'royalblue': [65, 105, 225, 1], 'saddlebrown': [139, 69, 19, 1], + 'salmon': [250, 128, 114, 1], 'sandybrown': [244, 164, 96, 1], + 'seagreen': [46, 139, 87, 1], 'seashell': [255, 245, 238, 1], + 'sienna': [160, 82, 45, 1], 'silver': [192, 192, 192, 1], + 'skyblue': [135, 206, 235, 1], 'slateblue': [106, 90, 205, 1], + 'slategray': [112, 128, 144, 1], 'slategrey': [112, 128, 144, 1], + 'snow': [255, 250, 250, 1], 'springgreen': [0, 255, 127, 1], + 'steelblue': [70, 130, 180, 1], 'tan': [210, 180, 140, 1], + 'teal': [0, 128, 128, 1], 'thistle': [216, 191, 216, 1], + 'tomato': [255, 99, 71, 1], 'turquoise': [64, 224, 208, 1], + 'violet': [238, 130, 238, 1], 'wheat': [245, 222, 179, 1], + 'white': [255, 255, 255, 1], 'whitesmoke': [245, 245, 245, 1], + 'yellow': [255, 255, 0, 1], 'yellowgreen': [154, 205, 50, 1] + }; + function clampCssByte(i) { + i = Math.round(i); + return i < 0 ? 0 : i > 255 ? 255 : i; + } + function clampCssAngle(i) { + i = Math.round(i); + return i < 0 ? 0 : i > 360 ? 360 : i; + } + function clampCssFloat(f) { + return f < 0 ? 0 : f > 1 ? 1 : f; + } + function parseCssInt(val) { + var str = val; + if (str.length && str.charAt(str.length - 1) === '%') { + return clampCssByte(parseFloat(str) / 100 * 255); + } + return clampCssByte(parseInt(str, 10)); + } + function parseCssFloat(val) { + var str = val; + if (str.length && str.charAt(str.length - 1) === '%') { + return clampCssFloat(parseFloat(str) / 100); + } + return clampCssFloat(parseFloat(str)); + } + function cssHueToRgb(m1, m2, h) { + if (h < 0) { + h += 1; + } + else if (h > 1) { + h -= 1; + } + if (h * 6 < 1) { + return m1 + (m2 - m1) * h * 6; + } + if (h * 2 < 1) { + return m2; + } + if (h * 3 < 2) { + return m1 + (m2 - m1) * (2 / 3 - h) * 6; + } + return m1; + } + function lerpNumber(a, b, p) { + return a + (b - a) * p; + } + function setRgba(out, r, g, b, a) { + out[0] = r; + out[1] = g; + out[2] = b; + out[3] = a; + return out; + } + function copyRgba(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; + } + var colorCache = new LRU(20); + var lastRemovedArr = null; + function putToCache(colorStr, rgbaArr) { + if (lastRemovedArr) { + copyRgba(lastRemovedArr, rgbaArr); + } + lastRemovedArr = colorCache.put(colorStr, lastRemovedArr || (rgbaArr.slice())); + } + function parse(colorStr, rgbaArr) { + if (!colorStr) { + return; + } + rgbaArr = rgbaArr || []; + var cached = colorCache.get(colorStr); + if (cached) { + return copyRgba(rgbaArr, cached); + } + colorStr = colorStr + ''; + var str = colorStr.replace(/ /g, '').toLowerCase(); + if (str in kCSSColorTable) { + copyRgba(rgbaArr, kCSSColorTable[str]); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + var strLen = str.length; + if (str.charAt(0) === '#') { + if (strLen === 4 || strLen === 5) { + var iv = parseInt(str.slice(1, 4), 16); + if (!(iv >= 0 && iv <= 0xfff)) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + setRgba(rgbaArr, ((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), (iv & 0xf0) | ((iv & 0xf0) >> 4), (iv & 0xf) | ((iv & 0xf) << 4), strLen === 5 ? parseInt(str.slice(4), 16) / 0xf : 1); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + else if (strLen === 7 || strLen === 9) { + var iv = parseInt(str.slice(1, 7), 16); + if (!(iv >= 0 && iv <= 0xffffff)) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + setRgba(rgbaArr, (iv & 0xff0000) >> 16, (iv & 0xff00) >> 8, iv & 0xff, strLen === 9 ? parseInt(str.slice(7), 16) / 0xff : 1); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + return; + } + var op = str.indexOf('('); + var ep = str.indexOf(')'); + if (op !== -1 && ep + 1 === strLen) { + var fname = str.substr(0, op); + var params = str.substr(op + 1, ep - (op + 1)).split(','); + var alpha = 1; + switch (fname) { + case 'rgba': + if (params.length !== 4) { + return params.length === 3 + ? setRgba(rgbaArr, +params[0], +params[1], +params[2], 1) + : setRgba(rgbaArr, 0, 0, 0, 1); + } + alpha = parseCssFloat(params.pop()); + case 'rgb': + if (params.length !== 3) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + setRgba(rgbaArr, parseCssInt(params[0]), parseCssInt(params[1]), parseCssInt(params[2]), alpha); + putToCache(colorStr, rgbaArr); + return rgbaArr; + case 'hsla': + if (params.length !== 4) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + params[3] = parseCssFloat(params[3]); + hsla2rgba(params, rgbaArr); + putToCache(colorStr, rgbaArr); + return rgbaArr; + case 'hsl': + if (params.length !== 3) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + hsla2rgba(params, rgbaArr); + putToCache(colorStr, rgbaArr); + return rgbaArr; + default: + return; + } + } + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + function hsla2rgba(hsla, rgba) { + var h = (((parseFloat(hsla[0]) % 360) + 360) % 360) / 360; + var s = parseCssFloat(hsla[1]); + var l = parseCssFloat(hsla[2]); + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var m1 = l * 2 - m2; + rgba = rgba || []; + setRgba(rgba, clampCssByte(cssHueToRgb(m1, m2, h + 1 / 3) * 255), clampCssByte(cssHueToRgb(m1, m2, h) * 255), clampCssByte(cssHueToRgb(m1, m2, h - 1 / 3) * 255), 1); + if (hsla.length === 4) { + rgba[3] = hsla[3]; + } + return rgba; + } + function rgba2hsla(rgba) { + if (!rgba) { + return; + } + var R = rgba[0] / 255; + var G = rgba[1] / 255; + var B = rgba[2] / 255; + var vMin = Math.min(R, G, B); + var vMax = Math.max(R, G, B); + var delta = vMax - vMin; + var L = (vMax + vMin) / 2; + var H; + var S; + if (delta === 0) { + H = 0; + S = 0; + } + else { + if (L < 0.5) { + S = delta / (vMax + vMin); + } + else { + S = delta / (2 - vMax - vMin); + } + var deltaR = (((vMax - R) / 6) + (delta / 2)) / delta; + var deltaG = (((vMax - G) / 6) + (delta / 2)) / delta; + var deltaB = (((vMax - B) / 6) + (delta / 2)) / delta; + if (R === vMax) { + H = deltaB - deltaG; + } + else if (G === vMax) { + H = (1 / 3) + deltaR - deltaB; + } + else if (B === vMax) { + H = (2 / 3) + deltaG - deltaR; + } + if (H < 0) { + H += 1; + } + if (H > 1) { + H -= 1; + } + } + var hsla = [H * 360, S, L]; + if (rgba[3] != null) { + hsla.push(rgba[3]); + } + return hsla; + } + function lift(color, level) { + var colorArr = parse(color); + if (colorArr) { + for (var i = 0; i < 3; i++) { + if (level < 0) { + colorArr[i] = colorArr[i] * (1 - level) | 0; + } + else { + colorArr[i] = ((255 - colorArr[i]) * level + colorArr[i]) | 0; + } + if (colorArr[i] > 255) { + colorArr[i] = 255; + } + else if (colorArr[i] < 0) { + colorArr[i] = 0; + } + } + return stringify(colorArr, colorArr.length === 4 ? 'rgba' : 'rgb'); + } + } + function toHex(color) { + var colorArr = parse(color); + if (colorArr) { + return ((1 << 24) + (colorArr[0] << 16) + (colorArr[1] << 8) + (+colorArr[2])).toString(16).slice(1); + } + } + function fastLerp(normalizedValue, colors, out) { + if (!(colors && colors.length) + || !(normalizedValue >= 0 && normalizedValue <= 1)) { + return; + } + out = out || []; + var value = normalizedValue * (colors.length - 1); + var leftIndex = Math.floor(value); + var rightIndex = Math.ceil(value); + var leftColor = colors[leftIndex]; + var rightColor = colors[rightIndex]; + var dv = value - leftIndex; + out[0] = clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv)); + out[1] = clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv)); + out[2] = clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv)); + out[3] = clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv)); + return out; + } + var fastMapToColor = fastLerp; + function lerp$1(normalizedValue, colors, fullOutput) { + if (!(colors && colors.length) + || !(normalizedValue >= 0 && normalizedValue <= 1)) { + return; + } + var value = normalizedValue * (colors.length - 1); + var leftIndex = Math.floor(value); + var rightIndex = Math.ceil(value); + var leftColor = parse(colors[leftIndex]); + var rightColor = parse(colors[rightIndex]); + var dv = value - leftIndex; + var color = stringify([ + clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv)), + clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv)), + clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv)), + clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv)) + ], 'rgba'); + return fullOutput + ? { + color: color, + leftIndex: leftIndex, + rightIndex: rightIndex, + value: value + } + : color; + } + var mapToColor = lerp$1; + function modifyHSL(color, h, s, l) { + var colorArr = parse(color); + if (color) { + colorArr = rgba2hsla(colorArr); + h != null && (colorArr[0] = clampCssAngle(h)); + s != null && (colorArr[1] = parseCssFloat(s)); + l != null && (colorArr[2] = parseCssFloat(l)); + return stringify(hsla2rgba(colorArr), 'rgba'); + } + } + function modifyAlpha(color, alpha) { + var colorArr = parse(color); + if (colorArr && alpha != null) { + colorArr[3] = clampCssFloat(alpha); + return stringify(colorArr, 'rgba'); + } + } + function stringify(arrColor, type) { + if (!arrColor || !arrColor.length) { + return; + } + var colorStr = arrColor[0] + ',' + arrColor[1] + ',' + arrColor[2]; + if (type === 'rgba' || type === 'hsva' || type === 'hsla') { + colorStr += ',' + arrColor[3]; + } + return type + '(' + colorStr + ')'; + } + function lum(color, backgroundLum) { + var arr = parse(color); + return arr + ? (0.299 * arr[0] + 0.587 * arr[1] + 0.114 * arr[2]) * arr[3] / 255 + + (1 - arr[3]) * backgroundLum + : 0; + } + function random() { + return stringify([ + Math.round(Math.random() * 255), + Math.round(Math.random() * 255), + Math.round(Math.random() * 255) + ], 'rgb'); + } + + var color = /*#__PURE__*/Object.freeze({ + __proto__: null, + parse: parse, + lift: lift, + toHex: toHex, + fastLerp: fastLerp, + fastMapToColor: fastMapToColor, + lerp: lerp$1, + mapToColor: mapToColor, + modifyHSL: modifyHSL, + modifyAlpha: modifyAlpha, + stringify: stringify, + lum: lum, + random: random + }); + + var mathRound = Math.round; + function normalizeColor(color) { + var opacity; + if (!color || color === 'transparent') { + color = 'none'; + } + else if (typeof color === 'string' && color.indexOf('rgba') > -1) { + var arr = parse(color); + if (arr) { + color = 'rgb(' + arr[0] + ',' + arr[1] + ',' + arr[2] + ')'; + opacity = arr[3]; + } + } + return { + color: color, + opacity: opacity == null ? 1 : opacity + }; + } + var EPSILON$1 = 1e-4; + function isAroundZero$1(transform) { + return transform < EPSILON$1 && transform > -EPSILON$1; + } + function round3(transform) { + return mathRound(transform * 1e3) / 1e3; + } + function round4(transform) { + return mathRound(transform * 1e4) / 1e4; + } + function getMatrixStr(m) { + return 'matrix(' + + round3(m[0]) + ',' + + round3(m[1]) + ',' + + round3(m[2]) + ',' + + round3(m[3]) + ',' + + round4(m[4]) + ',' + + round4(m[5]) + + ')'; + } + var TEXT_ALIGN_TO_ANCHOR = { + left: 'start', + right: 'end', + center: 'middle', + middle: 'middle' + }; + function adjustTextY(y, lineHeight, textBaseline) { + if (textBaseline === 'top') { + y += lineHeight / 2; + } + else if (textBaseline === 'bottom') { + y -= lineHeight / 2; + } + return y; + } + function hasShadow(style) { + return style + && (style.shadowBlur || style.shadowOffsetX || style.shadowOffsetY); + } + function getShadowKey(displayable) { + var style = displayable.style; + var globalScale = displayable.getGlobalScale(); + return [ + style.shadowColor, + (style.shadowBlur || 0).toFixed(2), + (style.shadowOffsetX || 0).toFixed(2), + (style.shadowOffsetY || 0).toFixed(2), + globalScale[0], + globalScale[1] + ].join(','); + } + function isImagePattern(val) { + return val && (!!val.image); + } + function isSVGPattern(val) { + return val && (!!val.svgElement); + } + function isPattern(val) { + return isImagePattern(val) || isSVGPattern(val); + } + function isLinearGradient(val) { + return val.type === 'linear'; + } + function isRadialGradient(val) { + return val.type === 'radial'; + } + function isGradient(val) { + return val && (val.type === 'linear' + || val.type === 'radial'); + } + function getIdURL(id) { + return "url(#" + id + ")"; + } + function getPathPrecision(el) { + var scale = el.getGlobalScale(); + var size = Math.max(scale[0], scale[1]); + return Math.max(Math.ceil(Math.log(size) / Math.log(10)), 1); + } + function getSRTTransformString(transform) { + var x = transform.x || 0; + var y = transform.y || 0; + var rotation = (transform.rotation || 0) * RADIAN_TO_DEGREE; + var scaleX = retrieve2(transform.scaleX, 1); + var scaleY = retrieve2(transform.scaleY, 1); + var skewX = transform.skewX || 0; + var skewY = transform.skewY || 0; + var res = []; + if (x || y) { + res.push("translate(" + x + "px," + y + "px)"); + } + if (rotation) { + res.push("rotate(" + rotation + ")"); + } + if (scaleX !== 1 || scaleY !== 1) { + res.push("scale(" + scaleX + "," + scaleY + ")"); + } + if (skewX || skewY) { + res.push("skew(" + mathRound(skewX * RADIAN_TO_DEGREE) + "deg, " + mathRound(skewY * RADIAN_TO_DEGREE) + "deg)"); + } + return res.join(' '); + } + var encodeBase64 = (function () { + if (env.hasGlobalWindow && isFunction(window.btoa)) { + return function (str) { + return window.btoa(unescape(str)); + }; + } + if (typeof Buffer !== 'undefined') { + return function (str) { + return Buffer.from(str).toString('base64'); + }; + } + return function (str) { + if ("development" !== 'production') { + logError('Base64 isn\'t natively supported in the current environment.'); + } + return null; + }; + })(); + + var arraySlice = Array.prototype.slice; + function interpolateNumber(p0, p1, percent) { + return (p1 - p0) * percent + p0; + } + function interpolate1DArray(out, p0, p1, percent) { + var len = p0.length; + for (var i = 0; i < len; i++) { + out[i] = interpolateNumber(p0[i], p1[i], percent); + } + return out; + } + function interpolate2DArray(out, p0, p1, percent) { + var len = p0.length; + var len2 = len && p0[0].length; + for (var i = 0; i < len; i++) { + if (!out[i]) { + out[i] = []; + } + for (var j = 0; j < len2; j++) { + out[i][j] = interpolateNumber(p0[i][j], p1[i][j], percent); + } + } + return out; + } + function add1DArray(out, p0, p1, sign) { + var len = p0.length; + for (var i = 0; i < len; i++) { + out[i] = p0[i] + p1[i] * sign; + } + return out; + } + function add2DArray(out, p0, p1, sign) { + var len = p0.length; + var len2 = len && p0[0].length; + for (var i = 0; i < len; i++) { + if (!out[i]) { + out[i] = []; + } + for (var j = 0; j < len2; j++) { + out[i][j] = p0[i][j] + p1[i][j] * sign; + } + } + return out; + } + function fillColorStops(val0, val1) { + var len0 = val0.length; + var len1 = val1.length; + var shorterArr = len0 > len1 ? val1 : val0; + var shorterLen = Math.min(len0, len1); + var last = shorterArr[shorterLen - 1] || { color: [0, 0, 0, 0], offset: 0 }; + for (var i = shorterLen; i < Math.max(len0, len1); i++) { + shorterArr.push({ + offset: last.offset, + color: last.color.slice() + }); + } + } + function fillArray(val0, val1, arrDim) { + var arr0 = val0; + var arr1 = val1; + if (!arr0.push || !arr1.push) { + return; + } + var arr0Len = arr0.length; + var arr1Len = arr1.length; + if (arr0Len !== arr1Len) { + var isPreviousLarger = arr0Len > arr1Len; + if (isPreviousLarger) { + arr0.length = arr1Len; + } + else { + for (var i = arr0Len; i < arr1Len; i++) { + arr0.push(arrDim === 1 ? arr1[i] : arraySlice.call(arr1[i])); + } + } + } + var len2 = arr0[0] && arr0[0].length; + for (var i = 0; i < arr0.length; i++) { + if (arrDim === 1) { + if (isNaN(arr0[i])) { + arr0[i] = arr1[i]; + } + } + else { + for (var j = 0; j < len2; j++) { + if (isNaN(arr0[i][j])) { + arr0[i][j] = arr1[i][j]; + } + } + } + } + } + function cloneValue(value) { + if (isArrayLike(value)) { + var len = value.length; + if (isArrayLike(value[0])) { + var ret = []; + for (var i = 0; i < len; i++) { + ret.push(arraySlice.call(value[i])); + } + return ret; + } + return arraySlice.call(value); + } + return value; + } + function rgba2String(rgba) { + rgba[0] = Math.floor(rgba[0]) || 0; + rgba[1] = Math.floor(rgba[1]) || 0; + rgba[2] = Math.floor(rgba[2]) || 0; + rgba[3] = rgba[3] == null ? 1 : rgba[3]; + return 'rgba(' + rgba.join(',') + ')'; + } + function guessArrayDim(value) { + return isArrayLike(value && value[0]) ? 2 : 1; + } + var VALUE_TYPE_NUMBER = 0; + var VALUE_TYPE_1D_ARRAY = 1; + var VALUE_TYPE_2D_ARRAY = 2; + var VALUE_TYPE_COLOR = 3; + var VALUE_TYPE_LINEAR_GRADIENT = 4; + var VALUE_TYPE_RADIAL_GRADIENT = 5; + var VALUE_TYPE_UNKOWN = 6; + function isGradientValueType(valType) { + return valType === VALUE_TYPE_LINEAR_GRADIENT || valType === VALUE_TYPE_RADIAL_GRADIENT; + } + function isArrayValueType(valType) { + return valType === VALUE_TYPE_1D_ARRAY || valType === VALUE_TYPE_2D_ARRAY; + } + var tmpRgba = [0, 0, 0, 0]; + var Track = (function () { + function Track(propName) { + this.keyframes = []; + this.discrete = false; + this._invalid = false; + this._needsSort = false; + this._lastFr = 0; + this._lastFrP = 0; + this.propName = propName; + } + Track.prototype.isFinished = function () { + return this._finished; + }; + Track.prototype.setFinished = function () { + this._finished = true; + if (this._additiveTrack) { + this._additiveTrack.setFinished(); + } + }; + Track.prototype.needsAnimate = function () { + return this.keyframes.length >= 1; + }; + Track.prototype.getAdditiveTrack = function () { + return this._additiveTrack; + }; + Track.prototype.addKeyframe = function (time, rawValue, easing) { + this._needsSort = true; + var keyframes = this.keyframes; + var len = keyframes.length; + var discrete = false; + var valType = VALUE_TYPE_UNKOWN; + var value = rawValue; + if (isArrayLike(rawValue)) { + var arrayDim = guessArrayDim(rawValue); + valType = arrayDim; + if (arrayDim === 1 && !isNumber(rawValue[0]) + || arrayDim === 2 && !isNumber(rawValue[0][0])) { + discrete = true; + } + } + else { + if (isNumber(rawValue) && !eqNaN(rawValue)) { + valType = VALUE_TYPE_NUMBER; + } + else if (isString(rawValue)) { + if (!isNaN(+rawValue)) { + valType = VALUE_TYPE_NUMBER; + } + else { + var colorArray = parse(rawValue); + if (colorArray) { + value = colorArray; + valType = VALUE_TYPE_COLOR; + } + } + } + else if (isGradientObject(rawValue)) { + var parsedGradient = extend({}, value); + parsedGradient.colorStops = map(rawValue.colorStops, function (colorStop) { return ({ + offset: colorStop.offset, + color: parse(colorStop.color) + }); }); + if (isLinearGradient(rawValue)) { + valType = VALUE_TYPE_LINEAR_GRADIENT; + } + else if (isRadialGradient(rawValue)) { + valType = VALUE_TYPE_RADIAL_GRADIENT; + } + value = parsedGradient; + } + } + if (len === 0) { + this.valType = valType; + } + else if (valType !== this.valType || valType === VALUE_TYPE_UNKOWN) { + discrete = true; + } + this.discrete = this.discrete || discrete; + var kf = { + time: time, + value: value, + rawValue: rawValue, + percent: 0 + }; + if (easing) { + kf.easing = easing; + kf.easingFunc = isFunction(easing) + ? easing + : easingFuncs[easing] || createCubicEasingFunc(easing); + } + keyframes.push(kf); + return kf; + }; + Track.prototype.prepare = function (maxTime, additiveTrack) { + var kfs = this.keyframes; + if (this._needsSort) { + kfs.sort(function (a, b) { + return a.time - b.time; + }); + } + var valType = this.valType; + var kfsLen = kfs.length; + var lastKf = kfs[kfsLen - 1]; + var isDiscrete = this.discrete; + var isArr = isArrayValueType(valType); + var isGradient = isGradientValueType(valType); + for (var i = 0; i < kfsLen; i++) { + var kf = kfs[i]; + var value = kf.value; + var lastValue = lastKf.value; + kf.percent = kf.time / maxTime; + if (!isDiscrete) { + if (isArr && i !== kfsLen - 1) { + fillArray(value, lastValue, valType); + } + else if (isGradient) { + fillColorStops(value.colorStops, lastValue.colorStops); + } + } + } + if (!isDiscrete + && valType !== VALUE_TYPE_RADIAL_GRADIENT + && additiveTrack + && this.needsAnimate() + && additiveTrack.needsAnimate() + && valType === additiveTrack.valType + && !additiveTrack._finished) { + this._additiveTrack = additiveTrack; + var startValue = kfs[0].value; + for (var i = 0; i < kfsLen; i++) { + if (valType === VALUE_TYPE_NUMBER) { + kfs[i].additiveValue = kfs[i].value - startValue; + } + else if (valType === VALUE_TYPE_COLOR) { + kfs[i].additiveValue = + add1DArray([], kfs[i].value, startValue, -1); + } + else if (isArrayValueType(valType)) { + kfs[i].additiveValue = valType === VALUE_TYPE_1D_ARRAY + ? add1DArray([], kfs[i].value, startValue, -1) + : add2DArray([], kfs[i].value, startValue, -1); + } + } + } + }; + Track.prototype.step = function (target, percent) { + if (this._finished) { + return; + } + if (this._additiveTrack && this._additiveTrack._finished) { + this._additiveTrack = null; + } + var isAdditive = this._additiveTrack != null; + var valueKey = isAdditive ? 'additiveValue' : 'value'; + var valType = this.valType; + var keyframes = this.keyframes; + var kfsNum = keyframes.length; + var propName = this.propName; + var isValueColor = valType === VALUE_TYPE_COLOR; + var frameIdx; + var lastFrame = this._lastFr; + var mathMin = Math.min; + var frame; + var nextFrame; + if (kfsNum === 1) { + frame = nextFrame = keyframes[0]; + } + else { + if (percent < 0) { + frameIdx = 0; + } + else if (percent < this._lastFrP) { + var start = mathMin(lastFrame + 1, kfsNum - 1); + for (frameIdx = start; frameIdx >= 0; frameIdx--) { + if (keyframes[frameIdx].percent <= percent) { + break; + } + } + frameIdx = mathMin(frameIdx, kfsNum - 2); + } + else { + for (frameIdx = lastFrame; frameIdx < kfsNum; frameIdx++) { + if (keyframes[frameIdx].percent > percent) { + break; + } + } + frameIdx = mathMin(frameIdx - 1, kfsNum - 2); + } + nextFrame = keyframes[frameIdx + 1]; + frame = keyframes[frameIdx]; + } + if (!(frame && nextFrame)) { + return; + } + this._lastFr = frameIdx; + this._lastFrP = percent; + var interval = (nextFrame.percent - frame.percent); + var w = interval === 0 ? 1 : mathMin((percent - frame.percent) / interval, 1); + if (nextFrame.easingFunc) { + w = nextFrame.easingFunc(w); + } + var targetArr = isAdditive ? this._additiveValue + : (isValueColor ? tmpRgba : target[propName]); + if ((isArrayValueType(valType) || isValueColor) && !targetArr) { + targetArr = this._additiveValue = []; + } + if (this.discrete) { + target[propName] = w < 1 ? frame.rawValue : nextFrame.rawValue; + } + else if (isArrayValueType(valType)) { + valType === VALUE_TYPE_1D_ARRAY + ? interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w) + : interpolate2DArray(targetArr, frame[valueKey], nextFrame[valueKey], w); + } + else if (isGradientValueType(valType)) { + var val = frame[valueKey]; + var nextVal_1 = nextFrame[valueKey]; + var isLinearGradient_1 = valType === VALUE_TYPE_LINEAR_GRADIENT; + target[propName] = { + type: isLinearGradient_1 ? 'linear' : 'radial', + x: interpolateNumber(val.x, nextVal_1.x, w), + y: interpolateNumber(val.y, nextVal_1.y, w), + colorStops: map(val.colorStops, function (colorStop, idx) { + var nextColorStop = nextVal_1.colorStops[idx]; + return { + offset: interpolateNumber(colorStop.offset, nextColorStop.offset, w), + color: rgba2String(interpolate1DArray([], colorStop.color, nextColorStop.color, w)) + }; + }), + global: nextVal_1.global + }; + if (isLinearGradient_1) { + target[propName].x2 = interpolateNumber(val.x2, nextVal_1.x2, w); + target[propName].y2 = interpolateNumber(val.y2, nextVal_1.y2, w); + } + else { + target[propName].r = interpolateNumber(val.r, nextVal_1.r, w); + } + } + else if (isValueColor) { + interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w); + if (!isAdditive) { + target[propName] = rgba2String(targetArr); + } + } + else { + var value = interpolateNumber(frame[valueKey], nextFrame[valueKey], w); + if (isAdditive) { + this._additiveValue = value; + } + else { + target[propName] = value; + } + } + if (isAdditive) { + this._addToTarget(target); + } + }; + Track.prototype._addToTarget = function (target) { + var valType = this.valType; + var propName = this.propName; + var additiveValue = this._additiveValue; + if (valType === VALUE_TYPE_NUMBER) { + target[propName] = target[propName] + additiveValue; + } + else if (valType === VALUE_TYPE_COLOR) { + parse(target[propName], tmpRgba); + add1DArray(tmpRgba, tmpRgba, additiveValue, 1); + target[propName] = rgba2String(tmpRgba); + } + else if (valType === VALUE_TYPE_1D_ARRAY) { + add1DArray(target[propName], target[propName], additiveValue, 1); + } + else if (valType === VALUE_TYPE_2D_ARRAY) { + add2DArray(target[propName], target[propName], additiveValue, 1); + } + }; + return Track; + }()); + var Animator = (function () { + function Animator(target, loop, allowDiscreteAnimation, additiveTo) { + this._tracks = {}; + this._trackKeys = []; + this._maxTime = 0; + this._started = 0; + this._clip = null; + this._target = target; + this._loop = loop; + if (loop && additiveTo) { + logError('Can\' use additive animation on looped animation.'); + return; + } + this._additiveAnimators = additiveTo; + this._allowDiscrete = allowDiscreteAnimation; + } + Animator.prototype.getMaxTime = function () { + return this._maxTime; + }; + Animator.prototype.getDelay = function () { + return this._delay; + }; + Animator.prototype.getLoop = function () { + return this._loop; + }; + Animator.prototype.getTarget = function () { + return this._target; + }; + Animator.prototype.changeTarget = function (target) { + this._target = target; + }; + Animator.prototype.when = function (time, props, easing) { + return this.whenWithKeys(time, props, keys(props), easing); + }; + Animator.prototype.whenWithKeys = function (time, props, propNames, easing) { + var tracks = this._tracks; + for (var i = 0; i < propNames.length; i++) { + var propName = propNames[i]; + var track = tracks[propName]; + if (!track) { + track = tracks[propName] = new Track(propName); + var initialValue = void 0; + var additiveTrack = this._getAdditiveTrack(propName); + if (additiveTrack) { + var addtiveTrackKfs = additiveTrack.keyframes; + var lastFinalKf = addtiveTrackKfs[addtiveTrackKfs.length - 1]; + initialValue = lastFinalKf && lastFinalKf.value; + if (additiveTrack.valType === VALUE_TYPE_COLOR && initialValue) { + initialValue = rgba2String(initialValue); + } + } + else { + initialValue = this._target[propName]; + } + if (initialValue == null) { + continue; + } + if (time > 0) { + track.addKeyframe(0, cloneValue(initialValue), easing); + } + this._trackKeys.push(propName); + } + track.addKeyframe(time, cloneValue(props[propName]), easing); + } + this._maxTime = Math.max(this._maxTime, time); + return this; + }; + Animator.prototype.pause = function () { + this._clip.pause(); + this._paused = true; + }; + Animator.prototype.resume = function () { + this._clip.resume(); + this._paused = false; + }; + Animator.prototype.isPaused = function () { + return !!this._paused; + }; + Animator.prototype.duration = function (duration) { + this._maxTime = duration; + this._force = true; + return this; + }; + Animator.prototype._doneCallback = function () { + this._setTracksFinished(); + this._clip = null; + var doneList = this._doneCbs; + if (doneList) { + var len = doneList.length; + for (var i = 0; i < len; i++) { + doneList[i].call(this); + } + } + }; + Animator.prototype._abortedCallback = function () { + this._setTracksFinished(); + var animation = this.animation; + var abortedList = this._abortedCbs; + if (animation) { + animation.removeClip(this._clip); + } + this._clip = null; + if (abortedList) { + for (var i = 0; i < abortedList.length; i++) { + abortedList[i].call(this); + } + } + }; + Animator.prototype._setTracksFinished = function () { + var tracks = this._tracks; + var tracksKeys = this._trackKeys; + for (var i = 0; i < tracksKeys.length; i++) { + tracks[tracksKeys[i]].setFinished(); + } + }; + Animator.prototype._getAdditiveTrack = function (trackName) { + var additiveTrack; + var additiveAnimators = this._additiveAnimators; + if (additiveAnimators) { + for (var i = 0; i < additiveAnimators.length; i++) { + var track = additiveAnimators[i].getTrack(trackName); + if (track) { + additiveTrack = track; + } + } + } + return additiveTrack; + }; + Animator.prototype.start = function (easing) { + if (this._started > 0) { + return; + } + this._started = 1; + var self = this; + var tracks = []; + var maxTime = this._maxTime || 0; + for (var i = 0; i < this._trackKeys.length; i++) { + var propName = this._trackKeys[i]; + var track = this._tracks[propName]; + var additiveTrack = this._getAdditiveTrack(propName); + var kfs = track.keyframes; + var kfsNum = kfs.length; + track.prepare(maxTime, additiveTrack); + if (track.needsAnimate()) { + if (!this._allowDiscrete && track.discrete) { + var lastKf = kfs[kfsNum - 1]; + if (lastKf) { + self._target[track.propName] = lastKf.rawValue; + } + track.setFinished(); + } + else { + tracks.push(track); + } + } + } + if (tracks.length || this._force) { + var clip = new Clip({ + life: maxTime, + loop: this._loop, + delay: this._delay || 0, + onframe: function (percent) { + self._started = 2; + var additiveAnimators = self._additiveAnimators; + if (additiveAnimators) { + var stillHasAdditiveAnimator = false; + for (var i = 0; i < additiveAnimators.length; i++) { + if (additiveAnimators[i]._clip) { + stillHasAdditiveAnimator = true; + break; + } + } + if (!stillHasAdditiveAnimator) { + self._additiveAnimators = null; + } + } + for (var i = 0; i < tracks.length; i++) { + tracks[i].step(self._target, percent); + } + var onframeList = self._onframeCbs; + if (onframeList) { + for (var i = 0; i < onframeList.length; i++) { + onframeList[i](self._target, percent); + } + } + }, + ondestroy: function () { + self._doneCallback(); + } + }); + this._clip = clip; + if (this.animation) { + this.animation.addClip(clip); + } + if (easing) { + clip.setEasing(easing); + } + } + else { + this._doneCallback(); + } + return this; + }; + Animator.prototype.stop = function (forwardToLast) { + if (!this._clip) { + return; + } + var clip = this._clip; + if (forwardToLast) { + clip.onframe(1); + } + this._abortedCallback(); + }; + Animator.prototype.delay = function (time) { + this._delay = time; + return this; + }; + Animator.prototype.during = function (cb) { + if (cb) { + if (!this._onframeCbs) { + this._onframeCbs = []; + } + this._onframeCbs.push(cb); + } + return this; + }; + Animator.prototype.done = function (cb) { + if (cb) { + if (!this._doneCbs) { + this._doneCbs = []; + } + this._doneCbs.push(cb); + } + return this; + }; + Animator.prototype.aborted = function (cb) { + if (cb) { + if (!this._abortedCbs) { + this._abortedCbs = []; + } + this._abortedCbs.push(cb); + } + return this; + }; + Animator.prototype.getClip = function () { + return this._clip; + }; + Animator.prototype.getTrack = function (propName) { + return this._tracks[propName]; + }; + Animator.prototype.getTracks = function () { + var _this = this; + return map(this._trackKeys, function (key) { return _this._tracks[key]; }); + }; + Animator.prototype.stopTracks = function (propNames, forwardToLast) { + if (!propNames.length || !this._clip) { + return true; + } + var tracks = this._tracks; + var tracksKeys = this._trackKeys; + for (var i = 0; i < propNames.length; i++) { + var track = tracks[propNames[i]]; + if (track && !track.isFinished()) { + if (forwardToLast) { + track.step(this._target, 1); + } + else if (this._started === 1) { + track.step(this._target, 0); + } + track.setFinished(); + } + } + var allAborted = true; + for (var i = 0; i < tracksKeys.length; i++) { + if (!tracks[tracksKeys[i]].isFinished()) { + allAborted = false; + break; + } + } + if (allAborted) { + this._abortedCallback(); + } + return allAborted; + }; + Animator.prototype.saveTo = function (target, trackKeys, firstOrLast) { + if (!target) { + return; + } + trackKeys = trackKeys || this._trackKeys; + for (var i = 0; i < trackKeys.length; i++) { + var propName = trackKeys[i]; + var track = this._tracks[propName]; + if (!track || track.isFinished()) { + continue; + } + var kfs = track.keyframes; + var kf = kfs[firstOrLast ? 0 : kfs.length - 1]; + if (kf) { + target[propName] = cloneValue(kf.rawValue); + } + } + }; + Animator.prototype.__changeFinalValue = function (finalProps, trackKeys) { + trackKeys = trackKeys || keys(finalProps); + for (var i = 0; i < trackKeys.length; i++) { + var propName = trackKeys[i]; + var track = this._tracks[propName]; + if (!track) { + continue; + } + var kfs = track.keyframes; + if (kfs.length > 1) { + var lastKf = kfs.pop(); + track.addKeyframe(lastKf.time, finalProps[propName]); + track.prepare(this._maxTime, track.getAdditiveTrack()); + } + } + }; + return Animator; + }()); + + function getTime() { + return new Date().getTime(); + } + var Animation = (function (_super) { + __extends(Animation, _super); + function Animation(opts) { + var _this = _super.call(this) || this; + _this._running = false; + _this._time = 0; + _this._pausedTime = 0; + _this._pauseStart = 0; + _this._paused = false; + opts = opts || {}; + _this.stage = opts.stage || {}; + return _this; + } + Animation.prototype.addClip = function (clip) { + if (clip.animation) { + this.removeClip(clip); + } + if (!this._head) { + this._head = this._tail = clip; + } + else { + this._tail.next = clip; + clip.prev = this._tail; + clip.next = null; + this._tail = clip; + } + clip.animation = this; + }; + Animation.prototype.addAnimator = function (animator) { + animator.animation = this; + var clip = animator.getClip(); + if (clip) { + this.addClip(clip); + } + }; + Animation.prototype.removeClip = function (clip) { + if (!clip.animation) { + return; + } + var prev = clip.prev; + var next = clip.next; + if (prev) { + prev.next = next; + } + else { + this._head = next; + } + if (next) { + next.prev = prev; + } + else { + this._tail = prev; + } + clip.next = clip.prev = clip.animation = null; + }; + Animation.prototype.removeAnimator = function (animator) { + var clip = animator.getClip(); + if (clip) { + this.removeClip(clip); + } + animator.animation = null; + }; + Animation.prototype.update = function (notTriggerFrameAndStageUpdate) { + var time = getTime() - this._pausedTime; + var delta = time - this._time; + var clip = this._head; + while (clip) { + var nextClip = clip.next; + var finished = clip.step(time, delta); + if (finished) { + clip.ondestroy(); + this.removeClip(clip); + clip = nextClip; + } + else { + clip = nextClip; + } + } + this._time = time; + if (!notTriggerFrameAndStageUpdate) { + this.trigger('frame', delta); + this.stage.update && this.stage.update(); + } + }; + Animation.prototype._startLoop = function () { + var self = this; + this._running = true; + function step() { + if (self._running) { + requestAnimationFrame$1(step); + !self._paused && self.update(); + } + } + requestAnimationFrame$1(step); + }; + Animation.prototype.start = function () { + if (this._running) { + return; + } + this._time = getTime(); + this._pausedTime = 0; + this._startLoop(); + }; + Animation.prototype.stop = function () { + this._running = false; + }; + Animation.prototype.pause = function () { + if (!this._paused) { + this._pauseStart = getTime(); + this._paused = true; + } + }; + Animation.prototype.resume = function () { + if (this._paused) { + this._pausedTime += getTime() - this._pauseStart; + this._paused = false; + } + }; + Animation.prototype.clear = function () { + var clip = this._head; + while (clip) { + var nextClip = clip.next; + clip.prev = clip.next = clip.animation = null; + clip = nextClip; + } + this._head = this._tail = null; + }; + Animation.prototype.isFinished = function () { + return this._head == null; + }; + Animation.prototype.animate = function (target, options) { + options = options || {}; + this.start(); + var animator = new Animator(target, options.loop); + this.addAnimator(animator); + return animator; + }; + return Animation; + }(Eventful)); + + var TOUCH_CLICK_DELAY = 300; + var globalEventSupported = env.domSupported; + var localNativeListenerNames = (function () { + var mouseHandlerNames = [ + 'click', 'dblclick', 'mousewheel', 'wheel', 'mouseout', + 'mouseup', 'mousedown', 'mousemove', 'contextmenu' + ]; + var touchHandlerNames = [ + 'touchstart', 'touchend', 'touchmove' + ]; + var pointerEventNameMap = { + pointerdown: 1, pointerup: 1, pointermove: 1, pointerout: 1 + }; + var pointerHandlerNames = map(mouseHandlerNames, function (name) { + var nm = name.replace('mouse', 'pointer'); + return pointerEventNameMap.hasOwnProperty(nm) ? nm : name; + }); + return { + mouse: mouseHandlerNames, + touch: touchHandlerNames, + pointer: pointerHandlerNames + }; + })(); + var globalNativeListenerNames = { + mouse: ['mousemove', 'mouseup'], + pointer: ['pointermove', 'pointerup'] + }; + var wheelEventSupported = false; + function isPointerFromTouch(event) { + var pointerType = event.pointerType; + return pointerType === 'pen' || pointerType === 'touch'; + } + function setTouchTimer(scope) { + scope.touching = true; + if (scope.touchTimer != null) { + clearTimeout(scope.touchTimer); + scope.touchTimer = null; + } + scope.touchTimer = setTimeout(function () { + scope.touching = false; + scope.touchTimer = null; + }, 700); + } + function markTouch(event) { + event && (event.zrByTouch = true); + } + function normalizeGlobalEvent(instance, event) { + return normalizeEvent(instance.dom, new FakeGlobalEvent(instance, event), true); + } + function isLocalEl(instance, el) { + var elTmp = el; + var isLocal = false; + while (elTmp && elTmp.nodeType !== 9 + && !(isLocal = elTmp.domBelongToZr + || (elTmp !== el && elTmp === instance.painterRoot))) { + elTmp = elTmp.parentNode; + } + return isLocal; + } + var FakeGlobalEvent = (function () { + function FakeGlobalEvent(instance, event) { + this.stopPropagation = noop; + this.stopImmediatePropagation = noop; + this.preventDefault = noop; + this.type = event.type; + this.target = this.currentTarget = instance.dom; + this.pointerType = event.pointerType; + this.clientX = event.clientX; + this.clientY = event.clientY; + } + return FakeGlobalEvent; + }()); + var localDOMHandlers = { + mousedown: function (event) { + event = normalizeEvent(this.dom, event); + this.__mayPointerCapture = [event.zrX, event.zrY]; + this.trigger('mousedown', event); + }, + mousemove: function (event) { + event = normalizeEvent(this.dom, event); + var downPoint = this.__mayPointerCapture; + if (downPoint && (event.zrX !== downPoint[0] || event.zrY !== downPoint[1])) { + this.__togglePointerCapture(true); + } + this.trigger('mousemove', event); + }, + mouseup: function (event) { + event = normalizeEvent(this.dom, event); + this.__togglePointerCapture(false); + this.trigger('mouseup', event); + }, + mouseout: function (event) { + event = normalizeEvent(this.dom, event); + var element = event.toElement || event.relatedTarget; + if (!isLocalEl(this, element)) { + if (this.__pointerCapturing) { + event.zrEventControl = 'no_globalout'; + } + this.trigger('mouseout', event); + } + }, + wheel: function (event) { + wheelEventSupported = true; + event = normalizeEvent(this.dom, event); + this.trigger('mousewheel', event); + }, + mousewheel: function (event) { + if (wheelEventSupported) { + return; + } + event = normalizeEvent(this.dom, event); + this.trigger('mousewheel', event); + }, + touchstart: function (event) { + event = normalizeEvent(this.dom, event); + markTouch(event); + this.__lastTouchMoment = new Date(); + this.handler.processGesture(event, 'start'); + localDOMHandlers.mousemove.call(this, event); + localDOMHandlers.mousedown.call(this, event); + }, + touchmove: function (event) { + event = normalizeEvent(this.dom, event); + markTouch(event); + this.handler.processGesture(event, 'change'); + localDOMHandlers.mousemove.call(this, event); + }, + touchend: function (event) { + event = normalizeEvent(this.dom, event); + markTouch(event); + this.handler.processGesture(event, 'end'); + localDOMHandlers.mouseup.call(this, event); + if (+new Date() - (+this.__lastTouchMoment) < TOUCH_CLICK_DELAY) { + localDOMHandlers.click.call(this, event); + } + }, + pointerdown: function (event) { + localDOMHandlers.mousedown.call(this, event); + }, + pointermove: function (event) { + if (!isPointerFromTouch(event)) { + localDOMHandlers.mousemove.call(this, event); + } + }, + pointerup: function (event) { + localDOMHandlers.mouseup.call(this, event); + }, + pointerout: function (event) { + if (!isPointerFromTouch(event)) { + localDOMHandlers.mouseout.call(this, event); + } + } + }; + each(['click', 'dblclick', 'contextmenu'], function (name) { + localDOMHandlers[name] = function (event) { + event = normalizeEvent(this.dom, event); + this.trigger(name, event); + }; + }); + var globalDOMHandlers = { + pointermove: function (event) { + if (!isPointerFromTouch(event)) { + globalDOMHandlers.mousemove.call(this, event); + } + }, + pointerup: function (event) { + globalDOMHandlers.mouseup.call(this, event); + }, + mousemove: function (event) { + this.trigger('mousemove', event); + }, + mouseup: function (event) { + var pointerCaptureReleasing = this.__pointerCapturing; + this.__togglePointerCapture(false); + this.trigger('mouseup', event); + if (pointerCaptureReleasing) { + event.zrEventControl = 'only_globalout'; + this.trigger('mouseout', event); + } + } + }; + function mountLocalDOMEventListeners(instance, scope) { + var domHandlers = scope.domHandlers; + if (env.pointerEventsSupported) { + each(localNativeListenerNames.pointer, function (nativeEventName) { + mountSingleDOMEventListener(scope, nativeEventName, function (event) { + domHandlers[nativeEventName].call(instance, event); + }); + }); + } + else { + if (env.touchEventsSupported) { + each(localNativeListenerNames.touch, function (nativeEventName) { + mountSingleDOMEventListener(scope, nativeEventName, function (event) { + domHandlers[nativeEventName].call(instance, event); + setTouchTimer(scope); + }); + }); + } + each(localNativeListenerNames.mouse, function (nativeEventName) { + mountSingleDOMEventListener(scope, nativeEventName, function (event) { + event = getNativeEvent(event); + if (!scope.touching) { + domHandlers[nativeEventName].call(instance, event); + } + }); + }); + } + } + function mountGlobalDOMEventListeners(instance, scope) { + if (env.pointerEventsSupported) { + each(globalNativeListenerNames.pointer, mount); + } + else if (!env.touchEventsSupported) { + each(globalNativeListenerNames.mouse, mount); + } + function mount(nativeEventName) { + function nativeEventListener(event) { + event = getNativeEvent(event); + if (!isLocalEl(instance, event.target)) { + event = normalizeGlobalEvent(instance, event); + scope.domHandlers[nativeEventName].call(instance, event); + } + } + mountSingleDOMEventListener(scope, nativeEventName, nativeEventListener, { capture: true }); + } + } + function mountSingleDOMEventListener(scope, nativeEventName, listener, opt) { + scope.mounted[nativeEventName] = listener; + scope.listenerOpts[nativeEventName] = opt; + addEventListener(scope.domTarget, nativeEventName, listener, opt); + } + function unmountDOMEventListeners(scope) { + var mounted = scope.mounted; + for (var nativeEventName in mounted) { + if (mounted.hasOwnProperty(nativeEventName)) { + removeEventListener(scope.domTarget, nativeEventName, mounted[nativeEventName], scope.listenerOpts[nativeEventName]); + } + } + scope.mounted = {}; + } + var DOMHandlerScope = (function () { + function DOMHandlerScope(domTarget, domHandlers) { + this.mounted = {}; + this.listenerOpts = {}; + this.touching = false; + this.domTarget = domTarget; + this.domHandlers = domHandlers; + } + return DOMHandlerScope; + }()); + var HandlerDomProxy = (function (_super) { + __extends(HandlerDomProxy, _super); + function HandlerDomProxy(dom, painterRoot) { + var _this = _super.call(this) || this; + _this.__pointerCapturing = false; + _this.dom = dom; + _this.painterRoot = painterRoot; + _this._localHandlerScope = new DOMHandlerScope(dom, localDOMHandlers); + if (globalEventSupported) { + _this._globalHandlerScope = new DOMHandlerScope(document, globalDOMHandlers); + } + mountLocalDOMEventListeners(_this, _this._localHandlerScope); + return _this; + } + HandlerDomProxy.prototype.dispose = function () { + unmountDOMEventListeners(this._localHandlerScope); + if (globalEventSupported) { + unmountDOMEventListeners(this._globalHandlerScope); + } + }; + HandlerDomProxy.prototype.setCursor = function (cursorStyle) { + this.dom.style && (this.dom.style.cursor = cursorStyle || 'default'); + }; + HandlerDomProxy.prototype.__togglePointerCapture = function (isPointerCapturing) { + this.__mayPointerCapture = null; + if (globalEventSupported + && ((+this.__pointerCapturing) ^ (+isPointerCapturing))) { + this.__pointerCapturing = isPointerCapturing; + var globalHandlerScope = this._globalHandlerScope; + isPointerCapturing + ? mountGlobalDOMEventListeners(this, globalHandlerScope) + : unmountDOMEventListeners(globalHandlerScope); + } + }; + return HandlerDomProxy; + }(Eventful)); + + var dpr = 1; + if (env.hasGlobalWindow) { + dpr = Math.max(window.devicePixelRatio + || (window.screen && window.screen.deviceXDPI / window.screen.logicalXDPI) + || 1, 1); + } + var devicePixelRatio = dpr; + var DARK_MODE_THRESHOLD = 0.4; + var DARK_LABEL_COLOR = '#333'; + var LIGHT_LABEL_COLOR = '#ccc'; + var LIGHTER_LABEL_COLOR = '#eee'; + + function create$1() { + return [1, 0, 0, 1, 0, 0]; + } + function identity(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + return out; + } + function copy$1(out, m) { + out[0] = m[0]; + out[1] = m[1]; + out[2] = m[2]; + out[3] = m[3]; + out[4] = m[4]; + out[5] = m[5]; + return out; + } + function mul$1(out, m1, m2) { + var out0 = m1[0] * m2[0] + m1[2] * m2[1]; + var out1 = m1[1] * m2[0] + m1[3] * m2[1]; + var out2 = m1[0] * m2[2] + m1[2] * m2[3]; + var out3 = m1[1] * m2[2] + m1[3] * m2[3]; + var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4]; + var out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5]; + out[0] = out0; + out[1] = out1; + out[2] = out2; + out[3] = out3; + out[4] = out4; + out[5] = out5; + return out; + } + function translate(out, a, v) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4] + v[0]; + out[5] = a[5] + v[1]; + return out; + } + function rotate(out, a, rad) { + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + var st = Math.sin(rad); + var ct = Math.cos(rad); + out[0] = aa * ct + ab * st; + out[1] = -aa * st + ab * ct; + out[2] = ac * ct + ad * st; + out[3] = -ac * st + ct * ad; + out[4] = ct * atx + st * aty; + out[5] = ct * aty - st * atx; + return out; + } + function scale$1(out, a, v) { + var vx = v[0]; + var vy = v[1]; + out[0] = a[0] * vx; + out[1] = a[1] * vy; + out[2] = a[2] * vx; + out[3] = a[3] * vy; + out[4] = a[4] * vx; + out[5] = a[5] * vy; + return out; + } + function invert(out, a) { + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + var det = aa * ad - ab * ac; + if (!det) { + return null; + } + det = 1.0 / det; + out[0] = ad * det; + out[1] = -ab * det; + out[2] = -ac * det; + out[3] = aa * det; + out[4] = (ac * aty - ad * atx) * det; + out[5] = (ab * atx - aa * aty) * det; + return out; + } + function clone$2(a) { + var b = create$1(); + copy$1(b, a); + return b; + } + + var matrix = /*#__PURE__*/Object.freeze({ + __proto__: null, + create: create$1, + identity: identity, + copy: copy$1, + mul: mul$1, + translate: translate, + rotate: rotate, + scale: scale$1, + invert: invert, + clone: clone$2 + }); + + var mIdentity = identity; + var EPSILON$2 = 5e-5; + function isNotAroundZero$1(val) { + return val > EPSILON$2 || val < -EPSILON$2; + } + var scaleTmp = []; + var tmpTransform = []; + var originTransform = create$1(); + var abs = Math.abs; + var Transformable = (function () { + function Transformable() { + } + Transformable.prototype.getLocalTransform = function (m) { + return Transformable.getLocalTransform(this, m); + }; + Transformable.prototype.setPosition = function (arr) { + this.x = arr[0]; + this.y = arr[1]; + }; + Transformable.prototype.setScale = function (arr) { + this.scaleX = arr[0]; + this.scaleY = arr[1]; + }; + Transformable.prototype.setSkew = function (arr) { + this.skewX = arr[0]; + this.skewY = arr[1]; + }; + Transformable.prototype.setOrigin = function (arr) { + this.originX = arr[0]; + this.originY = arr[1]; + }; + Transformable.prototype.needLocalTransform = function () { + return isNotAroundZero$1(this.rotation) + || isNotAroundZero$1(this.x) + || isNotAroundZero$1(this.y) + || isNotAroundZero$1(this.scaleX - 1) + || isNotAroundZero$1(this.scaleY - 1) + || isNotAroundZero$1(this.skewX) + || isNotAroundZero$1(this.skewY); + }; + Transformable.prototype.updateTransform = function () { + var parentTransform = this.parent && this.parent.transform; + var needLocalTransform = this.needLocalTransform(); + var m = this.transform; + if (!(needLocalTransform || parentTransform)) { + m && mIdentity(m); + return; + } + m = m || create$1(); + if (needLocalTransform) { + this.getLocalTransform(m); + } + else { + mIdentity(m); + } + if (parentTransform) { + if (needLocalTransform) { + mul$1(m, parentTransform, m); + } + else { + copy$1(m, parentTransform); + } + } + this.transform = m; + this._resolveGlobalScaleRatio(m); + }; + Transformable.prototype._resolveGlobalScaleRatio = function (m) { + var globalScaleRatio = this.globalScaleRatio; + if (globalScaleRatio != null && globalScaleRatio !== 1) { + this.getGlobalScale(scaleTmp); + var relX = scaleTmp[0] < 0 ? -1 : 1; + var relY = scaleTmp[1] < 0 ? -1 : 1; + var sx = ((scaleTmp[0] - relX) * globalScaleRatio + relX) / scaleTmp[0] || 0; + var sy = ((scaleTmp[1] - relY) * globalScaleRatio + relY) / scaleTmp[1] || 0; + m[0] *= sx; + m[1] *= sx; + m[2] *= sy; + m[3] *= sy; + } + this.invTransform = this.invTransform || create$1(); + invert(this.invTransform, m); + }; + Transformable.prototype.getComputedTransform = function () { + var transformNode = this; + var ancestors = []; + while (transformNode) { + ancestors.push(transformNode); + transformNode = transformNode.parent; + } + while (transformNode = ancestors.pop()) { + transformNode.updateTransform(); + } + return this.transform; + }; + Transformable.prototype.setLocalTransform = function (m) { + if (!m) { + return; + } + var sx = m[0] * m[0] + m[1] * m[1]; + var sy = m[2] * m[2] + m[3] * m[3]; + var rotation = Math.atan2(m[1], m[0]); + var shearX = Math.PI / 2 + rotation - Math.atan2(m[3], m[2]); + sy = Math.sqrt(sy) * Math.cos(shearX); + sx = Math.sqrt(sx); + this.skewX = shearX; + this.skewY = 0; + this.rotation = -rotation; + this.x = +m[4]; + this.y = +m[5]; + this.scaleX = sx; + this.scaleY = sy; + this.originX = 0; + this.originY = 0; + }; + Transformable.prototype.decomposeTransform = function () { + if (!this.transform) { + return; + } + var parent = this.parent; + var m = this.transform; + if (parent && parent.transform) { + mul$1(tmpTransform, parent.invTransform, m); + m = tmpTransform; + } + var ox = this.originX; + var oy = this.originY; + if (ox || oy) { + originTransform[4] = ox; + originTransform[5] = oy; + mul$1(tmpTransform, m, originTransform); + tmpTransform[4] -= ox; + tmpTransform[5] -= oy; + m = tmpTransform; + } + this.setLocalTransform(m); + }; + Transformable.prototype.getGlobalScale = function (out) { + var m = this.transform; + out = out || []; + if (!m) { + out[0] = 1; + out[1] = 1; + return out; + } + out[0] = Math.sqrt(m[0] * m[0] + m[1] * m[1]); + out[1] = Math.sqrt(m[2] * m[2] + m[3] * m[3]); + if (m[0] < 0) { + out[0] = -out[0]; + } + if (m[3] < 0) { + out[1] = -out[1]; + } + return out; + }; + Transformable.prototype.transformCoordToLocal = function (x, y) { + var v2 = [x, y]; + var invTransform = this.invTransform; + if (invTransform) { + applyTransform(v2, v2, invTransform); + } + return v2; + }; + Transformable.prototype.transformCoordToGlobal = function (x, y) { + var v2 = [x, y]; + var transform = this.transform; + if (transform) { + applyTransform(v2, v2, transform); + } + return v2; + }; + Transformable.prototype.getLineScale = function () { + var m = this.transform; + return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10 + ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1])) + : 1; + }; + Transformable.prototype.copyTransform = function (source) { + copyTransform(this, source); + }; + Transformable.getLocalTransform = function (target, m) { + m = m || []; + var ox = target.originX || 0; + var oy = target.originY || 0; + var sx = target.scaleX; + var sy = target.scaleY; + var ax = target.anchorX; + var ay = target.anchorY; + var rotation = target.rotation || 0; + var x = target.x; + var y = target.y; + var skewX = target.skewX ? Math.tan(target.skewX) : 0; + var skewY = target.skewY ? Math.tan(-target.skewY) : 0; + if (ox || oy || ax || ay) { + var dx = ox + ax; + var dy = oy + ay; + m[4] = -dx * sx - skewX * dy * sy; + m[5] = -dy * sy - skewY * dx * sx; + } + else { + m[4] = m[5] = 0; + } + m[0] = sx; + m[3] = sy; + m[1] = skewY * sx; + m[2] = skewX * sy; + rotation && rotate(m, m, rotation); + m[4] += ox + x; + m[5] += oy + y; + return m; + }; + Transformable.initDefaultProps = (function () { + var proto = Transformable.prototype; + proto.scaleX = + proto.scaleY = + proto.globalScaleRatio = 1; + proto.x = + proto.y = + proto.originX = + proto.originY = + proto.skewX = + proto.skewY = + proto.rotation = + proto.anchorX = + proto.anchorY = 0; + })(); + return Transformable; + }()); + var TRANSFORMABLE_PROPS = [ + 'x', 'y', 'originX', 'originY', 'anchorX', 'anchorY', 'rotation', 'scaleX', 'scaleY', 'skewX', 'skewY' + ]; + function copyTransform(target, source) { + for (var i = 0; i < TRANSFORMABLE_PROPS.length; i++) { + var propName = TRANSFORMABLE_PROPS[i]; + target[propName] = source[propName]; + } + } + + var Point = (function () { + function Point(x, y) { + this.x = x || 0; + this.y = y || 0; + } + Point.prototype.copy = function (other) { + this.x = other.x; + this.y = other.y; + return this; + }; + Point.prototype.clone = function () { + return new Point(this.x, this.y); + }; + Point.prototype.set = function (x, y) { + this.x = x; + this.y = y; + return this; + }; + Point.prototype.equal = function (other) { + return other.x === this.x && other.y === this.y; + }; + Point.prototype.add = function (other) { + this.x += other.x; + this.y += other.y; + return this; + }; + Point.prototype.scale = function (scalar) { + this.x *= scalar; + this.y *= scalar; + }; + Point.prototype.scaleAndAdd = function (other, scalar) { + this.x += other.x * scalar; + this.y += other.y * scalar; + }; + Point.prototype.sub = function (other) { + this.x -= other.x; + this.y -= other.y; + return this; + }; + Point.prototype.dot = function (other) { + return this.x * other.x + this.y * other.y; + }; + Point.prototype.len = function () { + return Math.sqrt(this.x * this.x + this.y * this.y); + }; + Point.prototype.lenSquare = function () { + return this.x * this.x + this.y * this.y; + }; + Point.prototype.normalize = function () { + var len = this.len(); + this.x /= len; + this.y /= len; + return this; + }; + Point.prototype.distance = function (other) { + var dx = this.x - other.x; + var dy = this.y - other.y; + return Math.sqrt(dx * dx + dy * dy); + }; + Point.prototype.distanceSquare = function (other) { + var dx = this.x - other.x; + var dy = this.y - other.y; + return dx * dx + dy * dy; + }; + Point.prototype.negate = function () { + this.x = -this.x; + this.y = -this.y; + return this; + }; + Point.prototype.transform = function (m) { + if (!m) { + return; + } + var x = this.x; + var y = this.y; + this.x = m[0] * x + m[2] * y + m[4]; + this.y = m[1] * x + m[3] * y + m[5]; + return this; + }; + Point.prototype.toArray = function (out) { + out[0] = this.x; + out[1] = this.y; + return out; + }; + Point.prototype.fromArray = function (input) { + this.x = input[0]; + this.y = input[1]; + }; + Point.set = function (p, x, y) { + p.x = x; + p.y = y; + }; + Point.copy = function (p, p2) { + p.x = p2.x; + p.y = p2.y; + }; + Point.len = function (p) { + return Math.sqrt(p.x * p.x + p.y * p.y); + }; + Point.lenSquare = function (p) { + return p.x * p.x + p.y * p.y; + }; + Point.dot = function (p0, p1) { + return p0.x * p1.x + p0.y * p1.y; + }; + Point.add = function (out, p0, p1) { + out.x = p0.x + p1.x; + out.y = p0.y + p1.y; + }; + Point.sub = function (out, p0, p1) { + out.x = p0.x - p1.x; + out.y = p0.y - p1.y; + }; + Point.scale = function (out, p0, scalar) { + out.x = p0.x * scalar; + out.y = p0.y * scalar; + }; + Point.scaleAndAdd = function (out, p0, p1, scalar) { + out.x = p0.x + p1.x * scalar; + out.y = p0.y + p1.y * scalar; + }; + Point.lerp = function (out, p0, p1, t) { + var onet = 1 - t; + out.x = onet * p0.x + t * p1.x; + out.y = onet * p0.y + t * p1.y; + }; + return Point; + }()); + + var mathMin = Math.min; + var mathMax = Math.max; + var lt = new Point(); + var rb = new Point(); + var lb = new Point(); + var rt = new Point(); + var minTv = new Point(); + var maxTv = new Point(); + var BoundingRect = (function () { + function BoundingRect(x, y, width, height) { + if (width < 0) { + x = x + width; + width = -width; + } + if (height < 0) { + y = y + height; + height = -height; + } + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + BoundingRect.prototype.union = function (other) { + var x = mathMin(other.x, this.x); + var y = mathMin(other.y, this.y); + if (isFinite(this.x) && isFinite(this.width)) { + this.width = mathMax(other.x + other.width, this.x + this.width) - x; + } + else { + this.width = other.width; + } + if (isFinite(this.y) && isFinite(this.height)) { + this.height = mathMax(other.y + other.height, this.y + this.height) - y; + } + else { + this.height = other.height; + } + this.x = x; + this.y = y; + }; + BoundingRect.prototype.applyTransform = function (m) { + BoundingRect.applyTransform(this, this, m); + }; + BoundingRect.prototype.calculateTransform = function (b) { + var a = this; + var sx = b.width / a.width; + var sy = b.height / a.height; + var m = create$1(); + translate(m, m, [-a.x, -a.y]); + scale$1(m, m, [sx, sy]); + translate(m, m, [b.x, b.y]); + return m; + }; + BoundingRect.prototype.intersect = function (b, mtv) { + if (!b) { + return false; + } + if (!(b instanceof BoundingRect)) { + b = BoundingRect.create(b); + } + var a = this; + var ax0 = a.x; + var ax1 = a.x + a.width; + var ay0 = a.y; + var ay1 = a.y + a.height; + var bx0 = b.x; + var bx1 = b.x + b.width; + var by0 = b.y; + var by1 = b.y + b.height; + var overlap = !(ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0); + if (mtv) { + var dMin = Infinity; + var dMax = 0; + var d0 = Math.abs(ax1 - bx0); + var d1 = Math.abs(bx1 - ax0); + var d2 = Math.abs(ay1 - by0); + var d3 = Math.abs(by1 - ay0); + var dx = Math.min(d0, d1); + var dy = Math.min(d2, d3); + if (ax1 < bx0 || bx1 < ax0) { + if (dx > dMax) { + dMax = dx; + if (d0 < d1) { + Point.set(maxTv, -d0, 0); + } + else { + Point.set(maxTv, d1, 0); + } + } + } + else { + if (dx < dMin) { + dMin = dx; + if (d0 < d1) { + Point.set(minTv, d0, 0); + } + else { + Point.set(minTv, -d1, 0); + } + } + } + if (ay1 < by0 || by1 < ay0) { + if (dy > dMax) { + dMax = dy; + if (d2 < d3) { + Point.set(maxTv, 0, -d2); + } + else { + Point.set(maxTv, 0, d3); + } + } + } + else { + if (dx < dMin) { + dMin = dx; + if (d2 < d3) { + Point.set(minTv, 0, d2); + } + else { + Point.set(minTv, 0, -d3); + } + } + } + } + if (mtv) { + Point.copy(mtv, overlap ? minTv : maxTv); + } + return overlap; + }; + BoundingRect.prototype.contain = function (x, y) { + var rect = this; + return x >= rect.x + && x <= (rect.x + rect.width) + && y >= rect.y + && y <= (rect.y + rect.height); + }; + BoundingRect.prototype.clone = function () { + return new BoundingRect(this.x, this.y, this.width, this.height); + }; + BoundingRect.prototype.copy = function (other) { + BoundingRect.copy(this, other); + }; + BoundingRect.prototype.plain = function () { + return { + x: this.x, + y: this.y, + width: this.width, + height: this.height + }; + }; + BoundingRect.prototype.isFinite = function () { + return isFinite(this.x) + && isFinite(this.y) + && isFinite(this.width) + && isFinite(this.height); + }; + BoundingRect.prototype.isZero = function () { + return this.width === 0 || this.height === 0; + }; + BoundingRect.create = function (rect) { + return new BoundingRect(rect.x, rect.y, rect.width, rect.height); + }; + BoundingRect.copy = function (target, source) { + target.x = source.x; + target.y = source.y; + target.width = source.width; + target.height = source.height; + }; + BoundingRect.applyTransform = function (target, source, m) { + if (!m) { + if (target !== source) { + BoundingRect.copy(target, source); + } + return; + } + if (m[1] < 1e-5 && m[1] > -1e-5 && m[2] < 1e-5 && m[2] > -1e-5) { + var sx = m[0]; + var sy = m[3]; + var tx = m[4]; + var ty = m[5]; + target.x = source.x * sx + tx; + target.y = source.y * sy + ty; + target.width = source.width * sx; + target.height = source.height * sy; + if (target.width < 0) { + target.x += target.width; + target.width = -target.width; + } + if (target.height < 0) { + target.y += target.height; + target.height = -target.height; + } + return; + } + lt.x = lb.x = source.x; + lt.y = rt.y = source.y; + rb.x = rt.x = source.x + source.width; + rb.y = lb.y = source.y + source.height; + lt.transform(m); + rt.transform(m); + rb.transform(m); + lb.transform(m); + target.x = mathMin(lt.x, rb.x, lb.x, rt.x); + target.y = mathMin(lt.y, rb.y, lb.y, rt.y); + var maxX = mathMax(lt.x, rb.x, lb.x, rt.x); + var maxY = mathMax(lt.y, rb.y, lb.y, rt.y); + target.width = maxX - target.x; + target.height = maxY - target.y; + }; + return BoundingRect; + }()); + + var textWidthCache = {}; + function getWidth(text, font) { + font = font || DEFAULT_FONT; + var cacheOfFont = textWidthCache[font]; + if (!cacheOfFont) { + cacheOfFont = textWidthCache[font] = new LRU(500); + } + var width = cacheOfFont.get(text); + if (width == null) { + width = platformApi.measureText(text, font).width; + cacheOfFont.put(text, width); + } + return width; + } + function innerGetBoundingRect(text, font, textAlign, textBaseline) { + var width = getWidth(text, font); + var height = getLineHeight(font); + var x = adjustTextX(0, width, textAlign); + var y = adjustTextY$1(0, height, textBaseline); + var rect = new BoundingRect(x, y, width, height); + return rect; + } + function getBoundingRect(text, font, textAlign, textBaseline) { + var textLines = ((text || '') + '').split('\n'); + var len = textLines.length; + if (len === 1) { + return innerGetBoundingRect(textLines[0], font, textAlign, textBaseline); + } + else { + var uniondRect = new BoundingRect(0, 0, 0, 0); + for (var i = 0; i < textLines.length; i++) { + var rect = innerGetBoundingRect(textLines[i], font, textAlign, textBaseline); + i === 0 ? uniondRect.copy(rect) : uniondRect.union(rect); + } + return uniondRect; + } + } + function adjustTextX(x, width, textAlign) { + if (textAlign === 'right') { + x -= width; + } + else if (textAlign === 'center') { + x -= width / 2; + } + return x; + } + function adjustTextY$1(y, height, verticalAlign) { + if (verticalAlign === 'middle') { + y -= height / 2; + } + else if (verticalAlign === 'bottom') { + y -= height; + } + return y; + } + function getLineHeight(font) { + return getWidth('国', font); + } + function parsePercent(value, maxValue) { + if (typeof value === 'string') { + if (value.lastIndexOf('%') >= 0) { + return parseFloat(value) / 100 * maxValue; + } + return parseFloat(value); + } + return value; + } + function calculateTextPosition(out, opts, rect) { + var textPosition = opts.position || 'inside'; + var distance = opts.distance != null ? opts.distance : 5; + var height = rect.height; + var width = rect.width; + var halfHeight = height / 2; + var x = rect.x; + var y = rect.y; + var textAlign = 'left'; + var textVerticalAlign = 'top'; + if (textPosition instanceof Array) { + x += parsePercent(textPosition[0], rect.width); + y += parsePercent(textPosition[1], rect.height); + textAlign = null; + textVerticalAlign = null; + } + else { + switch (textPosition) { + case 'left': + x -= distance; + y += halfHeight; + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + case 'right': + x += distance + width; + y += halfHeight; + textVerticalAlign = 'middle'; + break; + case 'top': + x += width / 2; + y -= distance; + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + case 'bottom': + x += width / 2; + y += height + distance; + textAlign = 'center'; + break; + case 'inside': + x += width / 2; + y += halfHeight; + textAlign = 'center'; + textVerticalAlign = 'middle'; + break; + case 'insideLeft': + x += distance; + y += halfHeight; + textVerticalAlign = 'middle'; + break; + case 'insideRight': + x += width - distance; + y += halfHeight; + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + case 'insideTop': + x += width / 2; + y += distance; + textAlign = 'center'; + break; + case 'insideBottom': + x += width / 2; + y += height - distance; + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + case 'insideTopLeft': + x += distance; + y += distance; + break; + case 'insideTopRight': + x += width - distance; + y += distance; + textAlign = 'right'; + break; + case 'insideBottomLeft': + x += distance; + y += height - distance; + textVerticalAlign = 'bottom'; + break; + case 'insideBottomRight': + x += width - distance; + y += height - distance; + textAlign = 'right'; + textVerticalAlign = 'bottom'; + break; + } + } + out = out || {}; + out.x = x; + out.y = y; + out.align = textAlign; + out.verticalAlign = textVerticalAlign; + return out; + } + + var PRESERVED_NORMAL_STATE = '__zr_normal__'; + var PRIMARY_STATES_KEYS = TRANSFORMABLE_PROPS.concat(['ignore']); + var DEFAULT_ANIMATABLE_MAP = reduce(TRANSFORMABLE_PROPS, function (obj, key) { + obj[key] = true; + return obj; + }, { ignore: false }); + var tmpTextPosCalcRes = {}; + var tmpBoundingRect = new BoundingRect(0, 0, 0, 0); + var Element = (function () { + function Element(props) { + this.id = guid(); + this.animators = []; + this.currentStates = []; + this.states = {}; + this._init(props); + } + Element.prototype._init = function (props) { + this.attr(props); + }; + Element.prototype.drift = function (dx, dy, e) { + switch (this.draggable) { + case 'horizontal': + dy = 0; + break; + case 'vertical': + dx = 0; + break; + } + var m = this.transform; + if (!m) { + m = this.transform = [1, 0, 0, 1, 0, 0]; + } + m[4] += dx; + m[5] += dy; + this.decomposeTransform(); + this.markRedraw(); + }; + Element.prototype.beforeUpdate = function () { }; + Element.prototype.afterUpdate = function () { }; + Element.prototype.update = function () { + this.updateTransform(); + if (this.__dirty) { + this.updateInnerText(); + } + }; + Element.prototype.updateInnerText = function (forceUpdate) { + var textEl = this._textContent; + if (textEl && (!textEl.ignore || forceUpdate)) { + if (!this.textConfig) { + this.textConfig = {}; + } + var textConfig = this.textConfig; + var isLocal = textConfig.local; + var innerTransformable = textEl.innerTransformable; + var textAlign = void 0; + var textVerticalAlign = void 0; + var textStyleChanged = false; + innerTransformable.parent = isLocal ? this : null; + var innerOrigin = false; + innerTransformable.copyTransform(textEl); + if (textConfig.position != null) { + var layoutRect = tmpBoundingRect; + if (textConfig.layoutRect) { + layoutRect.copy(textConfig.layoutRect); + } + else { + layoutRect.copy(this.getBoundingRect()); + } + if (!isLocal) { + layoutRect.applyTransform(this.transform); + } + if (this.calculateTextPosition) { + this.calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect); + } + else { + calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect); + } + innerTransformable.x = tmpTextPosCalcRes.x; + innerTransformable.y = tmpTextPosCalcRes.y; + textAlign = tmpTextPosCalcRes.align; + textVerticalAlign = tmpTextPosCalcRes.verticalAlign; + var textOrigin = textConfig.origin; + if (textOrigin && textConfig.rotation != null) { + var relOriginX = void 0; + var relOriginY = void 0; + if (textOrigin === 'center') { + relOriginX = layoutRect.width * 0.5; + relOriginY = layoutRect.height * 0.5; + } + else { + relOriginX = parsePercent(textOrigin[0], layoutRect.width); + relOriginY = parsePercent(textOrigin[1], layoutRect.height); + } + innerOrigin = true; + innerTransformable.originX = -innerTransformable.x + relOriginX + (isLocal ? 0 : layoutRect.x); + innerTransformable.originY = -innerTransformable.y + relOriginY + (isLocal ? 0 : layoutRect.y); + } + } + if (textConfig.rotation != null) { + innerTransformable.rotation = textConfig.rotation; + } + var textOffset = textConfig.offset; + if (textOffset) { + innerTransformable.x += textOffset[0]; + innerTransformable.y += textOffset[1]; + if (!innerOrigin) { + innerTransformable.originX = -textOffset[0]; + innerTransformable.originY = -textOffset[1]; + } + } + var isInside = textConfig.inside == null + ? (typeof textConfig.position === 'string' && textConfig.position.indexOf('inside') >= 0) + : textConfig.inside; + var innerTextDefaultStyle = this._innerTextDefaultStyle || (this._innerTextDefaultStyle = {}); + var textFill = void 0; + var textStroke = void 0; + var autoStroke = void 0; + if (isInside && this.canBeInsideText()) { + textFill = textConfig.insideFill; + textStroke = textConfig.insideStroke; + if (textFill == null || textFill === 'auto') { + textFill = this.getInsideTextFill(); + } + if (textStroke == null || textStroke === 'auto') { + textStroke = this.getInsideTextStroke(textFill); + autoStroke = true; + } + } + else { + textFill = textConfig.outsideFill; + textStroke = textConfig.outsideStroke; + if (textFill == null || textFill === 'auto') { + textFill = this.getOutsideFill(); + } + if (textStroke == null || textStroke === 'auto') { + textStroke = this.getOutsideStroke(textFill); + autoStroke = true; + } + } + textFill = textFill || '#000'; + if (textFill !== innerTextDefaultStyle.fill + || textStroke !== innerTextDefaultStyle.stroke + || autoStroke !== innerTextDefaultStyle.autoStroke + || textAlign !== innerTextDefaultStyle.align + || textVerticalAlign !== innerTextDefaultStyle.verticalAlign) { + textStyleChanged = true; + innerTextDefaultStyle.fill = textFill; + innerTextDefaultStyle.stroke = textStroke; + innerTextDefaultStyle.autoStroke = autoStroke; + innerTextDefaultStyle.align = textAlign; + innerTextDefaultStyle.verticalAlign = textVerticalAlign; + textEl.setDefaultTextStyle(innerTextDefaultStyle); + } + textEl.__dirty |= REDRAW_BIT; + if (textStyleChanged) { + textEl.dirtyStyle(true); + } + } + }; + Element.prototype.canBeInsideText = function () { + return true; + }; + Element.prototype.getInsideTextFill = function () { + return '#fff'; + }; + Element.prototype.getInsideTextStroke = function (textFill) { + return '#000'; + }; + Element.prototype.getOutsideFill = function () { + return this.__zr && this.__zr.isDarkMode() ? LIGHT_LABEL_COLOR : DARK_LABEL_COLOR; + }; + Element.prototype.getOutsideStroke = function (textFill) { + var backgroundColor = this.__zr && this.__zr.getBackgroundColor(); + var colorArr = typeof backgroundColor === 'string' && parse(backgroundColor); + if (!colorArr) { + colorArr = [255, 255, 255, 1]; + } + var alpha = colorArr[3]; + var isDark = this.__zr.isDarkMode(); + for (var i = 0; i < 3; i++) { + colorArr[i] = colorArr[i] * alpha + (isDark ? 0 : 255) * (1 - alpha); + } + colorArr[3] = 1; + return stringify(colorArr, 'rgba'); + }; + Element.prototype.traverse = function (cb, context) { }; + Element.prototype.attrKV = function (key, value) { + if (key === 'textConfig') { + this.setTextConfig(value); + } + else if (key === 'textContent') { + this.setTextContent(value); + } + else if (key === 'clipPath') { + this.setClipPath(value); + } + else if (key === 'extra') { + this.extra = this.extra || {}; + extend(this.extra, value); + } + else { + this[key] = value; + } + }; + Element.prototype.hide = function () { + this.ignore = true; + this.markRedraw(); + }; + Element.prototype.show = function () { + this.ignore = false; + this.markRedraw(); + }; + Element.prototype.attr = function (keyOrObj, value) { + if (typeof keyOrObj === 'string') { + this.attrKV(keyOrObj, value); + } + else if (isObject(keyOrObj)) { + var obj = keyOrObj; + var keysArr = keys(obj); + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + this.attrKV(key, keyOrObj[key]); + } + } + this.markRedraw(); + return this; + }; + Element.prototype.saveCurrentToNormalState = function (toState) { + this._innerSaveToNormal(toState); + var normalState = this._normalState; + for (var i = 0; i < this.animators.length; i++) { + var animator = this.animators[i]; + var fromStateTransition = animator.__fromStateTransition; + if (animator.getLoop() || fromStateTransition && fromStateTransition !== PRESERVED_NORMAL_STATE) { + continue; + } + var targetName = animator.targetName; + var target = targetName + ? normalState[targetName] : normalState; + animator.saveTo(target); + } + }; + Element.prototype._innerSaveToNormal = function (toState) { + var normalState = this._normalState; + if (!normalState) { + normalState = this._normalState = {}; + } + if (toState.textConfig && !normalState.textConfig) { + normalState.textConfig = this.textConfig; + } + this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS); + }; + Element.prototype._savePrimaryToNormal = function (toState, normalState, primaryKeys) { + for (var i = 0; i < primaryKeys.length; i++) { + var key = primaryKeys[i]; + if (toState[key] != null && !(key in normalState)) { + normalState[key] = this[key]; + } + } + }; + Element.prototype.hasState = function () { + return this.currentStates.length > 0; + }; + Element.prototype.getState = function (name) { + return this.states[name]; + }; + Element.prototype.ensureState = function (name) { + var states = this.states; + if (!states[name]) { + states[name] = {}; + } + return states[name]; + }; + Element.prototype.clearStates = function (noAnimation) { + this.useState(PRESERVED_NORMAL_STATE, false, noAnimation); + }; + Element.prototype.useState = function (stateName, keepCurrentStates, noAnimation, forceUseHoverLayer) { + var toNormalState = stateName === PRESERVED_NORMAL_STATE; + var hasStates = this.hasState(); + if (!hasStates && toNormalState) { + return; + } + var currentStates = this.currentStates; + var animationCfg = this.stateTransition; + if (indexOf(currentStates, stateName) >= 0 && (keepCurrentStates || currentStates.length === 1)) { + return; + } + var state; + if (this.stateProxy && !toNormalState) { + state = this.stateProxy(stateName); + } + if (!state) { + state = (this.states && this.states[stateName]); + } + if (!state && !toNormalState) { + logError("State " + stateName + " not exists."); + return; + } + if (!toNormalState) { + this.saveCurrentToNormalState(state); + } + var useHoverLayer = !!((state && state.hoverLayer) || forceUseHoverLayer); + if (useHoverLayer) { + this._toggleHoverLayerFlag(true); + } + this._applyStateObj(stateName, state, this._normalState, keepCurrentStates, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg); + var textContent = this._textContent; + var textGuide = this._textGuide; + if (textContent) { + textContent.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer); + } + if (textGuide) { + textGuide.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer); + } + if (toNormalState) { + this.currentStates = []; + this._normalState = {}; + } + else { + if (!keepCurrentStates) { + this.currentStates = [stateName]; + } + else { + this.currentStates.push(stateName); + } + } + this._updateAnimationTargets(); + this.markRedraw(); + if (!useHoverLayer && this.__inHover) { + this._toggleHoverLayerFlag(false); + this.__dirty &= ~REDRAW_BIT; + } + return state; + }; + Element.prototype.useStates = function (states, noAnimation, forceUseHoverLayer) { + if (!states.length) { + this.clearStates(); + } + else { + var stateObjects = []; + var currentStates = this.currentStates; + var len = states.length; + var notChange = len === currentStates.length; + if (notChange) { + for (var i = 0; i < len; i++) { + if (states[i] !== currentStates[i]) { + notChange = false; + break; + } + } + } + if (notChange) { + return; + } + for (var i = 0; i < len; i++) { + var stateName = states[i]; + var stateObj = void 0; + if (this.stateProxy) { + stateObj = this.stateProxy(stateName, states); + } + if (!stateObj) { + stateObj = this.states[stateName]; + } + if (stateObj) { + stateObjects.push(stateObj); + } + } + var lastStateObj = stateObjects[len - 1]; + var useHoverLayer = !!((lastStateObj && lastStateObj.hoverLayer) || forceUseHoverLayer); + if (useHoverLayer) { + this._toggleHoverLayerFlag(true); + } + var mergedState = this._mergeStates(stateObjects); + var animationCfg = this.stateTransition; + this.saveCurrentToNormalState(mergedState); + this._applyStateObj(states.join(','), mergedState, this._normalState, false, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg); + var textContent = this._textContent; + var textGuide = this._textGuide; + if (textContent) { + textContent.useStates(states, noAnimation, useHoverLayer); + } + if (textGuide) { + textGuide.useStates(states, noAnimation, useHoverLayer); + } + this._updateAnimationTargets(); + this.currentStates = states.slice(); + this.markRedraw(); + if (!useHoverLayer && this.__inHover) { + this._toggleHoverLayerFlag(false); + this.__dirty &= ~REDRAW_BIT; + } + } + }; + Element.prototype._updateAnimationTargets = function () { + for (var i = 0; i < this.animators.length; i++) { + var animator = this.animators[i]; + if (animator.targetName) { + animator.changeTarget(this[animator.targetName]); + } + } + }; + Element.prototype.removeState = function (state) { + var idx = indexOf(this.currentStates, state); + if (idx >= 0) { + var currentStates = this.currentStates.slice(); + currentStates.splice(idx, 1); + this.useStates(currentStates); + } + }; + Element.prototype.replaceState = function (oldState, newState, forceAdd) { + var currentStates = this.currentStates.slice(); + var idx = indexOf(currentStates, oldState); + var newStateExists = indexOf(currentStates, newState) >= 0; + if (idx >= 0) { + if (!newStateExists) { + currentStates[idx] = newState; + } + else { + currentStates.splice(idx, 1); + } + } + else if (forceAdd && !newStateExists) { + currentStates.push(newState); + } + this.useStates(currentStates); + }; + Element.prototype.toggleState = function (state, enable) { + if (enable) { + this.useState(state, true); + } + else { + this.removeState(state); + } + }; + Element.prototype._mergeStates = function (states) { + var mergedState = {}; + var mergedTextConfig; + for (var i = 0; i < states.length; i++) { + var state = states[i]; + extend(mergedState, state); + if (state.textConfig) { + mergedTextConfig = mergedTextConfig || {}; + extend(mergedTextConfig, state.textConfig); + } + } + if (mergedTextConfig) { + mergedState.textConfig = mergedTextConfig; + } + return mergedState; + }; + Element.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) { + var needsRestoreToNormal = !(state && keepCurrentStates); + if (state && state.textConfig) { + this.textConfig = extend({}, keepCurrentStates ? this.textConfig : normalState.textConfig); + extend(this.textConfig, state.textConfig); + } + else if (needsRestoreToNormal) { + if (normalState.textConfig) { + this.textConfig = normalState.textConfig; + } + } + var transitionTarget = {}; + var hasTransition = false; + for (var i = 0; i < PRIMARY_STATES_KEYS.length; i++) { + var key = PRIMARY_STATES_KEYS[i]; + var propNeedsTransition = transition && DEFAULT_ANIMATABLE_MAP[key]; + if (state && state[key] != null) { + if (propNeedsTransition) { + hasTransition = true; + transitionTarget[key] = state[key]; + } + else { + this[key] = state[key]; + } + } + else if (needsRestoreToNormal) { + if (normalState[key] != null) { + if (propNeedsTransition) { + hasTransition = true; + transitionTarget[key] = normalState[key]; + } + else { + this[key] = normalState[key]; + } + } + } + } + if (!transition) { + for (var i = 0; i < this.animators.length; i++) { + var animator = this.animators[i]; + var targetName = animator.targetName; + if (!animator.getLoop()) { + animator.__changeFinalValue(targetName + ? (state || normalState)[targetName] + : (state || normalState)); + } + } + } + if (hasTransition) { + this._transitionState(stateName, transitionTarget, animationCfg); + } + }; + Element.prototype._attachComponent = function (componentEl) { + if (componentEl.__zr && !componentEl.__hostTarget) { + if ("development" !== 'production') { + throw new Error('Text element has been added to zrender.'); + } + return; + } + if (componentEl === this) { + if ("development" !== 'production') { + throw new Error('Recursive component attachment.'); + } + return; + } + var zr = this.__zr; + if (zr) { + componentEl.addSelfToZr(zr); + } + componentEl.__zr = zr; + componentEl.__hostTarget = this; + }; + Element.prototype._detachComponent = function (componentEl) { + if (componentEl.__zr) { + componentEl.removeSelfFromZr(componentEl.__zr); + } + componentEl.__zr = null; + componentEl.__hostTarget = null; + }; + Element.prototype.getClipPath = function () { + return this._clipPath; + }; + Element.prototype.setClipPath = function (clipPath) { + if (this._clipPath && this._clipPath !== clipPath) { + this.removeClipPath(); + } + this._attachComponent(clipPath); + this._clipPath = clipPath; + this.markRedraw(); + }; + Element.prototype.removeClipPath = function () { + var clipPath = this._clipPath; + if (clipPath) { + this._detachComponent(clipPath); + this._clipPath = null; + this.markRedraw(); + } + }; + Element.prototype.getTextContent = function () { + return this._textContent; + }; + Element.prototype.setTextContent = function (textEl) { + var previousTextContent = this._textContent; + if (previousTextContent === textEl) { + return; + } + if (previousTextContent && previousTextContent !== textEl) { + this.removeTextContent(); + } + if ("development" !== 'production') { + if (textEl.__zr && !textEl.__hostTarget) { + throw new Error('Text element has been added to zrender.'); + } + } + textEl.innerTransformable = new Transformable(); + this._attachComponent(textEl); + this._textContent = textEl; + this.markRedraw(); + }; + Element.prototype.setTextConfig = function (cfg) { + if (!this.textConfig) { + this.textConfig = {}; + } + extend(this.textConfig, cfg); + this.markRedraw(); + }; + Element.prototype.removeTextConfig = function () { + this.textConfig = null; + this.markRedraw(); + }; + Element.prototype.removeTextContent = function () { + var textEl = this._textContent; + if (textEl) { + textEl.innerTransformable = null; + this._detachComponent(textEl); + this._textContent = null; + this._innerTextDefaultStyle = null; + this.markRedraw(); + } + }; + Element.prototype.getTextGuideLine = function () { + return this._textGuide; + }; + Element.prototype.setTextGuideLine = function (guideLine) { + if (this._textGuide && this._textGuide !== guideLine) { + this.removeTextGuideLine(); + } + this._attachComponent(guideLine); + this._textGuide = guideLine; + this.markRedraw(); + }; + Element.prototype.removeTextGuideLine = function () { + var textGuide = this._textGuide; + if (textGuide) { + this._detachComponent(textGuide); + this._textGuide = null; + this.markRedraw(); + } + }; + Element.prototype.markRedraw = function () { + this.__dirty |= REDRAW_BIT; + var zr = this.__zr; + if (zr) { + if (this.__inHover) { + zr.refreshHover(); + } + else { + zr.refresh(); + } + } + if (this.__hostTarget) { + this.__hostTarget.markRedraw(); + } + }; + Element.prototype.dirty = function () { + this.markRedraw(); + }; + Element.prototype._toggleHoverLayerFlag = function (inHover) { + this.__inHover = inHover; + var textContent = this._textContent; + var textGuide = this._textGuide; + if (textContent) { + textContent.__inHover = inHover; + } + if (textGuide) { + textGuide.__inHover = inHover; + } + }; + Element.prototype.addSelfToZr = function (zr) { + if (this.__zr === zr) { + return; + } + this.__zr = zr; + var animators = this.animators; + if (animators) { + for (var i = 0; i < animators.length; i++) { + zr.animation.addAnimator(animators[i]); + } + } + if (this._clipPath) { + this._clipPath.addSelfToZr(zr); + } + if (this._textContent) { + this._textContent.addSelfToZr(zr); + } + if (this._textGuide) { + this._textGuide.addSelfToZr(zr); + } + }; + Element.prototype.removeSelfFromZr = function (zr) { + if (!this.__zr) { + return; + } + this.__zr = null; + var animators = this.animators; + if (animators) { + for (var i = 0; i < animators.length; i++) { + zr.animation.removeAnimator(animators[i]); + } + } + if (this._clipPath) { + this._clipPath.removeSelfFromZr(zr); + } + if (this._textContent) { + this._textContent.removeSelfFromZr(zr); + } + if (this._textGuide) { + this._textGuide.removeSelfFromZr(zr); + } + }; + Element.prototype.animate = function (key, loop, allowDiscreteAnimation) { + var target = key ? this[key] : this; + if ("development" !== 'production') { + if (!target) { + logError('Property "' + + key + + '" is not existed in element ' + + this.id); + return; + } + } + var animator = new Animator(target, loop, allowDiscreteAnimation); + key && (animator.targetName = key); + this.addAnimator(animator, key); + return animator; + }; + Element.prototype.addAnimator = function (animator, key) { + var zr = this.__zr; + var el = this; + animator.during(function () { + el.updateDuringAnimation(key); + }).done(function () { + var animators = el.animators; + var idx = indexOf(animators, animator); + if (idx >= 0) { + animators.splice(idx, 1); + } + }); + this.animators.push(animator); + if (zr) { + zr.animation.addAnimator(animator); + } + zr && zr.wakeUp(); + }; + Element.prototype.updateDuringAnimation = function (key) { + this.markRedraw(); + }; + Element.prototype.stopAnimation = function (scope, forwardToLast) { + var animators = this.animators; + var len = animators.length; + var leftAnimators = []; + for (var i = 0; i < len; i++) { + var animator = animators[i]; + if (!scope || scope === animator.scope) { + animator.stop(forwardToLast); + } + else { + leftAnimators.push(animator); + } + } + this.animators = leftAnimators; + return this; + }; + Element.prototype.animateTo = function (target, cfg, animationProps) { + animateTo(this, target, cfg, animationProps); + }; + Element.prototype.animateFrom = function (target, cfg, animationProps) { + animateTo(this, target, cfg, animationProps, true); + }; + Element.prototype._transitionState = function (stateName, target, cfg, animationProps) { + var animators = animateTo(this, target, cfg, animationProps); + for (var i = 0; i < animators.length; i++) { + animators[i].__fromStateTransition = stateName; + } + }; + Element.prototype.getBoundingRect = function () { + return null; + }; + Element.prototype.getPaintRect = function () { + return null; + }; + Element.initDefaultProps = (function () { + var elProto = Element.prototype; + elProto.type = 'element'; + elProto.name = ''; + elProto.ignore = + elProto.silent = + elProto.isGroup = + elProto.draggable = + elProto.dragging = + elProto.ignoreClip = + elProto.__inHover = false; + elProto.__dirty = REDRAW_BIT; + var logs = {}; + function logDeprecatedError(key, xKey, yKey) { + if (!logs[key + xKey + yKey]) { + console.warn("DEPRECATED: '" + key + "' has been deprecated. use '" + xKey + "', '" + yKey + "' instead"); + logs[key + xKey + yKey] = true; + } + } + function createLegacyProperty(key, privateKey, xKey, yKey) { + Object.defineProperty(elProto, key, { + get: function () { + if ("development" !== 'production') { + logDeprecatedError(key, xKey, yKey); + } + if (!this[privateKey]) { + var pos = this[privateKey] = []; + enhanceArray(this, pos); + } + return this[privateKey]; + }, + set: function (pos) { + if ("development" !== 'production') { + logDeprecatedError(key, xKey, yKey); + } + this[xKey] = pos[0]; + this[yKey] = pos[1]; + this[privateKey] = pos; + enhanceArray(this, pos); + } + }); + function enhanceArray(self, pos) { + Object.defineProperty(pos, 0, { + get: function () { + return self[xKey]; + }, + set: function (val) { + self[xKey] = val; + } + }); + Object.defineProperty(pos, 1, { + get: function () { + return self[yKey]; + }, + set: function (val) { + self[yKey] = val; + } + }); + } + } + if (Object.defineProperty) { + createLegacyProperty('position', '_legacyPos', 'x', 'y'); + createLegacyProperty('scale', '_legacyScale', 'scaleX', 'scaleY'); + createLegacyProperty('origin', '_legacyOrigin', 'originX', 'originY'); + } + })(); + return Element; + }()); + mixin(Element, Eventful); + mixin(Element, Transformable); + function animateTo(animatable, target, cfg, animationProps, reverse) { + cfg = cfg || {}; + var animators = []; + animateToShallow(animatable, '', animatable, target, cfg, animationProps, animators, reverse); + var finishCount = animators.length; + var doneHappened = false; + var cfgDone = cfg.done; + var cfgAborted = cfg.aborted; + var doneCb = function () { + doneHappened = true; + finishCount--; + if (finishCount <= 0) { + doneHappened + ? (cfgDone && cfgDone()) + : (cfgAborted && cfgAborted()); + } + }; + var abortedCb = function () { + finishCount--; + if (finishCount <= 0) { + doneHappened + ? (cfgDone && cfgDone()) + : (cfgAborted && cfgAborted()); + } + }; + if (!finishCount) { + cfgDone && cfgDone(); + } + if (animators.length > 0 && cfg.during) { + animators[0].during(function (target, percent) { + cfg.during(percent); + }); + } + for (var i = 0; i < animators.length; i++) { + var animator = animators[i]; + if (doneCb) { + animator.done(doneCb); + } + if (abortedCb) { + animator.aborted(abortedCb); + } + if (cfg.force) { + animator.duration(cfg.duration); + } + animator.start(cfg.easing); + } + return animators; + } + function copyArrShallow(source, target, len) { + for (var i = 0; i < len; i++) { + source[i] = target[i]; + } + } + function is2DArray(value) { + return isArrayLike(value[0]); + } + function copyValue(target, source, key) { + if (isArrayLike(source[key])) { + if (!isArrayLike(target[key])) { + target[key] = []; + } + if (isTypedArray(source[key])) { + var len = source[key].length; + if (target[key].length !== len) { + target[key] = new (source[key].constructor)(len); + copyArrShallow(target[key], source[key], len); + } + } + else { + var sourceArr = source[key]; + var targetArr = target[key]; + var len0 = sourceArr.length; + if (is2DArray(sourceArr)) { + var len1 = sourceArr[0].length; + for (var i = 0; i < len0; i++) { + if (!targetArr[i]) { + targetArr[i] = Array.prototype.slice.call(sourceArr[i]); + } + else { + copyArrShallow(targetArr[i], sourceArr[i], len1); + } + } + } + else { + copyArrShallow(targetArr, sourceArr, len0); + } + targetArr.length = sourceArr.length; + } + } + else { + target[key] = source[key]; + } + } + function isValueSame(val1, val2) { + return val1 === val2 + || isArrayLike(val1) && isArrayLike(val2) && is1DArraySame(val1, val2); + } + function is1DArraySame(arr0, arr1) { + var len = arr0.length; + if (len !== arr1.length) { + return false; + } + for (var i = 0; i < len; i++) { + if (arr0[i] !== arr1[i]) { + return false; + } + } + return true; + } + function animateToShallow(animatable, topKey, animateObj, target, cfg, animationProps, animators, reverse) { + var targetKeys = keys(target); + var duration = cfg.duration; + var delay = cfg.delay; + var additive = cfg.additive; + var setToFinal = cfg.setToFinal; + var animateAll = !isObject(animationProps); + var existsAnimators = animatable.animators; + var animationKeys = []; + for (var k = 0; k < targetKeys.length; k++) { + var innerKey = targetKeys[k]; + var targetVal = target[innerKey]; + if (targetVal != null && animateObj[innerKey] != null + && (animateAll || animationProps[innerKey])) { + if (isObject(targetVal) + && !isArrayLike(targetVal) + && !isGradientObject(targetVal)) { + if (topKey) { + if (!reverse) { + animateObj[innerKey] = targetVal; + animatable.updateDuringAnimation(topKey); + } + continue; + } + animateToShallow(animatable, innerKey, animateObj[innerKey], targetVal, cfg, animationProps && animationProps[innerKey], animators, reverse); + } + else { + animationKeys.push(innerKey); + } + } + else if (!reverse) { + animateObj[innerKey] = targetVal; + animatable.updateDuringAnimation(topKey); + animationKeys.push(innerKey); + } + } + var keyLen = animationKeys.length; + if (!additive && keyLen) { + for (var i = 0; i < existsAnimators.length; i++) { + var animator = existsAnimators[i]; + if (animator.targetName === topKey) { + var allAborted = animator.stopTracks(animationKeys); + if (allAborted) { + var idx = indexOf(existsAnimators, animator); + existsAnimators.splice(idx, 1); + } + } + } + } + if (!cfg.force) { + animationKeys = filter(animationKeys, function (key) { return !isValueSame(target[key], animateObj[key]); }); + keyLen = animationKeys.length; + } + if (keyLen > 0 + || (cfg.force && !animators.length)) { + var revertedSource = void 0; + var reversedTarget = void 0; + var sourceClone = void 0; + if (reverse) { + reversedTarget = {}; + if (setToFinal) { + revertedSource = {}; + } + for (var i = 0; i < keyLen; i++) { + var innerKey = animationKeys[i]; + reversedTarget[innerKey] = animateObj[innerKey]; + if (setToFinal) { + revertedSource[innerKey] = target[innerKey]; + } + else { + animateObj[innerKey] = target[innerKey]; + } + } + } + else if (setToFinal) { + sourceClone = {}; + for (var i = 0; i < keyLen; i++) { + var innerKey = animationKeys[i]; + sourceClone[innerKey] = cloneValue(animateObj[innerKey]); + copyValue(animateObj, target, innerKey); + } + } + var animator = new Animator(animateObj, false, false, additive ? filter(existsAnimators, function (animator) { return animator.targetName === topKey; }) : null); + animator.targetName = topKey; + if (cfg.scope) { + animator.scope = cfg.scope; + } + if (setToFinal && revertedSource) { + animator.whenWithKeys(0, revertedSource, animationKeys); + } + if (sourceClone) { + animator.whenWithKeys(0, sourceClone, animationKeys); + } + animator.whenWithKeys(duration == null ? 500 : duration, reverse ? reversedTarget : target, animationKeys).delay(delay || 0); + animatable.addAnimator(animator, topKey); + animators.push(animator); + } + } + + var Group = (function (_super) { + __extends(Group, _super); + function Group(opts) { + var _this = _super.call(this) || this; + _this.isGroup = true; + _this._children = []; + _this.attr(opts); + return _this; + } + Group.prototype.childrenRef = function () { + return this._children; + }; + Group.prototype.children = function () { + return this._children.slice(); + }; + Group.prototype.childAt = function (idx) { + return this._children[idx]; + }; + Group.prototype.childOfName = function (name) { + var children = this._children; + for (var i = 0; i < children.length; i++) { + if (children[i].name === name) { + return children[i]; + } + } + }; + Group.prototype.childCount = function () { + return this._children.length; + }; + Group.prototype.add = function (child) { + if (child) { + if (child !== this && child.parent !== this) { + this._children.push(child); + this._doAdd(child); + } + if ("development" !== 'production') { + if (child.__hostTarget) { + throw 'This elemenet has been used as an attachment'; + } + } + } + return this; + }; + Group.prototype.addBefore = function (child, nextSibling) { + if (child && child !== this && child.parent !== this + && nextSibling && nextSibling.parent === this) { + var children = this._children; + var idx = children.indexOf(nextSibling); + if (idx >= 0) { + children.splice(idx, 0, child); + this._doAdd(child); + } + } + return this; + }; + Group.prototype.replace = function (oldChild, newChild) { + var idx = indexOf(this._children, oldChild); + if (idx >= 0) { + this.replaceAt(newChild, idx); + } + return this; + }; + Group.prototype.replaceAt = function (child, index) { + var children = this._children; + var old = children[index]; + if (child && child !== this && child.parent !== this && child !== old) { + children[index] = child; + old.parent = null; + var zr = this.__zr; + if (zr) { + old.removeSelfFromZr(zr); + } + this._doAdd(child); + } + return this; + }; + Group.prototype._doAdd = function (child) { + if (child.parent) { + child.parent.remove(child); + } + child.parent = this; + var zr = this.__zr; + if (zr && zr !== child.__zr) { + child.addSelfToZr(zr); + } + zr && zr.refresh(); + }; + Group.prototype.remove = function (child) { + var zr = this.__zr; + var children = this._children; + var idx = indexOf(children, child); + if (idx < 0) { + return this; + } + children.splice(idx, 1); + child.parent = null; + if (zr) { + child.removeSelfFromZr(zr); + } + zr && zr.refresh(); + return this; + }; + Group.prototype.removeAll = function () { + var children = this._children; + var zr = this.__zr; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (zr) { + child.removeSelfFromZr(zr); + } + child.parent = null; + } + children.length = 0; + return this; + }; + Group.prototype.eachChild = function (cb, context) { + var children = this._children; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + cb.call(context, child, i); + } + return this; + }; + Group.prototype.traverse = function (cb, context) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + var stopped = cb.call(context, child); + if (child.isGroup && !stopped) { + child.traverse(cb, context); + } + } + return this; + }; + Group.prototype.addSelfToZr = function (zr) { + _super.prototype.addSelfToZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + child.addSelfToZr(zr); + } + }; + Group.prototype.removeSelfFromZr = function (zr) { + _super.prototype.removeSelfFromZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + child.removeSelfFromZr(zr); + } + }; + Group.prototype.getBoundingRect = function (includeChildren) { + var tmpRect = new BoundingRect(0, 0, 0, 0); + var children = includeChildren || this._children; + var tmpMat = []; + var rect = null; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (child.ignore || child.invisible) { + continue; + } + var childRect = child.getBoundingRect(); + var transform = child.getLocalTransform(tmpMat); + if (transform) { + BoundingRect.applyTransform(tmpRect, childRect, transform); + rect = rect || tmpRect.clone(); + rect.union(tmpRect); + } + else { + rect = rect || childRect.clone(); + rect.union(childRect); + } + } + return rect || tmpRect; + }; + return Group; + }(Element)); + Group.prototype.type = 'group'; + + /*! + * ZRender, a high performance 2d drawing library. + * + * Copyright (c) 2013, Baidu Inc. + * All rights reserved. + * + * LICENSE + * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt + */ + var painterCtors = {}; + var instances = {}; + function delInstance(id) { + delete instances[id]; + } + function isDarkMode(backgroundColor) { + if (!backgroundColor) { + return false; + } + if (typeof backgroundColor === 'string') { + return lum(backgroundColor, 1) < DARK_MODE_THRESHOLD; + } + else if (backgroundColor.colorStops) { + var colorStops = backgroundColor.colorStops; + var totalLum = 0; + var len = colorStops.length; + for (var i = 0; i < len; i++) { + totalLum += lum(colorStops[i].color, 1); + } + totalLum /= len; + return totalLum < DARK_MODE_THRESHOLD; + } + return false; + } + var ZRender = (function () { + function ZRender(id, dom, opts) { + var _this = this; + this._sleepAfterStill = 10; + this._stillFrameAccum = 0; + this._needsRefresh = true; + this._needsRefreshHover = true; + this._darkMode = false; + opts = opts || {}; + this.dom = dom; + this.id = id; + var storage = new Storage(); + var rendererType = opts.renderer || 'canvas'; + if (!painterCtors[rendererType]) { + rendererType = keys(painterCtors)[0]; + } + if ("development" !== 'production') { + if (!painterCtors[rendererType]) { + throw new Error("Renderer '" + rendererType + "' is not imported. Please import it first."); + } + } + opts.useDirtyRect = opts.useDirtyRect == null + ? false + : opts.useDirtyRect; + var painter = new painterCtors[rendererType](dom, storage, opts, id); + var ssrMode = opts.ssr || painter.ssrOnly; + this.storage = storage; + this.painter = painter; + var handerProxy = (!env.node && !env.worker && !ssrMode) + ? new HandlerDomProxy(painter.getViewportRoot(), painter.root) + : null; + this.handler = new Handler(storage, painter, handerProxy, painter.root); + this.animation = new Animation({ + stage: { + update: ssrMode ? null : function () { return _this._flush(true); } + } + }); + if (!ssrMode) { + this.animation.start(); + } + } + ZRender.prototype.add = function (el) { + if (!el) { + return; + } + this.storage.addRoot(el); + el.addSelfToZr(this); + this.refresh(); + }; + ZRender.prototype.remove = function (el) { + if (!el) { + return; + } + this.storage.delRoot(el); + el.removeSelfFromZr(this); + this.refresh(); + }; + ZRender.prototype.configLayer = function (zLevel, config) { + if (this.painter.configLayer) { + this.painter.configLayer(zLevel, config); + } + this.refresh(); + }; + ZRender.prototype.setBackgroundColor = function (backgroundColor) { + if (this.painter.setBackgroundColor) { + this.painter.setBackgroundColor(backgroundColor); + } + this.refresh(); + this._backgroundColor = backgroundColor; + this._darkMode = isDarkMode(backgroundColor); + }; + ZRender.prototype.getBackgroundColor = function () { + return this._backgroundColor; + }; + ZRender.prototype.setDarkMode = function (darkMode) { + this._darkMode = darkMode; + }; + ZRender.prototype.isDarkMode = function () { + return this._darkMode; + }; + ZRender.prototype.refreshImmediately = function (fromInside) { + if (!fromInside) { + this.animation.update(true); + } + this._needsRefresh = false; + this.painter.refresh(); + this._needsRefresh = false; + }; + ZRender.prototype.refresh = function () { + this._needsRefresh = true; + this.animation.start(); + }; + ZRender.prototype.flush = function () { + this._flush(false); + }; + ZRender.prototype._flush = function (fromInside) { + var triggerRendered; + var start = getTime(); + if (this._needsRefresh) { + triggerRendered = true; + this.refreshImmediately(fromInside); + } + if (this._needsRefreshHover) { + triggerRendered = true; + this.refreshHoverImmediately(); + } + var end = getTime(); + if (triggerRendered) { + this._stillFrameAccum = 0; + this.trigger('rendered', { + elapsedTime: end - start + }); + } + else if (this._sleepAfterStill > 0) { + this._stillFrameAccum++; + if (this._stillFrameAccum > this._sleepAfterStill) { + this.animation.stop(); + } + } + }; + ZRender.prototype.setSleepAfterStill = function (stillFramesCount) { + this._sleepAfterStill = stillFramesCount; + }; + ZRender.prototype.wakeUp = function () { + this.animation.start(); + this._stillFrameAccum = 0; + }; + ZRender.prototype.refreshHover = function () { + this._needsRefreshHover = true; + }; + ZRender.prototype.refreshHoverImmediately = function () { + this._needsRefreshHover = false; + if (this.painter.refreshHover && this.painter.getType() === 'canvas') { + this.painter.refreshHover(); + } + }; + ZRender.prototype.resize = function (opts) { + opts = opts || {}; + this.painter.resize(opts.width, opts.height); + this.handler.resize(); + }; + ZRender.prototype.clearAnimation = function () { + this.animation.clear(); + }; + ZRender.prototype.getWidth = function () { + return this.painter.getWidth(); + }; + ZRender.prototype.getHeight = function () { + return this.painter.getHeight(); + }; + ZRender.prototype.setCursorStyle = function (cursorStyle) { + this.handler.setCursorStyle(cursorStyle); + }; + ZRender.prototype.findHover = function (x, y) { + return this.handler.findHover(x, y); + }; + ZRender.prototype.on = function (eventName, eventHandler, context) { + this.handler.on(eventName, eventHandler, context); + return this; + }; + ZRender.prototype.off = function (eventName, eventHandler) { + this.handler.off(eventName, eventHandler); + }; + ZRender.prototype.trigger = function (eventName, event) { + this.handler.trigger(eventName, event); + }; + ZRender.prototype.clear = function () { + var roots = this.storage.getRoots(); + for (var i = 0; i < roots.length; i++) { + if (roots[i] instanceof Group) { + roots[i].removeSelfFromZr(this); + } + } + this.storage.delAllRoots(); + this.painter.clear(); + }; + ZRender.prototype.dispose = function () { + this.animation.stop(); + this.clear(); + this.storage.dispose(); + this.painter.dispose(); + this.handler.dispose(); + this.animation = + this.storage = + this.painter = + this.handler = null; + delInstance(this.id); + }; + return ZRender; + }()); + function init(dom, opts) { + var zr = new ZRender(guid(), dom, opts); + instances[zr.id] = zr; + return zr; + } + function dispose(zr) { + zr.dispose(); + } + function disposeAll() { + for (var key in instances) { + if (instances.hasOwnProperty(key)) { + instances[key].dispose(); + } + } + instances = {}; + } + function getInstance(id) { + return instances[id]; + } + function registerPainter(name, Ctor) { + painterCtors[name] = Ctor; + } + var version = '5.3.2'; + + var zrender = /*#__PURE__*/Object.freeze({ + __proto__: null, + init: init, + dispose: dispose, + disposeAll: disposeAll, + getInstance: getInstance, + registerPainter: registerPainter, + version: version + }); + + var RADIAN_EPSILON = 1e-4; // Although chrome already enlarge this number to 100 for `toFixed`, but + // we sill follow the spec for compatibility. + + var ROUND_SUPPORTED_PRECISION_MAX = 20; + + function _trim(str) { + return str.replace(/^\s+|\s+$/g, ''); + } + /** + * Linear mapping a value from domain to range + * @param val + * @param domain Domain extent domain[0] can be bigger than domain[1] + * @param range Range extent range[0] can be bigger than range[1] + * @param clamp Default to be false + */ + + + function linearMap(val, domain, range, clamp) { + var d0 = domain[0]; + var d1 = domain[1]; + var r0 = range[0]; + var r1 = range[1]; + var subDomain = d1 - d0; + var subRange = r1 - r0; + + if (subDomain === 0) { + return subRange === 0 ? r0 : (r0 + r1) / 2; + } // Avoid accuracy problem in edge, such as + // 146.39 - 62.83 === 83.55999999999999. + // See echarts/test/ut/spec/util/number.js#linearMap#accuracyError + // It is a little verbose for efficiency considering this method + // is a hotspot. + + + if (clamp) { + if (subDomain > 0) { + if (val <= d0) { + return r0; + } else if (val >= d1) { + return r1; + } + } else { + if (val >= d0) { + return r0; + } else if (val <= d1) { + return r1; + } + } + } else { + if (val === d0) { + return r0; + } + + if (val === d1) { + return r1; + } + } + + return (val - d0) / subDomain * subRange + r0; + } + /** + * Convert a percent string to absolute number. + * Returns NaN if percent is not a valid string or number + */ + + function parsePercent$1(percent, all) { + switch (percent) { + case 'center': + case 'middle': + percent = '50%'; + break; + + case 'left': + case 'top': + percent = '0%'; + break; + + case 'right': + case 'bottom': + percent = '100%'; + break; + } + + if (isString(percent)) { + if (_trim(percent).match(/%$/)) { + return parseFloat(percent) / 100 * all; + } + + return parseFloat(percent); + } + + return percent == null ? NaN : +percent; + } + function round(x, precision, returnStr) { + if (precision == null) { + precision = 10; + } // Avoid range error + + + precision = Math.min(Math.max(0, precision), ROUND_SUPPORTED_PRECISION_MAX); // PENDING: 1.005.toFixed(2) is '1.00' rather than '1.01' + + x = (+x).toFixed(precision); + return returnStr ? x : +x; + } + /** + * Inplacd asc sort arr. + * The input arr will be modified. + */ + + function asc(arr) { + arr.sort(function (a, b) { + return a - b; + }); + return arr; + } + /** + * Get precision. + */ + + function getPrecision(val) { + val = +val; + + if (isNaN(val)) { + return 0; + } // It is much faster than methods converting number to string as follows + // let tmp = val.toString(); + // return tmp.length - 1 - tmp.indexOf('.'); + // especially when precision is low + // Notice: + // (1) If the loop count is over about 20, it is slower than `getPrecisionSafe`. + // (see https://jsbench.me/2vkpcekkvw/1) + // (2) If the val is less than for example 1e-15, the result may be incorrect. + // (see test/ut/spec/util/number.test.ts `getPrecision_equal_random`) + + + if (val > 1e-14) { + var e = 1; + + for (var i = 0; i < 15; i++, e *= 10) { + if (Math.round(val * e) / e === val) { + return i; + } + } + } + + return getPrecisionSafe(val); + } + /** + * Get precision with slow but safe method + */ + + function getPrecisionSafe(val) { + // toLowerCase for: '3.4E-12' + var str = val.toString().toLowerCase(); // Consider scientific notation: '3.4e-12' '3.4e+12' + + var eIndex = str.indexOf('e'); + var exp = eIndex > 0 ? +str.slice(eIndex + 1) : 0; + var significandPartLen = eIndex > 0 ? eIndex : str.length; + var dotIndex = str.indexOf('.'); + var decimalPartLen = dotIndex < 0 ? 0 : significandPartLen - 1 - dotIndex; + return Math.max(0, decimalPartLen - exp); + } + /** + * Minimal dicernible data precisioin according to a single pixel. + */ + + function getPixelPrecision(dataExtent, pixelExtent) { + var log = Math.log; + var LN10 = Math.LN10; + var dataQuantity = Math.floor(log(dataExtent[1] - dataExtent[0]) / LN10); + var sizeQuantity = Math.round(log(Math.abs(pixelExtent[1] - pixelExtent[0])) / LN10); // toFixed() digits argument must be between 0 and 20. + + var precision = Math.min(Math.max(-dataQuantity + sizeQuantity, 0), 20); + return !isFinite(precision) ? 20 : precision; + } + /** + * Get a data of given precision, assuring the sum of percentages + * in valueList is 1. + * The largest remainer method is used. + * https://en.wikipedia.org/wiki/Largest_remainder_method + * + * @param valueList a list of all data + * @param idx index of the data to be processed in valueList + * @param precision integer number showing digits of precision + * @return percent ranging from 0 to 100 + */ + + function getPercentWithPrecision(valueList, idx, precision) { + if (!valueList[idx]) { + return 0; + } + + var sum = reduce(valueList, function (acc, val) { + return acc + (isNaN(val) ? 0 : val); + }, 0); + + if (sum === 0) { + return 0; + } + + var digits = Math.pow(10, precision); + var votesPerQuota = map(valueList, function (val) { + return (isNaN(val) ? 0 : val) / sum * digits * 100; + }); + var targetSeats = digits * 100; + var seats = map(votesPerQuota, function (votes) { + // Assign automatic seats. + return Math.floor(votes); + }); + var currentSum = reduce(seats, function (acc, val) { + return acc + val; + }, 0); + var remainder = map(votesPerQuota, function (votes, idx) { + return votes - seats[idx]; + }); // Has remainding votes. + + while (currentSum < targetSeats) { + // Find next largest remainder. + var max = Number.NEGATIVE_INFINITY; + var maxId = null; + + for (var i = 0, len = remainder.length; i < len; ++i) { + if (remainder[i] > max) { + max = remainder[i]; + maxId = i; + } + } // Add a vote to max remainder. + + + ++seats[maxId]; + remainder[maxId] = 0; + ++currentSum; + } + + return seats[idx] / digits; + } + /** + * Solve the floating point adding problem like 0.1 + 0.2 === 0.30000000000000004 + * See <http://0.30000000000000004.com/> + */ + + function addSafe(val0, val1) { + var maxPrecision = Math.max(getPrecision(val0), getPrecision(val1)); // const multiplier = Math.pow(10, maxPrecision); + // return (Math.round(val0 * multiplier) + Math.round(val1 * multiplier)) / multiplier; + + var sum = val0 + val1; // // PENDING: support more? + + return maxPrecision > ROUND_SUPPORTED_PRECISION_MAX ? sum : round(sum, maxPrecision); + } // Number.MAX_SAFE_INTEGER, ie do not support. + + var MAX_SAFE_INTEGER = 9007199254740991; + /** + * To 0 - 2 * PI, considering negative radian. + */ + + function remRadian(radian) { + var pi2 = Math.PI * 2; + return (radian % pi2 + pi2) % pi2; + } + /** + * @param {type} radian + * @return {boolean} + */ + + function isRadianAroundZero(val) { + return val > -RADIAN_EPSILON && val < RADIAN_EPSILON; + } // eslint-disable-next-line + + var TIME_REG = /^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d{1,2})(?::(\d{1,2})(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/; // jshint ignore:line + + /** + * @param value valid type: number | string | Date, otherwise return `new Date(NaN)` + * These values can be accepted: + * + An instance of Date, represent a time in its own time zone. + * + Or string in a subset of ISO 8601, only including: + * + only year, month, date: '2012-03', '2012-03-01', '2012-03-01 05', '2012-03-01 05:06', + * + separated with T or space: '2012-03-01T12:22:33.123', '2012-03-01 12:22:33.123', + * + time zone: '2012-03-01T12:22:33Z', '2012-03-01T12:22:33+8000', '2012-03-01T12:22:33-05:00', + * all of which will be treated as local time if time zone is not specified + * (see <https://momentjs.com/>). + * + Or other string format, including (all of which will be treated as loacal time): + * '2012', '2012-3-1', '2012/3/1', '2012/03/01', + * '2009/6/12 2:00', '2009/6/12 2:05:08', '2009/6/12 2:05:08.123' + * + a timestamp, which represent a time in UTC. + * @return date Never be null/undefined. If invalid, return `new Date(NaN)`. + */ + + function parseDate(value) { + if (value instanceof Date) { + return value; + } else if (isString(value)) { + // Different browsers parse date in different way, so we parse it manually. + // Some other issues: + // new Date('1970-01-01') is UTC, + // new Date('1970/01/01') and new Date('1970-1-01') is local. + // See issue #3623 + var match = TIME_REG.exec(value); + + if (!match) { + // return Invalid Date. + return new Date(NaN); + } // Use local time when no timezone offset specifed. + + + if (!match[8]) { + // match[n] can only be string or undefined. + // But take care of '12' + 1 => '121'. + return new Date(+match[1], +(match[2] || 1) - 1, +match[3] || 1, +match[4] || 0, +(match[5] || 0), +match[6] || 0, match[7] ? +match[7].substring(0, 3) : 0); + } // Timezoneoffset of Javascript Date has considered DST (Daylight Saving Time, + // https://tc39.github.io/ecma262/#sec-daylight-saving-time-adjustment). + // For example, system timezone is set as "Time Zone: America/Toronto", + // then these code will get different result: + // `new Date(1478411999999).getTimezoneOffset(); // get 240` + // `new Date(1478412000000).getTimezoneOffset(); // get 300` + // So we should not use `new Date`, but use `Date.UTC`. + else { + var hour = +match[4] || 0; + + if (match[8].toUpperCase() !== 'Z') { + hour -= +match[8].slice(0, 3); + } + + return new Date(Date.UTC(+match[1], +(match[2] || 1) - 1, +match[3] || 1, hour, +(match[5] || 0), +match[6] || 0, match[7] ? +match[7].substring(0, 3) : 0)); + } + } else if (value == null) { + return new Date(NaN); + } + + return new Date(Math.round(value)); + } + /** + * Quantity of a number. e.g. 0.1, 1, 10, 100 + * + * @param val + * @return + */ + + function quantity(val) { + return Math.pow(10, quantityExponent(val)); + } + /** + * Exponent of the quantity of a number + * e.g., 1234 equals to 1.234*10^3, so quantityExponent(1234) is 3 + * + * @param val non-negative value + * @return + */ + + function quantityExponent(val) { + if (val === 0) { + return 0; + } + + var exp = Math.floor(Math.log(val) / Math.LN10); + /** + * exp is expected to be the rounded-down result of the base-10 log of val. + * But due to the precision loss with Math.log(val), we need to restore it + * using 10^exp to make sure we can get val back from exp. #11249 + */ + + if (val / Math.pow(10, exp) >= 10) { + exp++; + } + + return exp; + } + /** + * find a “nice” number approximately equal to x. Round the number if round = true, + * take ceiling if round = false. The primary observation is that the “nicest” + * numbers in decimal are 1, 2, and 5, and all power-of-ten multiples of these numbers. + * + * See "Nice Numbers for Graph Labels" of Graphic Gems. + * + * @param val Non-negative value. + * @param round + * @return Niced number + */ + + function nice(val, round) { + var exponent = quantityExponent(val); + var exp10 = Math.pow(10, exponent); + var f = val / exp10; // 1 <= f < 10 + + var nf; + + if (round) { + if (f < 1.5) { + nf = 1; + } else if (f < 2.5) { + nf = 2; + } else if (f < 4) { + nf = 3; + } else if (f < 7) { + nf = 5; + } else { + nf = 10; + } + } else { + if (f < 1) { + nf = 1; + } else if (f < 2) { + nf = 2; + } else if (f < 3) { + nf = 3; + } else if (f < 5) { + nf = 5; + } else { + nf = 10; + } + } + + val = nf * exp10; // Fix 3 * 0.1 === 0.30000000000000004 issue (see IEEE 754). + // 20 is the uppper bound of toFixed. + + return exponent >= -20 ? +val.toFixed(exponent < 0 ? -exponent : 0) : val; + } + /** + * This code was copied from "d3.js" + * <https://github.com/d3/d3/blob/9cc9a875e636a1dcf36cc1e07bdf77e1ad6e2c74/src/arrays/quantile.js>. + * See the license statement at the head of this file. + * @param ascArr + */ + + function quantile(ascArr, p) { + var H = (ascArr.length - 1) * p + 1; + var h = Math.floor(H); + var v = +ascArr[h - 1]; + var e = H - h; + return e ? v + e * (ascArr[h] - v) : v; + } + /** + * Order intervals asc, and split them when overlap. + * expect(numberUtil.reformIntervals([ + * {interval: [18, 62], close: [1, 1]}, + * {interval: [-Infinity, -70], close: [0, 0]}, + * {interval: [-70, -26], close: [1, 1]}, + * {interval: [-26, 18], close: [1, 1]}, + * {interval: [62, 150], close: [1, 1]}, + * {interval: [106, 150], close: [1, 1]}, + * {interval: [150, Infinity], close: [0, 0]} + * ])).toEqual([ + * {interval: [-Infinity, -70], close: [0, 0]}, + * {interval: [-70, -26], close: [1, 1]}, + * {interval: [-26, 18], close: [0, 1]}, + * {interval: [18, 62], close: [0, 1]}, + * {interval: [62, 150], close: [0, 1]}, + * {interval: [150, Infinity], close: [0, 0]} + * ]); + * @param list, where `close` mean open or close + * of the interval, and Infinity can be used. + * @return The origin list, which has been reformed. + */ + + function reformIntervals(list) { + list.sort(function (a, b) { + return littleThan(a, b, 0) ? -1 : 1; + }); + var curr = -Infinity; + var currClose = 1; + + for (var i = 0; i < list.length;) { + var interval = list[i].interval; + var close_1 = list[i].close; + + for (var lg = 0; lg < 2; lg++) { + if (interval[lg] <= curr) { + interval[lg] = curr; + close_1[lg] = !lg ? 1 - currClose : 1; + } + + curr = interval[lg]; + currClose = close_1[lg]; + } + + if (interval[0] === interval[1] && close_1[0] * close_1[1] !== 1) { + list.splice(i, 1); + } else { + i++; + } + } + + return list; + + function littleThan(a, b, lg) { + return a.interval[lg] < b.interval[lg] || a.interval[lg] === b.interval[lg] && (a.close[lg] - b.close[lg] === (!lg ? 1 : -1) || !lg && littleThan(a, b, 1)); + } + } + /** + * [Numberic is defined as]: + * `parseFloat(val) == val` + * For example: + * numeric: + * typeof number except NaN, '-123', '123', '2e3', '-2e3', '011', 'Infinity', Infinity, + * and they rounded by white-spaces or line-terminal like ' -123 \n ' (see es spec) + * not-numeric: + * null, undefined, [], {}, true, false, 'NaN', NaN, '123ab', + * empty string, string with only white-spaces or line-terminal (see es spec), + * 0x12, '0x12', '-0x12', 012, '012', '-012', + * non-string, ... + * + * @test See full test cases in `test/ut/spec/util/number.js`. + * @return Must be a typeof number. If not numeric, return NaN. + */ + + function numericToNumber(val) { + var valFloat = parseFloat(val); + return valFloat == val // eslint-disable-line eqeqeq + && (valFloat !== 0 || !isString(val) || val.indexOf('x') <= 0) // For case ' 0x0 '. + ? valFloat : NaN; + } + /** + * Definition of "numeric": see `numericToNumber`. + */ + + function isNumeric(val) { + return !isNaN(numericToNumber(val)); + } + /** + * Use random base to prevent users hard code depending on + * this auto generated marker id. + * @return An positive integer. + */ + + function getRandomIdBase() { + return Math.round(Math.random() * 9); + } + /** + * Get the greatest common dividor + * + * @param {number} a one number + * @param {number} b the other number + */ + + function getGreatestCommonDividor(a, b) { + if (b === 0) { + return a; + } + + return getGreatestCommonDividor(b, a % b); + } + /** + * Get the least common multiple + * + * @param {number} a one number + * @param {number} b the other number + */ + + function getLeastCommonMultiple(a, b) { + if (a == null) { + return b; + } + + if (b == null) { + return a; + } + + return a * b / getGreatestCommonDividor(a, b); + } + + var ECHARTS_PREFIX = '[ECharts] '; + var storedLogs = {}; + var hasConsole = typeof console !== 'undefined' // eslint-disable-next-line + && console.warn && console.log; + + function outputLog(type, str, onlyOnce) { + if (hasConsole) { + if (onlyOnce) { + if (storedLogs[str]) { + return; + } + + storedLogs[str] = true; + } // eslint-disable-next-line + + + console[type](ECHARTS_PREFIX + str); + } + } + + function log(str, onlyOnce) { + outputLog('log', str, onlyOnce); + } + function warn(str, onlyOnce) { + outputLog('warn', str, onlyOnce); + } + function error(str, onlyOnce) { + outputLog('error', str, onlyOnce); + } + function deprecateLog(str) { + if ("development" !== 'production') { + // Not display duplicate message. + outputLog('warn', 'DEPRECATED: ' + str, true); + } + } + function deprecateReplaceLog(oldOpt, newOpt, scope) { + if ("development" !== 'production') { + deprecateLog((scope ? "[" + scope + "]" : '') + (oldOpt + " is deprecated, use " + newOpt + " instead.")); + } + } + /** + * If in __DEV__ environment, get console printable message for users hint. + * Parameters are separated by ' '. + * @usuage + * makePrintable('This is an error on', someVar, someObj); + * + * @param hintInfo anything about the current execution context to hint users. + * @throws Error + */ + + function makePrintable() { + var hintInfo = []; + + for (var _i = 0; _i < arguments.length; _i++) { + hintInfo[_i] = arguments[_i]; + } + + var msg = ''; + + if ("development" !== 'production') { + // Fuzzy stringify for print. + // This code only exist in dev environment. + var makePrintableStringIfPossible_1 = function (val) { + return val === void 0 ? 'undefined' : val === Infinity ? 'Infinity' : val === -Infinity ? '-Infinity' : eqNaN(val) ? 'NaN' : val instanceof Date ? 'Date(' + val.toISOString() + ')' : isFunction(val) ? 'function () { ... }' : isRegExp(val) ? val + '' : null; + }; + + msg = map(hintInfo, function (arg) { + if (isString(arg)) { + // Print without quotation mark for some statement. + return arg; + } else { + var printableStr = makePrintableStringIfPossible_1(arg); + + if (printableStr != null) { + return printableStr; + } else if (typeof JSON !== 'undefined' && JSON.stringify) { + try { + return JSON.stringify(arg, function (n, val) { + var printableStr = makePrintableStringIfPossible_1(val); + return printableStr == null ? val : printableStr; + }); // In most cases the info object is small, so do not line break. + } catch (err) { + return '?'; + } + } else { + return '?'; + } + } + }).join(' '); + } + + return msg; + } + /** + * @throws Error + */ + + function throwError(msg) { + throw new Error(msg); + } + + function interpolateNumber$1(p0, p1, percent) { + return (p1 - p0) * percent + p0; + } + /** + * Make the name displayable. But we should + * make sure it is not duplicated with user + * specified name, so use '\0'; + */ + + + var DUMMY_COMPONENT_NAME_PREFIX = 'series\0'; + var INTERNAL_COMPONENT_ID_PREFIX = '\0_ec_\0'; + /** + * If value is not array, then translate it to array. + * @param {*} value + * @return {Array} [value] or value + */ + + function normalizeToArray(value) { + return value instanceof Array ? value : value == null ? [] : [value]; + } + /** + * Sync default option between normal and emphasis like `position` and `show` + * In case some one will write code like + * label: { + * show: false, + * position: 'outside', + * fontSize: 18 + * }, + * emphasis: { + * label: { show: true } + * } + */ + + function defaultEmphasis(opt, key, subOpts) { + // Caution: performance sensitive. + if (opt) { + opt[key] = opt[key] || {}; + opt.emphasis = opt.emphasis || {}; + opt.emphasis[key] = opt.emphasis[key] || {}; // Default emphasis option from normal + + for (var i = 0, len = subOpts.length; i < len; i++) { + var subOptName = subOpts[i]; + + if (!opt.emphasis[key].hasOwnProperty(subOptName) && opt[key].hasOwnProperty(subOptName)) { + opt.emphasis[key][subOptName] = opt[key][subOptName]; + } + } + } + } + var TEXT_STYLE_OPTIONS = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'rich', 'tag', 'color', 'textBorderColor', 'textBorderWidth', 'width', 'height', 'lineHeight', 'align', 'verticalAlign', 'baseline', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY', 'textShadowColor', 'textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY', 'backgroundColor', 'borderColor', 'borderWidth', 'borderRadius', 'padding']; // modelUtil.LABEL_OPTIONS = modelUtil.TEXT_STYLE_OPTIONS.concat([ + // 'position', 'offset', 'rotate', 'origin', 'show', 'distance', 'formatter', + // 'fontStyle', 'fontWeight', 'fontSize', 'fontFamily', + // // FIXME: deprecated, check and remove it. + // 'textStyle' + // ]); + + /** + * The method do not ensure performance. + * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}] + * This helper method retieves value from data. + */ + + function getDataItemValue(dataItem) { + return isObject(dataItem) && !isArray(dataItem) && !(dataItem instanceof Date) ? dataItem.value : dataItem; + } + /** + * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}] + * This helper method determine if dataItem has extra option besides value + */ + + function isDataItemOption(dataItem) { + return isObject(dataItem) && !(dataItem instanceof Array); // // markLine data can be array + // && !(dataItem[0] && isObject(dataItem[0]) && !(dataItem[0] instanceof Array)); + } + /** + * Mapping to existings for merge. + * + * Mode "normalMege": + * The mapping result (merge result) will keep the order of the existing + * component, rather than the order of new option. Because we should ensure + * some specified index reference (like xAxisIndex) keep work. + * And in most cases, "merge option" is used to update partial option but not + * be expected to change the order. + * + * Mode "replaceMege": + * (1) Only the id mapped components will be merged. + * (2) Other existing components (except internal compoonets) will be removed. + * (3) Other new options will be used to create new component. + * (4) The index of the existing compoents will not be modified. + * That means their might be "hole" after the removal. + * The new components are created first at those available index. + * + * Mode "replaceAll": + * This mode try to support that reproduce an echarts instance from another + * echarts instance (via `getOption`) in some simple cases. + * In this senario, the `result` index are exactly the consistent with the `newCmptOptions`, + * which ensures the compoennt index referring (like `xAxisIndex: ?`) corrent. That is, + * the "hole" in `newCmptOptions` will also be kept. + * On the contrary, other modes try best to eliminate holes. + * PENDING: This is an experimental mode yet. + * + * @return See the comment of <MappingResult>. + */ + + function mappingToExists(existings, newCmptOptions, mode) { + var isNormalMergeMode = mode === 'normalMerge'; + var isReplaceMergeMode = mode === 'replaceMerge'; + var isReplaceAllMode = mode === 'replaceAll'; + existings = existings || []; + newCmptOptions = (newCmptOptions || []).slice(); + var existingIdIdxMap = createHashMap(); // Validate id and name on user input option. + + each(newCmptOptions, function (cmptOption, index) { + if (!isObject(cmptOption)) { + newCmptOptions[index] = null; + return; + } + + if ("development" !== 'production') { + // There is some legacy case that name is set as `false`. + // But should work normally rather than throw error. + if (cmptOption.id != null && !isValidIdOrName(cmptOption.id)) { + warnInvalidateIdOrName(cmptOption.id); + } + + if (cmptOption.name != null && !isValidIdOrName(cmptOption.name)) { + warnInvalidateIdOrName(cmptOption.name); + } + } + }); + var result = prepareResult(existings, existingIdIdxMap, mode); + + if (isNormalMergeMode || isReplaceMergeMode) { + mappingById(result, existings, existingIdIdxMap, newCmptOptions); + } + + if (isNormalMergeMode) { + mappingByName(result, newCmptOptions); + } + + if (isNormalMergeMode || isReplaceMergeMode) { + mappingByIndex(result, newCmptOptions, isReplaceMergeMode); + } else if (isReplaceAllMode) { + mappingInReplaceAllMode(result, newCmptOptions); + } + + makeIdAndName(result); // The array `result` MUST NOT contain elided items, otherwise the + // forEach will ommit those items and result in incorrect result. + + return result; + } + + function prepareResult(existings, existingIdIdxMap, mode) { + var result = []; + + if (mode === 'replaceAll') { + return result; + } // Do not use native `map` to in case that the array `existings` + // contains elided items, which will be ommited. + + + for (var index = 0; index < existings.length; index++) { + var existing = existings[index]; // Because of replaceMerge, `existing` may be null/undefined. + + if (existing && existing.id != null) { + existingIdIdxMap.set(existing.id, index); + } // For non-internal-componnets: + // Mode "normalMerge": all existings kept. + // Mode "replaceMerge": all existing removed unless mapped by id. + // For internal-components: + // go with "replaceMerge" approach in both mode. + + + result.push({ + existing: mode === 'replaceMerge' || isComponentIdInternal(existing) ? null : existing, + newOption: null, + keyInfo: null, + brandNew: null + }); + } + + return result; + } + + function mappingById(result, existings, existingIdIdxMap, newCmptOptions) { + // Mapping by id if specified. + each(newCmptOptions, function (cmptOption, index) { + if (!cmptOption || cmptOption.id == null) { + return; + } + + var optionId = makeComparableKey(cmptOption.id); + var existingIdx = existingIdIdxMap.get(optionId); + + if (existingIdx != null) { + var resultItem = result[existingIdx]; + assert(!resultItem.newOption, 'Duplicated option on id "' + optionId + '".'); + resultItem.newOption = cmptOption; // In both mode, if id matched, new option will be merged to + // the existings rather than creating new component model. + + resultItem.existing = existings[existingIdx]; + newCmptOptions[index] = null; + } + }); + } + + function mappingByName(result, newCmptOptions) { + // Mapping by name if specified. + each(newCmptOptions, function (cmptOption, index) { + if (!cmptOption || cmptOption.name == null) { + return; + } + + for (var i = 0; i < result.length; i++) { + var existing = result[i].existing; + + if (!result[i].newOption // Consider name: two map to one. + // Can not match when both ids existing but different. + && existing && (existing.id == null || cmptOption.id == null) && !isComponentIdInternal(cmptOption) && !isComponentIdInternal(existing) && keyExistAndEqual('name', existing, cmptOption)) { + result[i].newOption = cmptOption; + newCmptOptions[index] = null; + return; + } + } + }); + } + + function mappingByIndex(result, newCmptOptions, brandNew) { + each(newCmptOptions, function (cmptOption) { + if (!cmptOption) { + return; + } // Find the first place that not mapped by id and not internal component (consider the "hole"). + + + var resultItem; + var nextIdx = 0; + + while ( // Be `!resultItem` only when `nextIdx >= result.length`. + (resultItem = result[nextIdx]) && ( // (1) Existing models that already have id should be able to mapped to. Because + // after mapping performed, model will always be assigned with an id if user not given. + // After that all models have id. + // (2) If new option has id, it can only set to a hole or append to the last. It should + // not be merged to the existings with different id. Because id should not be overwritten. + // (3) Name can be overwritten, because axis use name as 'show label text'. + resultItem.newOption || isComponentIdInternal(resultItem.existing) || // In mode "replaceMerge", here no not-mapped-non-internal-existing. + resultItem.existing && cmptOption.id != null && !keyExistAndEqual('id', cmptOption, resultItem.existing))) { + nextIdx++; + } + + if (resultItem) { + resultItem.newOption = cmptOption; + resultItem.brandNew = brandNew; + } else { + result.push({ + newOption: cmptOption, + brandNew: brandNew, + existing: null, + keyInfo: null + }); + } + + nextIdx++; + }); + } + + function mappingInReplaceAllMode(result, newCmptOptions) { + each(newCmptOptions, function (cmptOption) { + // The feature "reproduce" requires "hole" will also reproduced + // in case that compoennt index referring are broken. + result.push({ + newOption: cmptOption, + brandNew: true, + existing: null, + keyInfo: null + }); + }); + } + /** + * Make id and name for mapping result (result of mappingToExists) + * into `keyInfo` field. + */ + + + function makeIdAndName(mapResult) { + // We use this id to hash component models and view instances + // in echarts. id can be specified by user, or auto generated. + // The id generation rule ensures new view instance are able + // to mapped to old instance when setOption are called in + // no-merge mode. So we generate model id by name and plus + // type in view id. + // name can be duplicated among components, which is convenient + // to specify multi components (like series) by one name. + // Ensure that each id is distinct. + var idMap = createHashMap(); + each(mapResult, function (item) { + var existing = item.existing; + existing && idMap.set(existing.id, item); + }); + each(mapResult, function (item) { + var opt = item.newOption; // Force ensure id not duplicated. + + assert(!opt || opt.id == null || !idMap.get(opt.id) || idMap.get(opt.id) === item, 'id duplicates: ' + (opt && opt.id)); + opt && opt.id != null && idMap.set(opt.id, item); + !item.keyInfo && (item.keyInfo = {}); + }); // Make name and id. + + each(mapResult, function (item, index) { + var existing = item.existing; + var opt = item.newOption; + var keyInfo = item.keyInfo; + + if (!isObject(opt)) { + return; + } // name can be overwitten. Consider case: axis.name = '20km'. + // But id generated by name will not be changed, which affect + // only in that case: setOption with 'not merge mode' and view + // instance will be recreated, which can be accepted. + + + keyInfo.name = opt.name != null ? makeComparableKey(opt.name) : existing ? existing.name // Avoid diffferent series has the same name, + // because name may be used like in color pallet. + : DUMMY_COMPONENT_NAME_PREFIX + index; + + if (existing) { + keyInfo.id = makeComparableKey(existing.id); + } else if (opt.id != null) { + keyInfo.id = makeComparableKey(opt.id); + } else { + // Consider this situatoin: + // optionA: [{name: 'a'}, {name: 'a'}, {..}] + // optionB [{..}, {name: 'a'}, {name: 'a'}] + // Series with the same name between optionA and optionB + // should be mapped. + var idNum = 0; + + do { + keyInfo.id = '\0' + keyInfo.name + '\0' + idNum++; + } while (idMap.get(keyInfo.id)); + } + + idMap.set(keyInfo.id, item); + }); + } + + function keyExistAndEqual(attr, obj1, obj2) { + var key1 = convertOptionIdName(obj1[attr], null); + var key2 = convertOptionIdName(obj2[attr], null); // See `MappingExistingItem`. `id` and `name` trade string equals to number. + + return key1 != null && key2 != null && key1 === key2; + } + /** + * @return return null if not exist. + */ + + + function makeComparableKey(val) { + if ("development" !== 'production') { + if (val == null) { + throw new Error(); + } + } + + return convertOptionIdName(val, ''); + } + + function convertOptionIdName(idOrName, defaultValue) { + if (idOrName == null) { + return defaultValue; + } + + return isString(idOrName) ? idOrName : isNumber(idOrName) || isStringSafe(idOrName) ? idOrName + '' : defaultValue; + } + + function warnInvalidateIdOrName(idOrName) { + if ("development" !== 'production') { + warn('`' + idOrName + '` is invalid id or name. Must be a string or number.'); + } + } + + function isValidIdOrName(idOrName) { + return isStringSafe(idOrName) || isNumeric(idOrName); + } + + function isNameSpecified(componentModel) { + var name = componentModel.name; // Is specified when `indexOf` get -1 or > 0. + + return !!(name && name.indexOf(DUMMY_COMPONENT_NAME_PREFIX)); + } + /** + * @public + * @param {Object} cmptOption + * @return {boolean} + */ + + function isComponentIdInternal(cmptOption) { + return cmptOption && cmptOption.id != null && makeComparableKey(cmptOption.id).indexOf(INTERNAL_COMPONENT_ID_PREFIX) === 0; + } + function makeInternalComponentId(idSuffix) { + return INTERNAL_COMPONENT_ID_PREFIX + idSuffix; + } + function setComponentTypeToKeyInfo(mappingResult, mainType, componentModelCtor) { + // Set mainType and complete subType. + each(mappingResult, function (item) { + var newOption = item.newOption; + + if (isObject(newOption)) { + item.keyInfo.mainType = mainType; + item.keyInfo.subType = determineSubType(mainType, newOption, item.existing, componentModelCtor); + } + }); + } + + function determineSubType(mainType, newCmptOption, existComponent, componentModelCtor) { + var subType = newCmptOption.type ? newCmptOption.type : existComponent ? existComponent.subType // Use determineSubType only when there is no existComponent. + : componentModelCtor.determineSubType(mainType, newCmptOption); // tooltip, markline, markpoint may always has no subType + + return subType; + } + /** + * A helper for removing duplicate items between batchA and batchB, + * and in themselves, and categorize by series. + * + * @param batchA Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...] + * @param batchB Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...] + * @return result: [resultBatchA, resultBatchB] + */ + + + function compressBatches(batchA, batchB) { + var mapA = {}; + var mapB = {}; + makeMap(batchA || [], mapA); + makeMap(batchB || [], mapB, mapA); + return [mapToArray(mapA), mapToArray(mapB)]; + + function makeMap(sourceBatch, map, otherMap) { + for (var i = 0, len = sourceBatch.length; i < len; i++) { + var seriesId = convertOptionIdName(sourceBatch[i].seriesId, null); + + if (seriesId == null) { + return; + } + + var dataIndices = normalizeToArray(sourceBatch[i].dataIndex); + var otherDataIndices = otherMap && otherMap[seriesId]; + + for (var j = 0, lenj = dataIndices.length; j < lenj; j++) { + var dataIndex = dataIndices[j]; + + if (otherDataIndices && otherDataIndices[dataIndex]) { + otherDataIndices[dataIndex] = null; + } else { + (map[seriesId] || (map[seriesId] = {}))[dataIndex] = 1; + } + } + } + } + + function mapToArray(map, isData) { + var result = []; + + for (var i in map) { + if (map.hasOwnProperty(i) && map[i] != null) { + if (isData) { + result.push(+i); + } else { + var dataIndices = mapToArray(map[i], true); + dataIndices.length && result.push({ + seriesId: i, + dataIndex: dataIndices + }); + } + } + } + + return result; + } + } + /** + * @param payload Contains dataIndex (means rawIndex) / dataIndexInside / name + * each of which can be Array or primary type. + * @return dataIndex If not found, return undefined/null. + */ + + function queryDataIndex(data, payload) { + if (payload.dataIndexInside != null) { + return payload.dataIndexInside; + } else if (payload.dataIndex != null) { + return isArray(payload.dataIndex) ? map(payload.dataIndex, function (value) { + return data.indexOfRawIndex(value); + }) : data.indexOfRawIndex(payload.dataIndex); + } else if (payload.name != null) { + return isArray(payload.name) ? map(payload.name, function (value) { + return data.indexOfName(value); + }) : data.indexOfName(payload.name); + } + } + /** + * Enable property storage to any host object. + * Notice: Serialization is not supported. + * + * For example: + * let inner = zrUitl.makeInner(); + * + * function some1(hostObj) { + * inner(hostObj).someProperty = 1212; + * ... + * } + * function some2() { + * let fields = inner(this); + * fields.someProperty1 = 1212; + * fields.someProperty2 = 'xx'; + * ... + * } + * + * @return {Function} + */ + + function makeInner() { + var key = '__ec_inner_' + innerUniqueIndex++; + return function (hostObj) { + return hostObj[key] || (hostObj[key] = {}); + }; + } + var innerUniqueIndex = getRandomIdBase(); + /** + * The same behavior as `component.getReferringComponents`. + */ + + function parseFinder(ecModel, finderInput, opt) { + var _a = preParseFinder(finderInput, opt), + mainTypeSpecified = _a.mainTypeSpecified, + queryOptionMap = _a.queryOptionMap, + others = _a.others; + + var result = others; + var defaultMainType = opt ? opt.defaultMainType : null; + + if (!mainTypeSpecified && defaultMainType) { + queryOptionMap.set(defaultMainType, {}); + } + + queryOptionMap.each(function (queryOption, mainType) { + var queryResult = queryReferringComponents(ecModel, mainType, queryOption, { + useDefault: defaultMainType === mainType, + enableAll: opt && opt.enableAll != null ? opt.enableAll : true, + enableNone: opt && opt.enableNone != null ? opt.enableNone : true + }); + result[mainType + 'Models'] = queryResult.models; + result[mainType + 'Model'] = queryResult.models[0]; + }); + return result; + } + function preParseFinder(finderInput, opt) { + var finder; + + if (isString(finderInput)) { + var obj = {}; + obj[finderInput + 'Index'] = 0; + finder = obj; + } else { + finder = finderInput; + } + + var queryOptionMap = createHashMap(); + var others = {}; + var mainTypeSpecified = false; + each(finder, function (value, key) { + // Exclude 'dataIndex' and other illgal keys. + if (key === 'dataIndex' || key === 'dataIndexInside') { + others[key] = value; + return; + } + + var parsedKey = key.match(/^(\w+)(Index|Id|Name)$/) || []; + var mainType = parsedKey[1]; + var queryType = (parsedKey[2] || '').toLowerCase(); + + if (!mainType || !queryType || opt && opt.includeMainTypes && indexOf(opt.includeMainTypes, mainType) < 0) { + return; + } + + mainTypeSpecified = mainTypeSpecified || !!mainType; + var queryOption = queryOptionMap.get(mainType) || queryOptionMap.set(mainType, {}); + queryOption[queryType] = value; + }); + return { + mainTypeSpecified: mainTypeSpecified, + queryOptionMap: queryOptionMap, + others: others + }; + } + var SINGLE_REFERRING = { + useDefault: true, + enableAll: false, + enableNone: false + }; + var MULTIPLE_REFERRING = { + useDefault: false, + enableAll: true, + enableNone: true + }; + function queryReferringComponents(ecModel, mainType, userOption, opt) { + opt = opt || SINGLE_REFERRING; + var indexOption = userOption.index; + var idOption = userOption.id; + var nameOption = userOption.name; + var result = { + models: null, + specified: indexOption != null || idOption != null || nameOption != null + }; + + if (!result.specified) { + // Use the first as default if `useDefault`. + var firstCmpt = void 0; + result.models = opt.useDefault && (firstCmpt = ecModel.getComponent(mainType)) ? [firstCmpt] : []; + return result; + } + + if (indexOption === 'none' || indexOption === false) { + assert(opt.enableNone, '`"none"` or `false` is not a valid value on index option.'); + result.models = []; + return result; + } // `queryComponents` will return all components if + // both all of index/id/name are null/undefined. + + + if (indexOption === 'all') { + assert(opt.enableAll, '`"all"` is not a valid value on index option.'); + indexOption = idOption = nameOption = null; + } + + result.models = ecModel.queryComponents({ + mainType: mainType, + index: indexOption, + id: idOption, + name: nameOption + }); + return result; + } + function setAttribute(dom, key, value) { + dom.setAttribute ? dom.setAttribute(key, value) : dom[key] = value; + } + function getAttribute(dom, key) { + return dom.getAttribute ? dom.getAttribute(key) : dom[key]; + } + function getTooltipRenderMode(renderModeOption) { + if (renderModeOption === 'auto') { + // Using html when `document` exists, use richText otherwise + return env.domSupported ? 'html' : 'richText'; + } else { + return renderModeOption || 'html'; + } + } + /** + * Group a list by key. + */ + + function groupData(array, getKey // return key + ) { + var buckets = createHashMap(); + var keys = []; + each(array, function (item) { + var key = getKey(item); + (buckets.get(key) || (keys.push(key), buckets.set(key, []))).push(item); + }); + return { + keys: keys, + buckets: buckets + }; + } + /** + * Interpolate raw values of a series with percent + * + * @param data data + * @param labelModel label model of the text element + * @param sourceValue start value. May be null/undefined when init. + * @param targetValue end value + * @param percent 0~1 percentage; 0 uses start value while 1 uses end value + * @return interpolated values + * If `sourceValue` and `targetValue` are `number`, return `number`. + * If `sourceValue` and `targetValue` are `string`, return `string`. + * If `sourceValue` and `targetValue` are `(string | number)[]`, return `(string | number)[]`. + * Other cases do not supported. + */ + + function interpolateRawValues(data, precision, sourceValue, targetValue, percent) { + var isAutoPrecision = precision == null || precision === 'auto'; + + if (targetValue == null) { + return targetValue; + } + + if (isNumber(targetValue)) { + var value = interpolateNumber$1(sourceValue || 0, targetValue, percent); + return round(value, isAutoPrecision ? Math.max(getPrecision(sourceValue || 0), getPrecision(targetValue)) : precision); + } else if (isString(targetValue)) { + return percent < 1 ? sourceValue : targetValue; + } else { + var interpolated = []; + var leftArr = sourceValue; + var rightArr = targetValue; + var length_1 = Math.max(leftArr ? leftArr.length : 0, rightArr.length); + + for (var i = 0; i < length_1; ++i) { + var info = data.getDimensionInfo(i); // Don't interpolate ordinal dims + + if (info && info.type === 'ordinal') { + // In init, there is no `sourceValue`, but should better not to get undefined result. + interpolated[i] = (percent < 1 && leftArr ? leftArr : rightArr)[i]; + } else { + var leftVal = leftArr && leftArr[i] ? leftArr[i] : 0; + var rightVal = rightArr[i]; + var value = interpolateNumber$1(leftVal, rightVal, percent); + interpolated[i] = round(value, isAutoPrecision ? Math.max(getPrecision(leftVal), getPrecision(rightVal)) : precision); + } + } + + return interpolated; + } + } + + var TYPE_DELIMITER = '.'; + var IS_CONTAINER = '___EC__COMPONENT__CONTAINER___'; + var IS_EXTENDED_CLASS = '___EC__EXTENDED_CLASS___'; + /** + * Notice, parseClassType('') should returns {main: '', sub: ''} + * @public + */ + + function parseClassType(componentType) { + var ret = { + main: '', + sub: '' + }; + + if (componentType) { + var typeArr = componentType.split(TYPE_DELIMITER); + ret.main = typeArr[0] || ''; + ret.sub = typeArr[1] || ''; + } + + return ret; + } + /** + * @public + */ + + function checkClassType(componentType) { + assert(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(componentType), 'componentType "' + componentType + '" illegal'); + } + + function isExtendedClass(clz) { + return !!(clz && clz[IS_EXTENDED_CLASS]); + } + /** + * Implements `ExtendableConstructor` for `rootClz`. + * + * @usage + * ```ts + * class Xxx {} + * type XxxConstructor = typeof Xxx & ExtendableConstructor + * enableClassExtend(Xxx as XxxConstructor); + * ``` + */ + + function enableClassExtend(rootClz, mandatoryMethods) { + rootClz.$constructor = rootClz; // FIXME: not necessary? + + rootClz.extend = function (proto) { + if ("development" !== 'production') { + each(mandatoryMethods, function (method) { + if (!proto[method]) { + console.warn('Method `' + method + '` should be implemented' + (proto.type ? ' in ' + proto.type : '') + '.'); + } + }); + } + + var superClass = this; + var ExtendedClass; + + if (isESClass(superClass)) { + ExtendedClass = + /** @class */ + function (_super) { + __extends(class_1, _super); + + function class_1() { + return _super.apply(this, arguments) || this; + } + + return class_1; + }(superClass); + } else { + // For backward compat, we both support ts class inheritance and this + // "extend" approach. + // The constructor should keep the same behavior as ts class inheritance: + // If this constructor/$constructor is not declared, auto invoke the super + // constructor. + // If this constructor/$constructor is declared, it is responsible for + // calling the super constructor. + ExtendedClass = function () { + (proto.$constructor || superClass).apply(this, arguments); + }; + + inherits(ExtendedClass, this); + } + + extend(ExtendedClass.prototype, proto); + ExtendedClass[IS_EXTENDED_CLASS] = true; + ExtendedClass.extend = this.extend; + ExtendedClass.superCall = superCall; + ExtendedClass.superApply = superApply; + ExtendedClass.superClass = superClass; + return ExtendedClass; + }; + } + + function isESClass(fn) { + return isFunction(fn) && /^class\s/.test(Function.prototype.toString.call(fn)); + } + /** + * A work around to both support ts extend and this extend mechanism. + * on sub-class. + * @usage + * ```ts + * class Component { ... } + * classUtil.enableClassExtend(Component); + * classUtil.enableClassManagement(Component, {registerWhenExtend: true}); + * + * class Series extends Component { ... } + * // Without calling `markExtend`, `registerWhenExtend` will not work. + * Component.markExtend(Series); + * ``` + */ + + + function mountExtend(SubClz, SupperClz) { + SubClz.extend = SupperClz.extend; + } // A random offset. + + var classBase = Math.round(Math.random() * 10); + /** + * Implements `CheckableConstructor` for `target`. + * Can not use instanceof, consider different scope by + * cross domain or es module import in ec extensions. + * Mount a method "isInstance()" to Clz. + * + * @usage + * ```ts + * class Xxx {} + * type XxxConstructor = typeof Xxx & CheckableConstructor; + * enableClassCheck(Xxx as XxxConstructor) + * ``` + */ + + function enableClassCheck(target) { + var classAttr = ['__\0is_clz', classBase++].join('_'); + target.prototype[classAttr] = true; + + if ("development" !== 'production') { + assert(!target.isInstance, 'The method "is" can not be defined.'); + } + + target.isInstance = function (obj) { + return !!(obj && obj[classAttr]); + }; + } // superCall should have class info, which can not be fetch from 'this'. + // Consider this case: + // class A has method f, + // class B inherits class A, overrides method f, f call superApply('f'), + // class C inherits class B, do not overrides method f, + // then when method of class C is called, dead loop occured. + + function superCall(context, methodName) { + var args = []; + + for (var _i = 2; _i < arguments.length; _i++) { + args[_i - 2] = arguments[_i]; + } + + return this.superClass.prototype[methodName].apply(context, args); + } + + function superApply(context, methodName, args) { + return this.superClass.prototype[methodName].apply(context, args); + } + /** + * Implements `ClassManager` for `target` + * + * @usage + * ```ts + * class Xxx {} + * type XxxConstructor = typeof Xxx & ClassManager + * enableClassManagement(Xxx as XxxConstructor); + * ``` + */ + + + function enableClassManagement(target) { + /** + * Component model classes + * key: componentType, + * value: + * componentClass, when componentType is 'a' + * or Object.<subKey, componentClass>, when componentType is 'a.b' + */ + var storage = {}; + + target.registerClass = function (clz) { + // `type` should not be a "instance memeber". + // If using TS class, should better declared as `static type = 'series.pie'`. + // otherwise users have to mount `type` on prototype manually. + // For backward compat and enable instance visit type via `this.type`, + // we stil support fetch `type` from prototype. + var componentFullType = clz.type || clz.prototype.type; + + if (componentFullType) { + checkClassType(componentFullType); // If only static type declared, we assign it to prototype mandatorily. + + clz.prototype.type = componentFullType; + var componentTypeInfo = parseClassType(componentFullType); + + if (!componentTypeInfo.sub) { + if ("development" !== 'production') { + if (storage[componentTypeInfo.main]) { + console.warn(componentTypeInfo.main + ' exists.'); + } + } + + storage[componentTypeInfo.main] = clz; + } else if (componentTypeInfo.sub !== IS_CONTAINER) { + var container = makeContainer(componentTypeInfo); + container[componentTypeInfo.sub] = clz; + } + } + + return clz; + }; + + target.getClass = function (mainType, subType, throwWhenNotFound) { + var clz = storage[mainType]; + + if (clz && clz[IS_CONTAINER]) { + clz = subType ? clz[subType] : null; + } + + if (throwWhenNotFound && !clz) { + throw new Error(!subType ? mainType + '.' + 'type should be specified.' : 'Component ' + mainType + '.' + (subType || '') + ' is used but not imported.'); + } + + return clz; + }; + + target.getClassesByMainType = function (componentType) { + var componentTypeInfo = parseClassType(componentType); + var result = []; + var obj = storage[componentTypeInfo.main]; + + if (obj && obj[IS_CONTAINER]) { + each(obj, function (o, type) { + type !== IS_CONTAINER && result.push(o); + }); + } else { + result.push(obj); + } + + return result; + }; + + target.hasClass = function (componentType) { + // Just consider componentType.main. + var componentTypeInfo = parseClassType(componentType); + return !!storage[componentTypeInfo.main]; + }; + /** + * @return Like ['aa', 'bb'], but can not be ['aa.xx'] + */ + + + target.getAllClassMainTypes = function () { + var types = []; + each(storage, function (obj, type) { + types.push(type); + }); + return types; + }; + /** + * If a main type is container and has sub types + */ + + + target.hasSubTypes = function (componentType) { + var componentTypeInfo = parseClassType(componentType); + var obj = storage[componentTypeInfo.main]; + return obj && obj[IS_CONTAINER]; + }; + + function makeContainer(componentTypeInfo) { + var container = storage[componentTypeInfo.main]; + + if (!container || !container[IS_CONTAINER]) { + container = storage[componentTypeInfo.main] = {}; + container[IS_CONTAINER] = true; + } + + return container; + } + } // /** + // * @param {string|Array.<string>} properties + // */ + // export function setReadOnly(obj, properties) { + // FIXME It seems broken in IE8 simulation of IE11 + // if (!zrUtil.isArray(properties)) { + // properties = properties != null ? [properties] : []; + // } + // zrUtil.each(properties, function (prop) { + // let value = obj[prop]; + // Object.defineProperty + // && Object.defineProperty(obj, prop, { + // value: value, writable: false + // }); + // zrUtil.isArray(obj[prop]) + // && Object.freeze + // && Object.freeze(obj[prop]); + // }); + // } + + function makeStyleMapper(properties, ignoreParent) { + // Normalize + for (var i = 0; i < properties.length; i++) { + if (!properties[i][1]) { + properties[i][1] = properties[i][0]; + } + } + + ignoreParent = ignoreParent || false; + return function (model, excludes, includes) { + var style = {}; + + for (var i = 0; i < properties.length; i++) { + var propName = properties[i][1]; + + if (excludes && indexOf(excludes, propName) >= 0 || includes && indexOf(includes, propName) < 0) { + continue; + } + + var val = model.getShallow(propName, ignoreParent); + + if (val != null) { + style[properties[i][0]] = val; + } + } // TODO Text or image? + + + return style; + }; + } + + var AREA_STYLE_KEY_MAP = [['fill', 'color'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['opacity'], ['shadowColor'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ]; + var getAreaStyle = makeStyleMapper(AREA_STYLE_KEY_MAP); + + var AreaStyleMixin = + /** @class */ + function () { + function AreaStyleMixin() {} + + AreaStyleMixin.prototype.getAreaStyle = function (excludes, includes) { + return getAreaStyle(this, excludes, includes); + }; + + return AreaStyleMixin; + }(); + + var globalImageCache = new LRU(50); + function findExistImage(newImageOrSrc) { + if (typeof newImageOrSrc === 'string') { + var cachedImgObj = globalImageCache.get(newImageOrSrc); + return cachedImgObj && cachedImgObj.image; + } + else { + return newImageOrSrc; + } + } + function createOrUpdateImage(newImageOrSrc, image, hostEl, onload, cbPayload) { + if (!newImageOrSrc) { + return image; + } + else if (typeof newImageOrSrc === 'string') { + if ((image && image.__zrImageSrc === newImageOrSrc) || !hostEl) { + return image; + } + var cachedImgObj = globalImageCache.get(newImageOrSrc); + var pendingWrap = { hostEl: hostEl, cb: onload, cbPayload: cbPayload }; + if (cachedImgObj) { + image = cachedImgObj.image; + !isImageReady(image) && cachedImgObj.pending.push(pendingWrap); + } + else { + image = platformApi.loadImage(newImageOrSrc, imageOnLoad, imageOnLoad); + image.__zrImageSrc = newImageOrSrc; + globalImageCache.put(newImageOrSrc, image.__cachedImgObj = { + image: image, + pending: [pendingWrap] + }); + } + return image; + } + else { + return newImageOrSrc; + } + } + function imageOnLoad() { + var cachedImgObj = this.__cachedImgObj; + this.onload = this.onerror = this.__cachedImgObj = null; + for (var i = 0; i < cachedImgObj.pending.length; i++) { + var pendingWrap = cachedImgObj.pending[i]; + var cb = pendingWrap.cb; + cb && cb(this, pendingWrap.cbPayload); + pendingWrap.hostEl.dirty(); + } + cachedImgObj.pending.length = 0; + } + function isImageReady(image) { + return image && image.width && image.height; + } + + var STYLE_REG = /\{([a-zA-Z0-9_]+)\|([^}]*)\}/g; + function truncateText(text, containerWidth, font, ellipsis, options) { + if (!containerWidth) { + return ''; + } + var textLines = (text + '').split('\n'); + options = prepareTruncateOptions(containerWidth, font, ellipsis, options); + for (var i = 0, len = textLines.length; i < len; i++) { + textLines[i] = truncateSingleLine(textLines[i], options); + } + return textLines.join('\n'); + } + function prepareTruncateOptions(containerWidth, font, ellipsis, options) { + options = options || {}; + var preparedOpts = extend({}, options); + preparedOpts.font = font; + ellipsis = retrieve2(ellipsis, '...'); + preparedOpts.maxIterations = retrieve2(options.maxIterations, 2); + var minChar = preparedOpts.minChar = retrieve2(options.minChar, 0); + preparedOpts.cnCharWidth = getWidth('国', font); + var ascCharWidth = preparedOpts.ascCharWidth = getWidth('a', font); + preparedOpts.placeholder = retrieve2(options.placeholder, ''); + var contentWidth = containerWidth = Math.max(0, containerWidth - 1); + for (var i = 0; i < minChar && contentWidth >= ascCharWidth; i++) { + contentWidth -= ascCharWidth; + } + var ellipsisWidth = getWidth(ellipsis, font); + if (ellipsisWidth > contentWidth) { + ellipsis = ''; + ellipsisWidth = 0; + } + contentWidth = containerWidth - ellipsisWidth; + preparedOpts.ellipsis = ellipsis; + preparedOpts.ellipsisWidth = ellipsisWidth; + preparedOpts.contentWidth = contentWidth; + preparedOpts.containerWidth = containerWidth; + return preparedOpts; + } + function truncateSingleLine(textLine, options) { + var containerWidth = options.containerWidth; + var font = options.font; + var contentWidth = options.contentWidth; + if (!containerWidth) { + return ''; + } + var lineWidth = getWidth(textLine, font); + if (lineWidth <= containerWidth) { + return textLine; + } + for (var j = 0;; j++) { + if (lineWidth <= contentWidth || j >= options.maxIterations) { + textLine += options.ellipsis; + break; + } + var subLength = j === 0 + ? estimateLength(textLine, contentWidth, options.ascCharWidth, options.cnCharWidth) + : lineWidth > 0 + ? Math.floor(textLine.length * contentWidth / lineWidth) + : 0; + textLine = textLine.substr(0, subLength); + lineWidth = getWidth(textLine, font); + } + if (textLine === '') { + textLine = options.placeholder; + } + return textLine; + } + function estimateLength(text, contentWidth, ascCharWidth, cnCharWidth) { + var width = 0; + var i = 0; + for (var len = text.length; i < len && width < contentWidth; i++) { + var charCode = text.charCodeAt(i); + width += (0 <= charCode && charCode <= 127) ? ascCharWidth : cnCharWidth; + } + return i; + } + function parsePlainText(text, style) { + text != null && (text += ''); + var overflow = style.overflow; + var padding = style.padding; + var font = style.font; + var truncate = overflow === 'truncate'; + var calculatedLineHeight = getLineHeight(font); + var lineHeight = retrieve2(style.lineHeight, calculatedLineHeight); + var bgColorDrawn = !!(style.backgroundColor); + var truncateLineOverflow = style.lineOverflow === 'truncate'; + var width = style.width; + var lines; + if (width != null && (overflow === 'break' || overflow === 'breakAll')) { + lines = text ? wrapText(text, style.font, width, overflow === 'breakAll', 0).lines : []; + } + else { + lines = text ? text.split('\n') : []; + } + var contentHeight = lines.length * lineHeight; + var height = retrieve2(style.height, contentHeight); + if (contentHeight > height && truncateLineOverflow) { + var lineCount = Math.floor(height / lineHeight); + lines = lines.slice(0, lineCount); + } + if (text && truncate && width != null) { + var options = prepareTruncateOptions(width, font, style.ellipsis, { + minChar: style.truncateMinChar, + placeholder: style.placeholder + }); + for (var i = 0; i < lines.length; i++) { + lines[i] = truncateSingleLine(lines[i], options); + } + } + var outerHeight = height; + var contentWidth = 0; + for (var i = 0; i < lines.length; i++) { + contentWidth = Math.max(getWidth(lines[i], font), contentWidth); + } + if (width == null) { + width = contentWidth; + } + var outerWidth = contentWidth; + if (padding) { + outerHeight += padding[0] + padding[2]; + outerWidth += padding[1] + padding[3]; + width += padding[1] + padding[3]; + } + if (bgColorDrawn) { + outerWidth = width; + } + return { + lines: lines, + height: height, + outerWidth: outerWidth, + outerHeight: outerHeight, + lineHeight: lineHeight, + calculatedLineHeight: calculatedLineHeight, + contentWidth: contentWidth, + contentHeight: contentHeight, + width: width + }; + } + var RichTextToken = (function () { + function RichTextToken() { + } + return RichTextToken; + }()); + var RichTextLine = (function () { + function RichTextLine(tokens) { + this.tokens = []; + if (tokens) { + this.tokens = tokens; + } + } + return RichTextLine; + }()); + var RichTextContentBlock = (function () { + function RichTextContentBlock() { + this.width = 0; + this.height = 0; + this.contentWidth = 0; + this.contentHeight = 0; + this.outerWidth = 0; + this.outerHeight = 0; + this.lines = []; + } + return RichTextContentBlock; + }()); + function parseRichText(text, style) { + var contentBlock = new RichTextContentBlock(); + text != null && (text += ''); + if (!text) { + return contentBlock; + } + var topWidth = style.width; + var topHeight = style.height; + var overflow = style.overflow; + var wrapInfo = (overflow === 'break' || overflow === 'breakAll') && topWidth != null + ? { width: topWidth, accumWidth: 0, breakAll: overflow === 'breakAll' } + : null; + var lastIndex = STYLE_REG.lastIndex = 0; + var result; + while ((result = STYLE_REG.exec(text)) != null) { + var matchedIndex = result.index; + if (matchedIndex > lastIndex) { + pushTokens(contentBlock, text.substring(lastIndex, matchedIndex), style, wrapInfo); + } + pushTokens(contentBlock, result[2], style, wrapInfo, result[1]); + lastIndex = STYLE_REG.lastIndex; + } + if (lastIndex < text.length) { + pushTokens(contentBlock, text.substring(lastIndex, text.length), style, wrapInfo); + } + var pendingList = []; + var calculatedHeight = 0; + var calculatedWidth = 0; + var stlPadding = style.padding; + var truncate = overflow === 'truncate'; + var truncateLine = style.lineOverflow === 'truncate'; + function finishLine(line, lineWidth, lineHeight) { + line.width = lineWidth; + line.lineHeight = lineHeight; + calculatedHeight += lineHeight; + calculatedWidth = Math.max(calculatedWidth, lineWidth); + } + outer: for (var i = 0; i < contentBlock.lines.length; i++) { + var line = contentBlock.lines[i]; + var lineHeight = 0; + var lineWidth = 0; + for (var j = 0; j < line.tokens.length; j++) { + var token = line.tokens[j]; + var tokenStyle = token.styleName && style.rich[token.styleName] || {}; + var textPadding = token.textPadding = tokenStyle.padding; + var paddingH = textPadding ? textPadding[1] + textPadding[3] : 0; + var font = token.font = tokenStyle.font || style.font; + token.contentHeight = getLineHeight(font); + var tokenHeight = retrieve2(tokenStyle.height, token.contentHeight); + token.innerHeight = tokenHeight; + textPadding && (tokenHeight += textPadding[0] + textPadding[2]); + token.height = tokenHeight; + token.lineHeight = retrieve3(tokenStyle.lineHeight, style.lineHeight, tokenHeight); + token.align = tokenStyle && tokenStyle.align || style.align; + token.verticalAlign = tokenStyle && tokenStyle.verticalAlign || 'middle'; + if (truncateLine && topHeight != null && calculatedHeight + token.lineHeight > topHeight) { + if (j > 0) { + line.tokens = line.tokens.slice(0, j); + finishLine(line, lineWidth, lineHeight); + contentBlock.lines = contentBlock.lines.slice(0, i + 1); + } + else { + contentBlock.lines = contentBlock.lines.slice(0, i); + } + break outer; + } + var styleTokenWidth = tokenStyle.width; + var tokenWidthNotSpecified = styleTokenWidth == null || styleTokenWidth === 'auto'; + if (typeof styleTokenWidth === 'string' && styleTokenWidth.charAt(styleTokenWidth.length - 1) === '%') { + token.percentWidth = styleTokenWidth; + pendingList.push(token); + token.contentWidth = getWidth(token.text, font); + } + else { + if (tokenWidthNotSpecified) { + var textBackgroundColor = tokenStyle.backgroundColor; + var bgImg = textBackgroundColor && textBackgroundColor.image; + if (bgImg) { + bgImg = findExistImage(bgImg); + if (isImageReady(bgImg)) { + token.width = Math.max(token.width, bgImg.width * tokenHeight / bgImg.height); + } + } + } + var remainTruncWidth = truncate && topWidth != null + ? topWidth - lineWidth : null; + if (remainTruncWidth != null && remainTruncWidth < token.width) { + if (!tokenWidthNotSpecified || remainTruncWidth < paddingH) { + token.text = ''; + token.width = token.contentWidth = 0; + } + else { + token.text = truncateText(token.text, remainTruncWidth - paddingH, font, style.ellipsis, { minChar: style.truncateMinChar }); + token.width = token.contentWidth = getWidth(token.text, font); + } + } + else { + token.contentWidth = getWidth(token.text, font); + } + } + token.width += paddingH; + lineWidth += token.width; + tokenStyle && (lineHeight = Math.max(lineHeight, token.lineHeight)); + } + finishLine(line, lineWidth, lineHeight); + } + contentBlock.outerWidth = contentBlock.width = retrieve2(topWidth, calculatedWidth); + contentBlock.outerHeight = contentBlock.height = retrieve2(topHeight, calculatedHeight); + contentBlock.contentHeight = calculatedHeight; + contentBlock.contentWidth = calculatedWidth; + if (stlPadding) { + contentBlock.outerWidth += stlPadding[1] + stlPadding[3]; + contentBlock.outerHeight += stlPadding[0] + stlPadding[2]; + } + for (var i = 0; i < pendingList.length; i++) { + var token = pendingList[i]; + var percentWidth = token.percentWidth; + token.width = parseInt(percentWidth, 10) / 100 * contentBlock.width; + } + return contentBlock; + } + function pushTokens(block, str, style, wrapInfo, styleName) { + var isEmptyStr = str === ''; + var tokenStyle = styleName && style.rich[styleName] || {}; + var lines = block.lines; + var font = tokenStyle.font || style.font; + var newLine = false; + var strLines; + var linesWidths; + if (wrapInfo) { + var tokenPadding = tokenStyle.padding; + var tokenPaddingH = tokenPadding ? tokenPadding[1] + tokenPadding[3] : 0; + if (tokenStyle.width != null && tokenStyle.width !== 'auto') { + var outerWidth_1 = parsePercent(tokenStyle.width, wrapInfo.width) + tokenPaddingH; + if (lines.length > 0) { + if (outerWidth_1 + wrapInfo.accumWidth > wrapInfo.width) { + strLines = str.split('\n'); + newLine = true; + } + } + wrapInfo.accumWidth = outerWidth_1; + } + else { + var res = wrapText(str, font, wrapInfo.width, wrapInfo.breakAll, wrapInfo.accumWidth); + wrapInfo.accumWidth = res.accumWidth + tokenPaddingH; + linesWidths = res.linesWidths; + strLines = res.lines; + } + } + else { + strLines = str.split('\n'); + } + for (var i = 0; i < strLines.length; i++) { + var text = strLines[i]; + var token = new RichTextToken(); + token.styleName = styleName; + token.text = text; + token.isLineHolder = !text && !isEmptyStr; + if (typeof tokenStyle.width === 'number') { + token.width = tokenStyle.width; + } + else { + token.width = linesWidths + ? linesWidths[i] + : getWidth(text, font); + } + if (!i && !newLine) { + var tokens = (lines[lines.length - 1] || (lines[0] = new RichTextLine())).tokens; + var tokensLen = tokens.length; + (tokensLen === 1 && tokens[0].isLineHolder) + ? (tokens[0] = token) + : ((text || !tokensLen || isEmptyStr) && tokens.push(token)); + } + else { + lines.push(new RichTextLine([token])); + } + } + } + function isLatin(ch) { + var code = ch.charCodeAt(0); + return code >= 0x21 && code <= 0x17F; + } + var breakCharMap = reduce(',&?/;] '.split(''), function (obj, ch) { + obj[ch] = true; + return obj; + }, {}); + function isWordBreakChar(ch) { + if (isLatin(ch)) { + if (breakCharMap[ch]) { + return true; + } + return false; + } + return true; + } + function wrapText(text, font, lineWidth, isBreakAll, lastAccumWidth) { + var lines = []; + var linesWidths = []; + var line = ''; + var currentWord = ''; + var currentWordWidth = 0; + var accumWidth = 0; + for (var i = 0; i < text.length; i++) { + var ch = text.charAt(i); + if (ch === '\n') { + if (currentWord) { + line += currentWord; + accumWidth += currentWordWidth; + } + lines.push(line); + linesWidths.push(accumWidth); + line = ''; + currentWord = ''; + currentWordWidth = 0; + accumWidth = 0; + continue; + } + var chWidth = getWidth(ch, font); + var inWord = isBreakAll ? false : !isWordBreakChar(ch); + if (!lines.length + ? lastAccumWidth + accumWidth + chWidth > lineWidth + : accumWidth + chWidth > lineWidth) { + if (!accumWidth) { + if (inWord) { + lines.push(currentWord); + linesWidths.push(currentWordWidth); + currentWord = ch; + currentWordWidth = chWidth; + } + else { + lines.push(ch); + linesWidths.push(chWidth); + } + } + else if (line || currentWord) { + if (inWord) { + if (!line) { + line = currentWord; + currentWord = ''; + currentWordWidth = 0; + accumWidth = currentWordWidth; + } + lines.push(line); + linesWidths.push(accumWidth - currentWordWidth); + currentWord += ch; + currentWordWidth += chWidth; + line = ''; + accumWidth = currentWordWidth; + } + else { + if (currentWord) { + line += currentWord; + currentWord = ''; + currentWordWidth = 0; + } + lines.push(line); + linesWidths.push(accumWidth); + line = ch; + accumWidth = chWidth; + } + } + continue; + } + accumWidth += chWidth; + if (inWord) { + currentWord += ch; + currentWordWidth += chWidth; + } + else { + if (currentWord) { + line += currentWord; + currentWord = ''; + currentWordWidth = 0; + } + line += ch; + } + } + if (!lines.length && !line) { + line = text; + currentWord = ''; + currentWordWidth = 0; + } + if (currentWord) { + line += currentWord; + } + if (line) { + lines.push(line); + linesWidths.push(accumWidth); + } + if (lines.length === 1) { + accumWidth += lastAccumWidth; + } + return { + accumWidth: accumWidth, + lines: lines, + linesWidths: linesWidths + }; + } + + var STYLE_MAGIC_KEY = '__zr_style_' + Math.round((Math.random() * 10)); + var DEFAULT_COMMON_STYLE = { + shadowBlur: 0, + shadowOffsetX: 0, + shadowOffsetY: 0, + shadowColor: '#000', + opacity: 1, + blend: 'source-over' + }; + var DEFAULT_COMMON_ANIMATION_PROPS = { + style: { + shadowBlur: true, + shadowOffsetX: true, + shadowOffsetY: true, + shadowColor: true, + opacity: true + } + }; + DEFAULT_COMMON_STYLE[STYLE_MAGIC_KEY] = true; + var PRIMARY_STATES_KEYS$1 = ['z', 'z2', 'invisible']; + var PRIMARY_STATES_KEYS_IN_HOVER_LAYER = ['invisible']; + var Displayable = (function (_super) { + __extends(Displayable, _super); + function Displayable(props) { + return _super.call(this, props) || this; + } + Displayable.prototype._init = function (props) { + var keysArr = keys(props); + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + if (key === 'style') { + this.useStyle(props[key]); + } + else { + _super.prototype.attrKV.call(this, key, props[key]); + } + } + if (!this.style) { + this.useStyle({}); + } + }; + Displayable.prototype.beforeBrush = function () { }; + Displayable.prototype.afterBrush = function () { }; + Displayable.prototype.innerBeforeBrush = function () { }; + Displayable.prototype.innerAfterBrush = function () { }; + Displayable.prototype.shouldBePainted = function (viewWidth, viewHeight, considerClipPath, considerAncestors) { + var m = this.transform; + if (this.ignore + || this.invisible + || this.style.opacity === 0 + || (this.culling + && isDisplayableCulled(this, viewWidth, viewHeight)) + || (m && !m[0] && !m[3])) { + return false; + } + if (considerClipPath && this.__clipPaths) { + for (var i = 0; i < this.__clipPaths.length; ++i) { + if (this.__clipPaths[i].isZeroArea()) { + return false; + } + } + } + if (considerAncestors && this.parent) { + var parent_1 = this.parent; + while (parent_1) { + if (parent_1.ignore) { + return false; + } + parent_1 = parent_1.parent; + } + } + return true; + }; + Displayable.prototype.contain = function (x, y) { + return this.rectContain(x, y); + }; + Displayable.prototype.traverse = function (cb, context) { + cb.call(context, this); + }; + Displayable.prototype.rectContain = function (x, y) { + var coord = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + return rect.contain(coord[0], coord[1]); + }; + Displayable.prototype.getPaintRect = function () { + var rect = this._paintRect; + if (!this._paintRect || this.__dirty) { + var transform = this.transform; + var elRect = this.getBoundingRect(); + var style = this.style; + var shadowSize = style.shadowBlur || 0; + var shadowOffsetX = style.shadowOffsetX || 0; + var shadowOffsetY = style.shadowOffsetY || 0; + rect = this._paintRect || (this._paintRect = new BoundingRect(0, 0, 0, 0)); + if (transform) { + BoundingRect.applyTransform(rect, elRect, transform); + } + else { + rect.copy(elRect); + } + if (shadowSize || shadowOffsetX || shadowOffsetY) { + rect.width += shadowSize * 2 + Math.abs(shadowOffsetX); + rect.height += shadowSize * 2 + Math.abs(shadowOffsetY); + rect.x = Math.min(rect.x, rect.x + shadowOffsetX - shadowSize); + rect.y = Math.min(rect.y, rect.y + shadowOffsetY - shadowSize); + } + var tolerance = this.dirtyRectTolerance; + if (!rect.isZero()) { + rect.x = Math.floor(rect.x - tolerance); + rect.y = Math.floor(rect.y - tolerance); + rect.width = Math.ceil(rect.width + 1 + tolerance * 2); + rect.height = Math.ceil(rect.height + 1 + tolerance * 2); + } + } + return rect; + }; + Displayable.prototype.setPrevPaintRect = function (paintRect) { + if (paintRect) { + this._prevPaintRect = this._prevPaintRect || new BoundingRect(0, 0, 0, 0); + this._prevPaintRect.copy(paintRect); + } + else { + this._prevPaintRect = null; + } + }; + Displayable.prototype.getPrevPaintRect = function () { + return this._prevPaintRect; + }; + Displayable.prototype.animateStyle = function (loop) { + return this.animate('style', loop); + }; + Displayable.prototype.updateDuringAnimation = function (targetKey) { + if (targetKey === 'style') { + this.dirtyStyle(); + } + else { + this.markRedraw(); + } + }; + Displayable.prototype.attrKV = function (key, value) { + if (key !== 'style') { + _super.prototype.attrKV.call(this, key, value); + } + else { + if (!this.style) { + this.useStyle(value); + } + else { + this.setStyle(value); + } + } + }; + Displayable.prototype.setStyle = function (keyOrObj, value) { + if (typeof keyOrObj === 'string') { + this.style[keyOrObj] = value; + } + else { + extend(this.style, keyOrObj); + } + this.dirtyStyle(); + return this; + }; + Displayable.prototype.dirtyStyle = function (notRedraw) { + if (!notRedraw) { + this.markRedraw(); + } + this.__dirty |= STYLE_CHANGED_BIT; + if (this._rect) { + this._rect = null; + } + }; + Displayable.prototype.dirty = function () { + this.dirtyStyle(); + }; + Displayable.prototype.styleChanged = function () { + return !!(this.__dirty & STYLE_CHANGED_BIT); + }; + Displayable.prototype.styleUpdated = function () { + this.__dirty &= ~STYLE_CHANGED_BIT; + }; + Displayable.prototype.createStyle = function (obj) { + return createObject(DEFAULT_COMMON_STYLE, obj); + }; + Displayable.prototype.useStyle = function (obj) { + if (!obj[STYLE_MAGIC_KEY]) { + obj = this.createStyle(obj); + } + if (this.__inHover) { + this.__hoverStyle = obj; + } + else { + this.style = obj; + } + this.dirtyStyle(); + }; + Displayable.prototype.isStyleObject = function (obj) { + return obj[STYLE_MAGIC_KEY]; + }; + Displayable.prototype._innerSaveToNormal = function (toState) { + _super.prototype._innerSaveToNormal.call(this, toState); + var normalState = this._normalState; + if (toState.style && !normalState.style) { + normalState.style = this._mergeStyle(this.createStyle(), this.style); + } + this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS$1); + }; + Displayable.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) { + _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg); + var needsRestoreToNormal = !(state && keepCurrentStates); + var targetStyle; + if (state && state.style) { + if (transition) { + if (keepCurrentStates) { + targetStyle = state.style; + } + else { + targetStyle = this._mergeStyle(this.createStyle(), normalState.style); + this._mergeStyle(targetStyle, state.style); + } + } + else { + targetStyle = this._mergeStyle(this.createStyle(), keepCurrentStates ? this.style : normalState.style); + this._mergeStyle(targetStyle, state.style); + } + } + else if (needsRestoreToNormal) { + targetStyle = normalState.style; + } + if (targetStyle) { + if (transition) { + var sourceStyle = this.style; + this.style = this.createStyle(needsRestoreToNormal ? {} : sourceStyle); + if (needsRestoreToNormal) { + var changedKeys = keys(sourceStyle); + for (var i = 0; i < changedKeys.length; i++) { + var key = changedKeys[i]; + if (key in targetStyle) { + targetStyle[key] = targetStyle[key]; + this.style[key] = sourceStyle[key]; + } + } + } + var targetKeys = keys(targetStyle); + for (var i = 0; i < targetKeys.length; i++) { + var key = targetKeys[i]; + this.style[key] = this.style[key]; + } + this._transitionState(stateName, { + style: targetStyle + }, animationCfg, this.getAnimationStyleProps()); + } + else { + this.useStyle(targetStyle); + } + } + var statesKeys = this.__inHover ? PRIMARY_STATES_KEYS_IN_HOVER_LAYER : PRIMARY_STATES_KEYS$1; + for (var i = 0; i < statesKeys.length; i++) { + var key = statesKeys[i]; + if (state && state[key] != null) { + this[key] = state[key]; + } + else if (needsRestoreToNormal) { + if (normalState[key] != null) { + this[key] = normalState[key]; + } + } + } + }; + Displayable.prototype._mergeStates = function (states) { + var mergedState = _super.prototype._mergeStates.call(this, states); + var mergedStyle; + for (var i = 0; i < states.length; i++) { + var state = states[i]; + if (state.style) { + mergedStyle = mergedStyle || {}; + this._mergeStyle(mergedStyle, state.style); + } + } + if (mergedStyle) { + mergedState.style = mergedStyle; + } + return mergedState; + }; + Displayable.prototype._mergeStyle = function (targetStyle, sourceStyle) { + extend(targetStyle, sourceStyle); + return targetStyle; + }; + Displayable.prototype.getAnimationStyleProps = function () { + return DEFAULT_COMMON_ANIMATION_PROPS; + }; + Displayable.initDefaultProps = (function () { + var dispProto = Displayable.prototype; + dispProto.type = 'displayable'; + dispProto.invisible = false; + dispProto.z = 0; + dispProto.z2 = 0; + dispProto.zlevel = 0; + dispProto.culling = false; + dispProto.cursor = 'pointer'; + dispProto.rectHover = false; + dispProto.incremental = false; + dispProto._rect = null; + dispProto.dirtyRectTolerance = 0; + dispProto.__dirty = REDRAW_BIT | STYLE_CHANGED_BIT; + })(); + return Displayable; + }(Element)); + var tmpRect = new BoundingRect(0, 0, 0, 0); + var viewRect = new BoundingRect(0, 0, 0, 0); + function isDisplayableCulled(el, width, height) { + tmpRect.copy(el.getBoundingRect()); + if (el.transform) { + tmpRect.applyTransform(el.transform); + } + viewRect.width = width; + viewRect.height = height; + return !tmpRect.intersect(viewRect); + } + + var mathMin$1 = Math.min; + var mathMax$1 = Math.max; + var mathSin = Math.sin; + var mathCos = Math.cos; + var PI2 = Math.PI * 2; + var start = create(); + var end = create(); + var extremity = create(); + function fromPoints(points, min, max) { + if (points.length === 0) { + return; + } + var p = points[0]; + var left = p[0]; + var right = p[0]; + var top = p[1]; + var bottom = p[1]; + for (var i = 1; i < points.length; i++) { + p = points[i]; + left = mathMin$1(left, p[0]); + right = mathMax$1(right, p[0]); + top = mathMin$1(top, p[1]); + bottom = mathMax$1(bottom, p[1]); + } + min[0] = left; + min[1] = top; + max[0] = right; + max[1] = bottom; + } + function fromLine(x0, y0, x1, y1, min, max) { + min[0] = mathMin$1(x0, x1); + min[1] = mathMin$1(y0, y1); + max[0] = mathMax$1(x0, x1); + max[1] = mathMax$1(y0, y1); + } + var xDim = []; + var yDim = []; + function fromCubic(x0, y0, x1, y1, x2, y2, x3, y3, min, max) { + var cubicExtrema$1 = cubicExtrema; + var cubicAt$1 = cubicAt; + var n = cubicExtrema$1(x0, x1, x2, x3, xDim); + min[0] = Infinity; + min[1] = Infinity; + max[0] = -Infinity; + max[1] = -Infinity; + for (var i = 0; i < n; i++) { + var x = cubicAt$1(x0, x1, x2, x3, xDim[i]); + min[0] = mathMin$1(x, min[0]); + max[0] = mathMax$1(x, max[0]); + } + n = cubicExtrema$1(y0, y1, y2, y3, yDim); + for (var i = 0; i < n; i++) { + var y = cubicAt$1(y0, y1, y2, y3, yDim[i]); + min[1] = mathMin$1(y, min[1]); + max[1] = mathMax$1(y, max[1]); + } + min[0] = mathMin$1(x0, min[0]); + max[0] = mathMax$1(x0, max[0]); + min[0] = mathMin$1(x3, min[0]); + max[0] = mathMax$1(x3, max[0]); + min[1] = mathMin$1(y0, min[1]); + max[1] = mathMax$1(y0, max[1]); + min[1] = mathMin$1(y3, min[1]); + max[1] = mathMax$1(y3, max[1]); + } + function fromQuadratic(x0, y0, x1, y1, x2, y2, min, max) { + var quadraticExtremum$1 = quadraticExtremum; + var quadraticAt$1 = quadraticAt; + var tx = mathMax$1(mathMin$1(quadraticExtremum$1(x0, x1, x2), 1), 0); + var ty = mathMax$1(mathMin$1(quadraticExtremum$1(y0, y1, y2), 1), 0); + var x = quadraticAt$1(x0, x1, x2, tx); + var y = quadraticAt$1(y0, y1, y2, ty); + min[0] = mathMin$1(x0, x2, x); + min[1] = mathMin$1(y0, y2, y); + max[0] = mathMax$1(x0, x2, x); + max[1] = mathMax$1(y0, y2, y); + } + function fromArc(x, y, rx, ry, startAngle, endAngle, anticlockwise, min$1, max$1) { + var vec2Min = min; + var vec2Max = max; + var diff = Math.abs(startAngle - endAngle); + if (diff % PI2 < 1e-4 && diff > 1e-4) { + min$1[0] = x - rx; + min$1[1] = y - ry; + max$1[0] = x + rx; + max$1[1] = y + ry; + return; + } + start[0] = mathCos(startAngle) * rx + x; + start[1] = mathSin(startAngle) * ry + y; + end[0] = mathCos(endAngle) * rx + x; + end[1] = mathSin(endAngle) * ry + y; + vec2Min(min$1, start, end); + vec2Max(max$1, start, end); + startAngle = startAngle % (PI2); + if (startAngle < 0) { + startAngle = startAngle + PI2; + } + endAngle = endAngle % (PI2); + if (endAngle < 0) { + endAngle = endAngle + PI2; + } + if (startAngle > endAngle && !anticlockwise) { + endAngle += PI2; + } + else if (startAngle < endAngle && anticlockwise) { + startAngle += PI2; + } + if (anticlockwise) { + var tmp = endAngle; + endAngle = startAngle; + startAngle = tmp; + } + for (var angle = 0; angle < endAngle; angle += Math.PI / 2) { + if (angle > startAngle) { + extremity[0] = mathCos(angle) * rx + x; + extremity[1] = mathSin(angle) * ry + y; + vec2Min(min$1, extremity, min$1); + vec2Max(max$1, extremity, max$1); + } + } + } + + var CMD = { + M: 1, + L: 2, + C: 3, + Q: 4, + A: 5, + Z: 6, + R: 7 + }; + var tmpOutX = []; + var tmpOutY = []; + var min$1 = []; + var max$1 = []; + var min2 = []; + var max2 = []; + var mathMin$2 = Math.min; + var mathMax$2 = Math.max; + var mathCos$1 = Math.cos; + var mathSin$1 = Math.sin; + var mathAbs = Math.abs; + var PI = Math.PI; + var PI2$1 = PI * 2; + var hasTypedArray = typeof Float32Array !== 'undefined'; + var tmpAngles = []; + function modPI2(radian) { + var n = Math.round(radian / PI * 1e8) / 1e8; + return (n % 2) * PI; + } + function normalizeArcAngles(angles, anticlockwise) { + var newStartAngle = modPI2(angles[0]); + if (newStartAngle < 0) { + newStartAngle += PI2$1; + } + var delta = newStartAngle - angles[0]; + var newEndAngle = angles[1]; + newEndAngle += delta; + if (!anticlockwise && newEndAngle - newStartAngle >= PI2$1) { + newEndAngle = newStartAngle + PI2$1; + } + else if (anticlockwise && newStartAngle - newEndAngle >= PI2$1) { + newEndAngle = newStartAngle - PI2$1; + } + else if (!anticlockwise && newStartAngle > newEndAngle) { + newEndAngle = newStartAngle + (PI2$1 - modPI2(newStartAngle - newEndAngle)); + } + else if (anticlockwise && newStartAngle < newEndAngle) { + newEndAngle = newStartAngle - (PI2$1 - modPI2(newEndAngle - newStartAngle)); + } + angles[0] = newStartAngle; + angles[1] = newEndAngle; + } + var PathProxy = (function () { + function PathProxy(notSaveData) { + this.dpr = 1; + this._xi = 0; + this._yi = 0; + this._x0 = 0; + this._y0 = 0; + this._len = 0; + if (notSaveData) { + this._saveData = false; + } + if (this._saveData) { + this.data = []; + } + } + PathProxy.prototype.increaseVersion = function () { + this._version++; + }; + PathProxy.prototype.getVersion = function () { + return this._version; + }; + PathProxy.prototype.setScale = function (sx, sy, segmentIgnoreThreshold) { + segmentIgnoreThreshold = segmentIgnoreThreshold || 0; + if (segmentIgnoreThreshold > 0) { + this._ux = mathAbs(segmentIgnoreThreshold / devicePixelRatio / sx) || 0; + this._uy = mathAbs(segmentIgnoreThreshold / devicePixelRatio / sy) || 0; + } + }; + PathProxy.prototype.setDPR = function (dpr) { + this.dpr = dpr; + }; + PathProxy.prototype.setContext = function (ctx) { + this._ctx = ctx; + }; + PathProxy.prototype.getContext = function () { + return this._ctx; + }; + PathProxy.prototype.beginPath = function () { + this._ctx && this._ctx.beginPath(); + this.reset(); + return this; + }; + PathProxy.prototype.reset = function () { + if (this._saveData) { + this._len = 0; + } + if (this._pathSegLen) { + this._pathSegLen = null; + this._pathLen = 0; + } + this._version++; + }; + PathProxy.prototype.moveTo = function (x, y) { + this._drawPendingPt(); + this.addData(CMD.M, x, y); + this._ctx && this._ctx.moveTo(x, y); + this._x0 = x; + this._y0 = y; + this._xi = x; + this._yi = y; + return this; + }; + PathProxy.prototype.lineTo = function (x, y) { + var dx = mathAbs(x - this._xi); + var dy = mathAbs(y - this._yi); + var exceedUnit = dx > this._ux || dy > this._uy; + this.addData(CMD.L, x, y); + if (this._ctx && exceedUnit) { + this._ctx.lineTo(x, y); + } + if (exceedUnit) { + this._xi = x; + this._yi = y; + this._pendingPtDist = 0; + } + else { + var d2 = dx * dx + dy * dy; + if (d2 > this._pendingPtDist) { + this._pendingPtX = x; + this._pendingPtY = y; + this._pendingPtDist = d2; + } + } + return this; + }; + PathProxy.prototype.bezierCurveTo = function (x1, y1, x2, y2, x3, y3) { + this._drawPendingPt(); + this.addData(CMD.C, x1, y1, x2, y2, x3, y3); + if (this._ctx) { + this._ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); + } + this._xi = x3; + this._yi = y3; + return this; + }; + PathProxy.prototype.quadraticCurveTo = function (x1, y1, x2, y2) { + this._drawPendingPt(); + this.addData(CMD.Q, x1, y1, x2, y2); + if (this._ctx) { + this._ctx.quadraticCurveTo(x1, y1, x2, y2); + } + this._xi = x2; + this._yi = y2; + return this; + }; + PathProxy.prototype.arc = function (cx, cy, r, startAngle, endAngle, anticlockwise) { + this._drawPendingPt(); + tmpAngles[0] = startAngle; + tmpAngles[1] = endAngle; + normalizeArcAngles(tmpAngles, anticlockwise); + startAngle = tmpAngles[0]; + endAngle = tmpAngles[1]; + var delta = endAngle - startAngle; + this.addData(CMD.A, cx, cy, r, r, startAngle, delta, 0, anticlockwise ? 0 : 1); + this._ctx && this._ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise); + this._xi = mathCos$1(endAngle) * r + cx; + this._yi = mathSin$1(endAngle) * r + cy; + return this; + }; + PathProxy.prototype.arcTo = function (x1, y1, x2, y2, radius) { + this._drawPendingPt(); + if (this._ctx) { + this._ctx.arcTo(x1, y1, x2, y2, radius); + } + return this; + }; + PathProxy.prototype.rect = function (x, y, w, h) { + this._drawPendingPt(); + this._ctx && this._ctx.rect(x, y, w, h); + this.addData(CMD.R, x, y, w, h); + return this; + }; + PathProxy.prototype.closePath = function () { + this._drawPendingPt(); + this.addData(CMD.Z); + var ctx = this._ctx; + var x0 = this._x0; + var y0 = this._y0; + if (ctx) { + ctx.closePath(); + } + this._xi = x0; + this._yi = y0; + return this; + }; + PathProxy.prototype.fill = function (ctx) { + ctx && ctx.fill(); + this.toStatic(); + }; + PathProxy.prototype.stroke = function (ctx) { + ctx && ctx.stroke(); + this.toStatic(); + }; + PathProxy.prototype.len = function () { + return this._len; + }; + PathProxy.prototype.setData = function (data) { + var len = data.length; + if (!(this.data && this.data.length === len) && hasTypedArray) { + this.data = new Float32Array(len); + } + for (var i = 0; i < len; i++) { + this.data[i] = data[i]; + } + this._len = len; + }; + PathProxy.prototype.appendPath = function (path) { + if (!(path instanceof Array)) { + path = [path]; + } + var len = path.length; + var appendSize = 0; + var offset = this._len; + for (var i = 0; i < len; i++) { + appendSize += path[i].len(); + } + if (hasTypedArray && (this.data instanceof Float32Array)) { + this.data = new Float32Array(offset + appendSize); + } + for (var i = 0; i < len; i++) { + var appendPathData = path[i].data; + for (var k = 0; k < appendPathData.length; k++) { + this.data[offset++] = appendPathData[k]; + } + } + this._len = offset; + }; + PathProxy.prototype.addData = function (cmd, a, b, c, d, e, f, g, h) { + if (!this._saveData) { + return; + } + var data = this.data; + if (this._len + arguments.length > data.length) { + this._expandData(); + data = this.data; + } + for (var i = 0; i < arguments.length; i++) { + data[this._len++] = arguments[i]; + } + }; + PathProxy.prototype._drawPendingPt = function () { + if (this._pendingPtDist > 0) { + this._ctx && this._ctx.lineTo(this._pendingPtX, this._pendingPtY); + this._pendingPtDist = 0; + } + }; + PathProxy.prototype._expandData = function () { + if (!(this.data instanceof Array)) { + var newData = []; + for (var i = 0; i < this._len; i++) { + newData[i] = this.data[i]; + } + this.data = newData; + } + }; + PathProxy.prototype.toStatic = function () { + if (!this._saveData) { + return; + } + this._drawPendingPt(); + var data = this.data; + if (data instanceof Array) { + data.length = this._len; + if (hasTypedArray && this._len > 11) { + this.data = new Float32Array(data); + } + } + }; + PathProxy.prototype.getBoundingRect = function () { + min$1[0] = min$1[1] = min2[0] = min2[1] = Number.MAX_VALUE; + max$1[0] = max$1[1] = max2[0] = max2[1] = -Number.MAX_VALUE; + var data = this.data; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + var i; + for (i = 0; i < this._len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + switch (cmd) { + case CMD.M: + xi = x0 = data[i++]; + yi = y0 = data[i++]; + min2[0] = x0; + min2[1] = y0; + max2[0] = x0; + max2[1] = y0; + break; + case CMD.L: + fromLine(xi, yi, data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.C: + fromCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.Q: + fromQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++]; + var endAngle = data[i++] + startAngle; + i += 1; + var anticlockwise = !data[i++]; + if (isFirst) { + x0 = mathCos$1(startAngle) * rx + cx; + y0 = mathSin$1(startAngle) * ry + cy; + } + fromArc(cx, cy, rx, ry, startAngle, endAngle, anticlockwise, min2, max2); + xi = mathCos$1(endAngle) * rx + cx; + yi = mathSin$1(endAngle) * ry + cy; + break; + case CMD.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + fromLine(x0, y0, x0 + width, y0 + height, min2, max2); + break; + case CMD.Z: + xi = x0; + yi = y0; + break; + } + min(min$1, min$1, min2); + max(max$1, max$1, max2); + } + if (i === 0) { + min$1[0] = min$1[1] = max$1[0] = max$1[1] = 0; + } + return new BoundingRect(min$1[0], min$1[1], max$1[0] - min$1[0], max$1[1] - min$1[1]); + }; + PathProxy.prototype._calculateLength = function () { + var data = this.data; + var len = this._len; + var ux = this._ux; + var uy = this._uy; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + if (!this._pathSegLen) { + this._pathSegLen = []; + } + var pathSegLen = this._pathSegLen; + var pathTotalLen = 0; + var segCount = 0; + for (var i = 0; i < len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + var l = -1; + switch (cmd) { + case CMD.M: + xi = x0 = data[i++]; + yi = y0 = data[i++]; + break; + case CMD.L: { + var x2 = data[i++]; + var y2 = data[i++]; + var dx = x2 - xi; + var dy = y2 - yi; + if (mathAbs(dx) > ux || mathAbs(dy) > uy || i === len - 1) { + l = Math.sqrt(dx * dx + dy * dy); + xi = x2; + yi = y2; + } + break; + } + case CMD.C: { + var x1 = data[i++]; + var y1 = data[i++]; + var x2 = data[i++]; + var y2 = data[i++]; + var x3 = data[i++]; + var y3 = data[i++]; + l = cubicLength(xi, yi, x1, y1, x2, y2, x3, y3, 10); + xi = x3; + yi = y3; + break; + } + case CMD.Q: { + var x1 = data[i++]; + var y1 = data[i++]; + var x2 = data[i++]; + var y2 = data[i++]; + l = quadraticLength(xi, yi, x1, y1, x2, y2, 10); + xi = x2; + yi = y2; + break; + } + case CMD.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++]; + var delta = data[i++]; + var endAngle = delta + startAngle; + i += 1; + var anticlockwise = !data[i++]; + if (isFirst) { + x0 = mathCos$1(startAngle) * rx + cx; + y0 = mathSin$1(startAngle) * ry + cy; + } + l = mathMax$2(rx, ry) * mathMin$2(PI2$1, Math.abs(delta)); + xi = mathCos$1(endAngle) * rx + cx; + yi = mathSin$1(endAngle) * ry + cy; + break; + case CMD.R: { + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + l = width * 2 + height * 2; + break; + } + case CMD.Z: { + var dx = x0 - xi; + var dy = y0 - yi; + l = Math.sqrt(dx * dx + dy * dy); + xi = x0; + yi = y0; + break; + } + } + if (l >= 0) { + pathSegLen[segCount++] = l; + pathTotalLen += l; + } + } + this._pathLen = pathTotalLen; + return pathTotalLen; + }; + PathProxy.prototype.rebuildPath = function (ctx, percent) { + var d = this.data; + var ux = this._ux; + var uy = this._uy; + var len = this._len; + var x0; + var y0; + var xi; + var yi; + var x; + var y; + var drawPart = percent < 1; + var pathSegLen; + var pathTotalLen; + var accumLength = 0; + var segCount = 0; + var displayedLength; + var pendingPtDist = 0; + var pendingPtX; + var pendingPtY; + if (drawPart) { + if (!this._pathSegLen) { + this._calculateLength(); + } + pathSegLen = this._pathSegLen; + pathTotalLen = this._pathLen; + displayedLength = percent * pathTotalLen; + if (!displayedLength) { + return; + } + } + lo: for (var i = 0; i < len;) { + var cmd = d[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = d[i]; + yi = d[i + 1]; + x0 = xi; + y0 = yi; + } + if (cmd !== CMD.L && pendingPtDist > 0) { + ctx.lineTo(pendingPtX, pendingPtY); + pendingPtDist = 0; + } + switch (cmd) { + case CMD.M: + x0 = xi = d[i++]; + y0 = yi = d[i++]; + ctx.moveTo(xi, yi); + break; + case CMD.L: { + x = d[i++]; + y = d[i++]; + var dx = mathAbs(x - xi); + var dy = mathAbs(y - yi); + if (dx > ux || dy > uy) { + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + ctx.lineTo(xi * (1 - t) + x * t, yi * (1 - t) + y * t); + break lo; + } + accumLength += l; + } + ctx.lineTo(x, y); + xi = x; + yi = y; + pendingPtDist = 0; + } + else { + var d2 = dx * dx + dy * dy; + if (d2 > pendingPtDist) { + pendingPtX = x; + pendingPtY = y; + pendingPtDist = d2; + } + } + break; + } + case CMD.C: { + var x1 = d[i++]; + var y1 = d[i++]; + var x2 = d[i++]; + var y2 = d[i++]; + var x3 = d[i++]; + var y3 = d[i++]; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + cubicSubdivide(xi, x1, x2, x3, t, tmpOutX); + cubicSubdivide(yi, y1, y2, y3, t, tmpOutY); + ctx.bezierCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2], tmpOutX[3], tmpOutY[3]); + break lo; + } + accumLength += l; + } + ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); + xi = x3; + yi = y3; + break; + } + case CMD.Q: { + var x1 = d[i++]; + var y1 = d[i++]; + var x2 = d[i++]; + var y2 = d[i++]; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + quadraticSubdivide(xi, x1, x2, t, tmpOutX); + quadraticSubdivide(yi, y1, y2, t, tmpOutY); + ctx.quadraticCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2]); + break lo; + } + accumLength += l; + } + ctx.quadraticCurveTo(x1, y1, x2, y2); + xi = x2; + yi = y2; + break; + } + case CMD.A: + var cx = d[i++]; + var cy = d[i++]; + var rx = d[i++]; + var ry = d[i++]; + var startAngle = d[i++]; + var delta = d[i++]; + var psi = d[i++]; + var anticlockwise = !d[i++]; + var r = (rx > ry) ? rx : ry; + var isEllipse = mathAbs(rx - ry) > 1e-3; + var endAngle = startAngle + delta; + var breakBuild = false; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + endAngle = startAngle + delta * (displayedLength - accumLength) / l; + breakBuild = true; + } + accumLength += l; + } + if (isEllipse && ctx.ellipse) { + ctx.ellipse(cx, cy, rx, ry, psi, startAngle, endAngle, anticlockwise); + } + else { + ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise); + } + if (breakBuild) { + break lo; + } + if (isFirst) { + x0 = mathCos$1(startAngle) * rx + cx; + y0 = mathSin$1(startAngle) * ry + cy; + } + xi = mathCos$1(endAngle) * rx + cx; + yi = mathSin$1(endAngle) * ry + cy; + break; + case CMD.R: + x0 = xi = d[i]; + y0 = yi = d[i + 1]; + x = d[i++]; + y = d[i++]; + var width = d[i++]; + var height = d[i++]; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var d_1 = displayedLength - accumLength; + ctx.moveTo(x, y); + ctx.lineTo(x + mathMin$2(d_1, width), y); + d_1 -= width; + if (d_1 > 0) { + ctx.lineTo(x + width, y + mathMin$2(d_1, height)); + } + d_1 -= height; + if (d_1 > 0) { + ctx.lineTo(x + mathMax$2(width - d_1, 0), y + height); + } + d_1 -= width; + if (d_1 > 0) { + ctx.lineTo(x, y + mathMax$2(height - d_1, 0)); + } + break lo; + } + accumLength += l; + } + ctx.rect(x, y, width, height); + break; + case CMD.Z: + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + ctx.lineTo(xi * (1 - t) + x0 * t, yi * (1 - t) + y0 * t); + break lo; + } + accumLength += l; + } + ctx.closePath(); + xi = x0; + yi = y0; + } + } + }; + PathProxy.prototype.clone = function () { + var newProxy = new PathProxy(); + var data = this.data; + newProxy.data = data.slice ? data.slice() + : Array.prototype.slice.call(data); + newProxy._len = this._len; + return newProxy; + }; + PathProxy.CMD = CMD; + PathProxy.initDefaultProps = (function () { + var proto = PathProxy.prototype; + proto._saveData = true; + proto._ux = 0; + proto._uy = 0; + proto._pendingPtDist = 0; + proto._version = 0; + })(); + return PathProxy; + }()); + + function containStroke(x0, y0, x1, y1, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + var _a = 0; + var _b = x0; + if ((y > y0 + _l && y > y1 + _l) + || (y < y0 - _l && y < y1 - _l) + || (x > x0 + _l && x > x1 + _l) + || (x < x0 - _l && x < x1 - _l)) { + return false; + } + if (x0 !== x1) { + _a = (y0 - y1) / (x0 - x1); + _b = (x0 * y1 - x1 * y0) / (x0 - x1); + } + else { + return Math.abs(x - x0) <= _l / 2; + } + var tmp = _a * x - y + _b; + var _s = tmp * tmp / (_a * _a + 1); + return _s <= _l / 2 * _l / 2; + } + + function containStroke$1(x0, y0, x1, y1, x2, y2, x3, y3, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + if ((y > y0 + _l && y > y1 + _l && y > y2 + _l && y > y3 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l && y < y3 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l && x > x3 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l && x < x3 - _l)) { + return false; + } + var d = cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, null); + return d <= _l / 2; + } + + function containStroke$2(x0, y0, x1, y1, x2, y2, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + if ((y > y0 + _l && y > y1 + _l && y > y2 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l)) { + return false; + } + var d = quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, null); + return d <= _l / 2; + } + + var PI2$2 = Math.PI * 2; + function normalizeRadian(angle) { + angle %= PI2$2; + if (angle < 0) { + angle += PI2$2; + } + return angle; + } + + var PI2$3 = Math.PI * 2; + function containStroke$3(cx, cy, r, startAngle, endAngle, anticlockwise, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + x -= cx; + y -= cy; + var d = Math.sqrt(x * x + y * y); + if ((d - _l > r) || (d + _l < r)) { + return false; + } + if (Math.abs(startAngle - endAngle) % PI2$3 < 1e-4) { + return true; + } + if (anticlockwise) { + var tmp = startAngle; + startAngle = normalizeRadian(endAngle); + endAngle = normalizeRadian(tmp); + } + else { + startAngle = normalizeRadian(startAngle); + endAngle = normalizeRadian(endAngle); + } + if (startAngle > endAngle) { + endAngle += PI2$3; + } + var angle = Math.atan2(y, x); + if (angle < 0) { + angle += PI2$3; + } + return (angle >= startAngle && angle <= endAngle) + || (angle + PI2$3 >= startAngle && angle + PI2$3 <= endAngle); + } + + function windingLine(x0, y0, x1, y1, x, y) { + if ((y > y0 && y > y1) || (y < y0 && y < y1)) { + return 0; + } + if (y1 === y0) { + return 0; + } + var t = (y - y0) / (y1 - y0); + var dir = y1 < y0 ? 1 : -1; + if (t === 1 || t === 0) { + dir = y1 < y0 ? 0.5 : -0.5; + } + var x_ = t * (x1 - x0) + x0; + return x_ === x ? Infinity : x_ > x ? dir : 0; + } + + var CMD$1 = PathProxy.CMD; + var PI2$4 = Math.PI * 2; + var EPSILON$3 = 1e-4; + function isAroundEqual(a, b) { + return Math.abs(a - b) < EPSILON$3; + } + var roots = [-1, -1, -1]; + var extrema = [-1, -1]; + function swapExtrema() { + var tmp = extrema[0]; + extrema[0] = extrema[1]; + extrema[1] = tmp; + } + function windingCubic(x0, y0, x1, y1, x2, y2, x3, y3, x, y) { + if ((y > y0 && y > y1 && y > y2 && y > y3) + || (y < y0 && y < y1 && y < y2 && y < y3)) { + return 0; + } + var nRoots = cubicRootAt(y0, y1, y2, y3, y, roots); + if (nRoots === 0) { + return 0; + } + else { + var w = 0; + var nExtrema = -1; + var y0_ = void 0; + var y1_ = void 0; + for (var i = 0; i < nRoots; i++) { + var t = roots[i]; + var unit = (t === 0 || t === 1) ? 0.5 : 1; + var x_ = cubicAt(x0, x1, x2, x3, t); + if (x_ < x) { + continue; + } + if (nExtrema < 0) { + nExtrema = cubicExtrema(y0, y1, y2, y3, extrema); + if (extrema[1] < extrema[0] && nExtrema > 1) { + swapExtrema(); + } + y0_ = cubicAt(y0, y1, y2, y3, extrema[0]); + if (nExtrema > 1) { + y1_ = cubicAt(y0, y1, y2, y3, extrema[1]); + } + } + if (nExtrema === 2) { + if (t < extrema[0]) { + w += y0_ < y0 ? unit : -unit; + } + else if (t < extrema[1]) { + w += y1_ < y0_ ? unit : -unit; + } + else { + w += y3 < y1_ ? unit : -unit; + } + } + else { + if (t < extrema[0]) { + w += y0_ < y0 ? unit : -unit; + } + else { + w += y3 < y0_ ? unit : -unit; + } + } + } + return w; + } + } + function windingQuadratic(x0, y0, x1, y1, x2, y2, x, y) { + if ((y > y0 && y > y1 && y > y2) + || (y < y0 && y < y1 && y < y2)) { + return 0; + } + var nRoots = quadraticRootAt(y0, y1, y2, y, roots); + if (nRoots === 0) { + return 0; + } + else { + var t = quadraticExtremum(y0, y1, y2); + if (t >= 0 && t <= 1) { + var w = 0; + var y_ = quadraticAt(y0, y1, y2, t); + for (var i = 0; i < nRoots; i++) { + var unit = (roots[i] === 0 || roots[i] === 1) ? 0.5 : 1; + var x_ = quadraticAt(x0, x1, x2, roots[i]); + if (x_ < x) { + continue; + } + if (roots[i] < t) { + w += y_ < y0 ? unit : -unit; + } + else { + w += y2 < y_ ? unit : -unit; + } + } + return w; + } + else { + var unit = (roots[0] === 0 || roots[0] === 1) ? 0.5 : 1; + var x_ = quadraticAt(x0, x1, x2, roots[0]); + if (x_ < x) { + return 0; + } + return y2 < y0 ? unit : -unit; + } + } + } + function windingArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y) { + y -= cy; + if (y > r || y < -r) { + return 0; + } + var tmp = Math.sqrt(r * r - y * y); + roots[0] = -tmp; + roots[1] = tmp; + var dTheta = Math.abs(startAngle - endAngle); + if (dTheta < 1e-4) { + return 0; + } + if (dTheta >= PI2$4 - 1e-4) { + startAngle = 0; + endAngle = PI2$4; + var dir = anticlockwise ? 1 : -1; + if (x >= roots[0] + cx && x <= roots[1] + cx) { + return dir; + } + else { + return 0; + } + } + if (startAngle > endAngle) { + var tmp_1 = startAngle; + startAngle = endAngle; + endAngle = tmp_1; + } + if (startAngle < 0) { + startAngle += PI2$4; + endAngle += PI2$4; + } + var w = 0; + for (var i = 0; i < 2; i++) { + var x_ = roots[i]; + if (x_ + cx > x) { + var angle = Math.atan2(y, x_); + var dir = anticlockwise ? 1 : -1; + if (angle < 0) { + angle = PI2$4 + angle; + } + if ((angle >= startAngle && angle <= endAngle) + || (angle + PI2$4 >= startAngle && angle + PI2$4 <= endAngle)) { + if (angle > Math.PI / 2 && angle < Math.PI * 1.5) { + dir = -dir; + } + w += dir; + } + } + } + return w; + } + function containPath(path, lineWidth, isStroke, x, y) { + var data = path.data; + var len = path.len(); + var w = 0; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + var x1; + var y1; + for (var i = 0; i < len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (cmd === CMD$1.M && i > 1) { + if (!isStroke) { + w += windingLine(xi, yi, x0, y0, x, y); + } + } + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + switch (cmd) { + case CMD$1.M: + x0 = data[i++]; + y0 = data[i++]; + xi = x0; + yi = y0; + break; + case CMD$1.L: + if (isStroke) { + if (containStroke(xi, yi, data[i], data[i + 1], lineWidth, x, y)) { + return true; + } + } + else { + w += windingLine(xi, yi, data[i], data[i + 1], x, y) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD$1.C: + if (isStroke) { + if (containStroke$1(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) { + return true; + } + } + else { + w += windingCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD$1.Q: + if (isStroke) { + if (containStroke$2(xi, yi, data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) { + return true; + } + } + else { + w += windingQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD$1.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var theta = data[i++]; + var dTheta = data[i++]; + i += 1; + var anticlockwise = !!(1 - data[i++]); + x1 = Math.cos(theta) * rx + cx; + y1 = Math.sin(theta) * ry + cy; + if (!isFirst) { + w += windingLine(xi, yi, x1, y1, x, y); + } + else { + x0 = x1; + y0 = y1; + } + var _x = (x - cx) * ry / rx + cx; + if (isStroke) { + if (containStroke$3(cx, cy, ry, theta, theta + dTheta, anticlockwise, lineWidth, _x, y)) { + return true; + } + } + else { + w += windingArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y); + } + xi = Math.cos(theta + dTheta) * rx + cx; + yi = Math.sin(theta + dTheta) * ry + cy; + break; + case CMD$1.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + x1 = x0 + width; + y1 = y0 + height; + if (isStroke) { + if (containStroke(x0, y0, x1, y0, lineWidth, x, y) + || containStroke(x1, y0, x1, y1, lineWidth, x, y) + || containStroke(x1, y1, x0, y1, lineWidth, x, y) + || containStroke(x0, y1, x0, y0, lineWidth, x, y)) { + return true; + } + } + else { + w += windingLine(x1, y0, x1, y1, x, y); + w += windingLine(x0, y1, x0, y0, x, y); + } + break; + case CMD$1.Z: + if (isStroke) { + if (containStroke(xi, yi, x0, y0, lineWidth, x, y)) { + return true; + } + } + else { + w += windingLine(xi, yi, x0, y0, x, y); + } + xi = x0; + yi = y0; + break; + } + } + if (!isStroke && !isAroundEqual(yi, y0)) { + w += windingLine(xi, yi, x0, y0, x, y) || 0; + } + return w !== 0; + } + function contain(pathProxy, x, y) { + return containPath(pathProxy, 0, false, x, y); + } + function containStroke$4(pathProxy, lineWidth, x, y) { + return containPath(pathProxy, lineWidth, true, x, y); + } + + var DEFAULT_PATH_STYLE = defaults({ + fill: '#000', + stroke: null, + strokePercent: 1, + fillOpacity: 1, + strokeOpacity: 1, + lineDashOffset: 0, + lineWidth: 1, + lineCap: 'butt', + miterLimit: 10, + strokeNoScale: false, + strokeFirst: false + }, DEFAULT_COMMON_STYLE); + var DEFAULT_PATH_ANIMATION_PROPS = { + style: defaults({ + fill: true, + stroke: true, + strokePercent: true, + fillOpacity: true, + strokeOpacity: true, + lineDashOffset: true, + lineWidth: true, + miterLimit: true + }, DEFAULT_COMMON_ANIMATION_PROPS.style) + }; + var pathCopyParams = TRANSFORMABLE_PROPS.concat(['invisible', + 'culling', 'z', 'z2', 'zlevel', 'parent' + ]); + var Path = (function (_super) { + __extends(Path, _super); + function Path(opts) { + return _super.call(this, opts) || this; + } + Path.prototype.update = function () { + var _this = this; + _super.prototype.update.call(this); + var style = this.style; + if (style.decal) { + var decalEl = this._decalEl = this._decalEl || new Path(); + if (decalEl.buildPath === Path.prototype.buildPath) { + decalEl.buildPath = function (ctx) { + _this.buildPath(ctx, _this.shape); + }; + } + decalEl.silent = true; + var decalElStyle = decalEl.style; + for (var key in style) { + if (decalElStyle[key] !== style[key]) { + decalElStyle[key] = style[key]; + } + } + decalElStyle.fill = style.fill ? style.decal : null; + decalElStyle.decal = null; + decalElStyle.shadowColor = null; + style.strokeFirst && (decalElStyle.stroke = null); + for (var i = 0; i < pathCopyParams.length; ++i) { + decalEl[pathCopyParams[i]] = this[pathCopyParams[i]]; + } + decalEl.__dirty |= REDRAW_BIT; + } + else if (this._decalEl) { + this._decalEl = null; + } + }; + Path.prototype.getDecalElement = function () { + return this._decalEl; + }; + Path.prototype._init = function (props) { + var keysArr = keys(props); + this.shape = this.getDefaultShape(); + var defaultStyle = this.getDefaultStyle(); + if (defaultStyle) { + this.useStyle(defaultStyle); + } + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + var value = props[key]; + if (key === 'style') { + if (!this.style) { + this.useStyle(value); + } + else { + extend(this.style, value); + } + } + else if (key === 'shape') { + extend(this.shape, value); + } + else { + _super.prototype.attrKV.call(this, key, value); + } + } + if (!this.style) { + this.useStyle({}); + } + }; + Path.prototype.getDefaultStyle = function () { + return null; + }; + Path.prototype.getDefaultShape = function () { + return {}; + }; + Path.prototype.canBeInsideText = function () { + return this.hasFill(); + }; + Path.prototype.getInsideTextFill = function () { + var pathFill = this.style.fill; + if (pathFill !== 'none') { + if (isString(pathFill)) { + var fillLum = lum(pathFill, 0); + if (fillLum > 0.5) { + return DARK_LABEL_COLOR; + } + else if (fillLum > 0.2) { + return LIGHTER_LABEL_COLOR; + } + return LIGHT_LABEL_COLOR; + } + else if (pathFill) { + return LIGHT_LABEL_COLOR; + } + } + return DARK_LABEL_COLOR; + }; + Path.prototype.getInsideTextStroke = function (textFill) { + var pathFill = this.style.fill; + if (isString(pathFill)) { + var zr = this.__zr; + var isDarkMode = !!(zr && zr.isDarkMode()); + var isDarkLabel = lum(textFill, 0) < DARK_MODE_THRESHOLD; + if (isDarkMode === isDarkLabel) { + return pathFill; + } + } + }; + Path.prototype.buildPath = function (ctx, shapeCfg, inBatch) { }; + Path.prototype.pathUpdated = function () { + this.__dirty &= ~SHAPE_CHANGED_BIT; + }; + Path.prototype.getUpdatedPathProxy = function (inBatch) { + !this.path && this.createPathProxy(); + this.path.beginPath(); + this.buildPath(this.path, this.shape, inBatch); + return this.path; + }; + Path.prototype.createPathProxy = function () { + this.path = new PathProxy(false); + }; + Path.prototype.hasStroke = function () { + var style = this.style; + var stroke = style.stroke; + return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0)); + }; + Path.prototype.hasFill = function () { + var style = this.style; + var fill = style.fill; + return fill != null && fill !== 'none'; + }; + Path.prototype.getBoundingRect = function () { + var rect = this._rect; + var style = this.style; + var needsUpdateRect = !rect; + if (needsUpdateRect) { + var firstInvoke = false; + if (!this.path) { + firstInvoke = true; + this.createPathProxy(); + } + var path = this.path; + if (firstInvoke || (this.__dirty & SHAPE_CHANGED_BIT)) { + path.beginPath(); + this.buildPath(path, this.shape, false); + this.pathUpdated(); + } + rect = path.getBoundingRect(); + } + this._rect = rect; + if (this.hasStroke() && this.path && this.path.len() > 0) { + var rectStroke = this._rectStroke || (this._rectStroke = rect.clone()); + if (this.__dirty || needsUpdateRect) { + rectStroke.copy(rect); + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + var w = style.lineWidth; + if (!this.hasFill()) { + var strokeContainThreshold = this.strokeContainThreshold; + w = Math.max(w, strokeContainThreshold == null ? 4 : strokeContainThreshold); + } + if (lineScale > 1e-10) { + rectStroke.width += w / lineScale; + rectStroke.height += w / lineScale; + rectStroke.x -= w / lineScale / 2; + rectStroke.y -= w / lineScale / 2; + } + } + return rectStroke; + } + return rect; + }; + Path.prototype.contain = function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + var style = this.style; + x = localPos[0]; + y = localPos[1]; + if (rect.contain(x, y)) { + var pathProxy = this.path; + if (this.hasStroke()) { + var lineWidth = style.lineWidth; + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + if (lineScale > 1e-10) { + if (!this.hasFill()) { + lineWidth = Math.max(lineWidth, this.strokeContainThreshold); + } + if (containStroke$4(pathProxy, lineWidth / lineScale, x, y)) { + return true; + } + } + } + if (this.hasFill()) { + return contain(pathProxy, x, y); + } + } + return false; + }; + Path.prototype.dirtyShape = function () { + this.__dirty |= SHAPE_CHANGED_BIT; + if (this._rect) { + this._rect = null; + } + if (this._decalEl) { + this._decalEl.dirtyShape(); + } + this.markRedraw(); + }; + Path.prototype.dirty = function () { + this.dirtyStyle(); + this.dirtyShape(); + }; + Path.prototype.animateShape = function (loop) { + return this.animate('shape', loop); + }; + Path.prototype.updateDuringAnimation = function (targetKey) { + if (targetKey === 'style') { + this.dirtyStyle(); + } + else if (targetKey === 'shape') { + this.dirtyShape(); + } + else { + this.markRedraw(); + } + }; + Path.prototype.attrKV = function (key, value) { + if (key === 'shape') { + this.setShape(value); + } + else { + _super.prototype.attrKV.call(this, key, value); + } + }; + Path.prototype.setShape = function (keyOrObj, value) { + var shape = this.shape; + if (!shape) { + shape = this.shape = {}; + } + if (typeof keyOrObj === 'string') { + shape[keyOrObj] = value; + } + else { + extend(shape, keyOrObj); + } + this.dirtyShape(); + return this; + }; + Path.prototype.shapeChanged = function () { + return !!(this.__dirty & SHAPE_CHANGED_BIT); + }; + Path.prototype.createStyle = function (obj) { + return createObject(DEFAULT_PATH_STYLE, obj); + }; + Path.prototype._innerSaveToNormal = function (toState) { + _super.prototype._innerSaveToNormal.call(this, toState); + var normalState = this._normalState; + if (toState.shape && !normalState.shape) { + normalState.shape = extend({}, this.shape); + } + }; + Path.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) { + _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg); + var needsRestoreToNormal = !(state && keepCurrentStates); + var targetShape; + if (state && state.shape) { + if (transition) { + if (keepCurrentStates) { + targetShape = state.shape; + } + else { + targetShape = extend({}, normalState.shape); + extend(targetShape, state.shape); + } + } + else { + targetShape = extend({}, keepCurrentStates ? this.shape : normalState.shape); + extend(targetShape, state.shape); + } + } + else if (needsRestoreToNormal) { + targetShape = normalState.shape; + } + if (targetShape) { + if (transition) { + this.shape = extend({}, this.shape); + var targetShapePrimaryProps = {}; + var shapeKeys = keys(targetShape); + for (var i = 0; i < shapeKeys.length; i++) { + var key = shapeKeys[i]; + if (typeof targetShape[key] === 'object') { + this.shape[key] = targetShape[key]; + } + else { + targetShapePrimaryProps[key] = targetShape[key]; + } + } + this._transitionState(stateName, { + shape: targetShapePrimaryProps + }, animationCfg); + } + else { + this.shape = targetShape; + this.dirtyShape(); + } + } + }; + Path.prototype._mergeStates = function (states) { + var mergedState = _super.prototype._mergeStates.call(this, states); + var mergedShape; + for (var i = 0; i < states.length; i++) { + var state = states[i]; + if (state.shape) { + mergedShape = mergedShape || {}; + this._mergeStyle(mergedShape, state.shape); + } + } + if (mergedShape) { + mergedState.shape = mergedShape; + } + return mergedState; + }; + Path.prototype.getAnimationStyleProps = function () { + return DEFAULT_PATH_ANIMATION_PROPS; + }; + Path.prototype.isZeroArea = function () { + return false; + }; + Path.extend = function (defaultProps) { + var Sub = (function (_super) { + __extends(Sub, _super); + function Sub(opts) { + var _this = _super.call(this, opts) || this; + defaultProps.init && defaultProps.init.call(_this, opts); + return _this; + } + Sub.prototype.getDefaultStyle = function () { + return clone(defaultProps.style); + }; + Sub.prototype.getDefaultShape = function () { + return clone(defaultProps.shape); + }; + return Sub; + }(Path)); + for (var key in defaultProps) { + if (typeof defaultProps[key] === 'function') { + Sub.prototype[key] = defaultProps[key]; + } + } + return Sub; + }; + Path.initDefaultProps = (function () { + var pathProto = Path.prototype; + pathProto.type = 'path'; + pathProto.strokeContainThreshold = 5; + pathProto.segmentIgnoreThreshold = 0; + pathProto.subPixelOptimize = false; + pathProto.autoBatch = false; + pathProto.__dirty = REDRAW_BIT | STYLE_CHANGED_BIT | SHAPE_CHANGED_BIT; + })(); + return Path; + }(Displayable)); + + var DEFAULT_TSPAN_STYLE = defaults({ + strokeFirst: true, + font: DEFAULT_FONT, + x: 0, + y: 0, + textAlign: 'left', + textBaseline: 'top', + miterLimit: 2 + }, DEFAULT_PATH_STYLE); + var TSpan = (function (_super) { + __extends(TSpan, _super); + function TSpan() { + return _super !== null && _super.apply(this, arguments) || this; + } + TSpan.prototype.hasStroke = function () { + var style = this.style; + var stroke = style.stroke; + return stroke != null && stroke !== 'none' && style.lineWidth > 0; + }; + TSpan.prototype.hasFill = function () { + var style = this.style; + var fill = style.fill; + return fill != null && fill !== 'none'; + }; + TSpan.prototype.createStyle = function (obj) { + return createObject(DEFAULT_TSPAN_STYLE, obj); + }; + TSpan.prototype.setBoundingRect = function (rect) { + this._rect = rect; + }; + TSpan.prototype.getBoundingRect = function () { + var style = this.style; + if (!this._rect) { + var text = style.text; + text != null ? (text += '') : (text = ''); + var rect = getBoundingRect(text, style.font, style.textAlign, style.textBaseline); + rect.x += style.x || 0; + rect.y += style.y || 0; + if (this.hasStroke()) { + var w = style.lineWidth; + rect.x -= w / 2; + rect.y -= w / 2; + rect.width += w; + rect.height += w; + } + this._rect = rect; + } + return this._rect; + }; + TSpan.initDefaultProps = (function () { + var tspanProto = TSpan.prototype; + tspanProto.dirtyRectTolerance = 10; + })(); + return TSpan; + }(Displayable)); + TSpan.prototype.type = 'tspan'; + + var DEFAULT_IMAGE_STYLE = defaults({ + x: 0, + y: 0 + }, DEFAULT_COMMON_STYLE); + var DEFAULT_IMAGE_ANIMATION_PROPS = { + style: defaults({ + x: true, + y: true, + width: true, + height: true, + sx: true, + sy: true, + sWidth: true, + sHeight: true + }, DEFAULT_COMMON_ANIMATION_PROPS.style) + }; + function isImageLike(source) { + return !!(source + && typeof source !== 'string' + && source.width && source.height); + } + var ZRImage = (function (_super) { + __extends(ZRImage, _super); + function ZRImage() { + return _super !== null && _super.apply(this, arguments) || this; + } + ZRImage.prototype.createStyle = function (obj) { + return createObject(DEFAULT_IMAGE_STYLE, obj); + }; + ZRImage.prototype._getSize = function (dim) { + var style = this.style; + var size = style[dim]; + if (size != null) { + return size; + } + var imageSource = isImageLike(style.image) + ? style.image : this.__image; + if (!imageSource) { + return 0; + } + var otherDim = dim === 'width' ? 'height' : 'width'; + var otherDimSize = style[otherDim]; + if (otherDimSize == null) { + return imageSource[dim]; + } + else { + return imageSource[dim] / imageSource[otherDim] * otherDimSize; + } + }; + ZRImage.prototype.getWidth = function () { + return this._getSize('width'); + }; + ZRImage.prototype.getHeight = function () { + return this._getSize('height'); + }; + ZRImage.prototype.getAnimationStyleProps = function () { + return DEFAULT_IMAGE_ANIMATION_PROPS; + }; + ZRImage.prototype.getBoundingRect = function () { + var style = this.style; + if (!this._rect) { + this._rect = new BoundingRect(style.x || 0, style.y || 0, this.getWidth(), this.getHeight()); + } + return this._rect; + }; + return ZRImage; + }(Displayable)); + ZRImage.prototype.type = 'image'; + + function buildPath(ctx, shape) { + var x = shape.x; + var y = shape.y; + var width = shape.width; + var height = shape.height; + var r = shape.r; + var r1; + var r2; + var r3; + var r4; + if (width < 0) { + x = x + width; + width = -width; + } + if (height < 0) { + y = y + height; + height = -height; + } + if (typeof r === 'number') { + r1 = r2 = r3 = r4 = r; + } + else if (r instanceof Array) { + if (r.length === 1) { + r1 = r2 = r3 = r4 = r[0]; + } + else if (r.length === 2) { + r1 = r3 = r[0]; + r2 = r4 = r[1]; + } + else if (r.length === 3) { + r1 = r[0]; + r2 = r4 = r[1]; + r3 = r[2]; + } + else { + r1 = r[0]; + r2 = r[1]; + r3 = r[2]; + r4 = r[3]; + } + } + else { + r1 = r2 = r3 = r4 = 0; + } + var total; + if (r1 + r2 > width) { + total = r1 + r2; + r1 *= width / total; + r2 *= width / total; + } + if (r3 + r4 > width) { + total = r3 + r4; + r3 *= width / total; + r4 *= width / total; + } + if (r2 + r3 > height) { + total = r2 + r3; + r2 *= height / total; + r3 *= height / total; + } + if (r1 + r4 > height) { + total = r1 + r4; + r1 *= height / total; + r4 *= height / total; + } + ctx.moveTo(x + r1, y); + ctx.lineTo(x + width - r2, y); + r2 !== 0 && ctx.arc(x + width - r2, y + r2, r2, -Math.PI / 2, 0); + ctx.lineTo(x + width, y + height - r3); + r3 !== 0 && ctx.arc(x + width - r3, y + height - r3, r3, 0, Math.PI / 2); + ctx.lineTo(x + r4, y + height); + r4 !== 0 && ctx.arc(x + r4, y + height - r4, r4, Math.PI / 2, Math.PI); + ctx.lineTo(x, y + r1); + r1 !== 0 && ctx.arc(x + r1, y + r1, r1, Math.PI, Math.PI * 1.5); + } + + var round$1 = Math.round; + function subPixelOptimizeLine(outputShape, inputShape, style) { + if (!inputShape) { + return; + } + var x1 = inputShape.x1; + var x2 = inputShape.x2; + var y1 = inputShape.y1; + var y2 = inputShape.y2; + outputShape.x1 = x1; + outputShape.x2 = x2; + outputShape.y1 = y1; + outputShape.y2 = y2; + var lineWidth = style && style.lineWidth; + if (!lineWidth) { + return outputShape; + } + if (round$1(x1 * 2) === round$1(x2 * 2)) { + outputShape.x1 = outputShape.x2 = subPixelOptimize(x1, lineWidth, true); + } + if (round$1(y1 * 2) === round$1(y2 * 2)) { + outputShape.y1 = outputShape.y2 = subPixelOptimize(y1, lineWidth, true); + } + return outputShape; + } + function subPixelOptimizeRect(outputShape, inputShape, style) { + if (!inputShape) { + return; + } + var originX = inputShape.x; + var originY = inputShape.y; + var originWidth = inputShape.width; + var originHeight = inputShape.height; + outputShape.x = originX; + outputShape.y = originY; + outputShape.width = originWidth; + outputShape.height = originHeight; + var lineWidth = style && style.lineWidth; + if (!lineWidth) { + return outputShape; + } + outputShape.x = subPixelOptimize(originX, lineWidth, true); + outputShape.y = subPixelOptimize(originY, lineWidth, true); + outputShape.width = Math.max(subPixelOptimize(originX + originWidth, lineWidth, false) - outputShape.x, originWidth === 0 ? 0 : 1); + outputShape.height = Math.max(subPixelOptimize(originY + originHeight, lineWidth, false) - outputShape.y, originHeight === 0 ? 0 : 1); + return outputShape; + } + function subPixelOptimize(position, lineWidth, positiveOrNegative) { + if (!lineWidth) { + return position; + } + var doubledPosition = round$1(position * 2); + return (doubledPosition + round$1(lineWidth)) % 2 === 0 + ? doubledPosition / 2 + : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2; + } + + var RectShape = (function () { + function RectShape() { + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + } + return RectShape; + }()); + var subPixelOptimizeOutputShape = {}; + var Rect = (function (_super) { + __extends(Rect, _super); + function Rect(opts) { + return _super.call(this, opts) || this; + } + Rect.prototype.getDefaultShape = function () { + return new RectShape(); + }; + Rect.prototype.buildPath = function (ctx, shape) { + var x; + var y; + var width; + var height; + if (this.subPixelOptimize) { + var optimizedShape = subPixelOptimizeRect(subPixelOptimizeOutputShape, shape, this.style); + x = optimizedShape.x; + y = optimizedShape.y; + width = optimizedShape.width; + height = optimizedShape.height; + optimizedShape.r = shape.r; + shape = optimizedShape; + } + else { + x = shape.x; + y = shape.y; + width = shape.width; + height = shape.height; + } + if (!shape.r) { + ctx.rect(x, y, width, height); + } + else { + buildPath(ctx, shape); + } + }; + Rect.prototype.isZeroArea = function () { + return !this.shape.width || !this.shape.height; + }; + return Rect; + }(Path)); + Rect.prototype.type = 'rect'; + + var DEFAULT_RICH_TEXT_COLOR = { + fill: '#000' + }; + var DEFAULT_STROKE_LINE_WIDTH = 2; + var DEFAULT_TEXT_ANIMATION_PROPS = { + style: defaults({ + fill: true, + stroke: true, + fillOpacity: true, + strokeOpacity: true, + lineWidth: true, + fontSize: true, + lineHeight: true, + width: true, + height: true, + textShadowColor: true, + textShadowBlur: true, + textShadowOffsetX: true, + textShadowOffsetY: true, + backgroundColor: true, + padding: true, + borderColor: true, + borderWidth: true, + borderRadius: true + }, DEFAULT_COMMON_ANIMATION_PROPS.style) + }; + var ZRText = (function (_super) { + __extends(ZRText, _super); + function ZRText(opts) { + var _this = _super.call(this) || this; + _this.type = 'text'; + _this._children = []; + _this._defaultStyle = DEFAULT_RICH_TEXT_COLOR; + _this.attr(opts); + return _this; + } + ZRText.prototype.childrenRef = function () { + return this._children; + }; + ZRText.prototype.update = function () { + _super.prototype.update.call(this); + if (this.styleChanged()) { + this._updateSubTexts(); + } + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + child.zlevel = this.zlevel; + child.z = this.z; + child.z2 = this.z2; + child.culling = this.culling; + child.cursor = this.cursor; + child.invisible = this.invisible; + } + }; + ZRText.prototype.updateTransform = function () { + var innerTransformable = this.innerTransformable; + if (innerTransformable) { + innerTransformable.updateTransform(); + if (innerTransformable.transform) { + this.transform = innerTransformable.transform; + } + } + else { + _super.prototype.updateTransform.call(this); + } + }; + ZRText.prototype.getLocalTransform = function (m) { + var innerTransformable = this.innerTransformable; + return innerTransformable + ? innerTransformable.getLocalTransform(m) + : _super.prototype.getLocalTransform.call(this, m); + }; + ZRText.prototype.getComputedTransform = function () { + if (this.__hostTarget) { + this.__hostTarget.getComputedTransform(); + this.__hostTarget.updateInnerText(true); + } + return _super.prototype.getComputedTransform.call(this); + }; + ZRText.prototype._updateSubTexts = function () { + this._childCursor = 0; + normalizeTextStyle(this.style); + this.style.rich + ? this._updateRichTexts() + : this._updatePlainTexts(); + this._children.length = this._childCursor; + this.styleUpdated(); + }; + ZRText.prototype.addSelfToZr = function (zr) { + _super.prototype.addSelfToZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + this._children[i].__zr = zr; + } + }; + ZRText.prototype.removeSelfFromZr = function (zr) { + _super.prototype.removeSelfFromZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + this._children[i].__zr = null; + } + }; + ZRText.prototype.getBoundingRect = function () { + if (this.styleChanged()) { + this._updateSubTexts(); + } + if (!this._rect) { + var tmpRect = new BoundingRect(0, 0, 0, 0); + var children = this._children; + var tmpMat = []; + var rect = null; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + var childRect = child.getBoundingRect(); + var transform = child.getLocalTransform(tmpMat); + if (transform) { + tmpRect.copy(childRect); + tmpRect.applyTransform(transform); + rect = rect || tmpRect.clone(); + rect.union(tmpRect); + } + else { + rect = rect || childRect.clone(); + rect.union(childRect); + } + } + this._rect = rect || tmpRect; + } + return this._rect; + }; + ZRText.prototype.setDefaultTextStyle = function (defaultTextStyle) { + this._defaultStyle = defaultTextStyle || DEFAULT_RICH_TEXT_COLOR; + }; + ZRText.prototype.setTextContent = function (textContent) { + if ("development" !== 'production') { + throw new Error('Can\'t attach text on another text'); + } + }; + ZRText.prototype._mergeStyle = function (targetStyle, sourceStyle) { + if (!sourceStyle) { + return targetStyle; + } + var sourceRich = sourceStyle.rich; + var targetRich = targetStyle.rich || (sourceRich && {}); + extend(targetStyle, sourceStyle); + if (sourceRich && targetRich) { + this._mergeRich(targetRich, sourceRich); + targetStyle.rich = targetRich; + } + else if (targetRich) { + targetStyle.rich = targetRich; + } + return targetStyle; + }; + ZRText.prototype._mergeRich = function (targetRich, sourceRich) { + var richNames = keys(sourceRich); + for (var i = 0; i < richNames.length; i++) { + var richName = richNames[i]; + targetRich[richName] = targetRich[richName] || {}; + extend(targetRich[richName], sourceRich[richName]); + } + }; + ZRText.prototype.getAnimationStyleProps = function () { + return DEFAULT_TEXT_ANIMATION_PROPS; + }; + ZRText.prototype._getOrCreateChild = function (Ctor) { + var child = this._children[this._childCursor]; + if (!child || !(child instanceof Ctor)) { + child = new Ctor(); + } + this._children[this._childCursor++] = child; + child.__zr = this.__zr; + child.parent = this; + return child; + }; + ZRText.prototype._updatePlainTexts = function () { + var style = this.style; + var textFont = style.font || DEFAULT_FONT; + var textPadding = style.padding; + var text = getStyleText(style); + var contentBlock = parsePlainText(text, style); + var needDrawBg = needDrawBackground(style); + var bgColorDrawn = !!(style.backgroundColor); + var outerHeight = contentBlock.outerHeight; + var outerWidth = contentBlock.outerWidth; + var contentWidth = contentBlock.contentWidth; + var textLines = contentBlock.lines; + var lineHeight = contentBlock.lineHeight; + var defaultStyle = this._defaultStyle; + var baseX = style.x || 0; + var baseY = style.y || 0; + var textAlign = style.align || defaultStyle.align || 'left'; + var verticalAlign = style.verticalAlign || defaultStyle.verticalAlign || 'top'; + var textX = baseX; + var textY = adjustTextY$1(baseY, contentBlock.contentHeight, verticalAlign); + if (needDrawBg || textPadding) { + var boxX = adjustTextX(baseX, outerWidth, textAlign); + var boxY = adjustTextY$1(baseY, outerHeight, verticalAlign); + needDrawBg && this._renderBackground(style, style, boxX, boxY, outerWidth, outerHeight); + } + textY += lineHeight / 2; + if (textPadding) { + textX = getTextXForPadding(baseX, textAlign, textPadding); + if (verticalAlign === 'top') { + textY += textPadding[0]; + } + else if (verticalAlign === 'bottom') { + textY -= textPadding[2]; + } + } + var defaultLineWidth = 0; + var useDefaultFill = false; + var textFill = getFill('fill' in style + ? style.fill + : (useDefaultFill = true, defaultStyle.fill)); + var textStroke = getStroke('stroke' in style + ? style.stroke + : (!bgColorDrawn + && (!defaultStyle.autoStroke || useDefaultFill)) + ? (defaultLineWidth = DEFAULT_STROKE_LINE_WIDTH, defaultStyle.stroke) + : null); + var hasShadow = style.textShadowBlur > 0; + var fixedBoundingRect = style.width != null + && (style.overflow === 'truncate' || style.overflow === 'break' || style.overflow === 'breakAll'); + var calculatedLineHeight = contentBlock.calculatedLineHeight; + for (var i = 0; i < textLines.length; i++) { + var el = this._getOrCreateChild(TSpan); + var subElStyle = el.createStyle(); + el.useStyle(subElStyle); + subElStyle.text = textLines[i]; + subElStyle.x = textX; + subElStyle.y = textY; + if (textAlign) { + subElStyle.textAlign = textAlign; + } + subElStyle.textBaseline = 'middle'; + subElStyle.opacity = style.opacity; + subElStyle.strokeFirst = true; + if (hasShadow) { + subElStyle.shadowBlur = style.textShadowBlur || 0; + subElStyle.shadowColor = style.textShadowColor || 'transparent'; + subElStyle.shadowOffsetX = style.textShadowOffsetX || 0; + subElStyle.shadowOffsetY = style.textShadowOffsetY || 0; + } + subElStyle.stroke = textStroke; + subElStyle.fill = textFill; + if (textStroke) { + subElStyle.lineWidth = style.lineWidth || defaultLineWidth; + subElStyle.lineDash = style.lineDash; + subElStyle.lineDashOffset = style.lineDashOffset || 0; + } + subElStyle.font = textFont; + setSeparateFont(subElStyle, style); + textY += lineHeight; + if (fixedBoundingRect) { + el.setBoundingRect(new BoundingRect(adjustTextX(subElStyle.x, style.width, subElStyle.textAlign), adjustTextY$1(subElStyle.y, calculatedLineHeight, subElStyle.textBaseline), contentWidth, calculatedLineHeight)); + } + } + }; + ZRText.prototype._updateRichTexts = function () { + var style = this.style; + var text = getStyleText(style); + var contentBlock = parseRichText(text, style); + var contentWidth = contentBlock.width; + var outerWidth = contentBlock.outerWidth; + var outerHeight = contentBlock.outerHeight; + var textPadding = style.padding; + var baseX = style.x || 0; + var baseY = style.y || 0; + var defaultStyle = this._defaultStyle; + var textAlign = style.align || defaultStyle.align; + var verticalAlign = style.verticalAlign || defaultStyle.verticalAlign; + var boxX = adjustTextX(baseX, outerWidth, textAlign); + var boxY = adjustTextY$1(baseY, outerHeight, verticalAlign); + var xLeft = boxX; + var lineTop = boxY; + if (textPadding) { + xLeft += textPadding[3]; + lineTop += textPadding[0]; + } + var xRight = xLeft + contentWidth; + if (needDrawBackground(style)) { + this._renderBackground(style, style, boxX, boxY, outerWidth, outerHeight); + } + var bgColorDrawn = !!(style.backgroundColor); + for (var i = 0; i < contentBlock.lines.length; i++) { + var line = contentBlock.lines[i]; + var tokens = line.tokens; + var tokenCount = tokens.length; + var lineHeight = line.lineHeight; + var remainedWidth = line.width; + var leftIndex = 0; + var lineXLeft = xLeft; + var lineXRight = xRight; + var rightIndex = tokenCount - 1; + var token = void 0; + while (leftIndex < tokenCount + && (token = tokens[leftIndex], !token.align || token.align === 'left')) { + this._placeToken(token, style, lineHeight, lineTop, lineXLeft, 'left', bgColorDrawn); + remainedWidth -= token.width; + lineXLeft += token.width; + leftIndex++; + } + while (rightIndex >= 0 + && (token = tokens[rightIndex], token.align === 'right')) { + this._placeToken(token, style, lineHeight, lineTop, lineXRight, 'right', bgColorDrawn); + remainedWidth -= token.width; + lineXRight -= token.width; + rightIndex--; + } + lineXLeft += (contentWidth - (lineXLeft - xLeft) - (xRight - lineXRight) - remainedWidth) / 2; + while (leftIndex <= rightIndex) { + token = tokens[leftIndex]; + this._placeToken(token, style, lineHeight, lineTop, lineXLeft + token.width / 2, 'center', bgColorDrawn); + lineXLeft += token.width; + leftIndex++; + } + lineTop += lineHeight; + } + }; + ZRText.prototype._placeToken = function (token, style, lineHeight, lineTop, x, textAlign, parentBgColorDrawn) { + var tokenStyle = style.rich[token.styleName] || {}; + tokenStyle.text = token.text; + var verticalAlign = token.verticalAlign; + var y = lineTop + lineHeight / 2; + if (verticalAlign === 'top') { + y = lineTop + token.height / 2; + } + else if (verticalAlign === 'bottom') { + y = lineTop + lineHeight - token.height / 2; + } + var needDrawBg = !token.isLineHolder && needDrawBackground(tokenStyle); + needDrawBg && this._renderBackground(tokenStyle, style, textAlign === 'right' + ? x - token.width + : textAlign === 'center' + ? x - token.width / 2 + : x, y - token.height / 2, token.width, token.height); + var bgColorDrawn = !!tokenStyle.backgroundColor; + var textPadding = token.textPadding; + if (textPadding) { + x = getTextXForPadding(x, textAlign, textPadding); + y -= token.height / 2 - textPadding[0] - token.innerHeight / 2; + } + var el = this._getOrCreateChild(TSpan); + var subElStyle = el.createStyle(); + el.useStyle(subElStyle); + var defaultStyle = this._defaultStyle; + var useDefaultFill = false; + var defaultLineWidth = 0; + var textFill = getFill('fill' in tokenStyle ? tokenStyle.fill + : 'fill' in style ? style.fill + : (useDefaultFill = true, defaultStyle.fill)); + var textStroke = getStroke('stroke' in tokenStyle ? tokenStyle.stroke + : 'stroke' in style ? style.stroke + : (!bgColorDrawn + && !parentBgColorDrawn + && (!defaultStyle.autoStroke || useDefaultFill)) ? (defaultLineWidth = DEFAULT_STROKE_LINE_WIDTH, defaultStyle.stroke) + : null); + var hasShadow = tokenStyle.textShadowBlur > 0 + || style.textShadowBlur > 0; + subElStyle.text = token.text; + subElStyle.x = x; + subElStyle.y = y; + if (hasShadow) { + subElStyle.shadowBlur = tokenStyle.textShadowBlur || style.textShadowBlur || 0; + subElStyle.shadowColor = tokenStyle.textShadowColor || style.textShadowColor || 'transparent'; + subElStyle.shadowOffsetX = tokenStyle.textShadowOffsetX || style.textShadowOffsetX || 0; + subElStyle.shadowOffsetY = tokenStyle.textShadowOffsetY || style.textShadowOffsetY || 0; + } + subElStyle.textAlign = textAlign; + subElStyle.textBaseline = 'middle'; + subElStyle.font = token.font || DEFAULT_FONT; + subElStyle.opacity = retrieve3(tokenStyle.opacity, style.opacity, 1); + setSeparateFont(subElStyle, tokenStyle); + if (textStroke) { + subElStyle.lineWidth = retrieve3(tokenStyle.lineWidth, style.lineWidth, defaultLineWidth); + subElStyle.lineDash = retrieve2(tokenStyle.lineDash, style.lineDash); + subElStyle.lineDashOffset = style.lineDashOffset || 0; + subElStyle.stroke = textStroke; + } + if (textFill) { + subElStyle.fill = textFill; + } + var textWidth = token.contentWidth; + var textHeight = token.contentHeight; + el.setBoundingRect(new BoundingRect(adjustTextX(subElStyle.x, textWidth, subElStyle.textAlign), adjustTextY$1(subElStyle.y, textHeight, subElStyle.textBaseline), textWidth, textHeight)); + }; + ZRText.prototype._renderBackground = function (style, topStyle, x, y, width, height) { + var textBackgroundColor = style.backgroundColor; + var textBorderWidth = style.borderWidth; + var textBorderColor = style.borderColor; + var isImageBg = textBackgroundColor && textBackgroundColor.image; + var isPlainOrGradientBg = textBackgroundColor && !isImageBg; + var textBorderRadius = style.borderRadius; + var self = this; + var rectEl; + var imgEl; + if (isPlainOrGradientBg || style.lineHeight || (textBorderWidth && textBorderColor)) { + rectEl = this._getOrCreateChild(Rect); + rectEl.useStyle(rectEl.createStyle()); + rectEl.style.fill = null; + var rectShape = rectEl.shape; + rectShape.x = x; + rectShape.y = y; + rectShape.width = width; + rectShape.height = height; + rectShape.r = textBorderRadius; + rectEl.dirtyShape(); + } + if (isPlainOrGradientBg) { + var rectStyle = rectEl.style; + rectStyle.fill = textBackgroundColor || null; + rectStyle.fillOpacity = retrieve2(style.fillOpacity, 1); + } + else if (isImageBg) { + imgEl = this._getOrCreateChild(ZRImage); + imgEl.onload = function () { + self.dirtyStyle(); + }; + var imgStyle = imgEl.style; + imgStyle.image = textBackgroundColor.image; + imgStyle.x = x; + imgStyle.y = y; + imgStyle.width = width; + imgStyle.height = height; + } + if (textBorderWidth && textBorderColor) { + var rectStyle = rectEl.style; + rectStyle.lineWidth = textBorderWidth; + rectStyle.stroke = textBorderColor; + rectStyle.strokeOpacity = retrieve2(style.strokeOpacity, 1); + rectStyle.lineDash = style.borderDash; + rectStyle.lineDashOffset = style.borderDashOffset || 0; + rectEl.strokeContainThreshold = 0; + if (rectEl.hasFill() && rectEl.hasStroke()) { + rectStyle.strokeFirst = true; + rectStyle.lineWidth *= 2; + } + } + var commonStyle = (rectEl || imgEl).style; + commonStyle.shadowBlur = style.shadowBlur || 0; + commonStyle.shadowColor = style.shadowColor || 'transparent'; + commonStyle.shadowOffsetX = style.shadowOffsetX || 0; + commonStyle.shadowOffsetY = style.shadowOffsetY || 0; + commonStyle.opacity = retrieve3(style.opacity, topStyle.opacity, 1); + }; + ZRText.makeFont = function (style) { + var font = ''; + if (hasSeparateFont(style)) { + font = [ + style.fontStyle, + style.fontWeight, + parseFontSize(style.fontSize), + style.fontFamily || 'sans-serif' + ].join(' '); + } + return font && trim(font) || style.textFont || style.font; + }; + return ZRText; + }(Displayable)); + var VALID_TEXT_ALIGN = { left: true, right: 1, center: 1 }; + var VALID_TEXT_VERTICAL_ALIGN = { top: 1, bottom: 1, middle: 1 }; + var FONT_PARTS = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily']; + function parseFontSize(fontSize) { + if (typeof fontSize === 'string' + && (fontSize.indexOf('px') !== -1 + || fontSize.indexOf('rem') !== -1 + || fontSize.indexOf('em') !== -1)) { + return fontSize; + } + else if (!isNaN(+fontSize)) { + return fontSize + 'px'; + } + else { + return DEFAULT_FONT_SIZE + 'px'; + } + } + function setSeparateFont(targetStyle, sourceStyle) { + for (var i = 0; i < FONT_PARTS.length; i++) { + var fontProp = FONT_PARTS[i]; + var val = sourceStyle[fontProp]; + if (val != null) { + targetStyle[fontProp] = val; + } + } + } + function hasSeparateFont(style) { + return style.fontSize != null || style.fontFamily || style.fontWeight; + } + function normalizeTextStyle(style) { + normalizeStyle(style); + each(style.rich, normalizeStyle); + return style; + } + function normalizeStyle(style) { + if (style) { + style.font = ZRText.makeFont(style); + var textAlign = style.align; + textAlign === 'middle' && (textAlign = 'center'); + style.align = (textAlign == null || VALID_TEXT_ALIGN[textAlign]) ? textAlign : 'left'; + var verticalAlign = style.verticalAlign; + verticalAlign === 'center' && (verticalAlign = 'middle'); + style.verticalAlign = (verticalAlign == null || VALID_TEXT_VERTICAL_ALIGN[verticalAlign]) ? verticalAlign : 'top'; + var textPadding = style.padding; + if (textPadding) { + style.padding = normalizeCssArray(style.padding); + } + } + } + function getStroke(stroke, lineWidth) { + return (stroke == null || lineWidth <= 0 || stroke === 'transparent' || stroke === 'none') + ? null + : (stroke.image || stroke.colorStops) + ? '#000' + : stroke; + } + function getFill(fill) { + return (fill == null || fill === 'none') + ? null + : (fill.image || fill.colorStops) + ? '#000' + : fill; + } + function getTextXForPadding(x, textAlign, textPadding) { + return textAlign === 'right' + ? (x - textPadding[1]) + : textAlign === 'center' + ? (x + textPadding[3] / 2 - textPadding[1] / 2) + : (x + textPadding[3]); + } + function getStyleText(style) { + var text = style.text; + text != null && (text += ''); + return text; + } + function needDrawBackground(style) { + return !!(style.backgroundColor + || style.lineHeight + || (style.borderWidth && style.borderColor)); + } + + var getECData = makeInner(); + var setCommonECData = function (seriesIndex, dataType, dataIdx, el) { + if (el) { + var ecData = getECData(el); // Add data index and series index for indexing the data by element + // Useful in tooltip + + ecData.dataIndex = dataIdx; + ecData.dataType = dataType; + ecData.seriesIndex = seriesIndex; // TODO: not store dataIndex on children. + + if (el.type === 'group') { + el.traverse(function (child) { + var childECData = getECData(child); + childECData.seriesIndex = seriesIndex; + childECData.dataIndex = dataIdx; + childECData.dataType = dataType; + }); + } + } + }; + + var _highlightNextDigit = 1; + var _highlightKeyMap = {}; + var getSavedStates = makeInner(); + var getComponentStates = makeInner(); + var HOVER_STATE_NORMAL = 0; + var HOVER_STATE_BLUR = 1; + var HOVER_STATE_EMPHASIS = 2; + var SPECIAL_STATES = ['emphasis', 'blur', 'select']; + var DISPLAY_STATES = ['normal', 'emphasis', 'blur', 'select']; + var Z2_EMPHASIS_LIFT = 10; + var Z2_SELECT_LIFT = 9; + var HIGHLIGHT_ACTION_TYPE = 'highlight'; + var DOWNPLAY_ACTION_TYPE = 'downplay'; + var SELECT_ACTION_TYPE = 'select'; + var UNSELECT_ACTION_TYPE = 'unselect'; + var TOGGLE_SELECT_ACTION_TYPE = 'toggleSelect'; + + function hasFillOrStroke(fillOrStroke) { + return fillOrStroke != null && fillOrStroke !== 'none'; + } // Most lifted color are duplicated. + + + var liftedColorCache = new LRU(100); + + function liftColor(color$1) { + if (isString(color$1)) { + var liftedColor = liftedColorCache.get(color$1); + + if (!liftedColor) { + liftedColor = lift(color$1, -0.1); + liftedColorCache.put(color$1, liftedColor); + } + + return liftedColor; + } else if (isGradientObject(color$1)) { + var ret = extend({}, color$1); + ret.colorStops = map(color$1.colorStops, function (stop) { + return { + offset: stop.offset, + color: lift(stop.color, -0.1) + }; + }); + return ret; + } // Change nothing. + + + return color$1; + } + + function doChangeHoverState(el, stateName, hoverStateEnum) { + if (el.onHoverStateChange && (el.hoverState || 0) !== hoverStateEnum) { + el.onHoverStateChange(stateName); + } + + el.hoverState = hoverStateEnum; + } + + function singleEnterEmphasis(el) { + // Only mark the flag. + // States will be applied in the echarts.ts in next frame. + doChangeHoverState(el, 'emphasis', HOVER_STATE_EMPHASIS); + } + + function singleLeaveEmphasis(el) { + // Only mark the flag. + // States will be applied in the echarts.ts in next frame. + if (el.hoverState === HOVER_STATE_EMPHASIS) { + doChangeHoverState(el, 'normal', HOVER_STATE_NORMAL); + } + } + + function singleEnterBlur(el) { + doChangeHoverState(el, 'blur', HOVER_STATE_BLUR); + } + + function singleLeaveBlur(el) { + if (el.hoverState === HOVER_STATE_BLUR) { + doChangeHoverState(el, 'normal', HOVER_STATE_NORMAL); + } + } + + function singleEnterSelect(el) { + el.selected = true; + } + + function singleLeaveSelect(el) { + el.selected = false; + } + + function updateElementState(el, updater, commonParam) { + updater(el, commonParam); + } + + function traverseUpdateState(el, updater, commonParam) { + updateElementState(el, updater, commonParam); + el.isGroup && el.traverse(function (child) { + updateElementState(child, updater, commonParam); + }); + } + + function setStatesFlag(el, stateName) { + switch (stateName) { + case 'emphasis': + el.hoverState = HOVER_STATE_EMPHASIS; + break; + + case 'normal': + el.hoverState = HOVER_STATE_NORMAL; + break; + + case 'blur': + el.hoverState = HOVER_STATE_BLUR; + break; + + case 'select': + el.selected = true; + } + } + + function getFromStateStyle(el, props, toStateName, defaultValue) { + var style = el.style; + var fromState = {}; + + for (var i = 0; i < props.length; i++) { + var propName = props[i]; + var val = style[propName]; + fromState[propName] = val == null ? defaultValue && defaultValue[propName] : val; + } + + for (var i = 0; i < el.animators.length; i++) { + var animator = el.animators[i]; + + if (animator.__fromStateTransition // Dont consider the animation to emphasis state. + && animator.__fromStateTransition.indexOf(toStateName) < 0 && animator.targetName === 'style') { + animator.saveTo(fromState, props); + } + } + + return fromState; + } + + function createEmphasisDefaultState(el, stateName, targetStates, state) { + var hasSelect = targetStates && indexOf(targetStates, 'select') >= 0; + var cloned = false; + + if (el instanceof Path) { + var store = getSavedStates(el); + var fromFill = hasSelect ? store.selectFill || store.normalFill : store.normalFill; + var fromStroke = hasSelect ? store.selectStroke || store.normalStroke : store.normalStroke; + + if (hasFillOrStroke(fromFill) || hasFillOrStroke(fromStroke)) { + state = state || {}; + var emphasisStyle = state.style || {}; // inherit case + + if (emphasisStyle.fill === 'inherit') { + cloned = true; + state = extend({}, state); + emphasisStyle = extend({}, emphasisStyle); + emphasisStyle.fill = fromFill; + } // Apply default color lift + else if (!hasFillOrStroke(emphasisStyle.fill) && hasFillOrStroke(fromFill)) { + cloned = true; // Not modify the original value. + + state = extend({}, state); + emphasisStyle = extend({}, emphasisStyle); // Already being applied 'emphasis'. DON'T lift color multiple times. + + emphasisStyle.fill = liftColor(fromFill); + } // Not highlight stroke if fill has been highlighted. + else if (!hasFillOrStroke(emphasisStyle.stroke) && hasFillOrStroke(fromStroke)) { + if (!cloned) { + state = extend({}, state); + emphasisStyle = extend({}, emphasisStyle); + } + + emphasisStyle.stroke = liftColor(fromStroke); + } + + state.style = emphasisStyle; + } + } + + if (state) { + // TODO Share with textContent? + if (state.z2 == null) { + if (!cloned) { + state = extend({}, state); + } + + var z2EmphasisLift = el.z2EmphasisLift; + state.z2 = el.z2 + (z2EmphasisLift != null ? z2EmphasisLift : Z2_EMPHASIS_LIFT); + } + } + + return state; + } + + function createSelectDefaultState(el, stateName, state) { + // const hasSelect = indexOf(el.currentStates, stateName) >= 0; + if (state) { + // TODO Share with textContent? + if (state.z2 == null) { + state = extend({}, state); + var z2SelectLift = el.z2SelectLift; + state.z2 = el.z2 + (z2SelectLift != null ? z2SelectLift : Z2_SELECT_LIFT); + } + } + + return state; + } + + function createBlurDefaultState(el, stateName, state) { + var hasBlur = indexOf(el.currentStates, stateName) >= 0; + var currentOpacity = el.style.opacity; + var fromState = !hasBlur ? getFromStateStyle(el, ['opacity'], stateName, { + opacity: 1 + }) : null; + state = state || {}; + var blurStyle = state.style || {}; + + if (blurStyle.opacity == null) { + // clone state + state = extend({}, state); + blurStyle = extend({ + // Already being applied 'emphasis'. DON'T mul opacity multiple times. + opacity: hasBlur ? currentOpacity : fromState.opacity * 0.1 + }, blurStyle); + state.style = blurStyle; + } + + return state; + } + + function elementStateProxy(stateName, targetStates) { + var state = this.states[stateName]; + + if (this.style) { + if (stateName === 'emphasis') { + return createEmphasisDefaultState(this, stateName, targetStates, state); + } else if (stateName === 'blur') { + return createBlurDefaultState(this, stateName, state); + } else if (stateName === 'select') { + return createSelectDefaultState(this, stateName, state); + } + } + + return state; + } + /**FI + * Set hover style (namely "emphasis style") of element. + * @param el Should not be `zrender/graphic/Group`. + * @param focus 'self' | 'selfInSeries' | 'series' + */ + + + function setDefaultStateProxy(el) { + el.stateProxy = elementStateProxy; + var textContent = el.getTextContent(); + var textGuide = el.getTextGuideLine(); + + if (textContent) { + textContent.stateProxy = elementStateProxy; + } + + if (textGuide) { + textGuide.stateProxy = elementStateProxy; + } + } + function enterEmphasisWhenMouseOver(el, e) { + !shouldSilent(el, e) // "emphasis" event highlight has higher priority than mouse highlight. + && !el.__highByOuter && traverseUpdateState(el, singleEnterEmphasis); + } + function leaveEmphasisWhenMouseOut(el, e) { + !shouldSilent(el, e) // "emphasis" event highlight has higher priority than mouse highlight. + && !el.__highByOuter && traverseUpdateState(el, singleLeaveEmphasis); + } + function enterEmphasis(el, highlightDigit) { + el.__highByOuter |= 1 << (highlightDigit || 0); + traverseUpdateState(el, singleEnterEmphasis); + } + function leaveEmphasis(el, highlightDigit) { + !(el.__highByOuter &= ~(1 << (highlightDigit || 0))) && traverseUpdateState(el, singleLeaveEmphasis); + } + function enterBlur(el) { + traverseUpdateState(el, singleEnterBlur); + } + function leaveBlur(el) { + traverseUpdateState(el, singleLeaveBlur); + } + function enterSelect(el) { + traverseUpdateState(el, singleEnterSelect); + } + function leaveSelect(el) { + traverseUpdateState(el, singleLeaveSelect); + } + + function shouldSilent(el, e) { + return el.__highDownSilentOnTouch && e.zrByTouch; + } + + function allLeaveBlur(api) { + var model = api.getModel(); + var leaveBlurredSeries = []; + var allComponentViews = []; + model.eachComponent(function (componentType, componentModel) { + var componentStates = getComponentStates(componentModel); + var isSeries = componentType === 'series'; + var view = isSeries ? api.getViewOfSeriesModel(componentModel) : api.getViewOfComponentModel(componentModel); + !isSeries && allComponentViews.push(view); + + if (componentStates.isBlured) { + // Leave blur anyway + view.group.traverse(function (child) { + singleLeaveBlur(child); + }); + isSeries && leaveBlurredSeries.push(componentModel); + } + + componentStates.isBlured = false; + }); + each(allComponentViews, function (view) { + if (view && view.toggleBlurSeries) { + view.toggleBlurSeries(leaveBlurredSeries, false, model); + } + }); + } + function blurSeries(targetSeriesIndex, focus, blurScope, api) { + var ecModel = api.getModel(); + blurScope = blurScope || 'coordinateSystem'; + + function leaveBlurOfIndices(data, dataIndices) { + for (var i = 0; i < dataIndices.length; i++) { + var itemEl = data.getItemGraphicEl(dataIndices[i]); + itemEl && leaveBlur(itemEl); + } + } + + if (targetSeriesIndex == null) { + return; + } + + if (!focus || focus === 'none') { + return; + } + + var targetSeriesModel = ecModel.getSeriesByIndex(targetSeriesIndex); + var targetCoordSys = targetSeriesModel.coordinateSystem; + + if (targetCoordSys && targetCoordSys.master) { + targetCoordSys = targetCoordSys.master; + } + + var blurredSeries = []; + ecModel.eachSeries(function (seriesModel) { + var sameSeries = targetSeriesModel === seriesModel; + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.master) { + coordSys = coordSys.master; + } + + var sameCoordSys = coordSys && targetCoordSys ? coordSys === targetCoordSys : sameSeries; // If there is no coordinate system. use sameSeries instead. + + if (!( // Not blur other series if blurScope series + blurScope === 'series' && !sameSeries // Not blur other coordinate system if blurScope is coordinateSystem + || blurScope === 'coordinateSystem' && !sameCoordSys // Not blur self series if focus is series. + || focus === 'series' && sameSeries // TODO blurScope: coordinate system + )) { + var view = api.getViewOfSeriesModel(seriesModel); + view.group.traverse(function (child) { + singleEnterBlur(child); + }); + + if (isArrayLike(focus)) { + leaveBlurOfIndices(seriesModel.getData(), focus); + } else if (isObject(focus)) { + var dataTypes = keys(focus); + + for (var d = 0; d < dataTypes.length; d++) { + leaveBlurOfIndices(seriesModel.getData(dataTypes[d]), focus[dataTypes[d]]); + } + } + + blurredSeries.push(seriesModel); + getComponentStates(seriesModel).isBlured = true; + } + }); + ecModel.eachComponent(function (componentType, componentModel) { + if (componentType === 'series') { + return; + } + + var view = api.getViewOfComponentModel(componentModel); + + if (view && view.toggleBlurSeries) { + view.toggleBlurSeries(blurredSeries, true, ecModel); + } + }); + } + function blurComponent(componentMainType, componentIndex, api) { + if (componentMainType == null || componentIndex == null) { + return; + } + + var componentModel = api.getModel().getComponent(componentMainType, componentIndex); + + if (!componentModel) { + return; + } + + getComponentStates(componentModel).isBlured = true; + var view = api.getViewOfComponentModel(componentModel); + + if (!view || !view.focusBlurEnabled) { + return; + } + + view.group.traverse(function (child) { + singleEnterBlur(child); + }); + } + function blurSeriesFromHighlightPayload(seriesModel, payload, api) { + var seriesIndex = seriesModel.seriesIndex; + var data = seriesModel.getData(payload.dataType); + + if (!data) { + if ("development" !== 'production') { + error("Unknown dataType " + payload.dataType); + } + + return; + } + + var dataIndex = queryDataIndex(data, payload); // Pick the first one if there is multiple/none exists. + + dataIndex = (isArray(dataIndex) ? dataIndex[0] : dataIndex) || 0; + var el = data.getItemGraphicEl(dataIndex); + + if (!el) { + var count = data.count(); + var current = 0; // If data on dataIndex is NaN. + + while (!el && current < count) { + el = data.getItemGraphicEl(current++); + } + } + + if (el) { + var ecData = getECData(el); + blurSeries(seriesIndex, ecData.focus, ecData.blurScope, api); + } else { + // If there is no element put on the data. Try getting it from raw option + // TODO Should put it on seriesModel? + var focus_1 = seriesModel.get(['emphasis', 'focus']); + var blurScope = seriesModel.get(['emphasis', 'blurScope']); + + if (focus_1 != null) { + blurSeries(seriesIndex, focus_1, blurScope, api); + } + } + } + function findComponentHighDownDispatchers(componentMainType, componentIndex, name, api) { + var ret = { + focusSelf: false, + dispatchers: null + }; + + if (componentMainType == null || componentMainType === 'series' || componentIndex == null || name == null) { + return ret; + } + + var componentModel = api.getModel().getComponent(componentMainType, componentIndex); + + if (!componentModel) { + return ret; + } + + var view = api.getViewOfComponentModel(componentModel); + + if (!view || !view.findHighDownDispatchers) { + return ret; + } + + var dispatchers = view.findHighDownDispatchers(name); // At presnet, the component (like Geo) only blur inside itself. + // So we do not use `blurScope` in component. + + var focusSelf; + + for (var i = 0; i < dispatchers.length; i++) { + if ("development" !== 'production' && !isHighDownDispatcher(dispatchers[i])) { + error('param should be highDownDispatcher'); + } + + if (getECData(dispatchers[i]).focus === 'self') { + focusSelf = true; + break; + } + } + + return { + focusSelf: focusSelf, + dispatchers: dispatchers + }; + } + function handleGlobalMouseOverForHighDown(dispatcher, e, api) { + if ("development" !== 'production' && !isHighDownDispatcher(dispatcher)) { + error('param should be highDownDispatcher'); + } + + var ecData = getECData(dispatcher); + + var _a = findComponentHighDownDispatchers(ecData.componentMainType, ecData.componentIndex, ecData.componentHighDownName, api), + dispatchers = _a.dispatchers, + focusSelf = _a.focusSelf; // If `findHighDownDispatchers` is supported on the component, + // highlight/downplay elements with the same name. + + + if (dispatchers) { + if (focusSelf) { + blurComponent(ecData.componentMainType, ecData.componentIndex, api); + } + + each(dispatchers, function (dispatcher) { + return enterEmphasisWhenMouseOver(dispatcher, e); + }); + } else { + // Try blur all in the related series. Then emphasis the hoverred. + // TODO. progressive mode. + blurSeries(ecData.seriesIndex, ecData.focus, ecData.blurScope, api); + + if (ecData.focus === 'self') { + blurComponent(ecData.componentMainType, ecData.componentIndex, api); + } // Other than series, component that not support `findHighDownDispatcher` will + // also use it. But in this case, highlight/downplay are only supported in + // mouse hover but not in dispatchAction. + + + enterEmphasisWhenMouseOver(dispatcher, e); + } + } + function handleGlobalMouseOutForHighDown(dispatcher, e, api) { + if ("development" !== 'production' && !isHighDownDispatcher(dispatcher)) { + error('param should be highDownDispatcher'); + } + + allLeaveBlur(api); + var ecData = getECData(dispatcher); + var dispatchers = findComponentHighDownDispatchers(ecData.componentMainType, ecData.componentIndex, ecData.componentHighDownName, api).dispatchers; + + if (dispatchers) { + each(dispatchers, function (dispatcher) { + return leaveEmphasisWhenMouseOut(dispatcher, e); + }); + } else { + leaveEmphasisWhenMouseOut(dispatcher, e); + } + } + function toggleSelectionFromPayload(seriesModel, payload, api) { + if (!isSelectChangePayload(payload)) { + return; + } + + var dataType = payload.dataType; + var data = seriesModel.getData(dataType); + var dataIndex = queryDataIndex(data, payload); + + if (!isArray(dataIndex)) { + dataIndex = [dataIndex]; + } + + seriesModel[payload.type === TOGGLE_SELECT_ACTION_TYPE ? 'toggleSelect' : payload.type === SELECT_ACTION_TYPE ? 'select' : 'unselect'](dataIndex, dataType); + } + function updateSeriesElementSelection(seriesModel) { + var allData = seriesModel.getAllData(); + each(allData, function (_a) { + var data = _a.data, + type = _a.type; + data.eachItemGraphicEl(function (el, idx) { + seriesModel.isSelected(idx, type) ? enterSelect(el) : leaveSelect(el); + }); + }); + } + function getAllSelectedIndices(ecModel) { + var ret = []; + ecModel.eachSeries(function (seriesModel) { + var allData = seriesModel.getAllData(); + each(allData, function (_a) { + var data = _a.data, + type = _a.type; + var dataIndices = seriesModel.getSelectedDataIndices(); + + if (dataIndices.length > 0) { + var item = { + dataIndex: dataIndices, + seriesIndex: seriesModel.seriesIndex + }; + + if (type != null) { + item.dataType = type; + } + + ret.push(item); + } + }); + }); + return ret; + } + /** + * Enable the function that mouseover will trigger the emphasis state. + * + * NOTE: + * This function should be used on the element with dataIndex, seriesIndex. + * + */ + + function enableHoverEmphasis(el, focus, blurScope) { + setAsHighDownDispatcher(el, true); + traverseUpdateState(el, setDefaultStateProxy); + enableHoverFocus(el, focus, blurScope); + } + function disableHoverEmphasis(el) { + setAsHighDownDispatcher(el, false); + } + function toggleHoverEmphasis(el, focus, blurScope, isDisabled) { + isDisabled ? disableHoverEmphasis(el) : enableHoverEmphasis(el, focus, blurScope); + } + function enableHoverFocus(el, focus, blurScope) { + var ecData = getECData(el); + + if (focus != null) { + // TODO dataIndex may be set after this function. This check is not useful. + // if (ecData.dataIndex == null) { + // if (__DEV__) { + // console.warn('focus can only been set on element with dataIndex'); + // } + // } + // else { + ecData.focus = focus; + ecData.blurScope = blurScope; // } + } else if (ecData.focus) { + ecData.focus = null; + } + } + var OTHER_STATES = ['emphasis', 'blur', 'select']; + var defaultStyleGetterMap = { + itemStyle: 'getItemStyle', + lineStyle: 'getLineStyle', + areaStyle: 'getAreaStyle' + }; + /** + * Set emphasis/blur/selected states of element. + */ + + function setStatesStylesFromModel(el, itemModel, styleType, // default itemStyle + getter) { + styleType = styleType || 'itemStyle'; + + for (var i = 0; i < OTHER_STATES.length; i++) { + var stateName = OTHER_STATES[i]; + var model = itemModel.getModel([stateName, styleType]); + var state = el.ensureState(stateName); // Let it throw error if getterType is not found. + + state.style = getter ? getter(model) : model[defaultStyleGetterMap[styleType]](); + } + } + /** + * + * Set element as highlight / downplay dispatcher. + * It will be checked when element recieved mouseover event or from highlight action. + * It's in change of all highlight/downplay behavior of it's children. + * + * @param el + * @param el.highDownSilentOnTouch + * In touch device, mouseover event will be trigger on touchstart event + * (see module:zrender/dom/HandlerProxy). By this mechanism, we can + * conveniently use hoverStyle when tap on touch screen without additional + * code for compatibility. + * But if the chart/component has select feature, which usually also use + * hoverStyle, there might be conflict between 'select-highlight' and + * 'hover-highlight' especially when roam is enabled (see geo for example). + * In this case, `highDownSilentOnTouch` should be used to disable + * hover-highlight on touch device. + * @param asDispatcher If `false`, do not set as "highDownDispatcher". + */ + + function setAsHighDownDispatcher(el, asDispatcher) { + var disable = asDispatcher === false; + var extendedEl = el; // Make `highDownSilentOnTouch` and `onStateChange` only work after + // `setAsHighDownDispatcher` called. Avoid it is modified by user unexpectedly. + + if (el.highDownSilentOnTouch) { + extendedEl.__highDownSilentOnTouch = el.highDownSilentOnTouch; + } // Simple optimize, since this method might be + // called for each elements of a group in some cases. + + + if (!disable || extendedEl.__highDownDispatcher) { + // Emphasis, normal can be triggered manually by API or other components like hover link. + // el[method]('emphasis', onElementEmphasisEvent)[method]('normal', onElementNormalEvent); + // Also keep previous record. + extendedEl.__highByOuter = extendedEl.__highByOuter || 0; + extendedEl.__highDownDispatcher = !disable; + } + } + function isHighDownDispatcher(el) { + return !!(el && el.__highDownDispatcher); + } + /** + * Enable component highlight/downplay features: + * + hover link (within the same name) + * + focus blur in component + */ + + function enableComponentHighDownFeatures(el, componentModel, componentHighDownName) { + var ecData = getECData(el); + ecData.componentMainType = componentModel.mainType; + ecData.componentIndex = componentModel.componentIndex; + ecData.componentHighDownName = componentHighDownName; + } + /** + * Support hightlight/downplay record on each elements. + * For the case: hover highlight/downplay (legend, visualMap, ...) and + * user triggerred hightlight/downplay should not conflict. + * Only all of the highlightDigit cleared, return to normal. + * @param {string} highlightKey + * @return {number} highlightDigit + */ + + function getHighlightDigit(highlightKey) { + var highlightDigit = _highlightKeyMap[highlightKey]; + + if (highlightDigit == null && _highlightNextDigit <= 32) { + highlightDigit = _highlightKeyMap[highlightKey] = _highlightNextDigit++; + } + + return highlightDigit; + } + function isSelectChangePayload(payload) { + var payloadType = payload.type; + return payloadType === SELECT_ACTION_TYPE || payloadType === UNSELECT_ACTION_TYPE || payloadType === TOGGLE_SELECT_ACTION_TYPE; + } + function isHighDownPayload(payload) { + var payloadType = payload.type; + return payloadType === HIGHLIGHT_ACTION_TYPE || payloadType === DOWNPLAY_ACTION_TYPE; + } + function savePathStates(el) { + var store = getSavedStates(el); + store.normalFill = el.style.fill; + store.normalStroke = el.style.stroke; + var selectState = el.states.select || {}; + store.selectFill = selectState.style && selectState.style.fill || null; + store.selectStroke = selectState.style && selectState.style.stroke || null; + } + + var CMD$2 = PathProxy.CMD; + var points = [[], [], []]; + var mathSqrt$1 = Math.sqrt; + var mathAtan2 = Math.atan2; + function transformPath(path, m) { + if (!m) { + return; + } + var data = path.data; + var len = path.len(); + var cmd; + var nPoint; + var i; + var j; + var k; + var p; + var M = CMD$2.M; + var C = CMD$2.C; + var L = CMD$2.L; + var R = CMD$2.R; + var A = CMD$2.A; + var Q = CMD$2.Q; + for (i = 0, j = 0; i < len;) { + cmd = data[i++]; + j = i; + nPoint = 0; + switch (cmd) { + case M: + nPoint = 1; + break; + case L: + nPoint = 1; + break; + case C: + nPoint = 3; + break; + case Q: + nPoint = 2; + break; + case A: + var x = m[4]; + var y = m[5]; + var sx = mathSqrt$1(m[0] * m[0] + m[1] * m[1]); + var sy = mathSqrt$1(m[2] * m[2] + m[3] * m[3]); + var angle = mathAtan2(-m[1] / sy, m[0] / sx); + data[i] *= sx; + data[i++] += x; + data[i] *= sy; + data[i++] += y; + data[i++] *= sx; + data[i++] *= sy; + data[i++] += angle; + data[i++] += angle; + i += 2; + j = i; + break; + case R: + p[0] = data[i++]; + p[1] = data[i++]; + applyTransform(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + p[0] += data[i++]; + p[1] += data[i++]; + applyTransform(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + } + for (k = 0; k < nPoint; k++) { + var p_1 = points[k]; + p_1[0] = data[i++]; + p_1[1] = data[i++]; + applyTransform(p_1, p_1, m); + data[j++] = p_1[0]; + data[j++] = p_1[1]; + } + } + path.increaseVersion(); + } + + var mathSqrt$2 = Math.sqrt; + var mathSin$2 = Math.sin; + var mathCos$2 = Math.cos; + var PI$1 = Math.PI; + function vMag(v) { + return Math.sqrt(v[0] * v[0] + v[1] * v[1]); + } + function vRatio(u, v) { + return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v)); + } + function vAngle(u, v) { + return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) + * Math.acos(vRatio(u, v)); + } + function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) { + var psi = psiDeg * (PI$1 / 180.0); + var xp = mathCos$2(psi) * (x1 - x2) / 2.0 + + mathSin$2(psi) * (y1 - y2) / 2.0; + var yp = -1 * mathSin$2(psi) * (x1 - x2) / 2.0 + + mathCos$2(psi) * (y1 - y2) / 2.0; + var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry); + if (lambda > 1) { + rx *= mathSqrt$2(lambda); + ry *= mathSqrt$2(lambda); + } + var f = (fa === fs ? -1 : 1) + * mathSqrt$2((((rx * rx) * (ry * ry)) + - ((rx * rx) * (yp * yp)) + - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp) + + (ry * ry) * (xp * xp))) || 0; + var cxp = f * rx * yp / ry; + var cyp = f * -ry * xp / rx; + var cx = (x1 + x2) / 2.0 + + mathCos$2(psi) * cxp + - mathSin$2(psi) * cyp; + var cy = (y1 + y2) / 2.0 + + mathSin$2(psi) * cxp + + mathCos$2(psi) * cyp; + var theta = vAngle([1, 0], [(xp - cxp) / rx, (yp - cyp) / ry]); + var u = [(xp - cxp) / rx, (yp - cyp) / ry]; + var v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry]; + var dTheta = vAngle(u, v); + if (vRatio(u, v) <= -1) { + dTheta = PI$1; + } + if (vRatio(u, v) >= 1) { + dTheta = 0; + } + if (dTheta < 0) { + var n = Math.round(dTheta / PI$1 * 1e6) / 1e6; + dTheta = PI$1 * 2 + (n % 2) * PI$1; + } + path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs); + } + var commandReg = /([mlvhzcqtsa])([^mlvhzcqtsa]*)/ig; + var numberReg = /-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g; + function createPathProxyFromString(data) { + var path = new PathProxy(); + if (!data) { + return path; + } + var cpx = 0; + var cpy = 0; + var subpathX = cpx; + var subpathY = cpy; + var prevCmd; + var CMD = PathProxy.CMD; + var cmdList = data.match(commandReg); + if (!cmdList) { + return path; + } + for (var l = 0; l < cmdList.length; l++) { + var cmdText = cmdList[l]; + var cmdStr = cmdText.charAt(0); + var cmd = void 0; + var p = cmdText.match(numberReg) || []; + var pLen = p.length; + for (var i = 0; i < pLen; i++) { + p[i] = parseFloat(p[i]); + } + var off = 0; + while (off < pLen) { + var ctlPtx = void 0; + var ctlPty = void 0; + var rx = void 0; + var ry = void 0; + var psi = void 0; + var fa = void 0; + var fs = void 0; + var x1 = cpx; + var y1 = cpy; + var len = void 0; + var pathData = void 0; + switch (cmdStr) { + case 'l': + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'L': + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'm': + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.M; + path.addData(cmd, cpx, cpy); + subpathX = cpx; + subpathY = cpy; + cmdStr = 'l'; + break; + case 'M': + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.M; + path.addData(cmd, cpx, cpy); + subpathX = cpx; + subpathY = cpy; + cmdStr = 'L'; + break; + case 'h': + cpx += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'H': + cpx = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'v': + cpy += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'V': + cpy = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'C': + cmd = CMD.C; + path.addData(cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++]); + cpx = p[off - 2]; + cpy = p[off - 1]; + break; + case 'c': + cmd = CMD.C; + path.addData(cmd, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy); + cpx += p[off - 2]; + cpy += p[off - 1]; + break; + case 'S': + ctlPtx = cpx; + ctlPty = cpy; + len = path.len(); + pathData = path.data; + if (prevCmd === CMD.C) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cmd = CMD.C; + x1 = p[off++]; + y1 = p[off++]; + cpx = p[off++]; + cpy = p[off++]; + path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); + break; + case 's': + ctlPtx = cpx; + ctlPty = cpy; + len = path.len(); + pathData = path.data; + if (prevCmd === CMD.C) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cmd = CMD.C; + x1 = cpx + p[off++]; + y1 = cpy + p[off++]; + cpx += p[off++]; + cpy += p[off++]; + path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); + break; + case 'Q': + x1 = p[off++]; + y1 = p[off++]; + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.Q; + path.addData(cmd, x1, y1, cpx, cpy); + break; + case 'q': + x1 = p[off++] + cpx; + y1 = p[off++] + cpy; + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.Q; + path.addData(cmd, x1, y1, cpx, cpy); + break; + case 'T': + ctlPtx = cpx; + ctlPty = cpy; + len = path.len(); + pathData = path.data; + if (prevCmd === CMD.Q) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.Q; + path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); + break; + case 't': + ctlPtx = cpx; + ctlPty = cpy; + len = path.len(); + pathData = path.data; + if (prevCmd === CMD.Q) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.Q; + path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); + break; + case 'A': + rx = p[off++]; + ry = p[off++]; + psi = p[off++]; + fa = p[off++]; + fs = p[off++]; + x1 = cpx, y1 = cpy; + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.A; + processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path); + break; + case 'a': + rx = p[off++]; + ry = p[off++]; + psi = p[off++]; + fa = p[off++]; + fs = p[off++]; + x1 = cpx, y1 = cpy; + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.A; + processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path); + break; + } + } + if (cmdStr === 'z' || cmdStr === 'Z') { + cmd = CMD.Z; + path.addData(cmd); + cpx = subpathX; + cpy = subpathY; + } + prevCmd = cmd; + } + path.toStatic(); + return path; + } + var SVGPath = (function (_super) { + __extends(SVGPath, _super); + function SVGPath() { + return _super !== null && _super.apply(this, arguments) || this; + } + SVGPath.prototype.applyTransform = function (m) { }; + return SVGPath; + }(Path)); + function isPathProxy(path) { + return path.setData != null; + } + function createPathOptions(str, opts) { + var pathProxy = createPathProxyFromString(str); + var innerOpts = extend({}, opts); + innerOpts.buildPath = function (path) { + if (isPathProxy(path)) { + path.setData(pathProxy.data); + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx, 1); + } + } + else { + var ctx = path; + pathProxy.rebuildPath(ctx, 1); + } + }; + innerOpts.applyTransform = function (m) { + transformPath(pathProxy, m); + this.dirtyShape(); + }; + return innerOpts; + } + function createFromString(str, opts) { + return new SVGPath(createPathOptions(str, opts)); + } + function extendFromString(str, defaultOpts) { + var innerOpts = createPathOptions(str, defaultOpts); + var Sub = (function (_super) { + __extends(Sub, _super); + function Sub(opts) { + var _this = _super.call(this, opts) || this; + _this.applyTransform = innerOpts.applyTransform; + _this.buildPath = innerOpts.buildPath; + return _this; + } + return Sub; + }(SVGPath)); + return Sub; + } + function mergePath(pathEls, opts) { + var pathList = []; + var len = pathEls.length; + for (var i = 0; i < len; i++) { + var pathEl = pathEls[i]; + pathList.push(pathEl.getUpdatedPathProxy(true)); + } + var pathBundle = new Path(opts); + pathBundle.createPathProxy(); + pathBundle.buildPath = function (path) { + if (isPathProxy(path)) { + path.appendPath(pathList); + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx, 1); + } + } + }; + return pathBundle; + } + function clonePath(sourcePath, opts) { + opts = opts || {}; + var path = new Path(); + if (sourcePath.shape) { + path.setShape(sourcePath.shape); + } + path.setStyle(sourcePath.style); + if (opts.bakeTransform) { + transformPath(path.path, sourcePath.getComputedTransform()); + } + else { + if (opts.toLocal) { + path.setLocalTransform(sourcePath.getComputedTransform()); + } + else { + path.copyTransform(sourcePath); + } + } + path.buildPath = sourcePath.buildPath; + path.applyTransform = path.applyTransform; + path.z = sourcePath.z; + path.z2 = sourcePath.z2; + path.zlevel = sourcePath.zlevel; + return path; + } + + var CircleShape = (function () { + function CircleShape() { + this.cx = 0; + this.cy = 0; + this.r = 0; + } + return CircleShape; + }()); + var Circle = (function (_super) { + __extends(Circle, _super); + function Circle(opts) { + return _super.call(this, opts) || this; + } + Circle.prototype.getDefaultShape = function () { + return new CircleShape(); + }; + Circle.prototype.buildPath = function (ctx, shape) { + ctx.moveTo(shape.cx + shape.r, shape.cy); + ctx.arc(shape.cx, shape.cy, shape.r, 0, Math.PI * 2); + }; + return Circle; + }(Path)); + Circle.prototype.type = 'circle'; + + var EllipseShape = (function () { + function EllipseShape() { + this.cx = 0; + this.cy = 0; + this.rx = 0; + this.ry = 0; + } + return EllipseShape; + }()); + var Ellipse = (function (_super) { + __extends(Ellipse, _super); + function Ellipse(opts) { + return _super.call(this, opts) || this; + } + Ellipse.prototype.getDefaultShape = function () { + return new EllipseShape(); + }; + Ellipse.prototype.buildPath = function (ctx, shape) { + var k = 0.5522848; + var x = shape.cx; + var y = shape.cy; + var a = shape.rx; + var b = shape.ry; + var ox = a * k; + var oy = b * k; + ctx.moveTo(x - a, y); + ctx.bezierCurveTo(x - a, y - oy, x - ox, y - b, x, y - b); + ctx.bezierCurveTo(x + ox, y - b, x + a, y - oy, x + a, y); + ctx.bezierCurveTo(x + a, y + oy, x + ox, y + b, x, y + b); + ctx.bezierCurveTo(x - ox, y + b, x - a, y + oy, x - a, y); + ctx.closePath(); + }; + return Ellipse; + }(Path)); + Ellipse.prototype.type = 'ellipse'; + + var PI$2 = Math.PI; + var PI2$5 = PI$2 * 2; + var mathSin$3 = Math.sin; + var mathCos$3 = Math.cos; + var mathACos = Math.acos; + var mathATan2 = Math.atan2; + var mathAbs$1 = Math.abs; + var mathSqrt$3 = Math.sqrt; + var mathMax$3 = Math.max; + var mathMin$3 = Math.min; + var e = 1e-4; + function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var dx10 = x1 - x0; + var dy10 = y1 - y0; + var dx32 = x3 - x2; + var dy32 = y3 - y2; + var t = dy32 * dx10 - dx32 * dy10; + if (t * t < e) { + return; + } + t = (dx32 * (y0 - y2) - dy32 * (x0 - x2)) / t; + return [x0 + t * dx10, y0 + t * dy10]; + } + function computeCornerTangents(x0, y0, x1, y1, radius, cr, clockwise) { + var x01 = x0 - x1; + var y01 = y0 - y1; + var lo = (clockwise ? cr : -cr) / mathSqrt$3(x01 * x01 + y01 * y01); + var ox = lo * y01; + var oy = -lo * x01; + var x11 = x0 + ox; + var y11 = y0 + oy; + var x10 = x1 + ox; + var y10 = y1 + oy; + var x00 = (x11 + x10) / 2; + var y00 = (y11 + y10) / 2; + var dx = x10 - x11; + var dy = y10 - y11; + var d2 = dx * dx + dy * dy; + var r = radius - cr; + var s = x11 * y10 - x10 * y11; + var d = (dy < 0 ? -1 : 1) * mathSqrt$3(mathMax$3(0, r * r * d2 - s * s)); + var cx0 = (s * dy - dx * d) / d2; + var cy0 = (-s * dx - dy * d) / d2; + var cx1 = (s * dy + dx * d) / d2; + var cy1 = (-s * dx + dy * d) / d2; + var dx0 = cx0 - x00; + var dy0 = cy0 - y00; + var dx1 = cx1 - x00; + var dy1 = cy1 - y00; + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) { + cx0 = cx1; + cy0 = cy1; + } + return { + cx: cx0, + cy: cy0, + x0: -ox, + y0: -oy, + x1: cx0 * (radius / r - 1), + y1: cy0 * (radius / r - 1) + }; + } + function normalizeCornerRadius(cr) { + var arr; + if (isArray(cr)) { + var len = cr.length; + if (!len) { + return cr; + } + if (len === 1) { + arr = [cr[0], cr[0], 0, 0]; + } + else if (len === 2) { + arr = [cr[0], cr[0], cr[1], cr[1]]; + } + else if (len === 3) { + arr = cr.concat(cr[2]); + } + else { + arr = cr; + } + } + else { + arr = [cr, cr, cr, cr]; + } + return arr; + } + function buildPath$1(ctx, shape) { + var _a; + var radius = mathMax$3(shape.r, 0); + var innerRadius = mathMax$3(shape.r0 || 0, 0); + var hasRadius = radius > 0; + var hasInnerRadius = innerRadius > 0; + if (!hasRadius && !hasInnerRadius) { + return; + } + if (!hasRadius) { + radius = innerRadius; + innerRadius = 0; + } + if (innerRadius > radius) { + var tmp = radius; + radius = innerRadius; + innerRadius = tmp; + } + var startAngle = shape.startAngle, endAngle = shape.endAngle; + if (isNaN(startAngle) || isNaN(endAngle)) { + return; + } + var cx = shape.cx, cy = shape.cy; + var clockwise = !!shape.clockwise; + var arc = mathAbs$1(endAngle - startAngle); + var mod = arc > PI2$5 && arc % PI2$5; + mod > e && (arc = mod); + if (!(radius > e)) { + ctx.moveTo(cx, cy); + } + else if (arc > PI2$5 - e) { + ctx.moveTo(cx + radius * mathCos$3(startAngle), cy + radius * mathSin$3(startAngle)); + ctx.arc(cx, cy, radius, startAngle, endAngle, !clockwise); + if (innerRadius > e) { + ctx.moveTo(cx + innerRadius * mathCos$3(endAngle), cy + innerRadius * mathSin$3(endAngle)); + ctx.arc(cx, cy, innerRadius, endAngle, startAngle, clockwise); + } + } + else { + var icrStart = void 0; + var icrEnd = void 0; + var ocrStart = void 0; + var ocrEnd = void 0; + var ocrs = void 0; + var ocre = void 0; + var icrs = void 0; + var icre = void 0; + var ocrMax = void 0; + var icrMax = void 0; + var limitedOcrMax = void 0; + var limitedIcrMax = void 0; + var xre = void 0; + var yre = void 0; + var xirs = void 0; + var yirs = void 0; + var xrs = radius * mathCos$3(startAngle); + var yrs = radius * mathSin$3(startAngle); + var xire = innerRadius * mathCos$3(endAngle); + var yire = innerRadius * mathSin$3(endAngle); + var hasArc = arc > e; + if (hasArc) { + var cornerRadius = shape.cornerRadius; + if (cornerRadius) { + _a = normalizeCornerRadius(cornerRadius), icrStart = _a[0], icrEnd = _a[1], ocrStart = _a[2], ocrEnd = _a[3]; + } + var halfRd = mathAbs$1(radius - innerRadius) / 2; + ocrs = mathMin$3(halfRd, ocrStart); + ocre = mathMin$3(halfRd, ocrEnd); + icrs = mathMin$3(halfRd, icrStart); + icre = mathMin$3(halfRd, icrEnd); + limitedOcrMax = ocrMax = mathMax$3(ocrs, ocre); + limitedIcrMax = icrMax = mathMax$3(icrs, icre); + if (ocrMax > e || icrMax > e) { + xre = radius * mathCos$3(endAngle); + yre = radius * mathSin$3(endAngle); + xirs = innerRadius * mathCos$3(startAngle); + yirs = innerRadius * mathSin$3(startAngle); + if (arc < PI$2) { + var it_1 = intersect(xrs, yrs, xirs, yirs, xre, yre, xire, yire); + if (it_1) { + var x0 = xrs - it_1[0]; + var y0 = yrs - it_1[1]; + var x1 = xre - it_1[0]; + var y1 = yre - it_1[1]; + var a = 1 / mathSin$3(mathACos((x0 * x1 + y0 * y1) / (mathSqrt$3(x0 * x0 + y0 * y0) * mathSqrt$3(x1 * x1 + y1 * y1))) / 2); + var b = mathSqrt$3(it_1[0] * it_1[0] + it_1[1] * it_1[1]); + limitedOcrMax = mathMin$3(ocrMax, (radius - b) / (a + 1)); + limitedIcrMax = mathMin$3(icrMax, (innerRadius - b) / (a - 1)); + } + } + } + } + if (!hasArc) { + ctx.moveTo(cx + xrs, cy + yrs); + } + else if (limitedOcrMax > e) { + var crStart = mathMin$3(ocrStart, limitedOcrMax); + var crEnd = mathMin$3(ocrEnd, limitedOcrMax); + var ct0 = computeCornerTangents(xirs, yirs, xrs, yrs, radius, crStart, clockwise); + var ct1 = computeCornerTangents(xre, yre, xire, yire, radius, crEnd, clockwise); + ctx.moveTo(cx + ct0.cx + ct0.x0, cy + ct0.cy + ct0.y0); + if (limitedOcrMax < ocrMax && crStart === crEnd) { + ctx.arc(cx + ct0.cx, cy + ct0.cy, limitedOcrMax, mathATan2(ct0.y0, ct0.x0), mathATan2(ct1.y0, ct1.x0), !clockwise); + } + else { + crStart > 0 && ctx.arc(cx + ct0.cx, cy + ct0.cy, crStart, mathATan2(ct0.y0, ct0.x0), mathATan2(ct0.y1, ct0.x1), !clockwise); + ctx.arc(cx, cy, radius, mathATan2(ct0.cy + ct0.y1, ct0.cx + ct0.x1), mathATan2(ct1.cy + ct1.y1, ct1.cx + ct1.x1), !clockwise); + crEnd > 0 && ctx.arc(cx + ct1.cx, cy + ct1.cy, crEnd, mathATan2(ct1.y1, ct1.x1), mathATan2(ct1.y0, ct1.x0), !clockwise); + } + } + else { + ctx.moveTo(cx + xrs, cy + yrs); + ctx.arc(cx, cy, radius, startAngle, endAngle, !clockwise); + } + if (!(innerRadius > e) || !hasArc) { + ctx.lineTo(cx + xire, cy + yire); + } + else if (limitedIcrMax > e) { + var crStart = mathMin$3(icrStart, limitedIcrMax); + var crEnd = mathMin$3(icrEnd, limitedIcrMax); + var ct0 = computeCornerTangents(xire, yire, xre, yre, innerRadius, -crEnd, clockwise); + var ct1 = computeCornerTangents(xrs, yrs, xirs, yirs, innerRadius, -crStart, clockwise); + ctx.lineTo(cx + ct0.cx + ct0.x0, cy + ct0.cy + ct0.y0); + if (limitedIcrMax < icrMax && crStart === crEnd) { + ctx.arc(cx + ct0.cx, cy + ct0.cy, limitedIcrMax, mathATan2(ct0.y0, ct0.x0), mathATan2(ct1.y0, ct1.x0), !clockwise); + } + else { + crEnd > 0 && ctx.arc(cx + ct0.cx, cy + ct0.cy, crEnd, mathATan2(ct0.y0, ct0.x0), mathATan2(ct0.y1, ct0.x1), !clockwise); + ctx.arc(cx, cy, innerRadius, mathATan2(ct0.cy + ct0.y1, ct0.cx + ct0.x1), mathATan2(ct1.cy + ct1.y1, ct1.cx + ct1.x1), clockwise); + crStart > 0 && ctx.arc(cx + ct1.cx, cy + ct1.cy, crStart, mathATan2(ct1.y1, ct1.x1), mathATan2(ct1.y0, ct1.x0), !clockwise); + } + } + else { + ctx.lineTo(cx + xire, cy + yire); + ctx.arc(cx, cy, innerRadius, endAngle, startAngle, clockwise); + } + } + ctx.closePath(); + } + + var SectorShape = (function () { + function SectorShape() { + this.cx = 0; + this.cy = 0; + this.r0 = 0; + this.r = 0; + this.startAngle = 0; + this.endAngle = Math.PI * 2; + this.clockwise = true; + this.cornerRadius = 0; + } + return SectorShape; + }()); + var Sector = (function (_super) { + __extends(Sector, _super); + function Sector(opts) { + return _super.call(this, opts) || this; + } + Sector.prototype.getDefaultShape = function () { + return new SectorShape(); + }; + Sector.prototype.buildPath = function (ctx, shape) { + buildPath$1(ctx, shape); + }; + Sector.prototype.isZeroArea = function () { + return this.shape.startAngle === this.shape.endAngle + || this.shape.r === this.shape.r0; + }; + return Sector; + }(Path)); + Sector.prototype.type = 'sector'; + + var RingShape = (function () { + function RingShape() { + this.cx = 0; + this.cy = 0; + this.r = 0; + this.r0 = 0; + } + return RingShape; + }()); + var Ring = (function (_super) { + __extends(Ring, _super); + function Ring(opts) { + return _super.call(this, opts) || this; + } + Ring.prototype.getDefaultShape = function () { + return new RingShape(); + }; + Ring.prototype.buildPath = function (ctx, shape) { + var x = shape.cx; + var y = shape.cy; + var PI2 = Math.PI * 2; + ctx.moveTo(x + shape.r, y); + ctx.arc(x, y, shape.r, 0, PI2, false); + ctx.moveTo(x + shape.r0, y); + ctx.arc(x, y, shape.r0, 0, PI2, true); + }; + return Ring; + }(Path)); + Ring.prototype.type = 'ring'; + + function smoothBezier(points, smooth, isLoop, constraint) { + var cps = []; + var v = []; + var v1 = []; + var v2 = []; + var prevPoint; + var nextPoint; + var min$1; + var max$1; + if (constraint) { + min$1 = [Infinity, Infinity]; + max$1 = [-Infinity, -Infinity]; + for (var i = 0, len = points.length; i < len; i++) { + min(min$1, min$1, points[i]); + max(max$1, max$1, points[i]); + } + min(min$1, min$1, constraint[0]); + max(max$1, max$1, constraint[1]); + } + for (var i = 0, len = points.length; i < len; i++) { + var point = points[i]; + if (isLoop) { + prevPoint = points[i ? i - 1 : len - 1]; + nextPoint = points[(i + 1) % len]; + } + else { + if (i === 0 || i === len - 1) { + cps.push(clone$1(points[i])); + continue; + } + else { + prevPoint = points[i - 1]; + nextPoint = points[i + 1]; + } + } + sub(v, nextPoint, prevPoint); + scale(v, v, smooth); + var d0 = distance(point, prevPoint); + var d1 = distance(point, nextPoint); + var sum = d0 + d1; + if (sum !== 0) { + d0 /= sum; + d1 /= sum; + } + scale(v1, v, -d0); + scale(v2, v, d1); + var cp0 = add([], point, v1); + var cp1 = add([], point, v2); + if (constraint) { + max(cp0, cp0, min$1); + min(cp0, cp0, max$1); + max(cp1, cp1, min$1); + min(cp1, cp1, max$1); + } + cps.push(cp0); + cps.push(cp1); + } + if (isLoop) { + cps.push(cps.shift()); + } + return cps; + } + + function buildPath$2(ctx, shape, closePath) { + var smooth = shape.smooth; + var points = shape.points; + if (points && points.length >= 2) { + if (smooth) { + var controlPoints = smoothBezier(points, smooth, closePath, shape.smoothConstraint); + ctx.moveTo(points[0][0], points[0][1]); + var len = points.length; + for (var i = 0; i < (closePath ? len : len - 1); i++) { + var cp1 = controlPoints[i * 2]; + var cp2 = controlPoints[i * 2 + 1]; + var p = points[(i + 1) % len]; + ctx.bezierCurveTo(cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]); + } + } + else { + ctx.moveTo(points[0][0], points[0][1]); + for (var i = 1, l = points.length; i < l; i++) { + ctx.lineTo(points[i][0], points[i][1]); + } + } + closePath && ctx.closePath(); + } + } + + var PolygonShape = (function () { + function PolygonShape() { + this.points = null; + this.smooth = 0; + this.smoothConstraint = null; + } + return PolygonShape; + }()); + var Polygon = (function (_super) { + __extends(Polygon, _super); + function Polygon(opts) { + return _super.call(this, opts) || this; + } + Polygon.prototype.getDefaultShape = function () { + return new PolygonShape(); + }; + Polygon.prototype.buildPath = function (ctx, shape) { + buildPath$2(ctx, shape, true); + }; + return Polygon; + }(Path)); + Polygon.prototype.type = 'polygon'; + + var PolylineShape = (function () { + function PolylineShape() { + this.points = null; + this.percent = 1; + this.smooth = 0; + this.smoothConstraint = null; + } + return PolylineShape; + }()); + var Polyline = (function (_super) { + __extends(Polyline, _super); + function Polyline(opts) { + return _super.call(this, opts) || this; + } + Polyline.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + Polyline.prototype.getDefaultShape = function () { + return new PolylineShape(); + }; + Polyline.prototype.buildPath = function (ctx, shape) { + buildPath$2(ctx, shape, false); + }; + return Polyline; + }(Path)); + Polyline.prototype.type = 'polyline'; + + var subPixelOptimizeOutputShape$1 = {}; + var LineShape = (function () { + function LineShape() { + this.x1 = 0; + this.y1 = 0; + this.x2 = 0; + this.y2 = 0; + this.percent = 1; + } + return LineShape; + }()); + var Line = (function (_super) { + __extends(Line, _super); + function Line(opts) { + return _super.call(this, opts) || this; + } + Line.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + Line.prototype.getDefaultShape = function () { + return new LineShape(); + }; + Line.prototype.buildPath = function (ctx, shape) { + var x1; + var y1; + var x2; + var y2; + if (this.subPixelOptimize) { + var optimizedShape = subPixelOptimizeLine(subPixelOptimizeOutputShape$1, shape, this.style); + x1 = optimizedShape.x1; + y1 = optimizedShape.y1; + x2 = optimizedShape.x2; + y2 = optimizedShape.y2; + } + else { + x1 = shape.x1; + y1 = shape.y1; + x2 = shape.x2; + y2 = shape.y2; + } + var percent = shape.percent; + if (percent === 0) { + return; + } + ctx.moveTo(x1, y1); + if (percent < 1) { + x2 = x1 * (1 - percent) + x2 * percent; + y2 = y1 * (1 - percent) + y2 * percent; + } + ctx.lineTo(x2, y2); + }; + Line.prototype.pointAt = function (p) { + var shape = this.shape; + return [ + shape.x1 * (1 - p) + shape.x2 * p, + shape.y1 * (1 - p) + shape.y2 * p + ]; + }; + return Line; + }(Path)); + Line.prototype.type = 'line'; + + var out = []; + var BezierCurveShape = (function () { + function BezierCurveShape() { + this.x1 = 0; + this.y1 = 0; + this.x2 = 0; + this.y2 = 0; + this.cpx1 = 0; + this.cpy1 = 0; + this.percent = 1; + } + return BezierCurveShape; + }()); + function someVectorAt(shape, t, isTangent) { + var cpx2 = shape.cpx2; + var cpy2 = shape.cpy2; + if (cpx2 != null || cpy2 != null) { + return [ + (isTangent ? cubicDerivativeAt : cubicAt)(shape.x1, shape.cpx1, shape.cpx2, shape.x2, t), + (isTangent ? cubicDerivativeAt : cubicAt)(shape.y1, shape.cpy1, shape.cpy2, shape.y2, t) + ]; + } + else { + return [ + (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.x1, shape.cpx1, shape.x2, t), + (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.y1, shape.cpy1, shape.y2, t) + ]; + } + } + var BezierCurve = (function (_super) { + __extends(BezierCurve, _super); + function BezierCurve(opts) { + return _super.call(this, opts) || this; + } + BezierCurve.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + BezierCurve.prototype.getDefaultShape = function () { + return new BezierCurveShape(); + }; + BezierCurve.prototype.buildPath = function (ctx, shape) { + var x1 = shape.x1; + var y1 = shape.y1; + var x2 = shape.x2; + var y2 = shape.y2; + var cpx1 = shape.cpx1; + var cpy1 = shape.cpy1; + var cpx2 = shape.cpx2; + var cpy2 = shape.cpy2; + var percent = shape.percent; + if (percent === 0) { + return; + } + ctx.moveTo(x1, y1); + if (cpx2 == null || cpy2 == null) { + if (percent < 1) { + quadraticSubdivide(x1, cpx1, x2, percent, out); + cpx1 = out[1]; + x2 = out[2]; + quadraticSubdivide(y1, cpy1, y2, percent, out); + cpy1 = out[1]; + y2 = out[2]; + } + ctx.quadraticCurveTo(cpx1, cpy1, x2, y2); + } + else { + if (percent < 1) { + cubicSubdivide(x1, cpx1, cpx2, x2, percent, out); + cpx1 = out[1]; + cpx2 = out[2]; + x2 = out[3]; + cubicSubdivide(y1, cpy1, cpy2, y2, percent, out); + cpy1 = out[1]; + cpy2 = out[2]; + y2 = out[3]; + } + ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2); + } + }; + BezierCurve.prototype.pointAt = function (t) { + return someVectorAt(this.shape, t, false); + }; + BezierCurve.prototype.tangentAt = function (t) { + var p = someVectorAt(this.shape, t, true); + return normalize(p, p); + }; + return BezierCurve; + }(Path)); + BezierCurve.prototype.type = 'bezier-curve'; + + var ArcShape = (function () { + function ArcShape() { + this.cx = 0; + this.cy = 0; + this.r = 0; + this.startAngle = 0; + this.endAngle = Math.PI * 2; + this.clockwise = true; + } + return ArcShape; + }()); + var Arc = (function (_super) { + __extends(Arc, _super); + function Arc(opts) { + return _super.call(this, opts) || this; + } + Arc.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + Arc.prototype.getDefaultShape = function () { + return new ArcShape(); + }; + Arc.prototype.buildPath = function (ctx, shape) { + var x = shape.cx; + var y = shape.cy; + var r = Math.max(shape.r, 0); + var startAngle = shape.startAngle; + var endAngle = shape.endAngle; + var clockwise = shape.clockwise; + var unitX = Math.cos(startAngle); + var unitY = Math.sin(startAngle); + ctx.moveTo(unitX * r + x, unitY * r + y); + ctx.arc(x, y, r, startAngle, endAngle, !clockwise); + }; + return Arc; + }(Path)); + Arc.prototype.type = 'arc'; + + var CompoundPath = (function (_super) { + __extends(CompoundPath, _super); + function CompoundPath() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = 'compound'; + return _this; + } + CompoundPath.prototype._updatePathDirty = function () { + var paths = this.shape.paths; + var dirtyPath = this.shapeChanged(); + for (var i = 0; i < paths.length; i++) { + dirtyPath = dirtyPath || paths[i].shapeChanged(); + } + if (dirtyPath) { + this.dirtyShape(); + } + }; + CompoundPath.prototype.beforeBrush = function () { + this._updatePathDirty(); + var paths = this.shape.paths || []; + var scale = this.getGlobalScale(); + for (var i = 0; i < paths.length; i++) { + if (!paths[i].path) { + paths[i].createPathProxy(); + } + paths[i].path.setScale(scale[0], scale[1], paths[i].segmentIgnoreThreshold); + } + }; + CompoundPath.prototype.buildPath = function (ctx, shape) { + var paths = shape.paths || []; + for (var i = 0; i < paths.length; i++) { + paths[i].buildPath(ctx, paths[i].shape, true); + } + }; + CompoundPath.prototype.afterBrush = function () { + var paths = this.shape.paths || []; + for (var i = 0; i < paths.length; i++) { + paths[i].pathUpdated(); + } + }; + CompoundPath.prototype.getBoundingRect = function () { + this._updatePathDirty.call(this); + return Path.prototype.getBoundingRect.call(this); + }; + return CompoundPath; + }(Path)); + + var Gradient = (function () { + function Gradient(colorStops) { + this.colorStops = colorStops || []; + } + Gradient.prototype.addColorStop = function (offset, color) { + this.colorStops.push({ + offset: offset, + color: color + }); + }; + return Gradient; + }()); + + var LinearGradient = (function (_super) { + __extends(LinearGradient, _super); + function LinearGradient(x, y, x2, y2, colorStops, globalCoord) { + var _this = _super.call(this, colorStops) || this; + _this.x = x == null ? 0 : x; + _this.y = y == null ? 0 : y; + _this.x2 = x2 == null ? 1 : x2; + _this.y2 = y2 == null ? 0 : y2; + _this.type = 'linear'; + _this.global = globalCoord || false; + return _this; + } + return LinearGradient; + }(Gradient)); + + var RadialGradient = (function (_super) { + __extends(RadialGradient, _super); + function RadialGradient(x, y, r, colorStops, globalCoord) { + var _this = _super.call(this, colorStops) || this; + _this.x = x == null ? 0.5 : x; + _this.y = y == null ? 0.5 : y; + _this.r = r == null ? 0.5 : r; + _this.type = 'radial'; + _this.global = globalCoord || false; + return _this; + } + return RadialGradient; + }(Gradient)); + + var extent = [0, 0]; + var extent2 = [0, 0]; + var minTv$1 = new Point(); + var maxTv$1 = new Point(); + var OrientedBoundingRect = (function () { + function OrientedBoundingRect(rect, transform) { + this._corners = []; + this._axes = []; + this._origin = [0, 0]; + for (var i = 0; i < 4; i++) { + this._corners[i] = new Point(); + } + for (var i = 0; i < 2; i++) { + this._axes[i] = new Point(); + } + if (rect) { + this.fromBoundingRect(rect, transform); + } + } + OrientedBoundingRect.prototype.fromBoundingRect = function (rect, transform) { + var corners = this._corners; + var axes = this._axes; + var x = rect.x; + var y = rect.y; + var x2 = x + rect.width; + var y2 = y + rect.height; + corners[0].set(x, y); + corners[1].set(x2, y); + corners[2].set(x2, y2); + corners[3].set(x, y2); + if (transform) { + for (var i = 0; i < 4; i++) { + corners[i].transform(transform); + } + } + Point.sub(axes[0], corners[1], corners[0]); + Point.sub(axes[1], corners[3], corners[0]); + axes[0].normalize(); + axes[1].normalize(); + for (var i = 0; i < 2; i++) { + this._origin[i] = axes[i].dot(corners[0]); + } + }; + OrientedBoundingRect.prototype.intersect = function (other, mtv) { + var overlapped = true; + var noMtv = !mtv; + minTv$1.set(Infinity, Infinity); + maxTv$1.set(0, 0); + if (!this._intersectCheckOneSide(this, other, minTv$1, maxTv$1, noMtv, 1)) { + overlapped = false; + if (noMtv) { + return overlapped; + } + } + if (!this._intersectCheckOneSide(other, this, minTv$1, maxTv$1, noMtv, -1)) { + overlapped = false; + if (noMtv) { + return overlapped; + } + } + if (!noMtv) { + Point.copy(mtv, overlapped ? minTv$1 : maxTv$1); + } + return overlapped; + }; + OrientedBoundingRect.prototype._intersectCheckOneSide = function (self, other, minTv, maxTv, noMtv, inverse) { + var overlapped = true; + for (var i = 0; i < 2; i++) { + var axis = this._axes[i]; + this._getProjMinMaxOnAxis(i, self._corners, extent); + this._getProjMinMaxOnAxis(i, other._corners, extent2); + if (extent[1] < extent2[0] || extent[0] > extent2[1]) { + overlapped = false; + if (noMtv) { + return overlapped; + } + var dist0 = Math.abs(extent2[0] - extent[1]); + var dist1 = Math.abs(extent[0] - extent2[1]); + if (Math.min(dist0, dist1) > maxTv.len()) { + if (dist0 < dist1) { + Point.scale(maxTv, axis, -dist0 * inverse); + } + else { + Point.scale(maxTv, axis, dist1 * inverse); + } + } + } + else if (minTv) { + var dist0 = Math.abs(extent2[0] - extent[1]); + var dist1 = Math.abs(extent[0] - extent2[1]); + if (Math.min(dist0, dist1) < minTv.len()) { + if (dist0 < dist1) { + Point.scale(minTv, axis, dist0 * inverse); + } + else { + Point.scale(minTv, axis, -dist1 * inverse); + } + } + } + } + return overlapped; + }; + OrientedBoundingRect.prototype._getProjMinMaxOnAxis = function (dim, corners, out) { + var axis = this._axes[dim]; + var origin = this._origin; + var proj = corners[0].dot(axis) + origin[dim]; + var min = proj; + var max = proj; + for (var i = 1; i < corners.length; i++) { + var proj_1 = corners[i].dot(axis) + origin[dim]; + min = Math.min(proj_1, min); + max = Math.max(proj_1, max); + } + out[0] = min; + out[1] = max; + }; + return OrientedBoundingRect; + }()); + + var m = []; + var IncrementalDisplayable = (function (_super) { + __extends(IncrementalDisplayable, _super); + function IncrementalDisplayable() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.notClear = true; + _this.incremental = true; + _this._displayables = []; + _this._temporaryDisplayables = []; + _this._cursor = 0; + return _this; + } + IncrementalDisplayable.prototype.traverse = function (cb, context) { + cb.call(context, this); + }; + IncrementalDisplayable.prototype.useStyle = function () { + this.style = {}; + }; + IncrementalDisplayable.prototype.getCursor = function () { + return this._cursor; + }; + IncrementalDisplayable.prototype.innerAfterBrush = function () { + this._cursor = this._displayables.length; + }; + IncrementalDisplayable.prototype.clearDisplaybles = function () { + this._displayables = []; + this._temporaryDisplayables = []; + this._cursor = 0; + this.markRedraw(); + this.notClear = false; + }; + IncrementalDisplayable.prototype.clearTemporalDisplayables = function () { + this._temporaryDisplayables = []; + }; + IncrementalDisplayable.prototype.addDisplayable = function (displayable, notPersistent) { + if (notPersistent) { + this._temporaryDisplayables.push(displayable); + } + else { + this._displayables.push(displayable); + } + this.markRedraw(); + }; + IncrementalDisplayable.prototype.addDisplayables = function (displayables, notPersistent) { + notPersistent = notPersistent || false; + for (var i = 0; i < displayables.length; i++) { + this.addDisplayable(displayables[i], notPersistent); + } + }; + IncrementalDisplayable.prototype.getDisplayables = function () { + return this._displayables; + }; + IncrementalDisplayable.prototype.getTemporalDisplayables = function () { + return this._temporaryDisplayables; + }; + IncrementalDisplayable.prototype.eachPendingDisplayable = function (cb) { + for (var i = this._cursor; i < this._displayables.length; i++) { + cb && cb(this._displayables[i]); + } + for (var i = 0; i < this._temporaryDisplayables.length; i++) { + cb && cb(this._temporaryDisplayables[i]); + } + }; + IncrementalDisplayable.prototype.update = function () { + this.updateTransform(); + for (var i = this._cursor; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + displayable.parent = this; + displayable.update(); + displayable.parent = null; + } + for (var i = 0; i < this._temporaryDisplayables.length; i++) { + var displayable = this._temporaryDisplayables[i]; + displayable.parent = this; + displayable.update(); + displayable.parent = null; + } + }; + IncrementalDisplayable.prototype.getBoundingRect = function () { + if (!this._rect) { + var rect = new BoundingRect(Infinity, Infinity, -Infinity, -Infinity); + for (var i = 0; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + var childRect = displayable.getBoundingRect().clone(); + if (displayable.needLocalTransform()) { + childRect.applyTransform(displayable.getLocalTransform(m)); + } + rect.union(childRect); + } + this._rect = rect; + } + return this._rect; + }; + IncrementalDisplayable.prototype.contain = function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + if (rect.contain(localPos[0], localPos[1])) { + for (var i = 0; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + if (displayable.contain(x, y)) { + return true; + } + } + } + return false; + }; + return IncrementalDisplayable; + }(Displayable)); + + var transitionStore = makeInner(); + /** + * Return null if animation is disabled. + */ + + function getAnimationConfig(animationType, animatableModel, dataIndex, // Extra opts can override the option in animatable model. + extraOpts, // TODO It's only for pictorial bar now. + extraDelayParams) { + var animationPayload; // Check if there is global animation configuration from dataZoom/resize can override the config in option. + // If animation is enabled. Will use this animation config in payload. + // If animation is disabled. Just ignore it. + + if (animatableModel && animatableModel.ecModel) { + var updatePayload = animatableModel.ecModel.getUpdatePayload(); + animationPayload = updatePayload && updatePayload.animation; + } + + var animationEnabled = animatableModel && animatableModel.isAnimationEnabled(); + var isUpdate = animationType === 'update'; + + if (animationEnabled) { + var duration = void 0; + var easing = void 0; + var delay = void 0; + + if (extraOpts) { + duration = retrieve2(extraOpts.duration, 200); + easing = retrieve2(extraOpts.easing, 'cubicOut'); + delay = 0; + } else { + duration = animatableModel.getShallow(isUpdate ? 'animationDurationUpdate' : 'animationDuration'); + easing = animatableModel.getShallow(isUpdate ? 'animationEasingUpdate' : 'animationEasing'); + delay = animatableModel.getShallow(isUpdate ? 'animationDelayUpdate' : 'animationDelay'); + } // animation from payload has highest priority. + + + if (animationPayload) { + animationPayload.duration != null && (duration = animationPayload.duration); + animationPayload.easing != null && (easing = animationPayload.easing); + animationPayload.delay != null && (delay = animationPayload.delay); + } + + if (isFunction(delay)) { + delay = delay(dataIndex, extraDelayParams); + } + + if (isFunction(duration)) { + duration = duration(dataIndex); + } + + var config = { + duration: duration || 0, + delay: delay, + easing: easing + }; + return config; + } else { + return null; + } + } + + function animateOrSetProps(animationType, el, props, animatableModel, dataIndex, cb, during) { + var isFrom = false; + var removeOpt; + + if (isFunction(dataIndex)) { + during = cb; + cb = dataIndex; + dataIndex = null; + } else if (isObject(dataIndex)) { + cb = dataIndex.cb; + during = dataIndex.during; + isFrom = dataIndex.isFrom; + removeOpt = dataIndex.removeOpt; + dataIndex = dataIndex.dataIndex; + } + + var isRemove = animationType === 'leave'; + + if (!isRemove) { + // Must stop the remove animation. + el.stopAnimation('leave'); + } + + var animationConfig = getAnimationConfig(animationType, animatableModel, dataIndex, isRemove ? removeOpt || {} : null, animatableModel && animatableModel.getAnimationDelayParams ? animatableModel.getAnimationDelayParams(el, dataIndex) : null); + + if (animationConfig && animationConfig.duration > 0) { + var duration = animationConfig.duration; + var animationDelay = animationConfig.delay; + var animationEasing = animationConfig.easing; + var animateConfig = { + duration: duration, + delay: animationDelay || 0, + easing: animationEasing, + done: cb, + force: !!cb || !!during, + // Set to final state in update/init animation. + // So the post processing based on the path shape can be done correctly. + setToFinal: !isRemove, + scope: animationType, + during: during + }; + isFrom ? el.animateFrom(props, animateConfig) : el.animateTo(props, animateConfig); + } else { + el.stopAnimation(); // If `isFrom`, the props is the "from" props. + + !isFrom && el.attr(props); // Call during at least once. + + during && during(1); + cb && cb(); + } + } + /** + * Update graphic element properties with or without animation according to the + * configuration in series. + * + * Caution: this method will stop previous animation. + * So do not use this method to one element twice before + * animation starts, unless you know what you are doing. + * @example + * graphic.updateProps(el, { + * position: [100, 100] + * }, seriesModel, dataIndex, function () { console.log('Animation done!'); }); + * // Or + * graphic.updateProps(el, { + * position: [100, 100] + * }, seriesModel, function () { console.log('Animation done!'); }); + */ + + + function updateProps(el, props, // TODO: TYPE AnimatableModel + animatableModel, dataIndex, cb, during) { + animateOrSetProps('update', el, props, animatableModel, dataIndex, cb, during); + } + /** + * Init graphic element properties with or without animation according to the + * configuration in series. + * + * Caution: this method will stop previous animation. + * So do not use this method to one element twice before + * animation starts, unless you know what you are doing. + */ + + function initProps(el, props, animatableModel, dataIndex, cb, during) { + animateOrSetProps('enter', el, props, animatableModel, dataIndex, cb, during); + } + /** + * If element is removed. + * It can determine if element is having remove animation. + */ + + function isElementRemoved(el) { + if (!el.__zr) { + return true; + } + + for (var i = 0; i < el.animators.length; i++) { + var animator = el.animators[i]; + + if (animator.scope === 'leave') { + return true; + } + } + + return false; + } + /** + * Remove graphic element + */ + + function removeElement(el, props, animatableModel, dataIndex, cb, during) { + // Don't do remove animation twice. + if (isElementRemoved(el)) { + return; + } + + animateOrSetProps('leave', el, props, animatableModel, dataIndex, cb, during); + } + + function fadeOutDisplayable(el, animatableModel, dataIndex, done) { + el.removeTextContent(); + el.removeTextGuideLine(); + removeElement(el, { + style: { + opacity: 0 + } + }, animatableModel, dataIndex, done); + } + + function removeElementWithFadeOut(el, animatableModel, dataIndex) { + function doRemove() { + el.parent && el.parent.remove(el); + } // Hide label and labelLine first + // TODO Also use fade out animation? + + + if (!el.isGroup) { + fadeOutDisplayable(el, animatableModel, dataIndex, doRemove); + } else { + el.traverse(function (disp) { + if (!disp.isGroup) { + // Can invoke doRemove multiple times. + fadeOutDisplayable(disp, animatableModel, dataIndex, doRemove); + } + }); + } + } + /** + * Save old style for style transition in universalTransition module. + * It's used when element will be reused in each render. + * For chart like map, heatmap, which will always create new element. + * We don't need to save this because universalTransition can get old style from the old element + */ + + function saveOldStyle(el) { + transitionStore(el).oldStyle = el.style; + } + function getOldStyle(el) { + return transitionStore(el).oldStyle; + } + + var mathMax$4 = Math.max; + var mathMin$4 = Math.min; + var _customShapeMap = {}; + /** + * Extend shape with parameters + */ + + function extendShape(opts) { + return Path.extend(opts); + } + var extendPathFromString = extendFromString; + /** + * Extend path + */ + + function extendPath(pathData, opts) { + return extendPathFromString(pathData, opts); + } + /** + * Register a user defined shape. + * The shape class can be fetched by `getShapeClass` + * This method will overwrite the registered shapes, including + * the registered built-in shapes, if using the same `name`. + * The shape can be used in `custom series` and + * `graphic component` by declaring `{type: name}`. + * + * @param name + * @param ShapeClass Can be generated by `extendShape`. + */ + + function registerShape(name, ShapeClass) { + _customShapeMap[name] = ShapeClass; + } + /** + * Find shape class registered by `registerShape`. Usually used in + * fetching user defined shape. + * + * [Caution]: + * (1) This method **MUST NOT be used inside echarts !!!**, unless it is prepared + * to use user registered shapes. + * Because the built-in shape (see `getBuiltInShape`) will be registered by + * `registerShape` by default. That enables users to get both built-in + * shapes as well as the shapes belonging to themsleves. But users can overwrite + * the built-in shapes by using names like 'circle', 'rect' via calling + * `registerShape`. So the echarts inner featrues should not fetch shapes from here + * in case that it is overwritten by users, except that some features, like + * `custom series`, `graphic component`, do it deliberately. + * + * (2) In the features like `custom series`, `graphic component`, the user input + * `{tpye: 'xxx'}` does not only specify shapes but also specify other graphic + * elements like `'group'`, `'text'`, `'image'` or event `'path'`. Those names + * are reserved names, that is, if some user register a shape named `'image'`, + * the shape will not be used. If we intending to add some more reserved names + * in feature, that might bring break changes (disable some existing user shape + * names). But that case probably rearly happen. So we dont make more mechanism + * to resolve this issue here. + * + * @param name + * @return The shape class. If not found, return nothing. + */ + + function getShapeClass(name) { + if (_customShapeMap.hasOwnProperty(name)) { + return _customShapeMap[name]; + } + } + /** + * Create a path element from path data string + * @param pathData + * @param opts + * @param rect + * @param layout 'center' or 'cover' default to be cover + */ + + function makePath(pathData, opts, rect, layout) { + var path = createFromString(pathData, opts); + + if (rect) { + if (layout === 'center') { + rect = centerGraphic(rect, path.getBoundingRect()); + } + + resizePath(path, rect); + } + + return path; + } + /** + * Create a image element from image url + * @param imageUrl image url + * @param opts options + * @param rect constrain rect + * @param layout 'center' or 'cover'. Default to be 'cover' + */ + + function makeImage(imageUrl, rect, layout) { + var zrImg = new ZRImage({ + style: { + image: imageUrl, + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + onload: function (img) { + if (layout === 'center') { + var boundingRect = { + width: img.width, + height: img.height + }; + zrImg.setStyle(centerGraphic(rect, boundingRect)); + } + } + }); + return zrImg; + } + /** + * Get position of centered element in bounding box. + * + * @param rect element local bounding box + * @param boundingRect constraint bounding box + * @return element position containing x, y, width, and height + */ + + function centerGraphic(rect, boundingRect) { + // Set rect to center, keep width / height ratio. + var aspect = boundingRect.width / boundingRect.height; + var width = rect.height * aspect; + var height; + + if (width <= rect.width) { + height = rect.height; + } else { + width = rect.width; + height = width / aspect; + } + + var cx = rect.x + rect.width / 2; + var cy = rect.y + rect.height / 2; + return { + x: cx - width / 2, + y: cy - height / 2, + width: width, + height: height + }; + } + + var mergePath$1 = mergePath; + /** + * Resize a path to fit the rect + * @param path + * @param rect + */ + + function resizePath(path, rect) { + if (!path.applyTransform) { + return; + } + + var pathRect = path.getBoundingRect(); + var m = pathRect.calculateTransform(rect); + path.applyTransform(m); + } + /** + * Sub pixel optimize line for canvas + */ + + function subPixelOptimizeLine$1(param) { + subPixelOptimizeLine(param.shape, param.shape, param.style); + return param; + } + /** + * Sub pixel optimize rect for canvas + */ + + function subPixelOptimizeRect$1(param) { + subPixelOptimizeRect(param.shape, param.shape, param.style); + return param; + } + /** + * Sub pixel optimize for canvas + * + * @param position Coordinate, such as x, y + * @param lineWidth Should be nonnegative integer. + * @param positiveOrNegative Default false (negative). + * @return Optimized position. + */ + + var subPixelOptimize$1 = subPixelOptimize; + /** + * Get transform matrix of target (param target), + * in coordinate of its ancestor (param ancestor) + * + * @param target + * @param [ancestor] + */ + + function getTransform(target, ancestor) { + var mat = identity([]); + + while (target && target !== ancestor) { + mul$1(mat, target.getLocalTransform(), mat); + target = target.parent; + } + + return mat; + } + /** + * Apply transform to an vertex. + * @param target [x, y] + * @param transform Can be: + * + Transform matrix: like [1, 0, 0, 1, 0, 0] + * + {position, rotation, scale}, the same as `zrender/Transformable`. + * @param invert Whether use invert matrix. + * @return [x, y] + */ + + function applyTransform$1(target, transform, invert$1) { + if (transform && !isArrayLike(transform)) { + transform = Transformable.getLocalTransform(transform); + } + + if (invert$1) { + transform = invert([], transform); + } + + return applyTransform([], target, transform); + } + /** + * @param direction 'left' 'right' 'top' 'bottom' + * @param transform Transform matrix: like [1, 0, 0, 1, 0, 0] + * @param invert Whether use invert matrix. + * @return Transformed direction. 'left' 'right' 'top' 'bottom' + */ + + function transformDirection(direction, transform, invert) { + // Pick a base, ensure that transform result will not be (0, 0). + var hBase = transform[4] === 0 || transform[5] === 0 || transform[0] === 0 ? 1 : Math.abs(2 * transform[4] / transform[0]); + var vBase = transform[4] === 0 || transform[5] === 0 || transform[2] === 0 ? 1 : Math.abs(2 * transform[4] / transform[2]); + var vertex = [direction === 'left' ? -hBase : direction === 'right' ? hBase : 0, direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0]; + vertex = applyTransform$1(vertex, transform, invert); + return Math.abs(vertex[0]) > Math.abs(vertex[1]) ? vertex[0] > 0 ? 'right' : 'left' : vertex[1] > 0 ? 'bottom' : 'top'; + } + + function isNotGroup(el) { + return !el.isGroup; + } + + function isPath(el) { + return el.shape != null; + } + /** + * Apply group transition animation from g1 to g2. + * If no animatableModel, no animation. + */ + + + function groupTransition(g1, g2, animatableModel) { + if (!g1 || !g2) { + return; + } + + function getElMap(g) { + var elMap = {}; + g.traverse(function (el) { + if (isNotGroup(el) && el.anid) { + elMap[el.anid] = el; + } + }); + return elMap; + } + + function getAnimatableProps(el) { + var obj = { + x: el.x, + y: el.y, + rotation: el.rotation + }; + + if (isPath(el)) { + obj.shape = extend({}, el.shape); + } + + return obj; + } + + var elMap1 = getElMap(g1); + g2.traverse(function (el) { + if (isNotGroup(el) && el.anid) { + var oldEl = elMap1[el.anid]; + + if (oldEl) { + var newProp = getAnimatableProps(el); + el.attr(getAnimatableProps(oldEl)); + updateProps(el, newProp, animatableModel, getECData(el).dataIndex); + } + } + }); + } + function clipPointsByRect(points, rect) { + // FIXME: this way migth be incorrect when grpahic clipped by a corner. + // and when element have border. + return map(points, function (point) { + var x = point[0]; + x = mathMax$4(x, rect.x); + x = mathMin$4(x, rect.x + rect.width); + var y = point[1]; + y = mathMax$4(y, rect.y); + y = mathMin$4(y, rect.y + rect.height); + return [x, y]; + }); + } + /** + * Return a new clipped rect. If rect size are negative, return undefined. + */ + + function clipRectByRect(targetRect, rect) { + var x = mathMax$4(targetRect.x, rect.x); + var x2 = mathMin$4(targetRect.x + targetRect.width, rect.x + rect.width); + var y = mathMax$4(targetRect.y, rect.y); + var y2 = mathMin$4(targetRect.y + targetRect.height, rect.y + rect.height); // If the total rect is cliped, nothing, including the border, + // should be painted. So return undefined. + + if (x2 >= x && y2 >= y) { + return { + x: x, + y: y, + width: x2 - x, + height: y2 - y + }; + } + } + function createIcon(iconStr, // Support 'image://' or 'path://' or direct svg path. + opt, rect) { + var innerOpts = extend({ + rectHover: true + }, opt); + var style = innerOpts.style = { + strokeNoScale: true + }; + rect = rect || { + x: -1, + y: -1, + width: 2, + height: 2 + }; + + if (iconStr) { + return iconStr.indexOf('image://') === 0 ? (style.image = iconStr.slice(8), defaults(style, rect), new ZRImage(innerOpts)) : makePath(iconStr.replace('path://', ''), innerOpts, rect, 'center'); + } + } + /** + * Return `true` if the given line (line `a`) and the given polygon + * are intersect. + * Note that we do not count colinear as intersect here because no + * requirement for that. We could do that if required in future. + */ + + function linePolygonIntersect(a1x, a1y, a2x, a2y, points) { + for (var i = 0, p2 = points[points.length - 1]; i < points.length; i++) { + var p = points[i]; + + if (lineLineIntersect(a1x, a1y, a2x, a2y, p[0], p[1], p2[0], p2[1])) { + return true; + } + + p2 = p; + } + } + /** + * Return `true` if the given two lines (line `a` and line `b`) + * are intersect. + * Note that we do not count colinear as intersect here because no + * requirement for that. We could do that if required in future. + */ + + function lineLineIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) { + // let `vec_m` to be `vec_a2 - vec_a1` and `vec_n` to be `vec_b2 - vec_b1`. + var mx = a2x - a1x; + var my = a2y - a1y; + var nx = b2x - b1x; + var ny = b2y - b1y; // `vec_m` and `vec_n` are parallel iff + // exising `k` such that `vec_m = k · vec_n`, equivalent to `vec_m X vec_n = 0`. + + var nmCrossProduct = crossProduct2d(nx, ny, mx, my); + + if (nearZero(nmCrossProduct)) { + return false; + } // `vec_m` and `vec_n` are intersect iff + // existing `p` and `q` in [0, 1] such that `vec_a1 + p * vec_m = vec_b1 + q * vec_n`, + // such that `q = ((vec_a1 - vec_b1) X vec_m) / (vec_n X vec_m)` + // and `p = ((vec_a1 - vec_b1) X vec_n) / (vec_n X vec_m)`. + + + var b1a1x = a1x - b1x; + var b1a1y = a1y - b1y; + var q = crossProduct2d(b1a1x, b1a1y, mx, my) / nmCrossProduct; + + if (q < 0 || q > 1) { + return false; + } + + var p = crossProduct2d(b1a1x, b1a1y, nx, ny) / nmCrossProduct; + + if (p < 0 || p > 1) { + return false; + } + + return true; + } + /** + * Cross product of 2-dimension vector. + */ + + function crossProduct2d(x1, y1, x2, y2) { + return x1 * y2 - x2 * y1; + } + + function nearZero(val) { + return val <= 1e-6 && val >= -1e-6; + } + + function setTooltipConfig(opt) { + var itemTooltipOption = opt.itemTooltipOption; + var componentModel = opt.componentModel; + var itemName = opt.itemName; + var itemTooltipOptionObj = isString(itemTooltipOption) ? { + formatter: itemTooltipOption + } : itemTooltipOption; + var mainType = componentModel.mainType; + var componentIndex = componentModel.componentIndex; + var formatterParams = { + componentType: mainType, + name: itemName, + $vars: ['name'] + }; + formatterParams[mainType + 'Index'] = componentIndex; + var formatterParamsExtra = opt.formatterParamsExtra; + + if (formatterParamsExtra) { + each(keys(formatterParamsExtra), function (key) { + if (!hasOwn(formatterParams, key)) { + formatterParams[key] = formatterParamsExtra[key]; + formatterParams.$vars.push(key); + } + }); + } + + var ecData = getECData(opt.el); + ecData.componentMainType = mainType; + ecData.componentIndex = componentIndex; + ecData.tooltipConfig = { + name: itemName, + option: defaults({ + content: itemName, + formatterParams: formatterParams + }, itemTooltipOptionObj) + }; + } + + function traverseElement(el, cb) { + var stopped; // TODO + // Polyfill for fixing zrender group traverse don't visit it's root issue. + + if (el.isGroup) { + stopped = cb(el); + } + + if (!stopped) { + el.traverse(cb); + } + } + + function traverseElements(els, cb) { + if (els) { + if (isArray(els)) { + for (var i = 0; i < els.length; i++) { + traverseElement(els[i], cb); + } + } else { + traverseElement(els, cb); + } + } + } // Register built-in shapes. These shapes might be overwirtten + // by users, although we do not recommend that. + + registerShape('circle', Circle); + registerShape('ellipse', Ellipse); + registerShape('sector', Sector); + registerShape('ring', Ring); + registerShape('polygon', Polygon); + registerShape('polyline', Polyline); + registerShape('rect', Rect); + registerShape('line', Line); + registerShape('bezierCurve', BezierCurve); + registerShape('arc', Arc); + + var graphic = /*#__PURE__*/Object.freeze({ + __proto__: null, + updateProps: updateProps, + initProps: initProps, + removeElement: removeElement, + removeElementWithFadeOut: removeElementWithFadeOut, + isElementRemoved: isElementRemoved, + extendShape: extendShape, + extendPath: extendPath, + registerShape: registerShape, + getShapeClass: getShapeClass, + makePath: makePath, + makeImage: makeImage, + mergePath: mergePath$1, + resizePath: resizePath, + subPixelOptimizeLine: subPixelOptimizeLine$1, + subPixelOptimizeRect: subPixelOptimizeRect$1, + subPixelOptimize: subPixelOptimize$1, + getTransform: getTransform, + applyTransform: applyTransform$1, + transformDirection: transformDirection, + groupTransition: groupTransition, + clipPointsByRect: clipPointsByRect, + clipRectByRect: clipRectByRect, + createIcon: createIcon, + linePolygonIntersect: linePolygonIntersect, + lineLineIntersect: lineLineIntersect, + setTooltipConfig: setTooltipConfig, + traverseElements: traverseElements, + Group: Group, + Image: ZRImage, + Text: ZRText, + Circle: Circle, + Ellipse: Ellipse, + Sector: Sector, + Ring: Ring, + Polygon: Polygon, + Polyline: Polyline, + Rect: Rect, + Line: Line, + BezierCurve: BezierCurve, + Arc: Arc, + IncrementalDisplayable: IncrementalDisplayable, + CompoundPath: CompoundPath, + LinearGradient: LinearGradient, + RadialGradient: RadialGradient, + BoundingRect: BoundingRect, + OrientedBoundingRect: OrientedBoundingRect, + Point: Point, + Path: Path + }); + + var EMPTY_OBJ = {}; + function setLabelText(label, labelTexts) { + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var text = labelTexts[stateName]; + var state = label.ensureState(stateName); + state.style = state.style || {}; + state.style.text = text; + } + + var oldStates = label.currentStates.slice(); + label.clearStates(true); + label.setStyle({ + text: labelTexts.normal + }); + label.useStates(oldStates, true); + } + + function getLabelText(opt, stateModels, interpolatedValue) { + var labelFetcher = opt.labelFetcher; + var labelDataIndex = opt.labelDataIndex; + var labelDimIndex = opt.labelDimIndex; + var normalModel = stateModels.normal; + var baseText; + + if (labelFetcher) { + baseText = labelFetcher.getFormattedLabel(labelDataIndex, 'normal', null, labelDimIndex, normalModel && normalModel.get('formatter'), interpolatedValue != null ? { + interpolatedValue: interpolatedValue + } : null); + } + + if (baseText == null) { + baseText = isFunction(opt.defaultText) ? opt.defaultText(labelDataIndex, opt, interpolatedValue) : opt.defaultText; + } + + var statesText = { + normal: baseText + }; + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var stateModel = stateModels[stateName]; + statesText[stateName] = retrieve2(labelFetcher ? labelFetcher.getFormattedLabel(labelDataIndex, stateName, null, labelDimIndex, stateModel && stateModel.get('formatter')) : null, baseText); + } + + return statesText; + } + + function setLabelStyle(targetEl, labelStatesModels, opt, stateSpecified // TODO specified position? + ) { + opt = opt || EMPTY_OBJ; + var isSetOnText = targetEl instanceof ZRText; + var needsCreateText = false; + + for (var i = 0; i < DISPLAY_STATES.length; i++) { + var stateModel = labelStatesModels[DISPLAY_STATES[i]]; + + if (stateModel && stateModel.getShallow('show')) { + needsCreateText = true; + break; + } + } + + var textContent = isSetOnText ? targetEl : targetEl.getTextContent(); + + if (needsCreateText) { + if (!isSetOnText) { + // Reuse the previous + if (!textContent) { + textContent = new ZRText(); + targetEl.setTextContent(textContent); + } // Use same state proxy + + + if (targetEl.stateProxy) { + textContent.stateProxy = targetEl.stateProxy; + } + } + + var labelStatesTexts = getLabelText(opt, labelStatesModels); + var normalModel = labelStatesModels.normal; + var showNormal = !!normalModel.getShallow('show'); + var normalStyle = createTextStyle(normalModel, stateSpecified && stateSpecified.normal, opt, false, !isSetOnText); + normalStyle.text = labelStatesTexts.normal; + + if (!isSetOnText) { + // Always create new + targetEl.setTextConfig(createTextConfig(normalModel, opt, false)); + } + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var stateModel = labelStatesModels[stateName]; + + if (stateModel) { + var stateObj = textContent.ensureState(stateName); + var stateShow = !!retrieve2(stateModel.getShallow('show'), showNormal); + + if (stateShow !== showNormal) { + stateObj.ignore = !stateShow; + } + + stateObj.style = createTextStyle(stateModel, stateSpecified && stateSpecified[stateName], opt, true, !isSetOnText); + stateObj.style.text = labelStatesTexts[stateName]; + + if (!isSetOnText) { + var targetElEmphasisState = targetEl.ensureState(stateName); + targetElEmphasisState.textConfig = createTextConfig(stateModel, opt, true); + } + } + } // PENDING: if there is many requirements that emphasis position + // need to be different from normal position, we might consider + // auto slient is those cases. + + + textContent.silent = !!normalModel.getShallow('silent'); // Keep x and y + + if (textContent.style.x != null) { + normalStyle.x = textContent.style.x; + } + + if (textContent.style.y != null) { + normalStyle.y = textContent.style.y; + } + + textContent.ignore = !showNormal; // Always create new style. + + textContent.useStyle(normalStyle); + textContent.dirty(); + + if (opt.enableTextSetter) { + labelInner(textContent).setLabelText = function (interpolatedValue) { + var labelStatesTexts = getLabelText(opt, labelStatesModels, interpolatedValue); + setLabelText(textContent, labelStatesTexts); + }; + } + } else if (textContent) { + // Not display rich text. + textContent.ignore = true; + } + + targetEl.dirty(); + } + function getLabelStatesModels(itemModel, labelName) { + labelName = labelName || 'label'; + var statesModels = { + normal: itemModel.getModel(labelName) + }; + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + statesModels[stateName] = itemModel.getModel([stateName, labelName]); + } + + return statesModels; + } + /** + * Set basic textStyle properties. + */ + + function createTextStyle(textStyleModel, specifiedTextStyle, // Fixed style in the code. Can't be set by model. + opt, isNotNormal, isAttached // If text is attached on an element. If so, auto color will handling in zrender. + ) { + var textStyle = {}; + setTextStyleCommon(textStyle, textStyleModel, opt, isNotNormal, isAttached); + specifiedTextStyle && extend(textStyle, specifiedTextStyle); // textStyle.host && textStyle.host.dirty && textStyle.host.dirty(false); + + return textStyle; + } + function createTextConfig(textStyleModel, opt, isNotNormal) { + opt = opt || {}; + var textConfig = {}; + var labelPosition; + var labelRotate = textStyleModel.getShallow('rotate'); + var labelDistance = retrieve2(textStyleModel.getShallow('distance'), isNotNormal ? null : 5); + var labelOffset = textStyleModel.getShallow('offset'); + labelPosition = textStyleModel.getShallow('position') || (isNotNormal ? null : 'inside'); // 'outside' is not a valid zr textPostion value, but used + // in bar series, and magric type should be considered. + + labelPosition === 'outside' && (labelPosition = opt.defaultOutsidePosition || 'top'); + + if (labelPosition != null) { + textConfig.position = labelPosition; + } + + if (labelOffset != null) { + textConfig.offset = labelOffset; + } + + if (labelRotate != null) { + labelRotate *= Math.PI / 180; + textConfig.rotation = labelRotate; + } + + if (labelDistance != null) { + textConfig.distance = labelDistance; + } // fill and auto is determined by the color of path fill if it's not specified by developers. + + + textConfig.outsideFill = textStyleModel.get('color') === 'inherit' ? opt.inheritColor || null : 'auto'; + return textConfig; + } + /** + * The uniform entry of set text style, that is, retrieve style definitions + * from `model` and set to `textStyle` object. + * + * Never in merge mode, but in overwrite mode, that is, all of the text style + * properties will be set. (Consider the states of normal and emphasis and + * default value can be adopted, merge would make the logic too complicated + * to manage.) + */ + + function setTextStyleCommon(textStyle, textStyleModel, opt, isNotNormal, isAttached) { + // Consider there will be abnormal when merge hover style to normal style if given default value. + opt = opt || EMPTY_OBJ; + var ecModel = textStyleModel.ecModel; + var globalTextStyle = ecModel && ecModel.option.textStyle; // Consider case: + // { + // data: [{ + // value: 12, + // label: { + // rich: { + // // no 'a' here but using parent 'a'. + // } + // } + // }], + // rich: { + // a: { ... } + // } + // } + + var richItemNames = getRichItemNames(textStyleModel); + var richResult; + + if (richItemNames) { + richResult = {}; + + for (var name_1 in richItemNames) { + if (richItemNames.hasOwnProperty(name_1)) { + // Cascade is supported in rich. + var richTextStyle = textStyleModel.getModel(['rich', name_1]); // In rich, never `disableBox`. + // FIXME: consider `label: {formatter: '{a|xx}', color: 'blue', rich: {a: {}}}`, + // the default color `'blue'` will not be adopted if no color declared in `rich`. + // That might confuses users. So probably we should put `textStyleModel` as the + // root ancestor of the `richTextStyle`. But that would be a break change. + + setTokenTextStyle(richResult[name_1] = {}, richTextStyle, globalTextStyle, opt, isNotNormal, isAttached, false, true); + } + } + } + + if (richResult) { + textStyle.rich = richResult; + } + + var overflow = textStyleModel.get('overflow'); + + if (overflow) { + textStyle.overflow = overflow; + } + + var margin = textStyleModel.get('minMargin'); + + if (margin != null) { + textStyle.margin = margin; + } + + setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isNotNormal, isAttached, true, false); + } // Consider case: + // { + // data: [{ + // value: 12, + // label: { + // rich: { + // // no 'a' here but using parent 'a'. + // } + // } + // }], + // rich: { + // a: { ... } + // } + // } + // TODO TextStyleModel + + + function getRichItemNames(textStyleModel) { + // Use object to remove duplicated names. + var richItemNameMap; + + while (textStyleModel && textStyleModel !== textStyleModel.ecModel) { + var rich = (textStyleModel.option || EMPTY_OBJ).rich; + + if (rich) { + richItemNameMap = richItemNameMap || {}; + var richKeys = keys(rich); + + for (var i = 0; i < richKeys.length; i++) { + var richKey = richKeys[i]; + richItemNameMap[richKey] = 1; + } + } + + textStyleModel = textStyleModel.parentModel; + } + + return richItemNameMap; + } + + var TEXT_PROPS_WITH_GLOBAL = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'textShadowColor', 'textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY']; + var TEXT_PROPS_SELF = ['align', 'lineHeight', 'width', 'height', 'tag', 'verticalAlign']; + var TEXT_PROPS_BOX = ['padding', 'borderWidth', 'borderRadius', 'borderDashOffset', 'backgroundColor', 'borderColor', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY']; + + function setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isNotNormal, isAttached, isBlock, inRich) { + // In merge mode, default value should not be given. + globalTextStyle = !isNotNormal && globalTextStyle || EMPTY_OBJ; + var inheritColor = opt && opt.inheritColor; + var fillColor = textStyleModel.getShallow('color'); + var strokeColor = textStyleModel.getShallow('textBorderColor'); + var opacity = retrieve2(textStyleModel.getShallow('opacity'), globalTextStyle.opacity); + + if (fillColor === 'inherit' || fillColor === 'auto') { + if ("development" !== 'production') { + if (fillColor === 'auto') { + deprecateReplaceLog('color: \'auto\'', 'color: \'inherit\''); + } + } + + if (inheritColor) { + fillColor = inheritColor; + } else { + fillColor = null; + } + } + + if (strokeColor === 'inherit' || strokeColor === 'auto') { + if ("development" !== 'production') { + if (strokeColor === 'auto') { + deprecateReplaceLog('color: \'auto\'', 'color: \'inherit\''); + } + } + + if (inheritColor) { + strokeColor = inheritColor; + } else { + strokeColor = null; + } + } + + if (!isAttached) { + // Only use default global textStyle.color if text is individual. + // Otherwise it will use the strategy of attached text color because text may be on a path. + fillColor = fillColor || globalTextStyle.color; + strokeColor = strokeColor || globalTextStyle.textBorderColor; + } + + if (fillColor != null) { + textStyle.fill = fillColor; + } + + if (strokeColor != null) { + textStyle.stroke = strokeColor; + } + + var textBorderWidth = retrieve2(textStyleModel.getShallow('textBorderWidth'), globalTextStyle.textBorderWidth); + + if (textBorderWidth != null) { + textStyle.lineWidth = textBorderWidth; + } + + var textBorderType = retrieve2(textStyleModel.getShallow('textBorderType'), globalTextStyle.textBorderType); + + if (textBorderType != null) { + textStyle.lineDash = textBorderType; + } + + var textBorderDashOffset = retrieve2(textStyleModel.getShallow('textBorderDashOffset'), globalTextStyle.textBorderDashOffset); + + if (textBorderDashOffset != null) { + textStyle.lineDashOffset = textBorderDashOffset; + } + + if (!isNotNormal && opacity == null && !inRich) { + opacity = opt && opt.defaultOpacity; + } + + if (opacity != null) { + textStyle.opacity = opacity; + } // TODO + + + if (!isNotNormal && !isAttached) { + // Set default finally. + if (textStyle.fill == null && opt.inheritColor) { + textStyle.fill = opt.inheritColor; + } + } // Do not use `getFont` here, because merge should be supported, where + // part of these properties may be changed in emphasis style, and the + // others should remain their original value got from normal style. + + + for (var i = 0; i < TEXT_PROPS_WITH_GLOBAL.length; i++) { + var key = TEXT_PROPS_WITH_GLOBAL[i]; + var val = retrieve2(textStyleModel.getShallow(key), globalTextStyle[key]); + + if (val != null) { + textStyle[key] = val; + } + } + + for (var i = 0; i < TEXT_PROPS_SELF.length; i++) { + var key = TEXT_PROPS_SELF[i]; + var val = textStyleModel.getShallow(key); + + if (val != null) { + textStyle[key] = val; + } + } + + if (textStyle.verticalAlign == null) { + var baseline = textStyleModel.getShallow('baseline'); + + if (baseline != null) { + textStyle.verticalAlign = baseline; + } + } + + if (!isBlock || !opt.disableBox) { + for (var i = 0; i < TEXT_PROPS_BOX.length; i++) { + var key = TEXT_PROPS_BOX[i]; + var val = textStyleModel.getShallow(key); + + if (val != null) { + textStyle[key] = val; + } + } + + var borderType = textStyleModel.getShallow('borderType'); + + if (borderType != null) { + textStyle.borderDash = borderType; + } + + if ((textStyle.backgroundColor === 'auto' || textStyle.backgroundColor === 'inherit') && inheritColor) { + if ("development" !== 'production') { + if (textStyle.backgroundColor === 'auto') { + deprecateReplaceLog('backgroundColor: \'auto\'', 'backgroundColor: \'inherit\''); + } + } + + textStyle.backgroundColor = inheritColor; + } + + if ((textStyle.borderColor === 'auto' || textStyle.borderColor === 'inherit') && inheritColor) { + if ("development" !== 'production') { + if (textStyle.borderColor === 'auto') { + deprecateReplaceLog('borderColor: \'auto\'', 'borderColor: \'inherit\''); + } + } + + textStyle.borderColor = inheritColor; + } + } + } + + function getFont(opt, ecModel) { + var gTextStyleModel = ecModel && ecModel.getModel('textStyle'); + return trim([// FIXME in node-canvas fontWeight is before fontStyle + opt.fontStyle || gTextStyleModel && gTextStyleModel.getShallow('fontStyle') || '', opt.fontWeight || gTextStyleModel && gTextStyleModel.getShallow('fontWeight') || '', (opt.fontSize || gTextStyleModel && gTextStyleModel.getShallow('fontSize') || 12) + 'px', opt.fontFamily || gTextStyleModel && gTextStyleModel.getShallow('fontFamily') || 'sans-serif'].join(' ')); + } + var labelInner = makeInner(); + function setLabelValueAnimation(label, labelStatesModels, value, getDefaultText) { + if (!label) { + return; + } + + var obj = labelInner(label); + obj.prevValue = obj.value; + obj.value = value; + var normalLabelModel = labelStatesModels.normal; + obj.valueAnimation = normalLabelModel.get('valueAnimation'); + + if (obj.valueAnimation) { + obj.precision = normalLabelModel.get('precision'); + obj.defaultInterpolatedText = getDefaultText; + obj.statesModels = labelStatesModels; + } + } + function animateLabelValue(textEl, dataIndex, data, animatableModel, labelFetcher) { + var labelInnerStore = labelInner(textEl); + + if (!labelInnerStore.valueAnimation || labelInnerStore.prevValue === labelInnerStore.value) { + // Value not changed, no new label animation + return; + } + + var defaultInterpolatedText = labelInnerStore.defaultInterpolatedText; // Consider the case that being animating, do not use the `obj.value`, + // Otherwise it will jump to the `obj.value` when this new animation started. + + var currValue = retrieve2(labelInnerStore.interpolatedValue, labelInnerStore.prevValue); + var targetValue = labelInnerStore.value; + + function during(percent) { + var interpolated = interpolateRawValues(data, labelInnerStore.precision, currValue, targetValue, percent); + labelInnerStore.interpolatedValue = percent === 1 ? null : interpolated; + var labelText = getLabelText({ + labelDataIndex: dataIndex, + labelFetcher: labelFetcher, + defaultText: defaultInterpolatedText ? defaultInterpolatedText(interpolated) : interpolated + '' + }, labelInnerStore.statesModels, interpolated); + setLabelText(textEl, labelText); + } + + textEl.percent = 0; + (labelInnerStore.prevValue == null ? initProps : updateProps)(textEl, { + // percent is used to prevent animation from being aborted #15916 + percent: 1 + }, animatableModel, dataIndex, null, during); + } + + var PATH_COLOR = ['textStyle', 'color']; + var textStyleParams = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'padding', 'lineHeight', 'rich', 'width', 'height', 'overflow']; // TODO Performance improvement? + + var tmpText = new ZRText(); + + var TextStyleMixin = + /** @class */ + function () { + function TextStyleMixin() {} + /** + * Get color property or get color from option.textStyle.color + */ + // TODO Callback + + + TextStyleMixin.prototype.getTextColor = function (isEmphasis) { + var ecModel = this.ecModel; + return this.getShallow('color') || (!isEmphasis && ecModel ? ecModel.get(PATH_COLOR) : null); + }; + /** + * Create font string from fontStyle, fontWeight, fontSize, fontFamily + * @return {string} + */ + + + TextStyleMixin.prototype.getFont = function () { + return getFont({ + fontStyle: this.getShallow('fontStyle'), + fontWeight: this.getShallow('fontWeight'), + fontSize: this.getShallow('fontSize'), + fontFamily: this.getShallow('fontFamily') + }, this.ecModel); + }; + + TextStyleMixin.prototype.getTextRect = function (text) { + var style = { + text: text, + verticalAlign: this.getShallow('verticalAlign') || this.getShallow('baseline') + }; + + for (var i = 0; i < textStyleParams.length; i++) { + style[textStyleParams[i]] = this.getShallow(textStyleParams[i]); + } + + tmpText.useStyle(style); + tmpText.update(); + return tmpText.getBoundingRect(); + }; + + return TextStyleMixin; + }(); + + var LINE_STYLE_KEY_MAP = [['lineWidth', 'width'], ['stroke', 'color'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'], ['lineDash', 'type'], ['lineDashOffset', 'dashOffset'], ['lineCap', 'cap'], ['lineJoin', 'join'], ['miterLimit'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ]; + var getLineStyle = makeStyleMapper(LINE_STYLE_KEY_MAP); + + var LineStyleMixin = + /** @class */ + function () { + function LineStyleMixin() {} + + LineStyleMixin.prototype.getLineStyle = function (excludes) { + return getLineStyle(this, excludes); + }; + + return LineStyleMixin; + }(); + + var ITEM_STYLE_KEY_MAP = [['fill', 'color'], ['stroke', 'borderColor'], ['lineWidth', 'borderWidth'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'], ['lineDash', 'borderType'], ['lineDashOffset', 'borderDashOffset'], ['lineCap', 'borderCap'], ['lineJoin', 'borderJoin'], ['miterLimit', 'borderMiterLimit'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ]; + var getItemStyle = makeStyleMapper(ITEM_STYLE_KEY_MAP); + + var ItemStyleMixin = + /** @class */ + function () { + function ItemStyleMixin() {} + + ItemStyleMixin.prototype.getItemStyle = function (excludes, includes) { + return getItemStyle(this, excludes, includes); + }; + + return ItemStyleMixin; + }(); + + var Model = + /** @class */ + function () { + function Model(option, parentModel, ecModel) { + this.parentModel = parentModel; + this.ecModel = ecModel; + this.option = option; // Simple optimization + // if (this.init) { + // if (arguments.length <= 4) { + // this.init(option, parentModel, ecModel, extraOpt); + // } + // else { + // this.init.apply(this, arguments); + // } + // } + } + + Model.prototype.init = function (option, parentModel, ecModel) { + var rest = []; + + for (var _i = 3; _i < arguments.length; _i++) { + rest[_i - 3] = arguments[_i]; + } + }; + /** + * Merge the input option to me. + */ + + + Model.prototype.mergeOption = function (option, ecModel) { + merge(this.option, option, true); + }; // `path` can be 'a.b.c', so the return value type have to be `ModelOption` + // TODO: TYPE strict key check? + // get(path: string | string[], ignoreParent?: boolean): ModelOption; + + + Model.prototype.get = function (path, ignoreParent) { + if (path == null) { + return this.option; + } + + return this._doGet(this.parsePath(path), !ignoreParent && this.parentModel); + }; + + Model.prototype.getShallow = function (key, ignoreParent) { + var option = this.option; + var val = option == null ? option : option[key]; + + if (val == null && !ignoreParent) { + var parentModel = this.parentModel; + + if (parentModel) { + // FIXME:TS do not know how to make it works + val = parentModel.getShallow(key); + } + } + + return val; + }; // `path` can be 'a.b.c', so the return value type have to be `Model<ModelOption>` + // getModel(path: string | string[], parentModel?: Model): Model; + // TODO 'a.b.c' is deprecated + + + Model.prototype.getModel = function (path, parentModel) { + var hasPath = path != null; + var pathFinal = hasPath ? this.parsePath(path) : null; + var obj = hasPath ? this._doGet(pathFinal) : this.option; + parentModel = parentModel || this.parentModel && this.parentModel.getModel(this.resolveParentPath(pathFinal)); + return new Model(obj, parentModel, this.ecModel); + }; + /** + * If model has option + */ + + + Model.prototype.isEmpty = function () { + return this.option == null; + }; + + Model.prototype.restoreData = function () {}; // Pending + + + Model.prototype.clone = function () { + var Ctor = this.constructor; + return new Ctor(clone(this.option)); + }; // setReadOnly(properties): void { + // clazzUtil.setReadOnly(this, properties); + // } + // If path is null/undefined, return null/undefined. + + + Model.prototype.parsePath = function (path) { + if (typeof path === 'string') { + return path.split('.'); + } + + return path; + }; // Resolve path for parent. Perhaps useful when parent use a different property. + // Default to be a identity resolver. + // Can be modified to a different resolver. + + + Model.prototype.resolveParentPath = function (path) { + return path; + }; // FIXME:TS check whether put this method here + + + Model.prototype.isAnimationEnabled = function () { + if (!env.node && this.option) { + if (this.option.animation != null) { + return !!this.option.animation; + } else if (this.parentModel) { + return this.parentModel.isAnimationEnabled(); + } + } + }; + + Model.prototype._doGet = function (pathArr, parentModel) { + var obj = this.option; + + if (!pathArr) { + return obj; + } + + for (var i = 0; i < pathArr.length; i++) { + // Ignore empty + if (!pathArr[i]) { + continue; + } // obj could be number/string/... (like 0) + + + obj = obj && typeof obj === 'object' ? obj[pathArr[i]] : null; + + if (obj == null) { + break; + } + } + + if (obj == null && parentModel) { + obj = parentModel._doGet(this.resolveParentPath(pathArr), parentModel.parentModel); + } + + return obj; + }; + + return Model; + }(); + + enableClassExtend(Model); + enableClassCheck(Model); + mixin(Model, LineStyleMixin); + mixin(Model, ItemStyleMixin); + mixin(Model, AreaStyleMixin); + mixin(Model, TextStyleMixin); + + var base = Math.round(Math.random() * 10); + /** + * @public + * @param {string} type + * @return {string} + */ + + function getUID(type) { + // Considering the case of crossing js context, + // use Math.random to make id as unique as possible. + return [type || '', base++].join('_'); + } + /** + * Implements `SubTypeDefaulterManager` for `target`. + */ + + function enableSubTypeDefaulter(target) { + var subTypeDefaulters = {}; + + target.registerSubTypeDefaulter = function (componentType, defaulter) { + var componentTypeInfo = parseClassType(componentType); + subTypeDefaulters[componentTypeInfo.main] = defaulter; + }; + + target.determineSubType = function (componentType, option) { + var type = option.type; + + if (!type) { + var componentTypeMain = parseClassType(componentType).main; + + if (target.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) { + type = subTypeDefaulters[componentTypeMain](option); + } + } + + return type; + }; + } + /** + * Implements `TopologicalTravelable<any>` for `entity`. + * + * Topological travel on Activity Network (Activity On Vertices). + * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis']. + * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology. + * If there is circular dependencey, Error will be thrown. + */ + + function enableTopologicalTravel(entity, dependencyGetter) { + /** + * @param targetNameList Target Component type list. + * Can be ['aa', 'bb', 'aa.xx'] + * @param fullNameList By which we can build dependency graph. + * @param callback Params: componentType, dependencies. + * @param context Scope of callback. + */ + entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) { + if (!targetNameList.length) { + return; + } + + var result = makeDepndencyGraph(fullNameList); + var graph = result.graph; + var noEntryList = result.noEntryList; + var targetNameSet = {}; + each(targetNameList, function (name) { + targetNameSet[name] = true; + }); + + while (noEntryList.length) { + var currComponentType = noEntryList.pop(); + var currVertex = graph[currComponentType]; + var isInTargetNameSet = !!targetNameSet[currComponentType]; + + if (isInTargetNameSet) { + callback.call(context, currComponentType, currVertex.originalDeps.slice()); + delete targetNameSet[currComponentType]; + } + + each(currVertex.successor, isInTargetNameSet ? removeEdgeAndAdd : removeEdge); + } + + each(targetNameSet, function () { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('Circular dependency may exists: ', targetNameSet, targetNameList, fullNameList); + } + + throw new Error(errMsg); + }); + + function removeEdge(succComponentType) { + graph[succComponentType].entryCount--; + + if (graph[succComponentType].entryCount === 0) { + noEntryList.push(succComponentType); + } + } // Consider this case: legend depends on series, and we call + // chart.setOption({series: [...]}), where only series is in option. + // If we do not have 'removeEdgeAndAdd', legendModel.mergeOption will + // not be called, but only sereis.mergeOption is called. Thus legend + // have no chance to update its local record about series (like which + // name of series is available in legend). + + + function removeEdgeAndAdd(succComponentType) { + targetNameSet[succComponentType] = true; + removeEdge(succComponentType); + } + }; + + function makeDepndencyGraph(fullNameList) { + var graph = {}; + var noEntryList = []; + each(fullNameList, function (name) { + var thisItem = createDependencyGraphItem(graph, name); + var originalDeps = thisItem.originalDeps = dependencyGetter(name); + var availableDeps = getAvailableDependencies(originalDeps, fullNameList); + thisItem.entryCount = availableDeps.length; + + if (thisItem.entryCount === 0) { + noEntryList.push(name); + } + + each(availableDeps, function (dependentName) { + if (indexOf(thisItem.predecessor, dependentName) < 0) { + thisItem.predecessor.push(dependentName); + } + + var thatItem = createDependencyGraphItem(graph, dependentName); + + if (indexOf(thatItem.successor, dependentName) < 0) { + thatItem.successor.push(name); + } + }); + }); + return { + graph: graph, + noEntryList: noEntryList + }; + } + + function createDependencyGraphItem(graph, name) { + if (!graph[name]) { + graph[name] = { + predecessor: [], + successor: [] + }; + } + + return graph[name]; + } + + function getAvailableDependencies(originalDeps, fullNameList) { + var availableDeps = []; + each(originalDeps, function (dep) { + indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep); + }); + return availableDeps; + } + } + function inheritDefaultOption(superOption, subOption) { + // See also `model/Component.ts#getDefaultOption` + return merge(merge({}, superOption, true), subOption, true); + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + + /** + * Language: English. + */ + var langEN = { + time: { + month: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + monthAbbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayOfWeek: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + dayOfWeekAbbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] + }, + legend: { + selector: { + all: 'All', + inverse: 'Inv' + } + }, + toolbox: { + brush: { + title: { + rect: 'Box Select', + polygon: 'Lasso Select', + lineX: 'Horizontally Select', + lineY: 'Vertically Select', + keep: 'Keep Selections', + clear: 'Clear Selections' + } + }, + dataView: { + title: 'Data View', + lang: ['Data View', 'Close', 'Refresh'] + }, + dataZoom: { + title: { + zoom: 'Zoom', + back: 'Zoom Reset' + } + }, + magicType: { + title: { + line: 'Switch to Line Chart', + bar: 'Switch to Bar Chart', + stack: 'Stack', + tiled: 'Tile' + } + }, + restore: { + title: 'Restore' + }, + saveAsImage: { + title: 'Save as Image', + lang: ['Right Click to Save Image'] + } + }, + series: { + typeNames: { + pie: 'Pie chart', + bar: 'Bar chart', + line: 'Line chart', + scatter: 'Scatter plot', + effectScatter: 'Ripple scatter plot', + radar: 'Radar chart', + tree: 'Tree', + treemap: 'Treemap', + boxplot: 'Boxplot', + candlestick: 'Candlestick', + k: 'K line chart', + heatmap: 'Heat map', + map: 'Map', + parallel: 'Parallel coordinate map', + lines: 'Line graph', + graph: 'Relationship graph', + sankey: 'Sankey diagram', + funnel: 'Funnel chart', + gauge: 'Gauge', + pictorialBar: 'Pictorial bar', + themeRiver: 'Theme River Map', + sunburst: 'Sunburst' + } + }, + aria: { + general: { + withTitle: 'This is a chart about "{title}"', + withoutTitle: 'This is a chart' + }, + series: { + single: { + prefix: '', + withName: ' with type {seriesType} named {seriesName}.', + withoutName: ' with type {seriesType}.' + }, + multiple: { + prefix: '. It consists of {seriesCount} series count.', + withName: ' The {seriesId} series is a {seriesType} representing {seriesName}.', + withoutName: ' The {seriesId} series is a {seriesType}.', + separator: { + middle: '', + end: '' + } + } + }, + data: { + allData: 'The data is as follows: ', + partialData: 'The first {displayCnt} items are: ', + withName: 'the data for {name} is {value}', + withoutName: '{value}', + separator: { + middle: ', ', + end: '. ' + } + } + } + }; + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + var langZH = { + time: { + month: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], + monthAbbr: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], + dayOfWeek: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], + dayOfWeekAbbr: ['日', '一', '二', '三', '四', '五', '六'] + }, + legend: { + selector: { + all: '全选', + inverse: '反选' + } + }, + toolbox: { + brush: { + title: { + rect: '矩形选择', + polygon: '圈选', + lineX: '横向选择', + lineY: '纵向选择', + keep: '保持选择', + clear: '清除选择' + } + }, + dataView: { + title: '数据视图', + lang: ['数据视图', '关闭', '刷新'] + }, + dataZoom: { + title: { + zoom: '区域缩放', + back: '区域缩放还原' + } + }, + magicType: { + title: { + line: '切换为折线图', + bar: '切换为柱状图', + stack: '切换为堆叠', + tiled: '切换为平铺' + } + }, + restore: { + title: '还原' + }, + saveAsImage: { + title: '保存为图片', + lang: ['右键另存为图片'] + } + }, + series: { + typeNames: { + pie: '饼图', + bar: '柱状图', + line: '折线图', + scatter: '散点图', + effectScatter: '涟漪散点图', + radar: '雷达图', + tree: '树图', + treemap: '矩形树图', + boxplot: '箱型图', + candlestick: 'K线图', + k: 'K线图', + heatmap: '热力图', + map: '地图', + parallel: '平行坐标图', + lines: '线图', + graph: '关系图', + sankey: '桑基图', + funnel: '漏斗图', + gauge: '仪表盘图', + pictorialBar: '象形柱图', + themeRiver: '主题河流图', + sunburst: '旭日图' + } + }, + aria: { + general: { + withTitle: '这是一个关于“{title}”的图表。', + withoutTitle: '这是一个图表,' + }, + series: { + single: { + prefix: '', + withName: '图表类型是{seriesType},表示{seriesName}。', + withoutName: '图表类型是{seriesType}。' + }, + multiple: { + prefix: '它由{seriesCount}个图表系列组成。', + withName: '第{seriesId}个系列是一个表示{seriesName}的{seriesType},', + withoutName: '第{seriesId}个系列是一个{seriesType},', + separator: { + middle: ';', + end: '。' + } + } + }, + data: { + allData: '其数据是——', + partialData: '其中,前{displayCnt}项是——', + withName: '{name}的数据是{value}', + withoutName: '{value}', + separator: { + middle: ',', + end: '' + } + } + } + }; + + var LOCALE_ZH = 'ZH'; + var LOCALE_EN = 'EN'; + var DEFAULT_LOCALE = LOCALE_EN; + var localeStorage = {}; + var localeModels = {}; + var SYSTEM_LANG = !env.domSupported ? DEFAULT_LOCALE : function () { + var langStr = ( + /* eslint-disable-next-line */ + document.documentElement.lang || navigator.language || navigator.browserLanguage).toUpperCase(); + return langStr.indexOf(LOCALE_ZH) > -1 ? LOCALE_ZH : DEFAULT_LOCALE; + }(); + function registerLocale(locale, localeObj) { + locale = locale.toUpperCase(); + localeModels[locale] = new Model(localeObj); + localeStorage[locale] = localeObj; + } // export function getLocale(locale: string) { + // return localeStorage[locale]; + // } + + function createLocaleObject(locale) { + if (isString(locale)) { + var localeObj = localeStorage[locale.toUpperCase()] || {}; + + if (locale === LOCALE_ZH || locale === LOCALE_EN) { + return clone(localeObj); + } else { + return merge(clone(localeObj), clone(localeStorage[DEFAULT_LOCALE]), false); + } + } else { + return merge(clone(locale), clone(localeStorage[DEFAULT_LOCALE]), false); + } + } + function getLocaleModel(lang) { + return localeModels[lang]; + } + function getDefaultLocaleModel() { + return localeModels[DEFAULT_LOCALE]; + } // Default locale + + registerLocale(LOCALE_EN, langEN); + registerLocale(LOCALE_ZH, langZH); + + var ONE_SECOND = 1000; + var ONE_MINUTE = ONE_SECOND * 60; + var ONE_HOUR = ONE_MINUTE * 60; + var ONE_DAY = ONE_HOUR * 24; + var ONE_YEAR = ONE_DAY * 365; + var defaultLeveledFormatter = { + year: '{yyyy}', + month: '{MMM}', + day: '{d}', + hour: '{HH}:{mm}', + minute: '{HH}:{mm}', + second: '{HH}:{mm}:{ss}', + millisecond: '{HH}:{mm}:{ss} {SSS}', + none: '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}' + }; + var fullDayFormatter = '{yyyy}-{MM}-{dd}'; + var fullLeveledFormatter = { + year: '{yyyy}', + month: '{yyyy}-{MM}', + day: fullDayFormatter, + hour: fullDayFormatter + ' ' + defaultLeveledFormatter.hour, + minute: fullDayFormatter + ' ' + defaultLeveledFormatter.minute, + second: fullDayFormatter + ' ' + defaultLeveledFormatter.second, + millisecond: defaultLeveledFormatter.none + }; + var primaryTimeUnits = ['year', 'month', 'day', 'hour', 'minute', 'second', 'millisecond']; + var timeUnits = ['year', 'half-year', 'quarter', 'month', 'week', 'half-week', 'day', 'half-day', 'quarter-day', 'hour', 'minute', 'second', 'millisecond']; + function pad(str, len) { + str += ''; + return '0000'.substr(0, len - str.length) + str; + } + function getPrimaryTimeUnit(timeUnit) { + switch (timeUnit) { + case 'half-year': + case 'quarter': + return 'month'; + + case 'week': + case 'half-week': + return 'day'; + + case 'half-day': + case 'quarter-day': + return 'hour'; + + default: + // year, minutes, second, milliseconds + return timeUnit; + } + } + function isPrimaryTimeUnit(timeUnit) { + return timeUnit === getPrimaryTimeUnit(timeUnit); + } + function getDefaultFormatPrecisionOfInterval(timeUnit) { + switch (timeUnit) { + case 'year': + case 'month': + return 'day'; + + case 'millisecond': + return 'millisecond'; + + default: + // Also for day, hour, minute, second + return 'second'; + } + } + function format( // Note: The result based on `isUTC` are totally different, which can not be just simply + // substituted by the result without `isUTC`. So we make the param `isUTC` mandatory. + time, template, isUTC, lang) { + var date = parseDate(time); + var y = date[fullYearGetterName(isUTC)](); + var M = date[monthGetterName(isUTC)]() + 1; + var q = Math.floor((M - 1) / 3) + 1; + var d = date[dateGetterName(isUTC)](); + var e = date['get' + (isUTC ? 'UTC' : '') + 'Day'](); + var H = date[hoursGetterName(isUTC)](); + var h = (H - 1) % 12 + 1; + var m = date[minutesGetterName(isUTC)](); + var s = date[secondsGetterName(isUTC)](); + var S = date[millisecondsGetterName(isUTC)](); + var localeModel = lang instanceof Model ? lang : getLocaleModel(lang || SYSTEM_LANG) || getDefaultLocaleModel(); + var timeModel = localeModel.getModel('time'); + var month = timeModel.get('month'); + var monthAbbr = timeModel.get('monthAbbr'); + var dayOfWeek = timeModel.get('dayOfWeek'); + var dayOfWeekAbbr = timeModel.get('dayOfWeekAbbr'); + return (template || '').replace(/{yyyy}/g, y + '').replace(/{yy}/g, y % 100 + '').replace(/{Q}/g, q + '').replace(/{MMMM}/g, month[M - 1]).replace(/{MMM}/g, monthAbbr[M - 1]).replace(/{MM}/g, pad(M, 2)).replace(/{M}/g, M + '').replace(/{dd}/g, pad(d, 2)).replace(/{d}/g, d + '').replace(/{eeee}/g, dayOfWeek[e]).replace(/{ee}/g, dayOfWeekAbbr[e]).replace(/{e}/g, e + '').replace(/{HH}/g, pad(H, 2)).replace(/{H}/g, H + '').replace(/{hh}/g, pad(h + '', 2)).replace(/{h}/g, h + '').replace(/{mm}/g, pad(m, 2)).replace(/{m}/g, m + '').replace(/{ss}/g, pad(s, 2)).replace(/{s}/g, s + '').replace(/{SSS}/g, pad(S, 3)).replace(/{S}/g, S + ''); + } + function leveledFormat(tick, idx, formatter, lang, isUTC) { + var template = null; + + if (isString(formatter)) { + // Single formatter for all units at all levels + template = formatter; + } else if (isFunction(formatter)) { + // Callback formatter + template = formatter(tick.value, idx, { + level: tick.level + }); + } else { + var defaults$1 = extend({}, defaultLeveledFormatter); + + if (tick.level > 0) { + for (var i = 0; i < primaryTimeUnits.length; ++i) { + defaults$1[primaryTimeUnits[i]] = "{primary|" + defaults$1[primaryTimeUnits[i]] + "}"; + } + } + + var mergedFormatter = formatter ? formatter.inherit === false ? formatter // Use formatter with bigger units + : defaults(formatter, defaults$1) : defaults$1; + var unit = getUnitFromValue(tick.value, isUTC); + + if (mergedFormatter[unit]) { + template = mergedFormatter[unit]; + } else if (mergedFormatter.inherit) { + // Unit formatter is not defined and should inherit from bigger units + var targetId = timeUnits.indexOf(unit); + + for (var i = targetId - 1; i >= 0; --i) { + if (mergedFormatter[unit]) { + template = mergedFormatter[unit]; + break; + } + } + + template = template || defaults$1.none; + } + + if (isArray(template)) { + var levelId = tick.level == null ? 0 : tick.level >= 0 ? tick.level : template.length + tick.level; + levelId = Math.min(levelId, template.length - 1); + template = template[levelId]; + } + } + + return format(new Date(tick.value), template, isUTC, lang); + } + function getUnitFromValue(value, isUTC) { + var date = parseDate(value); + var M = date[monthGetterName(isUTC)]() + 1; + var d = date[dateGetterName(isUTC)](); + var h = date[hoursGetterName(isUTC)](); + var m = date[minutesGetterName(isUTC)](); + var s = date[secondsGetterName(isUTC)](); + var S = date[millisecondsGetterName(isUTC)](); + var isSecond = S === 0; + var isMinute = isSecond && s === 0; + var isHour = isMinute && m === 0; + var isDay = isHour && h === 0; + var isMonth = isDay && d === 1; + var isYear = isMonth && M === 1; + + if (isYear) { + return 'year'; + } else if (isMonth) { + return 'month'; + } else if (isDay) { + return 'day'; + } else if (isHour) { + return 'hour'; + } else if (isMinute) { + return 'minute'; + } else if (isSecond) { + return 'second'; + } else { + return 'millisecond'; + } + } + function getUnitValue(value, unit, isUTC) { + var date = isNumber(value) ? parseDate(value) : value; + unit = unit || getUnitFromValue(value, isUTC); + + switch (unit) { + case 'year': + return date[fullYearGetterName(isUTC)](); + + case 'half-year': + return date[monthGetterName(isUTC)]() >= 6 ? 1 : 0; + + case 'quarter': + return Math.floor((date[monthGetterName(isUTC)]() + 1) / 4); + + case 'month': + return date[monthGetterName(isUTC)](); + + case 'day': + return date[dateGetterName(isUTC)](); + + case 'half-day': + return date[hoursGetterName(isUTC)]() / 24; + + case 'hour': + return date[hoursGetterName(isUTC)](); + + case 'minute': + return date[minutesGetterName(isUTC)](); + + case 'second': + return date[secondsGetterName(isUTC)](); + + case 'millisecond': + return date[millisecondsGetterName(isUTC)](); + } + } + function fullYearGetterName(isUTC) { + return isUTC ? 'getUTCFullYear' : 'getFullYear'; + } + function monthGetterName(isUTC) { + return isUTC ? 'getUTCMonth' : 'getMonth'; + } + function dateGetterName(isUTC) { + return isUTC ? 'getUTCDate' : 'getDate'; + } + function hoursGetterName(isUTC) { + return isUTC ? 'getUTCHours' : 'getHours'; + } + function minutesGetterName(isUTC) { + return isUTC ? 'getUTCMinutes' : 'getMinutes'; + } + function secondsGetterName(isUTC) { + return isUTC ? 'getUTCSeconds' : 'getSeconds'; + } + function millisecondsGetterName(isUTC) { + return isUTC ? 'getUTCMilliseconds' : 'getMilliseconds'; + } + function fullYearSetterName(isUTC) { + return isUTC ? 'setUTCFullYear' : 'setFullYear'; + } + function monthSetterName(isUTC) { + return isUTC ? 'setUTCMonth' : 'setMonth'; + } + function dateSetterName(isUTC) { + return isUTC ? 'setUTCDate' : 'setDate'; + } + function hoursSetterName(isUTC) { + return isUTC ? 'setUTCHours' : 'setHours'; + } + function minutesSetterName(isUTC) { + return isUTC ? 'setUTCMinutes' : 'setMinutes'; + } + function secondsSetterName(isUTC) { + return isUTC ? 'setUTCSeconds' : 'setSeconds'; + } + function millisecondsSetterName(isUTC) { + return isUTC ? 'setUTCMilliseconds' : 'setMilliseconds'; + } + + function getTextRect(text, font, align, verticalAlign, padding, rich, truncate, lineHeight) { + var textEl = new ZRText({ + style: { + text: text, + font: font, + align: align, + verticalAlign: verticalAlign, + padding: padding, + rich: rich, + overflow: truncate ? 'truncate' : null, + lineHeight: lineHeight + } + }); + return textEl.getBoundingRect(); + } + + /** + * Add a comma each three digit. + */ + + function addCommas(x) { + if (!isNumeric(x)) { + return isString(x) ? x : '-'; + } + + var parts = (x + '').split('.'); + return parts[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g, '$1,') + (parts.length > 1 ? '.' + parts[1] : ''); + } + function toCamelCase(str, upperCaseFirst) { + str = (str || '').toLowerCase().replace(/-(.)/g, function (match, group1) { + return group1.toUpperCase(); + }); + + if (upperCaseFirst && str) { + str = str.charAt(0).toUpperCase() + str.slice(1); + } + + return str; + } + var normalizeCssArray$1 = normalizeCssArray; + var replaceReg = /([&<>"'])/g; + var replaceMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''' + }; + function encodeHTML(source) { + return source == null ? '' : (source + '').replace(replaceReg, function (str, c) { + return replaceMap[c]; + }); + } + /** + * Make value user readable for tooltip and label. + * "User readable": + * Try to not print programmer-specific text like NaN, Infinity, null, undefined. + * Avoid to display an empty string, which users can not recognize there is + * a value and it might look like a bug. + */ + + function makeValueReadable(value, valueType, useUTC) { + var USER_READABLE_DEFUALT_TIME_PATTERN = '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}'; + + function stringToUserReadable(str) { + return str && trim(str) ? str : '-'; + } + + function isNumberUserReadable(num) { + return !!(num != null && !isNaN(num) && isFinite(num)); + } + + var isTypeTime = valueType === 'time'; + var isValueDate = value instanceof Date; + + if (isTypeTime || isValueDate) { + var date = isTypeTime ? parseDate(value) : value; + + if (!isNaN(+date)) { + return format(date, USER_READABLE_DEFUALT_TIME_PATTERN, useUTC); + } else if (isValueDate) { + return '-'; + } // In other cases, continue to try to display the value in the following code. + + } + + if (valueType === 'ordinal') { + return isStringSafe(value) ? stringToUserReadable(value) : isNumber(value) ? isNumberUserReadable(value) ? value + '' : '-' : '-'; + } // By default. + + + var numericResult = numericToNumber(value); + return isNumberUserReadable(numericResult) ? addCommas(numericResult) : isStringSafe(value) ? stringToUserReadable(value) : typeof value === 'boolean' ? value + '' : '-'; + } + var TPL_VAR_ALIAS = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; + + var wrapVar = function (varName, seriesIdx) { + return '{' + varName + (seriesIdx == null ? '' : seriesIdx) + '}'; + }; + /** + * Template formatter + * @param {Array.<Object>|Object} paramsList + */ + + + function formatTpl(tpl, paramsList, encode) { + if (!isArray(paramsList)) { + paramsList = [paramsList]; + } + + var seriesLen = paramsList.length; + + if (!seriesLen) { + return ''; + } + + var $vars = paramsList[0].$vars || []; + + for (var i = 0; i < $vars.length; i++) { + var alias = TPL_VAR_ALIAS[i]; + tpl = tpl.replace(wrapVar(alias), wrapVar(alias, 0)); + } + + for (var seriesIdx = 0; seriesIdx < seriesLen; seriesIdx++) { + for (var k = 0; k < $vars.length; k++) { + var val = paramsList[seriesIdx][$vars[k]]; + tpl = tpl.replace(wrapVar(TPL_VAR_ALIAS[k], seriesIdx), encode ? encodeHTML(val) : val); + } + } + + return tpl; + } + /** + * simple Template formatter + */ + + function formatTplSimple(tpl, param, encode) { + each(param, function (value, key) { + tpl = tpl.replace('{' + key + '}', encode ? encodeHTML(value) : value); + }); + return tpl; + } + function getTooltipMarker(inOpt, extraCssText) { + var opt = isString(inOpt) ? { + color: inOpt, + extraCssText: extraCssText + } : inOpt || {}; + var color = opt.color; + var type = opt.type; + extraCssText = opt.extraCssText; + var renderMode = opt.renderMode || 'html'; + + if (!color) { + return ''; + } + + if (renderMode === 'html') { + return type === 'subItem' ? '<span style="display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;' + 'border-radius:4px;width:4px;height:4px;background-color:' // Only support string + + encodeHTML(color) + ';' + (extraCssText || '') + '"></span>' : '<span style="display:inline-block;margin-right:4px;' + 'border-radius:10px;width:10px;height:10px;background-color:' + encodeHTML(color) + ';' + (extraCssText || '') + '"></span>'; + } else { + // Should better not to auto generate style name by auto-increment number here. + // Because this util is usually called in tooltip formatter, which is probably + // called repeatly when mouse move and the auto-increment number increases fast. + // Users can make their own style name by theirselves, make it unique and readable. + var markerId = opt.markerId || 'markerX'; + return { + renderMode: renderMode, + content: '{' + markerId + '|} ', + style: type === 'subItem' ? { + width: 4, + height: 4, + borderRadius: 2, + backgroundColor: color + } : { + width: 10, + height: 10, + borderRadius: 5, + backgroundColor: color + } + }; + } + } + /** + * @deprecated Use `time/format` instead. + * ISO Date format + * @param {string} tpl + * @param {number} value + * @param {boolean} [isUTC=false] Default in local time. + * see `module:echarts/scale/Time` + * and `module:echarts/util/number#parseDate`. + * @inner + */ + + function formatTime(tpl, value, isUTC) { + if ("development" !== 'production') { + deprecateReplaceLog('echarts.format.formatTime', 'echarts.time.format'); + } + + if (tpl === 'week' || tpl === 'month' || tpl === 'quarter' || tpl === 'half-year' || tpl === 'year') { + tpl = 'MM-dd\nyyyy'; + } + + var date = parseDate(value); + var getUTC = isUTC ? 'getUTC' : 'get'; + var y = date[getUTC + 'FullYear'](); + var M = date[getUTC + 'Month']() + 1; + var d = date[getUTC + 'Date'](); + var h = date[getUTC + 'Hours'](); + var m = date[getUTC + 'Minutes'](); + var s = date[getUTC + 'Seconds'](); + var S = date[getUTC + 'Milliseconds'](); + tpl = tpl.replace('MM', pad(M, 2)).replace('M', M).replace('yyyy', y).replace('yy', pad(y % 100 + '', 2)).replace('dd', pad(d, 2)).replace('d', d).replace('hh', pad(h, 2)).replace('h', h).replace('mm', pad(m, 2)).replace('m', m).replace('ss', pad(s, 2)).replace('s', s).replace('SSS', pad(S, 3)); + return tpl; + } + /** + * Capital first + * @param {string} str + * @return {string} + */ + + function capitalFirst(str) { + return str ? str.charAt(0).toUpperCase() + str.substr(1) : str; + } + /** + * @return Never be null/undefined. + */ + + function convertToColorString(color, defaultColor) { + defaultColor = defaultColor || 'transparent'; + return isString(color) ? color : isObject(color) ? color.colorStops && (color.colorStops[0] || {}).color || defaultColor : defaultColor; + } + /** + * open new tab + * @param link url + * @param target blank or self + */ + + function windowOpen(link, target) { + /* global window */ + if (target === '_blank' || target === 'blank') { + var blank = window.open(); + blank.opener = null; + blank.location.href = link; + } else { + window.open(link, target); + } + } + + var each$1 = each; + /** + * @public + */ + + var LOCATION_PARAMS = ['left', 'right', 'top', 'bottom', 'width', 'height']; + /** + * @public + */ + + var HV_NAMES = [['width', 'left', 'right'], ['height', 'top', 'bottom']]; + + function boxLayout(orient, group, gap, maxWidth, maxHeight) { + var x = 0; + var y = 0; + + if (maxWidth == null) { + maxWidth = Infinity; + } + + if (maxHeight == null) { + maxHeight = Infinity; + } + + var currentLineMaxSize = 0; + group.eachChild(function (child, idx) { + var rect = child.getBoundingRect(); + var nextChild = group.childAt(idx + 1); + var nextChildRect = nextChild && nextChild.getBoundingRect(); + var nextX; + var nextY; + + if (orient === 'horizontal') { + var moveX = rect.width + (nextChildRect ? -nextChildRect.x + rect.x : 0); + nextX = x + moveX; // Wrap when width exceeds maxWidth or meet a `newline` group + // FIXME compare before adding gap? + + if (nextX > maxWidth || child.newline) { + x = 0; + nextX = moveX; + y += currentLineMaxSize + gap; + currentLineMaxSize = rect.height; + } else { + // FIXME: consider rect.y is not `0`? + currentLineMaxSize = Math.max(currentLineMaxSize, rect.height); + } + } else { + var moveY = rect.height + (nextChildRect ? -nextChildRect.y + rect.y : 0); + nextY = y + moveY; // Wrap when width exceeds maxHeight or meet a `newline` group + + if (nextY > maxHeight || child.newline) { + x += currentLineMaxSize + gap; + y = 0; + nextY = moveY; + currentLineMaxSize = rect.width; + } else { + currentLineMaxSize = Math.max(currentLineMaxSize, rect.width); + } + } + + if (child.newline) { + return; + } + + child.x = x; + child.y = y; + child.markRedraw(); + orient === 'horizontal' ? x = nextX + gap : y = nextY + gap; + }); + } + /** + * VBox or HBox layouting + * @param {string} orient + * @param {module:zrender/graphic/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + + + var box = boxLayout; + /** + * VBox layouting + * @param {module:zrender/graphic/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + + var vbox = curry(boxLayout, 'vertical'); + /** + * HBox layouting + * @param {module:zrender/graphic/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + + var hbox = curry(boxLayout, 'horizontal'); + /** + * If x or x2 is not specified or 'center' 'left' 'right', + * the width would be as long as possible. + * If y or y2 is not specified or 'middle' 'top' 'bottom', + * the height would be as long as possible. + */ + + function getAvailableSize(positionInfo, containerRect, margin) { + var containerWidth = containerRect.width; + var containerHeight = containerRect.height; + var x = parsePercent$1(positionInfo.left, containerWidth); + var y = parsePercent$1(positionInfo.top, containerHeight); + var x2 = parsePercent$1(positionInfo.right, containerWidth); + var y2 = parsePercent$1(positionInfo.bottom, containerHeight); + (isNaN(x) || isNaN(parseFloat(positionInfo.left))) && (x = 0); + (isNaN(x2) || isNaN(parseFloat(positionInfo.right))) && (x2 = containerWidth); + (isNaN(y) || isNaN(parseFloat(positionInfo.top))) && (y = 0); + (isNaN(y2) || isNaN(parseFloat(positionInfo.bottom))) && (y2 = containerHeight); + margin = normalizeCssArray$1(margin || 0); + return { + width: Math.max(x2 - x - margin[1] - margin[3], 0), + height: Math.max(y2 - y - margin[0] - margin[2], 0) + }; + } + /** + * Parse position info. + */ + + function getLayoutRect(positionInfo, containerRect, margin) { + margin = normalizeCssArray$1(margin || 0); + var containerWidth = containerRect.width; + var containerHeight = containerRect.height; + var left = parsePercent$1(positionInfo.left, containerWidth); + var top = parsePercent$1(positionInfo.top, containerHeight); + var right = parsePercent$1(positionInfo.right, containerWidth); + var bottom = parsePercent$1(positionInfo.bottom, containerHeight); + var width = parsePercent$1(positionInfo.width, containerWidth); + var height = parsePercent$1(positionInfo.height, containerHeight); + var verticalMargin = margin[2] + margin[0]; + var horizontalMargin = margin[1] + margin[3]; + var aspect = positionInfo.aspect; // If width is not specified, calculate width from left and right + + if (isNaN(width)) { + width = containerWidth - right - horizontalMargin - left; + } + + if (isNaN(height)) { + height = containerHeight - bottom - verticalMargin - top; + } + + if (aspect != null) { + // If width and height are not given + // 1. Graph should not exceeds the container + // 2. Aspect must be keeped + // 3. Graph should take the space as more as possible + // FIXME + // Margin is not considered, because there is no case that both + // using margin and aspect so far. + if (isNaN(width) && isNaN(height)) { + if (aspect > containerWidth / containerHeight) { + width = containerWidth * 0.8; + } else { + height = containerHeight * 0.8; + } + } // Calculate width or height with given aspect + + + if (isNaN(width)) { + width = aspect * height; + } + + if (isNaN(height)) { + height = width / aspect; + } + } // If left is not specified, calculate left from right and width + + + if (isNaN(left)) { + left = containerWidth - right - width - horizontalMargin; + } + + if (isNaN(top)) { + top = containerHeight - bottom - height - verticalMargin; + } // Align left and top + + + switch (positionInfo.left || positionInfo.right) { + case 'center': + left = containerWidth / 2 - width / 2 - margin[3]; + break; + + case 'right': + left = containerWidth - width - horizontalMargin; + break; + } + + switch (positionInfo.top || positionInfo.bottom) { + case 'middle': + case 'center': + top = containerHeight / 2 - height / 2 - margin[0]; + break; + + case 'bottom': + top = containerHeight - height - verticalMargin; + break; + } // If something is wrong and left, top, width, height are calculated as NaN + + + left = left || 0; + top = top || 0; + + if (isNaN(width)) { + // Width may be NaN if only one value is given except width + width = containerWidth - horizontalMargin - left - (right || 0); + } + + if (isNaN(height)) { + // Height may be NaN if only one value is given except height + height = containerHeight - verticalMargin - top - (bottom || 0); + } + + var rect = new BoundingRect(left + margin[3], top + margin[0], width, height); + rect.margin = margin; + return rect; + } + /** + * Position a zr element in viewport + * Group position is specified by either + * {left, top}, {right, bottom} + * If all properties exists, right and bottom will be igonred. + * + * Logic: + * 1. Scale (against origin point in parent coord) + * 2. Rotate (against origin point in parent coord) + * 3. Traslate (with el.position by this method) + * So this method only fixes the last step 'Traslate', which does not affect + * scaling and rotating. + * + * If be called repeatly with the same input el, the same result will be gotten. + * + * Return true if the layout happend. + * + * @param el Should have `getBoundingRect` method. + * @param positionInfo + * @param positionInfo.left + * @param positionInfo.top + * @param positionInfo.right + * @param positionInfo.bottom + * @param positionInfo.width Only for opt.boundingModel: 'raw' + * @param positionInfo.height Only for opt.boundingModel: 'raw' + * @param containerRect + * @param margin + * @param opt + * @param opt.hv Only horizontal or only vertical. Default to be [1, 1] + * @param opt.boundingMode + * Specify how to calculate boundingRect when locating. + * 'all': Position the boundingRect that is transformed and uioned + * both itself and its descendants. + * This mode simplies confine the elements in the bounding + * of their container (e.g., using 'right: 0'). + * 'raw': Position the boundingRect that is not transformed and only itself. + * This mode is useful when you want a element can overflow its + * container. (Consider a rotated circle needs to be located in a corner.) + * In this mode positionInfo.width/height can only be number. + */ + + function positionElement(el, positionInfo, containerRect, margin, opt, out) { + var h = !opt || !opt.hv || opt.hv[0]; + var v = !opt || !opt.hv || opt.hv[1]; + var boundingMode = opt && opt.boundingMode || 'all'; + out = out || el; + out.x = el.x; + out.y = el.y; + + if (!h && !v) { + return false; + } + + var rect; + + if (boundingMode === 'raw') { + rect = el.type === 'group' ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0) : el.getBoundingRect(); + } else { + rect = el.getBoundingRect(); + + if (el.needLocalTransform()) { + var transform = el.getLocalTransform(); // Notice: raw rect may be inner object of el, + // which should not be modified. + + rect = rect.clone(); + rect.applyTransform(transform); + } + } // The real width and height can not be specified but calculated by the given el. + + + var layoutRect = getLayoutRect(defaults({ + width: rect.width, + height: rect.height + }, positionInfo), containerRect, margin); // Because 'tranlate' is the last step in transform + // (see zrender/core/Transformable#getLocalTransform), + // we can just only modify el.position to get final result. + + var dx = h ? layoutRect.x - rect.x : 0; + var dy = v ? layoutRect.y - rect.y : 0; + + if (boundingMode === 'raw') { + out.x = dx; + out.y = dy; + } else { + out.x += dx; + out.y += dy; + } + + if (out === el) { + el.markRedraw(); + } + + return true; + } + /** + * @param option Contains some of the properties in HV_NAMES. + * @param hvIdx 0: horizontal; 1: vertical. + */ + + function sizeCalculable(option, hvIdx) { + return option[HV_NAMES[hvIdx][0]] != null || option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null; + } + function fetchLayoutMode(ins) { + var layoutMode = ins.layoutMode || ins.constructor.layoutMode; + return isObject(layoutMode) ? layoutMode : layoutMode ? { + type: layoutMode + } : null; + } + /** + * Consider Case: + * When default option has {left: 0, width: 100}, and we set {right: 0} + * through setOption or media query, using normal zrUtil.merge will cause + * {right: 0} does not take effect. + * + * @example + * ComponentModel.extend({ + * init: function () { + * ... + * let inputPositionParams = layout.getLayoutParams(option); + * this.mergeOption(inputPositionParams); + * }, + * mergeOption: function (newOption) { + * newOption && zrUtil.merge(thisOption, newOption, true); + * layout.mergeLayoutParam(thisOption, newOption); + * } + * }); + * + * @param targetOption + * @param newOption + * @param opt + */ + + function mergeLayoutParam(targetOption, newOption, opt) { + var ignoreSize = opt && opt.ignoreSize; + !isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]); + var hResult = merge(HV_NAMES[0], 0); + var vResult = merge(HV_NAMES[1], 1); + copy(HV_NAMES[0], targetOption, hResult); + copy(HV_NAMES[1], targetOption, vResult); + + function merge(names, hvIdx) { + var newParams = {}; + var newValueCount = 0; + var merged = {}; + var mergedValueCount = 0; + var enoughParamNumber = 2; + each$1(names, function (name) { + merged[name] = targetOption[name]; + }); + each$1(names, function (name) { + // Consider case: newOption.width is null, which is + // set by user for removing width setting. + hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]); + hasValue(newParams, name) && newValueCount++; + hasValue(merged, name) && mergedValueCount++; + }); + + if (ignoreSize[hvIdx]) { + // Only one of left/right is premitted to exist. + if (hasValue(newOption, names[1])) { + merged[names[2]] = null; + } else if (hasValue(newOption, names[2])) { + merged[names[1]] = null; + } + + return merged; + } // Case: newOption: {width: ..., right: ...}, + // or targetOption: {right: ...} and newOption: {width: ...}, + // There is no conflict when merged only has params count + // little than enoughParamNumber. + + + if (mergedValueCount === enoughParamNumber || !newValueCount) { + return merged; + } // Case: newOption: {width: ..., right: ...}, + // Than we can make sure user only want those two, and ignore + // all origin params in targetOption. + else if (newValueCount >= enoughParamNumber) { + return newParams; + } else { + // Chose another param from targetOption by priority. + for (var i = 0; i < names.length; i++) { + var name_1 = names[i]; + + if (!hasProp(newParams, name_1) && hasProp(targetOption, name_1)) { + newParams[name_1] = targetOption[name_1]; + break; + } + } + + return newParams; + } + } + + function hasProp(obj, name) { + return obj.hasOwnProperty(name); + } + + function hasValue(obj, name) { + return obj[name] != null && obj[name] !== 'auto'; + } + + function copy(names, target, source) { + each$1(names, function (name) { + target[name] = source[name]; + }); + } + } + /** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + */ + + function getLayoutParams(source) { + return copyLayoutParams({}, source); + } + /** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + * @param {Object} source + * @return {Object} Result contains those props. + */ + + function copyLayoutParams(target, source) { + source && target && each$1(LOCATION_PARAMS, function (name) { + source.hasOwnProperty(name) && (target[name] = source[name]); + }); + return target; + } + + var inner = makeInner(); + + var ComponentModel = + /** @class */ + function (_super) { + __extends(ComponentModel, _super); + + function ComponentModel(option, parentModel, ecModel) { + var _this = _super.call(this, option, parentModel, ecModel) || this; + + _this.uid = getUID('ec_cpt_model'); + return _this; + } + + ComponentModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + }; + + ComponentModel.prototype.mergeDefaultAndTheme = function (option, ecModel) { + var layoutMode = fetchLayoutMode(this); + var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; + var themeModel = ecModel.getTheme(); + merge(option, themeModel.get(this.mainType)); + merge(option, this.getDefaultOption()); + + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }; + + ComponentModel.prototype.mergeOption = function (option, ecModel) { + merge(this.option, option, true); + var layoutMode = fetchLayoutMode(this); + + if (layoutMode) { + mergeLayoutParam(this.option, option, layoutMode); + } + }; + /** + * Called immediately after `init` or `mergeOption` of this instance called. + */ + + + ComponentModel.prototype.optionUpdated = function (newCptOption, isInit) {}; + /** + * [How to declare defaultOption]: + * + * (A) If using class declaration in typescript (since echarts 5): + * ```ts + * import {ComponentOption} from '../model/option.js'; + * export interface XxxOption extends ComponentOption { + * aaa: number + * } + * export class XxxModel extends Component { + * static type = 'xxx'; + * static defaultOption: XxxOption = { + * aaa: 123 + * } + * } + * Component.registerClass(XxxModel); + * ``` + * ```ts + * import {inheritDefaultOption} from '../util/component.js'; + * import {XxxModel, XxxOption} from './XxxModel.js'; + * export interface XxxSubOption extends XxxOption { + * bbb: number + * } + * class XxxSubModel extends XxxModel { + * static defaultOption: XxxSubOption = inheritDefaultOption(XxxModel.defaultOption, { + * bbb: 456 + * }) + * fn() { + * let opt = this.getDefaultOption(); + * // opt is {aaa: 123, bbb: 456} + * } + * } + * ``` + * + * (B) If using class extend (previous approach in echarts 3 & 4): + * ```js + * let XxxComponent = Component.extend({ + * defaultOption: { + * xx: 123 + * } + * }) + * ``` + * ```js + * let XxxSubComponent = XxxComponent.extend({ + * defaultOption: { + * yy: 456 + * }, + * fn: function () { + * let opt = this.getDefaultOption(); + * // opt is {xx: 123, yy: 456} + * } + * }) + * ``` + */ + + + ComponentModel.prototype.getDefaultOption = function () { + var ctor = this.constructor; // If using class declaration, it is different to travel super class + // in legacy env and auto merge defaultOption. So if using class + // declaration, defaultOption should be merged manually. + + if (!isExtendedClass(ctor)) { + // When using ts class, defaultOption must be declared as static. + return ctor.defaultOption; + } // FIXME: remove this approach? + + + var fields = inner(this); + + if (!fields.defaultOption) { + var optList = []; + var clz = ctor; + + while (clz) { + var opt = clz.prototype.defaultOption; + opt && optList.push(opt); + clz = clz.superClass; + } + + var defaultOption = {}; + + for (var i = optList.length - 1; i >= 0; i--) { + defaultOption = merge(defaultOption, optList[i], true); + } + + fields.defaultOption = defaultOption; + } + + return fields.defaultOption; + }; + /** + * Notice: always force to input param `useDefault` in case that forget to consider it. + * The same behavior as `modelUtil.parseFinder`. + * + * @param useDefault In many cases like series refer axis and axis refer grid, + * If axis index / axis id not specified, use the first target as default. + * In other cases like dataZoom refer axis, if not specified, measn no refer. + */ + + + ComponentModel.prototype.getReferringComponents = function (mainType, opt) { + var indexKey = mainType + 'Index'; + var idKey = mainType + 'Id'; + return queryReferringComponents(this.ecModel, mainType, { + index: this.get(indexKey, true), + id: this.get(idKey, true) + }, opt); + }; + + ComponentModel.prototype.getBoxLayoutParams = function () { + // Consider itself having box layout configs. + var boxLayoutModel = this; + return { + left: boxLayoutModel.get('left'), + top: boxLayoutModel.get('top'), + right: boxLayoutModel.get('right'), + bottom: boxLayoutModel.get('bottom'), + width: boxLayoutModel.get('width'), + height: boxLayoutModel.get('height') + }; + }; + /** + * Get key for zlevel. + * If developers don't configure zlevel. We will assign zlevel to series based on the key. + * For example, lines with trail effect and progressive series will in an individual zlevel. + */ + + + ComponentModel.prototype.getZLevelKey = function () { + return ''; + }; + + ComponentModel.prototype.setZLevel = function (zlevel) { + this.option.zlevel = zlevel; + }; + + ComponentModel.protoInitialize = function () { + var proto = ComponentModel.prototype; + proto.type = 'component'; + proto.id = ''; + proto.name = ''; + proto.mainType = ''; + proto.subType = ''; + proto.componentIndex = 0; + }(); + + return ComponentModel; + }(Model); + + mountExtend(ComponentModel, Model); + enableClassManagement(ComponentModel); + enableSubTypeDefaulter(ComponentModel); + enableTopologicalTravel(ComponentModel, getDependencies); + + function getDependencies(componentType) { + var deps = []; + each(ComponentModel.getClassesByMainType(componentType), function (clz) { + deps = deps.concat(clz.dependencies || clz.prototype.dependencies || []); + }); // Ensure main type. + + deps = map(deps, function (type) { + return parseClassType(type).main; + }); // Hack dataset for convenience. + + if (componentType !== 'dataset' && indexOf(deps, 'dataset') <= 0) { + deps.unshift('dataset'); + } + + return deps; + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + var platform = ''; // Navigator not exists in node + + if (typeof navigator !== 'undefined') { + /* global navigator */ + platform = navigator.platform || ''; + } + + var decalColor = 'rgba(0, 0, 0, 0.2)'; + var globalDefault = { + darkMode: 'auto', + // backgroundColor: 'rgba(0,0,0,0)', + colorBy: 'series', + color: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'], + gradientColor: ['#f6efa6', '#d88273', '#bf444c'], + aria: { + decal: { + decals: [{ + color: decalColor, + dashArrayX: [1, 0], + dashArrayY: [2, 5], + symbolSize: 1, + rotation: Math.PI / 6 + }, { + color: decalColor, + symbol: 'circle', + dashArrayX: [[8, 8], [0, 8, 8, 0]], + dashArrayY: [6, 0], + symbolSize: 0.8 + }, { + color: decalColor, + dashArrayX: [1, 0], + dashArrayY: [4, 3], + rotation: -Math.PI / 4 + }, { + color: decalColor, + dashArrayX: [[6, 6], [0, 6, 6, 0]], + dashArrayY: [6, 0] + }, { + color: decalColor, + dashArrayX: [[1, 0], [1, 6]], + dashArrayY: [1, 0, 6, 0], + rotation: Math.PI / 4 + }, { + color: decalColor, + symbol: 'triangle', + dashArrayX: [[9, 9], [0, 9, 9, 0]], + dashArrayY: [7, 2], + symbolSize: 0.75 + }] + } + }, + // If xAxis and yAxis declared, grid is created by default. + // grid: {}, + textStyle: { + // color: '#000', + // decoration: 'none', + // PENDING + fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif', + // fontFamily: 'Arial, Verdana, sans-serif', + fontSize: 12, + fontStyle: 'normal', + fontWeight: 'normal' + }, + // http://blogs.adobe.com/webplatform/2014/02/24/using-blend-modes-in-html-canvas/ + // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation + // Default is source-over + blendMode: null, + stateAnimation: { + duration: 300, + easing: 'cubicOut' + }, + animation: 'auto', + animationDuration: 1000, + animationDurationUpdate: 500, + animationEasing: 'cubicInOut', + animationEasingUpdate: 'cubicInOut', + animationThreshold: 2000, + // Configuration for progressive/incremental rendering + progressiveThreshold: 3000, + progressive: 400, + // Threshold of if use single hover layer to optimize. + // It is recommended that `hoverLayerThreshold` is equivalent to or less than + // `progressiveThreshold`, otherwise hover will cause restart of progressive, + // which is unexpected. + // see example <echarts/test/heatmap-large.html>. + hoverLayerThreshold: 3000, + // See: module:echarts/scale/Time + useUTC: false + }; + + var VISUAL_DIMENSIONS = createHashMap(['tooltip', 'label', 'itemName', 'itemId', 'itemGroupId', 'seriesName']); + var SOURCE_FORMAT_ORIGINAL = 'original'; + var SOURCE_FORMAT_ARRAY_ROWS = 'arrayRows'; + var SOURCE_FORMAT_OBJECT_ROWS = 'objectRows'; + var SOURCE_FORMAT_KEYED_COLUMNS = 'keyedColumns'; + var SOURCE_FORMAT_TYPED_ARRAY = 'typedArray'; + var SOURCE_FORMAT_UNKNOWN = 'unknown'; + var SERIES_LAYOUT_BY_COLUMN = 'column'; + var SERIES_LAYOUT_BY_ROW = 'row'; + + var BE_ORDINAL = { + Must: 1, + Might: 2, + Not: 3 // Other cases + + }; + var innerGlobalModel = makeInner(); + /** + * MUST be called before mergeOption of all series. + */ + + function resetSourceDefaulter(ecModel) { + // `datasetMap` is used to make default encode. + innerGlobalModel(ecModel).datasetMap = createHashMap(); + } + /** + * [The strategy of the arrengment of data dimensions for dataset]: + * "value way": all axes are non-category axes. So series one by one take + * several (the number is coordSysDims.length) dimensions from dataset. + * The result of data arrengment of data dimensions like: + * | ser0_x | ser0_y | ser1_x | ser1_y | ser2_x | ser2_y | + * "category way": at least one axis is category axis. So the the first data + * dimension is always mapped to the first category axis and shared by + * all of the series. The other data dimensions are taken by series like + * "value way" does. + * The result of data arrengment of data dimensions like: + * | ser_shared_x | ser0_y | ser1_y | ser2_y | + * + * @return encode Never be `null/undefined`. + */ + + function makeSeriesEncodeForAxisCoordSys(coordDimensions, seriesModel, source) { + var encode = {}; + var datasetModel = querySeriesUpstreamDatasetModel(seriesModel); // Currently only make default when using dataset, util more reqirements occur. + + if (!datasetModel || !coordDimensions) { + return encode; + } + + var encodeItemName = []; + var encodeSeriesName = []; + var ecModel = seriesModel.ecModel; + var datasetMap = innerGlobalModel(ecModel).datasetMap; + var key = datasetModel.uid + '_' + source.seriesLayoutBy; + var baseCategoryDimIndex; + var categoryWayValueDimStart; + coordDimensions = coordDimensions.slice(); + each(coordDimensions, function (coordDimInfoLoose, coordDimIdx) { + var coordDimInfo = isObject(coordDimInfoLoose) ? coordDimInfoLoose : coordDimensions[coordDimIdx] = { + name: coordDimInfoLoose + }; + + if (coordDimInfo.type === 'ordinal' && baseCategoryDimIndex == null) { + baseCategoryDimIndex = coordDimIdx; + categoryWayValueDimStart = getDataDimCountOnCoordDim(coordDimInfo); + } + + encode[coordDimInfo.name] = []; + }); + var datasetRecord = datasetMap.get(key) || datasetMap.set(key, { + categoryWayDim: categoryWayValueDimStart, + valueWayDim: 0 + }); // TODO + // Auto detect first time axis and do arrangement. + + each(coordDimensions, function (coordDimInfo, coordDimIdx) { + var coordDimName = coordDimInfo.name; + var count = getDataDimCountOnCoordDim(coordDimInfo); // In value way. + + if (baseCategoryDimIndex == null) { + var start = datasetRecord.valueWayDim; + pushDim(encode[coordDimName], start, count); + pushDim(encodeSeriesName, start, count); + datasetRecord.valueWayDim += count; // ??? TODO give a better default series name rule? + // especially when encode x y specified. + // consider: when mutiple series share one dimension + // category axis, series name should better use + // the other dimsion name. On the other hand, use + // both dimensions name. + } // In category way, the first category axis. + else if (baseCategoryDimIndex === coordDimIdx) { + pushDim(encode[coordDimName], 0, count); + pushDim(encodeItemName, 0, count); + } // In category way, the other axis. + else { + var start = datasetRecord.categoryWayDim; + pushDim(encode[coordDimName], start, count); + pushDim(encodeSeriesName, start, count); + datasetRecord.categoryWayDim += count; + } + }); + + function pushDim(dimIdxArr, idxFrom, idxCount) { + for (var i = 0; i < idxCount; i++) { + dimIdxArr.push(idxFrom + i); + } + } + + function getDataDimCountOnCoordDim(coordDimInfo) { + var dimsDef = coordDimInfo.dimsDef; + return dimsDef ? dimsDef.length : 1; + } + + encodeItemName.length && (encode.itemName = encodeItemName); + encodeSeriesName.length && (encode.seriesName = encodeSeriesName); + return encode; + } + /** + * Work for data like [{name: ..., value: ...}, ...]. + * + * @return encode Never be `null/undefined`. + */ + + function makeSeriesEncodeForNameBased(seriesModel, source, dimCount) { + var encode = {}; + var datasetModel = querySeriesUpstreamDatasetModel(seriesModel); // Currently only make default when using dataset, util more reqirements occur. + + if (!datasetModel) { + return encode; + } + + var sourceFormat = source.sourceFormat; + var dimensionsDefine = source.dimensionsDefine; + var potentialNameDimIndex; + + if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS || sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { + each(dimensionsDefine, function (dim, idx) { + if ((isObject(dim) ? dim.name : dim) === 'name') { + potentialNameDimIndex = idx; + } + }); + } + + var idxResult = function () { + var idxRes0 = {}; + var idxRes1 = {}; + var guessRecords = []; // 5 is an experience value. + + for (var i = 0, len = Math.min(5, dimCount); i < len; i++) { + var guessResult = doGuessOrdinal(source.data, sourceFormat, source.seriesLayoutBy, dimensionsDefine, source.startIndex, i); + guessRecords.push(guessResult); + var isPureNumber = guessResult === BE_ORDINAL.Not; // [Strategy of idxRes0]: find the first BE_ORDINAL.Not as the value dim, + // and then find a name dim with the priority: + // "BE_ORDINAL.Might|BE_ORDINAL.Must" > "other dim" > "the value dim itself". + + if (isPureNumber && idxRes0.v == null && i !== potentialNameDimIndex) { + idxRes0.v = i; + } + + if (idxRes0.n == null || idxRes0.n === idxRes0.v || !isPureNumber && guessRecords[idxRes0.n] === BE_ORDINAL.Not) { + idxRes0.n = i; + } + + if (fulfilled(idxRes0) && guessRecords[idxRes0.n] !== BE_ORDINAL.Not) { + return idxRes0; + } // [Strategy of idxRes1]: if idxRes0 not satisfied (that is, no BE_ORDINAL.Not), + // find the first BE_ORDINAL.Might as the value dim, + // and then find a name dim with the priority: + // "other dim" > "the value dim itself". + // That is for backward compat: number-like (e.g., `'3'`, `'55'`) can be + // treated as number. + + + if (!isPureNumber) { + if (guessResult === BE_ORDINAL.Might && idxRes1.v == null && i !== potentialNameDimIndex) { + idxRes1.v = i; + } + + if (idxRes1.n == null || idxRes1.n === idxRes1.v) { + idxRes1.n = i; + } + } + } + + function fulfilled(idxResult) { + return idxResult.v != null && idxResult.n != null; + } + + return fulfilled(idxRes0) ? idxRes0 : fulfilled(idxRes1) ? idxRes1 : null; + }(); + + if (idxResult) { + encode.value = [idxResult.v]; // `potentialNameDimIndex` has highest priority. + + var nameDimIndex = potentialNameDimIndex != null ? potentialNameDimIndex : idxResult.n; // By default, label use itemName in charts. + // So we dont set encodeLabel here. + + encode.itemName = [nameDimIndex]; + encode.seriesName = [nameDimIndex]; + } + + return encode; + } + /** + * @return If return null/undefined, indicate that should not use datasetModel. + */ + + function querySeriesUpstreamDatasetModel(seriesModel) { + // Caution: consider the scenario: + // A dataset is declared and a series is not expected to use the dataset, + // and at the beginning `setOption({series: { noData })` (just prepare other + // option but no data), then `setOption({series: {data: [...]}); In this case, + // the user should set an empty array to avoid that dataset is used by default. + var thisData = seriesModel.get('data', true); + + if (!thisData) { + return queryReferringComponents(seriesModel.ecModel, 'dataset', { + index: seriesModel.get('datasetIndex', true), + id: seriesModel.get('datasetId', true) + }, SINGLE_REFERRING).models[0]; + } + } + /** + * @return Always return an array event empty. + */ + + function queryDatasetUpstreamDatasetModels(datasetModel) { + // Only these attributes declared, we by defualt reference to `datasetIndex: 0`. + // Otherwise, no reference. + if (!datasetModel.get('transform', true) && !datasetModel.get('fromTransformResult', true)) { + return []; + } + + return queryReferringComponents(datasetModel.ecModel, 'dataset', { + index: datasetModel.get('fromDatasetIndex', true), + id: datasetModel.get('fromDatasetId', true) + }, SINGLE_REFERRING).models; + } + /** + * The rule should not be complex, otherwise user might not + * be able to known where the data is wrong. + * The code is ugly, but how to make it neat? + */ + + function guessOrdinal(source, dimIndex) { + return doGuessOrdinal(source.data, source.sourceFormat, source.seriesLayoutBy, source.dimensionsDefine, source.startIndex, dimIndex); + } // dimIndex may be overflow source data. + // return {BE_ORDINAL} + + function doGuessOrdinal(data, sourceFormat, seriesLayoutBy, dimensionsDefine, startIndex, dimIndex) { + var result; // Experience value. + + var maxLoop = 5; + + if (isTypedArray(data)) { + return BE_ORDINAL.Not; + } // When sourceType is 'objectRows' or 'keyedColumns', dimensionsDefine + // always exists in source. + + + var dimName; + var dimType; + + if (dimensionsDefine) { + var dimDefItem = dimensionsDefine[dimIndex]; + + if (isObject(dimDefItem)) { + dimName = dimDefItem.name; + dimType = dimDefItem.type; + } else if (isString(dimDefItem)) { + dimName = dimDefItem; + } + } + + if (dimType != null) { + return dimType === 'ordinal' ? BE_ORDINAL.Must : BE_ORDINAL.Not; + } + + if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { + var dataArrayRows = data; + + if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) { + var sample = dataArrayRows[dimIndex]; + + for (var i = 0; i < (sample || []).length && i < maxLoop; i++) { + if ((result = detectValue(sample[startIndex + i])) != null) { + return result; + } + } + } else { + for (var i = 0; i < dataArrayRows.length && i < maxLoop; i++) { + var row = dataArrayRows[startIndex + i]; + + if (row && (result = detectValue(row[dimIndex])) != null) { + return result; + } + } + } + } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { + var dataObjectRows = data; + + if (!dimName) { + return BE_ORDINAL.Not; + } + + for (var i = 0; i < dataObjectRows.length && i < maxLoop; i++) { + var item = dataObjectRows[i]; + + if (item && (result = detectValue(item[dimName])) != null) { + return result; + } + } + } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { + var dataKeyedColumns = data; + + if (!dimName) { + return BE_ORDINAL.Not; + } + + var sample = dataKeyedColumns[dimName]; + + if (!sample || isTypedArray(sample)) { + return BE_ORDINAL.Not; + } + + for (var i = 0; i < sample.length && i < maxLoop; i++) { + if ((result = detectValue(sample[i])) != null) { + return result; + } + } + } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { + var dataOriginal = data; + + for (var i = 0; i < dataOriginal.length && i < maxLoop; i++) { + var item = dataOriginal[i]; + var val = getDataItemValue(item); + + if (!isArray(val)) { + return BE_ORDINAL.Not; + } + + if ((result = detectValue(val[dimIndex])) != null) { + return result; + } + } + } + + function detectValue(val) { + var beStr = isString(val); // Consider usage convenience, '1', '2' will be treated as "number". + // `isFinit('')` get `true`. + + if (val != null && isFinite(val) && val !== '') { + return beStr ? BE_ORDINAL.Might : BE_ORDINAL.Not; + } else if (beStr && val !== '-') { + return BE_ORDINAL.Must; + } + } + + return BE_ORDINAL.Not; + } + + var internalOptionCreatorMap = createHashMap(); + function registerInternalOptionCreator(mainType, creator) { + assert(internalOptionCreatorMap.get(mainType) == null && creator); + internalOptionCreatorMap.set(mainType, creator); + } + function concatInternalOptions(ecModel, mainType, newCmptOptionList) { + var internalOptionCreator = internalOptionCreatorMap.get(mainType); + + if (!internalOptionCreator) { + return newCmptOptionList; + } + + var internalOptions = internalOptionCreator(ecModel); + + if (!internalOptions) { + return newCmptOptionList; + } + + if ("development" !== 'production') { + for (var i = 0; i < internalOptions.length; i++) { + assert(isComponentIdInternal(internalOptions[i])); + } + } + + return newCmptOptionList.concat(internalOptions); + } + + var innerColor = makeInner(); + var innerDecal = makeInner(); + + var PaletteMixin = + /** @class */ + function () { + function PaletteMixin() {} + + PaletteMixin.prototype.getColorFromPalette = function (name, scope, requestNum) { + var defaultPalette = normalizeToArray(this.get('color', true)); + var layeredPalette = this.get('colorLayer', true); + return getFromPalette(this, innerColor, defaultPalette, layeredPalette, name, scope, requestNum); + }; + + PaletteMixin.prototype.clearColorPalette = function () { + clearPalette(this, innerColor); + }; + + return PaletteMixin; + }(); + + function getDecalFromPalette(ecModel, name, scope, requestNum) { + var defaultDecals = normalizeToArray(ecModel.get(['aria', 'decal', 'decals'])); + return getFromPalette(ecModel, innerDecal, defaultDecals, null, name, scope, requestNum); + } + + function getNearestPalette(palettes, requestColorNum) { + var paletteNum = palettes.length; // TODO palettes must be in order + + for (var i = 0; i < paletteNum; i++) { + if (palettes[i].length > requestColorNum) { + return palettes[i]; + } + } + + return palettes[paletteNum - 1]; + } + /** + * @param name MUST NOT be null/undefined. Otherwise call this function + * twise with the same parameters will get different result. + * @param scope default this. + * @return Can be null/undefined + */ + + + function getFromPalette(that, inner, defaultPalette, layeredPalette, name, scope, requestNum) { + scope = scope || that; + var scopeFields = inner(scope); + var paletteIdx = scopeFields.paletteIdx || 0; + var paletteNameMap = scopeFields.paletteNameMap = scopeFields.paletteNameMap || {}; // Use `hasOwnProperty` to avoid conflict with Object.prototype. + + if (paletteNameMap.hasOwnProperty(name)) { + return paletteNameMap[name]; + } + + var palette = requestNum == null || !layeredPalette ? defaultPalette : getNearestPalette(layeredPalette, requestNum); // In case can't find in layered color palette. + + palette = palette || defaultPalette; + + if (!palette || !palette.length) { + return; + } + + var pickedPaletteItem = palette[paletteIdx]; + + if (name) { + paletteNameMap[name] = pickedPaletteItem; + } + + scopeFields.paletteIdx = (paletteIdx + 1) % palette.length; + return pickedPaletteItem; + } + + function clearPalette(that, inner) { + inner(that).paletteIdx = 0; + inner(that).paletteNameMap = {}; + } + + // Internal method names: + // ----------------------- + + var reCreateSeriesIndices; + var assertSeriesInitialized; + var initBase; + var OPTION_INNER_KEY = '\0_ec_inner'; + var OPTION_INNER_VALUE = 1; + var BUITIN_COMPONENTS_MAP = { + grid: 'GridComponent', + polar: 'PolarComponent', + geo: 'GeoComponent', + singleAxis: 'SingleAxisComponent', + parallel: 'ParallelComponent', + calendar: 'CalendarComponent', + graphic: 'GraphicComponent', + toolbox: 'ToolboxComponent', + tooltip: 'TooltipComponent', + axisPointer: 'AxisPointerComponent', + brush: 'BrushComponent', + title: 'TitleComponent', + timeline: 'TimelineComponent', + markPoint: 'MarkPointComponent', + markLine: 'MarkLineComponent', + markArea: 'MarkAreaComponent', + legend: 'LegendComponent', + dataZoom: 'DataZoomComponent', + visualMap: 'VisualMapComponent', + // aria: 'AriaComponent', + // dataset: 'DatasetComponent', + // Dependencies + xAxis: 'GridComponent', + yAxis: 'GridComponent', + angleAxis: 'PolarComponent', + radiusAxis: 'PolarComponent' + }; + var BUILTIN_CHARTS_MAP = { + line: 'LineChart', + bar: 'BarChart', + pie: 'PieChart', + scatter: 'ScatterChart', + radar: 'RadarChart', + map: 'MapChart', + tree: 'TreeChart', + treemap: 'TreemapChart', + graph: 'GraphChart', + gauge: 'GaugeChart', + funnel: 'FunnelChart', + parallel: 'ParallelChart', + sankey: 'SankeyChart', + boxplot: 'BoxplotChart', + candlestick: 'CandlestickChart', + effectScatter: 'EffectScatterChart', + lines: 'LinesChart', + heatmap: 'HeatmapChart', + pictorialBar: 'PictorialBarChart', + themeRiver: 'ThemeRiverChart', + sunburst: 'SunburstChart', + custom: 'CustomChart' + }; + var componetsMissingLogPrinted = {}; + + function checkMissingComponents(option) { + each(option, function (componentOption, mainType) { + if (!ComponentModel.hasClass(mainType)) { + var componentImportName = BUITIN_COMPONENTS_MAP[mainType]; + + if (componentImportName && !componetsMissingLogPrinted[componentImportName]) { + error("Component " + mainType + " is used but not imported.\nimport { " + componentImportName + " } from 'echarts/components';\necharts.use([" + componentImportName + "]);"); + componetsMissingLogPrinted[componentImportName] = true; + } + } + }); + } + + var GlobalModel = + /** @class */ + function (_super) { + __extends(GlobalModel, _super); + + function GlobalModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + + GlobalModel.prototype.init = function (option, parentModel, ecModel, theme, locale, optionManager) { + theme = theme || {}; + this.option = null; // Mark as not initialized. + + this._theme = new Model(theme); + this._locale = new Model(locale); + this._optionManager = optionManager; + }; + + GlobalModel.prototype.setOption = function (option, opts, optionPreprocessorFuncs) { + if ("development" !== 'production') { + assert(option != null, 'option is null/undefined'); + assert(option[OPTION_INNER_KEY] !== OPTION_INNER_VALUE, 'please use chart.getOption()'); + } + + var innerOpt = normalizeSetOptionInput(opts); + + this._optionManager.setOption(option, optionPreprocessorFuncs, innerOpt); + + this._resetOption(null, innerOpt); + }; + /** + * @param type null/undefined: reset all. + * 'recreate': force recreate all. + * 'timeline': only reset timeline option + * 'media': only reset media query option + * @return Whether option changed. + */ + + + GlobalModel.prototype.resetOption = function (type, opt) { + return this._resetOption(type, normalizeSetOptionInput(opt)); + }; + + GlobalModel.prototype._resetOption = function (type, opt) { + var optionChanged = false; + var optionManager = this._optionManager; + + if (!type || type === 'recreate') { + var baseOption = optionManager.mountOption(type === 'recreate'); + + if ("development" !== 'production') { + checkMissingComponents(baseOption); + } + + if (!this.option || type === 'recreate') { + initBase(this, baseOption); + } else { + this.restoreData(); + + this._mergeOption(baseOption, opt); + } + + optionChanged = true; + } + + if (type === 'timeline' || type === 'media') { + this.restoreData(); + } // By design, if `setOption(option2)` at the second time, and `option2` is a `ECUnitOption`, + // it should better not have the same props with `MediaUnit['option']`. + // Becuase either `option2` or `MediaUnit['option']` will be always merged to "current option" + // rather than original "baseOption". If they both override a prop, the result might be + // unexpected when media state changed after `setOption` called. + // If we really need to modify a props in each `MediaUnit['option']`, use the full version + // (`{baseOption, media}`) in `setOption`. + // For `timeline`, the case is the same. + + + if (!type || type === 'recreate' || type === 'timeline') { + var timelineOption = optionManager.getTimelineOption(this); + + if (timelineOption) { + optionChanged = true; + + this._mergeOption(timelineOption, opt); + } + } + + if (!type || type === 'recreate' || type === 'media') { + var mediaOptions = optionManager.getMediaOption(this); + + if (mediaOptions.length) { + each(mediaOptions, function (mediaOption) { + optionChanged = true; + + this._mergeOption(mediaOption, opt); + }, this); + } + } + + return optionChanged; + }; + + GlobalModel.prototype.mergeOption = function (option) { + this._mergeOption(option, null); + }; + + GlobalModel.prototype._mergeOption = function (newOption, opt) { + var option = this.option; + var componentsMap = this._componentsMap; + var componentsCount = this._componentsCount; + var newCmptTypes = []; + var newCmptTypeMap = createHashMap(); + var replaceMergeMainTypeMap = opt && opt.replaceMergeMainTypeMap; + resetSourceDefaulter(this); // If no component class, merge directly. + // For example: color, animaiton options, etc. + + each(newOption, function (componentOption, mainType) { + if (componentOption == null) { + return; + } + + if (!ComponentModel.hasClass(mainType)) { + // globalSettingTask.dirty(); + option[mainType] = option[mainType] == null ? clone(componentOption) : merge(option[mainType], componentOption, true); + } else if (mainType) { + newCmptTypes.push(mainType); + newCmptTypeMap.set(mainType, true); + } + }); + + if (replaceMergeMainTypeMap) { + // If there is a mainType `xxx` in `replaceMerge` but not declared in option, + // we trade it as it is declared in option as `{xxx: []}`. Because: + // (1) for normal merge, `{xxx: null/undefined}` are the same meaning as `{xxx: []}`. + // (2) some preprocessor may convert some of `{xxx: null/undefined}` to `{xxx: []}`. + replaceMergeMainTypeMap.each(function (val, mainTypeInReplaceMerge) { + if (ComponentModel.hasClass(mainTypeInReplaceMerge) && !newCmptTypeMap.get(mainTypeInReplaceMerge)) { + newCmptTypes.push(mainTypeInReplaceMerge); + newCmptTypeMap.set(mainTypeInReplaceMerge, true); + } + }); + } + + ComponentModel.topologicalTravel(newCmptTypes, ComponentModel.getAllClassMainTypes(), visitComponent, this); + + function visitComponent(mainType) { + var newCmptOptionList = concatInternalOptions(this, mainType, normalizeToArray(newOption[mainType])); + var oldCmptList = componentsMap.get(mainType); + var mergeMode = // `!oldCmptList` means init. See the comment in `mappingToExists` + !oldCmptList ? 'replaceAll' : replaceMergeMainTypeMap && replaceMergeMainTypeMap.get(mainType) ? 'replaceMerge' : 'normalMerge'; + var mappingResult = mappingToExists(oldCmptList, newCmptOptionList, mergeMode); // Set mainType and complete subType. + + setComponentTypeToKeyInfo(mappingResult, mainType, ComponentModel); // Empty it before the travel, in order to prevent `this._componentsMap` + // from being used in the `init`/`mergeOption`/`optionUpdated` of some + // components, which is probably incorrect logic. + + option[mainType] = null; + componentsMap.set(mainType, null); + componentsCount.set(mainType, 0); + var optionsByMainType = []; + var cmptsByMainType = []; + var cmptsCountByMainType = 0; + var tooltipExists; + var tooltipWarningLogged; + each(mappingResult, function (resultItem, index) { + var componentModel = resultItem.existing; + var newCmptOption = resultItem.newOption; + + if (!newCmptOption) { + if (componentModel) { + // Consider where is no new option and should be merged using {}, + // see removeEdgeAndAdd in topologicalTravel and + // ComponentModel.getAllClassMainTypes. + componentModel.mergeOption({}, this); + componentModel.optionUpdated({}, false); + } // If no both `resultItem.exist` and `resultItem.option`, + // either it is in `replaceMerge` and not matched by any id, + // or it has been removed in previous `replaceMerge` and left a "hole" in this component index. + + } else { + var isSeriesType = mainType === 'series'; + var ComponentModelClass = ComponentModel.getClass(mainType, resultItem.keyInfo.subType, !isSeriesType // Give a more detailed warn later if series don't exists + ); + + if (!ComponentModelClass) { + if ("development" !== 'production') { + var subType = resultItem.keyInfo.subType; + var seriesImportName = BUILTIN_CHARTS_MAP[subType]; + + if (!componetsMissingLogPrinted[subType]) { + componetsMissingLogPrinted[subType] = true; + + if (seriesImportName) { + error("Series " + subType + " is used but not imported.\nimport { " + seriesImportName + " } from 'echarts/charts';\necharts.use([" + seriesImportName + "]);"); + } else { + error("Unkown series " + subType); + } + } + } + + return; + } // TODO Before multiple tooltips get supported, we do this check to avoid unexpected exception. + + + if (mainType === 'tooltip') { + if (tooltipExists) { + if ("development" !== 'production') { + if (!tooltipWarningLogged) { + warn('Currently only one tooltip component is allowed.'); + tooltipWarningLogged = true; + } + } + + return; + } + + tooltipExists = true; + } + + if (componentModel && componentModel.constructor === ComponentModelClass) { + componentModel.name = resultItem.keyInfo.name; // componentModel.settingTask && componentModel.settingTask.dirty(); + + componentModel.mergeOption(newCmptOption, this); + componentModel.optionUpdated(newCmptOption, false); + } else { + // PENDING Global as parent ? + var extraOpt = extend({ + componentIndex: index + }, resultItem.keyInfo); + componentModel = new ComponentModelClass(newCmptOption, this, this, extraOpt); // Assign `keyInfo` + + extend(componentModel, extraOpt); + + if (resultItem.brandNew) { + componentModel.__requireNewView = true; + } + + componentModel.init(newCmptOption, this, this); // Call optionUpdated after init. + // newCmptOption has been used as componentModel.option + // and may be merged with theme and default, so pass null + // to avoid confusion. + + componentModel.optionUpdated(null, true); + } + } + + if (componentModel) { + optionsByMainType.push(componentModel.option); + cmptsByMainType.push(componentModel); + cmptsCountByMainType++; + } else { + // Always do assign to avoid elided item in array. + optionsByMainType.push(void 0); + cmptsByMainType.push(void 0); + } + }, this); + option[mainType] = optionsByMainType; + componentsMap.set(mainType, cmptsByMainType); + componentsCount.set(mainType, cmptsCountByMainType); // Backup series for filtering. + + if (mainType === 'series') { + reCreateSeriesIndices(this); + } + } // If no series declared, ensure `_seriesIndices` initialized. + + + if (!this._seriesIndices) { + reCreateSeriesIndices(this); + } + }; + /** + * Get option for output (cloned option and inner info removed) + */ + + + GlobalModel.prototype.getOption = function () { + var option = clone(this.option); + each(option, function (optInMainType, mainType) { + if (ComponentModel.hasClass(mainType)) { + var opts = normalizeToArray(optInMainType); // Inner cmpts need to be removed. + // Inner cmpts might not be at last since ec5.0, but still + // compatible for users: if inner cmpt at last, splice the returned array. + + var realLen = opts.length; + var metNonInner = false; + + for (var i = realLen - 1; i >= 0; i--) { + // Remove options with inner id. + if (opts[i] && !isComponentIdInternal(opts[i])) { + metNonInner = true; + } else { + opts[i] = null; + !metNonInner && realLen--; + } + } + + opts.length = realLen; + option[mainType] = opts; + } + }); + delete option[OPTION_INNER_KEY]; + return option; + }; + + GlobalModel.prototype.getTheme = function () { + return this._theme; + }; + + GlobalModel.prototype.getLocaleModel = function () { + return this._locale; + }; + + GlobalModel.prototype.setUpdatePayload = function (payload) { + this._payload = payload; + }; + + GlobalModel.prototype.getUpdatePayload = function () { + return this._payload; + }; + /** + * @param idx If not specified, return the first one. + */ + + + GlobalModel.prototype.getComponent = function (mainType, idx) { + var list = this._componentsMap.get(mainType); + + if (list) { + var cmpt = list[idx || 0]; + + if (cmpt) { + return cmpt; + } else if (idx == null) { + for (var i = 0; i < list.length; i++) { + if (list[i]) { + return list[i]; + } + } + } + } + }; + /** + * @return Never be null/undefined. + */ + + + GlobalModel.prototype.queryComponents = function (condition) { + var mainType = condition.mainType; + + if (!mainType) { + return []; + } + + var index = condition.index; + var id = condition.id; + var name = condition.name; + + var cmpts = this._componentsMap.get(mainType); + + if (!cmpts || !cmpts.length) { + return []; + } + + var result; + + if (index != null) { + result = []; + each(normalizeToArray(index), function (idx) { + cmpts[idx] && result.push(cmpts[idx]); + }); + } else if (id != null) { + result = queryByIdOrName('id', id, cmpts); + } else if (name != null) { + result = queryByIdOrName('name', name, cmpts); + } else { + // Return all non-empty components in that mainType + result = filter(cmpts, function (cmpt) { + return !!cmpt; + }); + } + + return filterBySubType(result, condition); + }; + /** + * The interface is different from queryComponents, + * which is convenient for inner usage. + * + * @usage + * let result = findComponents( + * {mainType: 'dataZoom', query: {dataZoomId: 'abc'}} + * ); + * let result = findComponents( + * {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}} + * ); + * let result = findComponents( + * {mainType: 'series', + * filter: function (model, index) {...}} + * ); + * // result like [component0, componnet1, ...] + */ + + + GlobalModel.prototype.findComponents = function (condition) { + var query = condition.query; + var mainType = condition.mainType; + var queryCond = getQueryCond(query); + var result = queryCond ? this.queryComponents(queryCond) // Retrieve all non-empty components. + : filter(this._componentsMap.get(mainType), function (cmpt) { + return !!cmpt; + }); + return doFilter(filterBySubType(result, condition)); + + function getQueryCond(q) { + var indexAttr = mainType + 'Index'; + var idAttr = mainType + 'Id'; + var nameAttr = mainType + 'Name'; + return q && (q[indexAttr] != null || q[idAttr] != null || q[nameAttr] != null) ? { + mainType: mainType, + // subType will be filtered finally. + index: q[indexAttr], + id: q[idAttr], + name: q[nameAttr] + } : null; + } + + function doFilter(res) { + return condition.filter ? filter(res, condition.filter) : res; + } + }; + + GlobalModel.prototype.eachComponent = function (mainType, cb, context) { + var componentsMap = this._componentsMap; + + if (isFunction(mainType)) { + var ctxForAll_1 = cb; + var cbForAll_1 = mainType; + componentsMap.each(function (cmpts, componentType) { + for (var i = 0; cmpts && i < cmpts.length; i++) { + var cmpt = cmpts[i]; + cmpt && cbForAll_1.call(ctxForAll_1, componentType, cmpt, cmpt.componentIndex); + } + }); + } else { + var cmpts = isString(mainType) ? componentsMap.get(mainType) : isObject(mainType) ? this.findComponents(mainType) : null; + + for (var i = 0; cmpts && i < cmpts.length; i++) { + var cmpt = cmpts[i]; + cmpt && cb.call(context, cmpt, cmpt.componentIndex); + } + } + }; + /** + * Get series list before filtered by name. + */ + + + GlobalModel.prototype.getSeriesByName = function (name) { + var nameStr = convertOptionIdName(name, null); + return filter(this._componentsMap.get('series'), function (oneSeries) { + return !!oneSeries && nameStr != null && oneSeries.name === nameStr; + }); + }; + /** + * Get series list before filtered by index. + */ + + + GlobalModel.prototype.getSeriesByIndex = function (seriesIndex) { + return this._componentsMap.get('series')[seriesIndex]; + }; + /** + * Get series list before filtered by type. + * FIXME: rename to getRawSeriesByType? + */ + + + GlobalModel.prototype.getSeriesByType = function (subType) { + return filter(this._componentsMap.get('series'), function (oneSeries) { + return !!oneSeries && oneSeries.subType === subType; + }); + }; + /** + * Get all series before filtered. + */ + + + GlobalModel.prototype.getSeries = function () { + return filter(this._componentsMap.get('series'), function (oneSeries) { + return !!oneSeries; + }); + }; + /** + * Count series before filtered. + */ + + + GlobalModel.prototype.getSeriesCount = function () { + return this._componentsCount.get('series'); + }; + /** + * After filtering, series may be different + * frome raw series. + */ + + + GlobalModel.prototype.eachSeries = function (cb, context) { + assertSeriesInitialized(this); + each(this._seriesIndices, function (rawSeriesIndex) { + var series = this._componentsMap.get('series')[rawSeriesIndex]; + + cb.call(context, series, rawSeriesIndex); + }, this); + }; + /** + * Iterate raw series before filtered. + * + * @param {Function} cb + * @param {*} context + */ + + + GlobalModel.prototype.eachRawSeries = function (cb, context) { + each(this._componentsMap.get('series'), function (series) { + series && cb.call(context, series, series.componentIndex); + }); + }; + /** + * After filtering, series may be different. + * frome raw series. + */ + + + GlobalModel.prototype.eachSeriesByType = function (subType, cb, context) { + assertSeriesInitialized(this); + each(this._seriesIndices, function (rawSeriesIndex) { + var series = this._componentsMap.get('series')[rawSeriesIndex]; + + if (series.subType === subType) { + cb.call(context, series, rawSeriesIndex); + } + }, this); + }; + /** + * Iterate raw series before filtered of given type. + */ + + + GlobalModel.prototype.eachRawSeriesByType = function (subType, cb, context) { + return each(this.getSeriesByType(subType), cb, context); + }; + + GlobalModel.prototype.isSeriesFiltered = function (seriesModel) { + assertSeriesInitialized(this); + return this._seriesIndicesMap.get(seriesModel.componentIndex) == null; + }; + + GlobalModel.prototype.getCurrentSeriesIndices = function () { + return (this._seriesIndices || []).slice(); + }; + + GlobalModel.prototype.filterSeries = function (cb, context) { + assertSeriesInitialized(this); + var newSeriesIndices = []; + each(this._seriesIndices, function (seriesRawIdx) { + var series = this._componentsMap.get('series')[seriesRawIdx]; + + cb.call(context, series, seriesRawIdx) && newSeriesIndices.push(seriesRawIdx); + }, this); + this._seriesIndices = newSeriesIndices; + this._seriesIndicesMap = createHashMap(newSeriesIndices); + }; + + GlobalModel.prototype.restoreData = function (payload) { + reCreateSeriesIndices(this); + var componentsMap = this._componentsMap; + var componentTypes = []; + componentsMap.each(function (components, componentType) { + if (ComponentModel.hasClass(componentType)) { + componentTypes.push(componentType); + } + }); + ComponentModel.topologicalTravel(componentTypes, ComponentModel.getAllClassMainTypes(), function (componentType) { + each(componentsMap.get(componentType), function (component) { + if (component && (componentType !== 'series' || !isNotTargetSeries(component, payload))) { + component.restoreData(); + } + }); + }); + }; + + GlobalModel.internalField = function () { + reCreateSeriesIndices = function (ecModel) { + var seriesIndices = ecModel._seriesIndices = []; + each(ecModel._componentsMap.get('series'), function (series) { + // series may have been removed by `replaceMerge`. + series && seriesIndices.push(series.componentIndex); + }); + ecModel._seriesIndicesMap = createHashMap(seriesIndices); + }; + + assertSeriesInitialized = function (ecModel) { + // Components that use _seriesIndices should depends on series component, + // which make sure that their initialization is after series. + if ("development" !== 'production') { + if (!ecModel._seriesIndices) { + throw new Error('Option should contains series.'); + } + } + }; + + initBase = function (ecModel, baseOption) { + // Using OPTION_INNER_KEY to mark that this option can not be used outside, + // i.e. `chart.setOption(chart.getModel().option);` is forbiden. + ecModel.option = {}; + ecModel.option[OPTION_INNER_KEY] = OPTION_INNER_VALUE; // Init with series: [], in case of calling findSeries method + // before series initialized. + + ecModel._componentsMap = createHashMap({ + series: [] + }); + ecModel._componentsCount = createHashMap(); // If user spefied `option.aria`, aria will be enable. This detection should be + // performed before theme and globalDefault merge. + + var airaOption = baseOption.aria; + + if (isObject(airaOption) && airaOption.enabled == null) { + airaOption.enabled = true; + } + + mergeTheme(baseOption, ecModel._theme.option); // TODO Needs clone when merging to the unexisted property + + merge(baseOption, globalDefault, false); + + ecModel._mergeOption(baseOption, null); + }; + }(); + + return GlobalModel; + }(Model); + + function isNotTargetSeries(seriesModel, payload) { + if (payload) { + var index = payload.seriesIndex; + var id = payload.seriesId; + var name_1 = payload.seriesName; + return index != null && seriesModel.componentIndex !== index || id != null && seriesModel.id !== id || name_1 != null && seriesModel.name !== name_1; + } + } + + function mergeTheme(option, theme) { + // PENDING + // NOT use `colorLayer` in theme if option has `color` + var notMergeColorLayer = option.color && !option.colorLayer; + each(theme, function (themeItem, name) { + if (name === 'colorLayer' && notMergeColorLayer) { + return; + } // If it is component model mainType, the model handles that merge later. + // otherwise, merge them here. + + + if (!ComponentModel.hasClass(name)) { + if (typeof themeItem === 'object') { + option[name] = !option[name] ? clone(themeItem) : merge(option[name], themeItem, false); + } else { + if (option[name] == null) { + option[name] = themeItem; + } + } + } + }); + } + + function queryByIdOrName(attr, idOrName, cmpts) { + // Here is a break from echarts4: string and number are + // treated as equal. + if (isArray(idOrName)) { + var keyMap_1 = createHashMap(); + each(idOrName, function (idOrNameItem) { + if (idOrNameItem != null) { + var idName = convertOptionIdName(idOrNameItem, null); + idName != null && keyMap_1.set(idOrNameItem, true); + } + }); + return filter(cmpts, function (cmpt) { + return cmpt && keyMap_1.get(cmpt[attr]); + }); + } else { + var idName_1 = convertOptionIdName(idOrName, null); + return filter(cmpts, function (cmpt) { + return cmpt && idName_1 != null && cmpt[attr] === idName_1; + }); + } + } + + function filterBySubType(components, condition) { + // Using hasOwnProperty for restrict. Consider + // subType is undefined in user payload. + return condition.hasOwnProperty('subType') ? filter(components, function (cmpt) { + return cmpt && cmpt.subType === condition.subType; + }) : components; + } + + function normalizeSetOptionInput(opts) { + var replaceMergeMainTypeMap = createHashMap(); + opts && each(normalizeToArray(opts.replaceMerge), function (mainType) { + if ("development" !== 'production') { + assert(ComponentModel.hasClass(mainType), '"' + mainType + '" is not valid component main type in "replaceMerge"'); + } + + replaceMergeMainTypeMap.set(mainType, true); + }); + return { + replaceMergeMainTypeMap: replaceMergeMainTypeMap + }; + } + + mixin(GlobalModel, PaletteMixin); + + var availableMethods = ['getDom', 'getZr', 'getWidth', 'getHeight', 'getDevicePixelRatio', 'dispatchAction', 'isSSR', 'isDisposed', 'on', 'off', 'getDataURL', 'getConnectedDataURL', // 'getModel', + 'getOption', // 'getViewOfComponentModel', + // 'getViewOfSeriesModel', + 'getId', 'updateLabelLayout']; + + var ExtensionAPI = + /** @class */ + function () { + function ExtensionAPI(ecInstance) { + each(availableMethods, function (methodName) { + this[methodName] = bind(ecInstance[methodName], ecInstance); + }, this); + } + + return ExtensionAPI; + }(); + + var coordinateSystemCreators = {}; + + var CoordinateSystemManager = + /** @class */ + function () { + function CoordinateSystemManager() { + this._coordinateSystems = []; + } + + CoordinateSystemManager.prototype.create = function (ecModel, api) { + var coordinateSystems = []; + each(coordinateSystemCreators, function (creater, type) { + var list = creater.create(ecModel, api); + coordinateSystems = coordinateSystems.concat(list || []); + }); + this._coordinateSystems = coordinateSystems; + }; + + CoordinateSystemManager.prototype.update = function (ecModel, api) { + each(this._coordinateSystems, function (coordSys) { + coordSys.update && coordSys.update(ecModel, api); + }); + }; + + CoordinateSystemManager.prototype.getCoordinateSystems = function () { + return this._coordinateSystems.slice(); + }; + + CoordinateSystemManager.register = function (type, creator) { + coordinateSystemCreators[type] = creator; + }; + + CoordinateSystemManager.get = function (type) { + return coordinateSystemCreators[type]; + }; + + return CoordinateSystemManager; + }(); + + var QUERY_REG = /^(min|max)?(.+)$/; // Key: mainType + // type FakeComponentsMap = HashMap<(MappingExistingItem & { subType: string })[]>; + + /** + * TERM EXPLANATIONS: + * See `ECOption` and `ECUnitOption` in `src/util/types.ts`. + */ + + var OptionManager = + /** @class */ + function () { + // timeline.notMerge is not supported in ec3. Firstly there is rearly + // case that notMerge is needed. Secondly supporting 'notMerge' requires + // rawOption cloned and backuped when timeline changed, which does no + // good to performance. What's more, that both timeline and setOption + // method supply 'notMerge' brings complex and some problems. + // Consider this case: + // (step1) chart.setOption({timeline: {notMerge: false}, ...}, false); + // (step2) chart.setOption({timeline: {notMerge: true}, ...}, false); + function OptionManager(api) { + this._timelineOptions = []; + this._mediaList = []; + /** + * -1, means default. + * empty means no media. + */ + + this._currentMediaIndices = []; + this._api = api; + } + + OptionManager.prototype.setOption = function (rawOption, optionPreprocessorFuncs, opt) { + if (rawOption) { + // That set dat primitive is dangerous if user reuse the data when setOption again. + each(normalizeToArray(rawOption.series), function (series) { + series && series.data && isTypedArray(series.data) && setAsPrimitive(series.data); + }); + each(normalizeToArray(rawOption.dataset), function (dataset) { + dataset && dataset.source && isTypedArray(dataset.source) && setAsPrimitive(dataset.source); + }); + } // Caution: some series modify option data, if do not clone, + // it should ensure that the repeat modify correctly + // (create a new object when modify itself). + + + rawOption = clone(rawOption); // FIXME + // If some property is set in timeline options or media option but + // not set in baseOption, a warning should be given. + + var optionBackup = this._optionBackup; + var newParsedOption = parseRawOption(rawOption, optionPreprocessorFuncs, !optionBackup); + this._newBaseOption = newParsedOption.baseOption; // For setOption at second time (using merge mode); + + if (optionBackup) { + // FIXME + // the restore merge solution is essentially incorrect. + // the mapping can not be 100% consistent with ecModel, which probably brings + // potential bug! + // The first merge is delayed, becuase in most cases, users do not call `setOption` twice. + // let fakeCmptsMap = this._fakeCmptsMap; + // if (!fakeCmptsMap) { + // fakeCmptsMap = this._fakeCmptsMap = createHashMap(); + // mergeToBackupOption(fakeCmptsMap, null, optionBackup.baseOption, null); + // } + // mergeToBackupOption( + // fakeCmptsMap, optionBackup.baseOption, newParsedOption.baseOption, opt + // ); + // For simplicity, timeline options and media options do not support merge, + // that is, if you `setOption` twice and both has timeline options, the latter + // timeline opitons will not be merged to the formers, but just substitude them. + if (newParsedOption.timelineOptions.length) { + optionBackup.timelineOptions = newParsedOption.timelineOptions; + } + + if (newParsedOption.mediaList.length) { + optionBackup.mediaList = newParsedOption.mediaList; + } + + if (newParsedOption.mediaDefault) { + optionBackup.mediaDefault = newParsedOption.mediaDefault; + } + } else { + this._optionBackup = newParsedOption; + } + }; + + OptionManager.prototype.mountOption = function (isRecreate) { + var optionBackup = this._optionBackup; + this._timelineOptions = optionBackup.timelineOptions; + this._mediaList = optionBackup.mediaList; + this._mediaDefault = optionBackup.mediaDefault; + this._currentMediaIndices = []; + return clone(isRecreate // this._optionBackup.baseOption, which is created at the first `setOption` + // called, and is merged into every new option by inner method `mergeToBackupOption` + // each time `setOption` called, can be only used in `isRecreate`, because + // its reliability is under suspicion. In other cases option merge is + // performed by `model.mergeOption`. + ? optionBackup.baseOption : this._newBaseOption); + }; + + OptionManager.prototype.getTimelineOption = function (ecModel) { + var option; + var timelineOptions = this._timelineOptions; + + if (timelineOptions.length) { + // getTimelineOption can only be called after ecModel inited, + // so we can get currentIndex from timelineModel. + var timelineModel = ecModel.getComponent('timeline'); + + if (timelineModel) { + option = clone( // FIXME:TS as TimelineModel or quivlant interface + timelineOptions[timelineModel.getCurrentIndex()]); + } + } + + return option; + }; + + OptionManager.prototype.getMediaOption = function (ecModel) { + var ecWidth = this._api.getWidth(); + + var ecHeight = this._api.getHeight(); + + var mediaList = this._mediaList; + var mediaDefault = this._mediaDefault; + var indices = []; + var result = []; // No media defined. + + if (!mediaList.length && !mediaDefault) { + return result; + } // Multi media may be applied, the latter defined media has higher priority. + + + for (var i = 0, len = mediaList.length; i < len; i++) { + if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) { + indices.push(i); + } + } // FIXME + // Whether mediaDefault should force users to provide? Otherwise + // the change by media query can not be recorvered. + + + if (!indices.length && mediaDefault) { + indices = [-1]; + } + + if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) { + result = map(indices, function (index) { + return clone(index === -1 ? mediaDefault.option : mediaList[index].option); + }); + } // Otherwise return nothing. + + + this._currentMediaIndices = indices; + return result; + }; + + return OptionManager; + }(); + /** + * [RAW_OPTION_PATTERNS] + * (Note: "series: []" represents all other props in `ECUnitOption`) + * + * (1) No prop "baseOption" declared: + * Root option is used as "baseOption" (except prop "options" and "media"). + * ```js + * option = { + * series: [], + * timeline: {}, + * options: [], + * }; + * option = { + * series: [], + * media: {}, + * }; + * option = { + * series: [], + * timeline: {}, + * options: [], + * media: {}, + * } + * ``` + * + * (2) Prop "baseOption" declared: + * If "baseOption" declared, `ECUnitOption` props can only be declared + * inside "baseOption" except prop "timeline" (compat ec2). + * ```js + * option = { + * baseOption: { + * timeline: {}, + * series: [], + * }, + * options: [] + * }; + * option = { + * baseOption: { + * series: [], + * }, + * media: [] + * }; + * option = { + * baseOption: { + * timeline: {}, + * series: [], + * }, + * options: [] + * media: [] + * }; + * option = { + * // ec3 compat ec2: allow (only) `timeline` declared + * // outside baseOption. Keep this setting for compat. + * timeline: {}, + * baseOption: { + * series: [], + * }, + * options: [], + * media: [] + * }; + * ``` + */ + + + function parseRawOption( // `rawOption` May be modified + rawOption, optionPreprocessorFuncs, isNew) { + var mediaList = []; + var mediaDefault; + var baseOption; + var declaredBaseOption = rawOption.baseOption; // Compatible with ec2, [RAW_OPTION_PATTERNS] above. + + var timelineOnRoot = rawOption.timeline; + var timelineOptionsOnRoot = rawOption.options; + var mediaOnRoot = rawOption.media; + var hasMedia = !!rawOption.media; + var hasTimeline = !!(timelineOptionsOnRoot || timelineOnRoot || declaredBaseOption && declaredBaseOption.timeline); + + if (declaredBaseOption) { + baseOption = declaredBaseOption; // For merge option. + + if (!baseOption.timeline) { + baseOption.timeline = timelineOnRoot; + } + } // For convenience, enable to use the root option as the `baseOption`: + // `{ ...normalOptionProps, media: [{ ... }, { ... }] }` + else { + if (hasTimeline || hasMedia) { + rawOption.options = rawOption.media = null; + } + + baseOption = rawOption; + } + + if (hasMedia) { + if (isArray(mediaOnRoot)) { + each(mediaOnRoot, function (singleMedia) { + if ("development" !== 'production') { + // Real case of wrong config. + if (singleMedia && !singleMedia.option && isObject(singleMedia.query) && isObject(singleMedia.query.option)) { + error('Illegal media option. Must be like { media: [ { query: {}, option: {} } ] }'); + } + } + + if (singleMedia && singleMedia.option) { + if (singleMedia.query) { + mediaList.push(singleMedia); + } else if (!mediaDefault) { + // Use the first media default. + mediaDefault = singleMedia; + } + } + }); + } else { + if ("development" !== 'production') { + // Real case of wrong config. + error('Illegal media option. Must be an array. Like { media: [ {...}, {...} ] }'); + } + } + } + + doPreprocess(baseOption); + each(timelineOptionsOnRoot, function (option) { + return doPreprocess(option); + }); + each(mediaList, function (media) { + return doPreprocess(media.option); + }); + + function doPreprocess(option) { + each(optionPreprocessorFuncs, function (preProcess) { + preProcess(option, isNew); + }); + } + + return { + baseOption: baseOption, + timelineOptions: timelineOptionsOnRoot || [], + mediaDefault: mediaDefault, + mediaList: mediaList + }; + } + /** + * @see <http://www.w3.org/TR/css3-mediaqueries/#media1> + * Support: width, height, aspectRatio + * Can use max or min as prefix. + */ + + + function applyMediaQuery(query, ecWidth, ecHeight) { + var realMap = { + width: ecWidth, + height: ecHeight, + aspectratio: ecWidth / ecHeight // lowser case for convenientce. + + }; + var applicatable = true; + each(query, function (value, attr) { + var matched = attr.match(QUERY_REG); + + if (!matched || !matched[1] || !matched[2]) { + return; + } + + var operator = matched[1]; + var realAttr = matched[2].toLowerCase(); + + if (!compare(realMap[realAttr], value, operator)) { + applicatable = false; + } + }); + return applicatable; + } + + function compare(real, expect, operator) { + if (operator === 'min') { + return real >= expect; + } else if (operator === 'max') { + return real <= expect; + } else { + // Equals + return real === expect; + } + } + + function indicesEquals(indices1, indices2) { + // indices is always order by asc and has only finite number. + return indices1.join(',') === indices2.join(','); + } + + var each$2 = each; + var isObject$1 = isObject; + var POSSIBLE_STYLES = ['areaStyle', 'lineStyle', 'nodeStyle', 'linkStyle', 'chordStyle', 'label', 'labelLine']; + + function compatEC2ItemStyle(opt) { + var itemStyleOpt = opt && opt.itemStyle; + + if (!itemStyleOpt) { + return; + } + + for (var i = 0, len = POSSIBLE_STYLES.length; i < len; i++) { + var styleName = POSSIBLE_STYLES[i]; + var normalItemStyleOpt = itemStyleOpt.normal; + var emphasisItemStyleOpt = itemStyleOpt.emphasis; + + if (normalItemStyleOpt && normalItemStyleOpt[styleName]) { + if ("development" !== 'production') { + deprecateReplaceLog("itemStyle.normal." + styleName, styleName); + } + + opt[styleName] = opt[styleName] || {}; + + if (!opt[styleName].normal) { + opt[styleName].normal = normalItemStyleOpt[styleName]; + } else { + merge(opt[styleName].normal, normalItemStyleOpt[styleName]); + } + + normalItemStyleOpt[styleName] = null; + } + + if (emphasisItemStyleOpt && emphasisItemStyleOpt[styleName]) { + if ("development" !== 'production') { + deprecateReplaceLog("itemStyle.emphasis." + styleName, "emphasis." + styleName); + } + + opt[styleName] = opt[styleName] || {}; + + if (!opt[styleName].emphasis) { + opt[styleName].emphasis = emphasisItemStyleOpt[styleName]; + } else { + merge(opt[styleName].emphasis, emphasisItemStyleOpt[styleName]); + } + + emphasisItemStyleOpt[styleName] = null; + } + } + } + + function convertNormalEmphasis(opt, optType, useExtend) { + if (opt && opt[optType] && (opt[optType].normal || opt[optType].emphasis)) { + var normalOpt = opt[optType].normal; + var emphasisOpt = opt[optType].emphasis; + + if (normalOpt) { + if ("development" !== 'production') { + // eslint-disable-next-line max-len + deprecateLog("'normal' hierarchy in " + optType + " has been removed since 4.0. All style properties are configured in " + optType + " directly now."); + } // Timeline controlStyle has other properties besides normal and emphasis + + + if (useExtend) { + opt[optType].normal = opt[optType].emphasis = null; + defaults(opt[optType], normalOpt); + } else { + opt[optType] = normalOpt; + } + } + + if (emphasisOpt) { + if ("development" !== 'production') { + deprecateLog(optType + ".emphasis has been changed to emphasis." + optType + " since 4.0"); + } + + opt.emphasis = opt.emphasis || {}; + opt.emphasis[optType] = emphasisOpt; // Also compat the case user mix the style and focus together in ec3 style + // for example: { itemStyle: { normal: {}, emphasis: {focus, shadowBlur} } } + + if (emphasisOpt.focus) { + opt.emphasis.focus = emphasisOpt.focus; + } + + if (emphasisOpt.blurScope) { + opt.emphasis.blurScope = emphasisOpt.blurScope; + } + } + } + } + + function removeEC3NormalStatus(opt) { + convertNormalEmphasis(opt, 'itemStyle'); + convertNormalEmphasis(opt, 'lineStyle'); + convertNormalEmphasis(opt, 'areaStyle'); + convertNormalEmphasis(opt, 'label'); + convertNormalEmphasis(opt, 'labelLine'); // treemap + + convertNormalEmphasis(opt, 'upperLabel'); // graph + + convertNormalEmphasis(opt, 'edgeLabel'); + } + + function compatTextStyle(opt, propName) { + // Check whether is not object (string\null\undefined ...) + var labelOptSingle = isObject$1(opt) && opt[propName]; + var textStyle = isObject$1(labelOptSingle) && labelOptSingle.textStyle; + + if (textStyle) { + if ("development" !== 'production') { + // eslint-disable-next-line max-len + deprecateLog("textStyle hierarchy in " + propName + " has been removed since 4.0. All textStyle properties are configured in " + propName + " directly now."); + } + + for (var i = 0, len = TEXT_STYLE_OPTIONS.length; i < len; i++) { + var textPropName = TEXT_STYLE_OPTIONS[i]; + + if (textStyle.hasOwnProperty(textPropName)) { + labelOptSingle[textPropName] = textStyle[textPropName]; + } + } + } + } + + function compatEC3CommonStyles(opt) { + if (opt) { + removeEC3NormalStatus(opt); + compatTextStyle(opt, 'label'); + opt.emphasis && compatTextStyle(opt.emphasis, 'label'); + } + } + + function processSeries(seriesOpt) { + if (!isObject$1(seriesOpt)) { + return; + } + + compatEC2ItemStyle(seriesOpt); + removeEC3NormalStatus(seriesOpt); + compatTextStyle(seriesOpt, 'label'); // treemap + + compatTextStyle(seriesOpt, 'upperLabel'); // graph + + compatTextStyle(seriesOpt, 'edgeLabel'); + + if (seriesOpt.emphasis) { + compatTextStyle(seriesOpt.emphasis, 'label'); // treemap + + compatTextStyle(seriesOpt.emphasis, 'upperLabel'); // graph + + compatTextStyle(seriesOpt.emphasis, 'edgeLabel'); + } + + var markPoint = seriesOpt.markPoint; + + if (markPoint) { + compatEC2ItemStyle(markPoint); + compatEC3CommonStyles(markPoint); + } + + var markLine = seriesOpt.markLine; + + if (markLine) { + compatEC2ItemStyle(markLine); + compatEC3CommonStyles(markLine); + } + + var markArea = seriesOpt.markArea; + + if (markArea) { + compatEC3CommonStyles(markArea); + } + + var data = seriesOpt.data; // Break with ec3: if `setOption` again, there may be no `type` in option, + // then the backward compat based on option type will not be performed. + + if (seriesOpt.type === 'graph') { + data = data || seriesOpt.nodes; + var edgeData = seriesOpt.links || seriesOpt.edges; + + if (edgeData && !isTypedArray(edgeData)) { + for (var i = 0; i < edgeData.length; i++) { + compatEC3CommonStyles(edgeData[i]); + } + } + + each(seriesOpt.categories, function (opt) { + removeEC3NormalStatus(opt); + }); + } + + if (data && !isTypedArray(data)) { + for (var i = 0; i < data.length; i++) { + compatEC3CommonStyles(data[i]); + } + } // mark point data + + + markPoint = seriesOpt.markPoint; + + if (markPoint && markPoint.data) { + var mpData = markPoint.data; + + for (var i = 0; i < mpData.length; i++) { + compatEC3CommonStyles(mpData[i]); + } + } // mark line data + + + markLine = seriesOpt.markLine; + + if (markLine && markLine.data) { + var mlData = markLine.data; + + for (var i = 0; i < mlData.length; i++) { + if (isArray(mlData[i])) { + compatEC3CommonStyles(mlData[i][0]); + compatEC3CommonStyles(mlData[i][1]); + } else { + compatEC3CommonStyles(mlData[i]); + } + } + } // Series + + + if (seriesOpt.type === 'gauge') { + compatTextStyle(seriesOpt, 'axisLabel'); + compatTextStyle(seriesOpt, 'title'); + compatTextStyle(seriesOpt, 'detail'); + } else if (seriesOpt.type === 'treemap') { + convertNormalEmphasis(seriesOpt.breadcrumb, 'itemStyle'); + each(seriesOpt.levels, function (opt) { + removeEC3NormalStatus(opt); + }); + } else if (seriesOpt.type === 'tree') { + removeEC3NormalStatus(seriesOpt.leaves); + } // sunburst starts from ec4, so it does not need to compat levels. + + } + + function toArr(o) { + return isArray(o) ? o : o ? [o] : []; + } + + function toObj(o) { + return (isArray(o) ? o[0] : o) || {}; + } + + function globalCompatStyle(option, isTheme) { + each$2(toArr(option.series), function (seriesOpt) { + isObject$1(seriesOpt) && processSeries(seriesOpt); + }); + var axes = ['xAxis', 'yAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'parallelAxis', 'radar']; + isTheme && axes.push('valueAxis', 'categoryAxis', 'logAxis', 'timeAxis'); + each$2(axes, function (axisName) { + each$2(toArr(option[axisName]), function (axisOpt) { + if (axisOpt) { + compatTextStyle(axisOpt, 'axisLabel'); + compatTextStyle(axisOpt.axisPointer, 'label'); + } + }); + }); + each$2(toArr(option.parallel), function (parallelOpt) { + var parallelAxisDefault = parallelOpt && parallelOpt.parallelAxisDefault; + compatTextStyle(parallelAxisDefault, 'axisLabel'); + compatTextStyle(parallelAxisDefault && parallelAxisDefault.axisPointer, 'label'); + }); + each$2(toArr(option.calendar), function (calendarOpt) { + convertNormalEmphasis(calendarOpt, 'itemStyle'); + compatTextStyle(calendarOpt, 'dayLabel'); + compatTextStyle(calendarOpt, 'monthLabel'); + compatTextStyle(calendarOpt, 'yearLabel'); + }); // radar.name.textStyle + + each$2(toArr(option.radar), function (radarOpt) { + compatTextStyle(radarOpt, 'name'); // Use axisName instead of name because component has name property + + if (radarOpt.name && radarOpt.axisName == null) { + radarOpt.axisName = radarOpt.name; + delete radarOpt.name; + + if ("development" !== 'production') { + deprecateLog('name property in radar component has been changed to axisName'); + } + } + + if (radarOpt.nameGap != null && radarOpt.axisNameGap == null) { + radarOpt.axisNameGap = radarOpt.nameGap; + delete radarOpt.nameGap; + + if ("development" !== 'production') { + deprecateLog('nameGap property in radar component has been changed to axisNameGap'); + } + } + + if ("development" !== 'production') { + each$2(radarOpt.indicator, function (indicatorOpt) { + if (indicatorOpt.text) { + deprecateReplaceLog('text', 'name', 'radar.indicator'); + } + }); + } + }); + each$2(toArr(option.geo), function (geoOpt) { + if (isObject$1(geoOpt)) { + compatEC3CommonStyles(geoOpt); + each$2(toArr(geoOpt.regions), function (regionObj) { + compatEC3CommonStyles(regionObj); + }); + } + }); + each$2(toArr(option.timeline), function (timelineOpt) { + compatEC3CommonStyles(timelineOpt); + convertNormalEmphasis(timelineOpt, 'label'); + convertNormalEmphasis(timelineOpt, 'itemStyle'); + convertNormalEmphasis(timelineOpt, 'controlStyle', true); + var data = timelineOpt.data; + isArray(data) && each(data, function (item) { + if (isObject(item)) { + convertNormalEmphasis(item, 'label'); + convertNormalEmphasis(item, 'itemStyle'); + } + }); + }); + each$2(toArr(option.toolbox), function (toolboxOpt) { + convertNormalEmphasis(toolboxOpt, 'iconStyle'); + each$2(toolboxOpt.feature, function (featureOpt) { + convertNormalEmphasis(featureOpt, 'iconStyle'); + }); + }); + compatTextStyle(toObj(option.axisPointer), 'label'); + compatTextStyle(toObj(option.tooltip).axisPointer, 'label'); // Clean logs + // storedLogs = {}; + } + + function get(opt, path) { + var pathArr = path.split(','); + var obj = opt; + + for (var i = 0; i < pathArr.length; i++) { + obj = obj && obj[pathArr[i]]; + + if (obj == null) { + break; + } + } + + return obj; + } + + function set$1(opt, path, val, overwrite) { + var pathArr = path.split(','); + var obj = opt; + var key; + var i = 0; + + for (; i < pathArr.length - 1; i++) { + key = pathArr[i]; + + if (obj[key] == null) { + obj[key] = {}; + } + + obj = obj[key]; + } + + if (overwrite || obj[pathArr[i]] == null) { + obj[pathArr[i]] = val; + } + } + + function compatLayoutProperties(option) { + option && each(LAYOUT_PROPERTIES, function (prop) { + if (prop[0] in option && !(prop[1] in option)) { + option[prop[1]] = option[prop[0]]; + } + }); + } + + var LAYOUT_PROPERTIES = [['x', 'left'], ['y', 'top'], ['x2', 'right'], ['y2', 'bottom']]; + var COMPATITABLE_COMPONENTS = ['grid', 'geo', 'parallel', 'legend', 'toolbox', 'title', 'visualMap', 'dataZoom', 'timeline']; + var BAR_ITEM_STYLE_MAP = [['borderRadius', 'barBorderRadius'], ['borderColor', 'barBorderColor'], ['borderWidth', 'barBorderWidth']]; + + function compatBarItemStyle(option) { + var itemStyle = option && option.itemStyle; + + if (itemStyle) { + for (var i = 0; i < BAR_ITEM_STYLE_MAP.length; i++) { + var oldName = BAR_ITEM_STYLE_MAP[i][1]; + var newName = BAR_ITEM_STYLE_MAP[i][0]; + + if (itemStyle[oldName] != null) { + itemStyle[newName] = itemStyle[oldName]; + + if ("development" !== 'production') { + deprecateReplaceLog(oldName, newName); + } + } + } + } + } + + function compatPieLabel(option) { + if (!option) { + return; + } + + if (option.alignTo === 'edge' && option.margin != null && option.edgeDistance == null) { + if ("development" !== 'production') { + deprecateReplaceLog('label.margin', 'label.edgeDistance', 'pie'); + } + + option.edgeDistance = option.margin; + } + } + + function compatSunburstState(option) { + if (!option) { + return; + } + + if (option.downplay && !option.blur) { + option.blur = option.downplay; + + if ("development" !== 'production') { + deprecateReplaceLog('downplay', 'blur', 'sunburst'); + } + } + } + + function compatGraphFocus(option) { + if (!option) { + return; + } + + if (option.focusNodeAdjacency != null) { + option.emphasis = option.emphasis || {}; + + if (option.emphasis.focus == null) { + if ("development" !== 'production') { + deprecateReplaceLog('focusNodeAdjacency', 'emphasis: { focus: \'adjacency\'}', 'graph/sankey'); + } + + option.emphasis.focus = 'adjacency'; + } + } + } + + function traverseTree(data, cb) { + if (data) { + for (var i = 0; i < data.length; i++) { + cb(data[i]); + data[i] && traverseTree(data[i].children, cb); + } + } + } + + function globalBackwardCompat(option, isTheme) { + globalCompatStyle(option, isTheme); // Make sure series array for model initialization. + + option.series = normalizeToArray(option.series); + each(option.series, function (seriesOpt) { + if (!isObject(seriesOpt)) { + return; + } + + var seriesType = seriesOpt.type; + + if (seriesType === 'line') { + if (seriesOpt.clipOverflow != null) { + seriesOpt.clip = seriesOpt.clipOverflow; + + if ("development" !== 'production') { + deprecateReplaceLog('clipOverflow', 'clip', 'line'); + } + } + } else if (seriesType === 'pie' || seriesType === 'gauge') { + if (seriesOpt.clockWise != null) { + seriesOpt.clockwise = seriesOpt.clockWise; + + if ("development" !== 'production') { + deprecateReplaceLog('clockWise', 'clockwise'); + } + } + + compatPieLabel(seriesOpt.label); + var data = seriesOpt.data; + + if (data && !isTypedArray(data)) { + for (var i = 0; i < data.length; i++) { + compatPieLabel(data[i]); + } + } + + if (seriesOpt.hoverOffset != null) { + seriesOpt.emphasis = seriesOpt.emphasis || {}; + + if (seriesOpt.emphasis.scaleSize = null) { + if ("development" !== 'production') { + deprecateReplaceLog('hoverOffset', 'emphasis.scaleSize'); + } + + seriesOpt.emphasis.scaleSize = seriesOpt.hoverOffset; + } + } + } else if (seriesType === 'gauge') { + var pointerColor = get(seriesOpt, 'pointer.color'); + pointerColor != null && set$1(seriesOpt, 'itemStyle.color', pointerColor); + } else if (seriesType === 'bar') { + compatBarItemStyle(seriesOpt); + compatBarItemStyle(seriesOpt.backgroundStyle); + compatBarItemStyle(seriesOpt.emphasis); + var data = seriesOpt.data; + + if (data && !isTypedArray(data)) { + for (var i = 0; i < data.length; i++) { + if (typeof data[i] === 'object') { + compatBarItemStyle(data[i]); + compatBarItemStyle(data[i] && data[i].emphasis); + } + } + } + } else if (seriesType === 'sunburst') { + var highlightPolicy = seriesOpt.highlightPolicy; + + if (highlightPolicy) { + seriesOpt.emphasis = seriesOpt.emphasis || {}; + + if (!seriesOpt.emphasis.focus) { + seriesOpt.emphasis.focus = highlightPolicy; + + if ("development" !== 'production') { + deprecateReplaceLog('highlightPolicy', 'emphasis.focus', 'sunburst'); + } + } + } + + compatSunburstState(seriesOpt); + traverseTree(seriesOpt.data, compatSunburstState); + } else if (seriesType === 'graph' || seriesType === 'sankey') { + compatGraphFocus(seriesOpt); // TODO nodes, edges? + } else if (seriesType === 'map') { + if (seriesOpt.mapType && !seriesOpt.map) { + if ("development" !== 'production') { + deprecateReplaceLog('mapType', 'map', 'map'); + } + + seriesOpt.map = seriesOpt.mapType; + } + + if (seriesOpt.mapLocation) { + if ("development" !== 'production') { + deprecateLog('`mapLocation` is not used anymore.'); + } + + defaults(seriesOpt, seriesOpt.mapLocation); + } + } + + if (seriesOpt.hoverAnimation != null) { + seriesOpt.emphasis = seriesOpt.emphasis || {}; + + if (seriesOpt.emphasis && seriesOpt.emphasis.scale == null) { + if ("development" !== 'production') { + deprecateReplaceLog('hoverAnimation', 'emphasis.scale'); + } + + seriesOpt.emphasis.scale = seriesOpt.hoverAnimation; + } + } + + compatLayoutProperties(seriesOpt); + }); // dataRange has changed to visualMap + + if (option.dataRange) { + option.visualMap = option.dataRange; + } + + each(COMPATITABLE_COMPONENTS, function (componentName) { + var options = option[componentName]; + + if (options) { + if (!isArray(options)) { + options = [options]; + } + + each(options, function (option) { + compatLayoutProperties(option); + }); + } + }); + } + + // data processing stage is blocked in stream. + // See <module:echarts/stream/Scheduler#performDataProcessorTasks> + // (2) Only register once when import repeatedly. + // Should be executed after series is filtered and before stack calculation. + + function dataStack(ecModel) { + var stackInfoMap = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var stack = seriesModel.get('stack'); // Compatible: when `stack` is set as '', do not stack. + + if (stack) { + var stackInfoList = stackInfoMap.get(stack) || stackInfoMap.set(stack, []); + var data = seriesModel.getData(); + var stackInfo = { + // Used for calculate axis extent automatically. + // TODO: Type getCalculationInfo return more specific type? + stackResultDimension: data.getCalculationInfo('stackResultDimension'), + stackedOverDimension: data.getCalculationInfo('stackedOverDimension'), + stackedDimension: data.getCalculationInfo('stackedDimension'), + stackedByDimension: data.getCalculationInfo('stackedByDimension'), + isStackedByIndex: data.getCalculationInfo('isStackedByIndex'), + data: data, + seriesModel: seriesModel + }; // If stacked on axis that do not support data stack. + + if (!stackInfo.stackedDimension || !(stackInfo.isStackedByIndex || stackInfo.stackedByDimension)) { + return; + } + + stackInfoList.length && data.setCalculationInfo('stackedOnSeries', stackInfoList[stackInfoList.length - 1].seriesModel); + stackInfoList.push(stackInfo); + } + }); + stackInfoMap.each(calculateStack); + } + + function calculateStack(stackInfoList) { + each(stackInfoList, function (targetStackInfo, idxInStack) { + var resultVal = []; + var resultNaN = [NaN, NaN]; + var dims = [targetStackInfo.stackResultDimension, targetStackInfo.stackedOverDimension]; + var targetData = targetStackInfo.data; + var isStackedByIndex = targetStackInfo.isStackedByIndex; + var stackStrategy = targetStackInfo.seriesModel.get('stackStrategy') || 'samesign'; // Should not write on raw data, because stack series model list changes + // depending on legend selection. + + targetData.modify(dims, function (v0, v1, dataIndex) { + var sum = targetData.get(targetStackInfo.stackedDimension, dataIndex); // Consider `connectNulls` of line area, if value is NaN, stackedOver + // should also be NaN, to draw a appropriate belt area. + + if (isNaN(sum)) { + return resultNaN; + } + + var byValue; + var stackedDataRawIndex; + + if (isStackedByIndex) { + stackedDataRawIndex = targetData.getRawIndex(dataIndex); + } else { + byValue = targetData.get(targetStackInfo.stackedByDimension, dataIndex); + } // If stackOver is NaN, chart view will render point on value start. + + + var stackedOver = NaN; + + for (var j = idxInStack - 1; j >= 0; j--) { + var stackInfo = stackInfoList[j]; // Has been optimized by inverted indices on `stackedByDimension`. + + if (!isStackedByIndex) { + stackedDataRawIndex = stackInfo.data.rawIndexOf(stackInfo.stackedByDimension, byValue); + } + + if (stackedDataRawIndex >= 0) { + var val = stackInfo.data.getByRawIndex(stackInfo.stackResultDimension, stackedDataRawIndex); // Considering positive stack, negative stack and empty data + + if (stackStrategy === 'all' // single stack group + || stackStrategy === 'positive' && val > 0 || stackStrategy === 'negative' && val < 0 || stackStrategy === 'samesign' && sum >= 0 && val > 0 // All positive stack + || stackStrategy === 'samesign' && sum <= 0 && val < 0 // All negative stack + ) { + // The sum has to be very small to be affected by the + // floating arithmetic problem. An incorrect result will probably + // cause axis min/max to be filtered incorrectly. + sum = addSafe(sum, val); + stackedOver = val; + break; + } + } + } + + resultVal[0] = sum; + resultVal[1] = stackedOver; + return resultVal; + }); + }); + } + + var SourceImpl = + /** @class */ + function () { + function SourceImpl(fields) { + this.data = fields.data || (fields.sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS ? {} : []); + this.sourceFormat = fields.sourceFormat || SOURCE_FORMAT_UNKNOWN; // Visit config + + this.seriesLayoutBy = fields.seriesLayoutBy || SERIES_LAYOUT_BY_COLUMN; + this.startIndex = fields.startIndex || 0; + this.dimensionsDetectedCount = fields.dimensionsDetectedCount; + this.metaRawOption = fields.metaRawOption; + var dimensionsDefine = this.dimensionsDefine = fields.dimensionsDefine; + + if (dimensionsDefine) { + for (var i = 0; i < dimensionsDefine.length; i++) { + var dim = dimensionsDefine[i]; + + if (dim.type == null) { + if (guessOrdinal(this, i) === BE_ORDINAL.Must) { + dim.type = 'ordinal'; + } + } + } + } + } + + return SourceImpl; + }(); + + function isSourceInstance(val) { + return val instanceof SourceImpl; + } + /** + * Create a source from option. + * NOTE: Created source is immutable. Don't change any properties in it. + */ + + function createSource(sourceData, thisMetaRawOption, // can be null. If not provided, auto detect it from `sourceData`. + sourceFormat) { + sourceFormat = sourceFormat || detectSourceFormat(sourceData); + var seriesLayoutBy = thisMetaRawOption.seriesLayoutBy; + var determined = determineSourceDimensions(sourceData, sourceFormat, seriesLayoutBy, thisMetaRawOption.sourceHeader, thisMetaRawOption.dimensions); + var source = new SourceImpl({ + data: sourceData, + sourceFormat: sourceFormat, + seriesLayoutBy: seriesLayoutBy, + dimensionsDefine: determined.dimensionsDefine, + startIndex: determined.startIndex, + dimensionsDetectedCount: determined.dimensionsDetectedCount, + metaRawOption: clone(thisMetaRawOption) + }); + return source; + } + /** + * Wrap original series data for some compatibility cases. + */ + + function createSourceFromSeriesDataOption(data) { + return new SourceImpl({ + data: data, + sourceFormat: isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL + }); + } + /** + * Clone source but excludes source data. + */ + + function cloneSourceShallow(source) { + return new SourceImpl({ + data: source.data, + sourceFormat: source.sourceFormat, + seriesLayoutBy: source.seriesLayoutBy, + dimensionsDefine: clone(source.dimensionsDefine), + startIndex: source.startIndex, + dimensionsDetectedCount: source.dimensionsDetectedCount + }); + } + /** + * Note: An empty array will be detected as `SOURCE_FORMAT_ARRAY_ROWS`. + */ + + function detectSourceFormat(data) { + var sourceFormat = SOURCE_FORMAT_UNKNOWN; + + if (isTypedArray(data)) { + sourceFormat = SOURCE_FORMAT_TYPED_ARRAY; + } else if (isArray(data)) { + // FIXME Whether tolerate null in top level array? + if (data.length === 0) { + sourceFormat = SOURCE_FORMAT_ARRAY_ROWS; + } + + for (var i = 0, len = data.length; i < len; i++) { + var item = data[i]; + + if (item == null) { + continue; + } else if (isArray(item)) { + sourceFormat = SOURCE_FORMAT_ARRAY_ROWS; + break; + } else if (isObject(item)) { + sourceFormat = SOURCE_FORMAT_OBJECT_ROWS; + break; + } + } + } else if (isObject(data)) { + for (var key in data) { + if (hasOwn(data, key) && isArrayLike(data[key])) { + sourceFormat = SOURCE_FORMAT_KEYED_COLUMNS; + break; + } + } + } + + return sourceFormat; + } + /** + * Determine the source definitions from data standalone dimensions definitions + * are not specified. + */ + + function determineSourceDimensions(data, sourceFormat, seriesLayoutBy, sourceHeader, // standalone raw dimensions definition, like: + // { + // dimensions: ['aa', 'bb', { name: 'cc', type: 'time' }] + // } + // in `dataset` or `series` + dimensionsDefine) { + var dimensionsDetectedCount; + var startIndex; // PEDING: could data be null/undefined here? + // currently, if `dataset.source` not specified, error thrown. + // if `series.data` not specified, nothing rendered without error thrown. + // Should test these cases. + + if (!data) { + return { + dimensionsDefine: normalizeDimensionsOption(dimensionsDefine), + startIndex: startIndex, + dimensionsDetectedCount: dimensionsDetectedCount + }; + } + + if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { + var dataArrayRows = data; // Rule: Most of the first line are string: it is header. + // Caution: consider a line with 5 string and 1 number, + // it still can not be sure it is a head, because the + // 5 string may be 5 values of category columns. + + if (sourceHeader === 'auto' || sourceHeader == null) { + arrayRowsTravelFirst(function (val) { + // '-' is regarded as null/undefined. + if (val != null && val !== '-') { + if (isString(val)) { + startIndex == null && (startIndex = 1); + } else { + startIndex = 0; + } + } // 10 is an experience number, avoid long loop. + + }, seriesLayoutBy, dataArrayRows, 10); + } else { + startIndex = isNumber(sourceHeader) ? sourceHeader : sourceHeader ? 1 : 0; + } + + if (!dimensionsDefine && startIndex === 1) { + dimensionsDefine = []; + arrayRowsTravelFirst(function (val, index) { + dimensionsDefine[index] = val != null ? val + '' : ''; + }, seriesLayoutBy, dataArrayRows, Infinity); + } + + dimensionsDetectedCount = dimensionsDefine ? dimensionsDefine.length : seriesLayoutBy === SERIES_LAYOUT_BY_ROW ? dataArrayRows.length : dataArrayRows[0] ? dataArrayRows[0].length : null; + } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { + if (!dimensionsDefine) { + dimensionsDefine = objectRowsCollectDimensions(data); + } + } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { + if (!dimensionsDefine) { + dimensionsDefine = []; + each(data, function (colArr, key) { + dimensionsDefine.push(key); + }); + } + } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { + var value0 = getDataItemValue(data[0]); + dimensionsDetectedCount = isArray(value0) && value0.length || 1; + } else if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { + if ("development" !== 'production') { + assert(!!dimensionsDefine, 'dimensions must be given if data is TypedArray.'); + } + } + + return { + startIndex: startIndex, + dimensionsDefine: normalizeDimensionsOption(dimensionsDefine), + dimensionsDetectedCount: dimensionsDetectedCount + }; + } + + function objectRowsCollectDimensions(data) { + var firstIndex = 0; + var obj; + + while (firstIndex < data.length && !(obj = data[firstIndex++])) {} // jshint ignore: line + + + if (obj) { + var dimensions_1 = []; + each(obj, function (value, key) { + dimensions_1.push(key); + }); + return dimensions_1; + } + } // Consider dimensions defined like ['A', 'price', 'B', 'price', 'C', 'price'], + // which is reasonable. But dimension name is duplicated. + // Returns undefined or an array contains only object without null/undefiend or string. + + + function normalizeDimensionsOption(dimensionsDefine) { + if (!dimensionsDefine) { + // The meaning of null/undefined is different from empty array. + return; + } + + var nameMap = createHashMap(); + return map(dimensionsDefine, function (rawItem, index) { + rawItem = isObject(rawItem) ? rawItem : { + name: rawItem + }; // Other fields will be discarded. + + var item = { + name: rawItem.name, + displayName: rawItem.displayName, + type: rawItem.type + }; // User can set null in dimensions. + // We dont auto specify name, othewise a given name may + // cause it be refered unexpectedly. + + if (item.name == null) { + return item; + } // Also consider number form like 2012. + + + item.name += ''; // User may also specify displayName. + // displayName will always exists except user not + // specified or dim name is not specified or detected. + // (A auto generated dim name will not be used as + // displayName). + + if (item.displayName == null) { + item.displayName = item.name; + } + + var exist = nameMap.get(item.name); + + if (!exist) { + nameMap.set(item.name, { + count: 1 + }); + } else { + item.name += '-' + exist.count++; + } + + return item; + }); + } + + function arrayRowsTravelFirst(cb, seriesLayoutBy, data, maxLoop) { + if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) { + for (var i = 0; i < data.length && i < maxLoop; i++) { + cb(data[i] ? data[i][0] : null, i); + } + } else { + var value0 = data[0] || []; + + for (var i = 0; i < value0.length && i < maxLoop; i++) { + cb(value0[i], i); + } + } + } + + function shouldRetrieveDataByName(source) { + var sourceFormat = source.sourceFormat; + return sourceFormat === SOURCE_FORMAT_OBJECT_ROWS || sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS; + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + var _a, _b, _c; // TODO + var providerMethods; + var mountMethods; + /** + * If normal array used, mutable chunk size is supported. + * If typed array used, chunk size must be fixed. + */ + + var DefaultDataProvider = + /** @class */ + function () { + function DefaultDataProvider(sourceParam, dimSize) { + // let source: Source; + var source = !isSourceInstance(sourceParam) ? createSourceFromSeriesDataOption(sourceParam) : sourceParam; // declare source is Source; + + this._source = source; + var data = this._data = source.data; // Typed array. TODO IE10+? + + if (source.sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { + if ("development" !== 'production') { + if (dimSize == null) { + throw new Error('Typed array data must specify dimension size'); + } + } + + this._offset = 0; + this._dimSize = dimSize; + this._data = data; + } + + mountMethods(this, data, source); + } + + DefaultDataProvider.prototype.getSource = function () { + return this._source; + }; + + DefaultDataProvider.prototype.count = function () { + return 0; + }; + + DefaultDataProvider.prototype.getItem = function (idx, out) { + return; + }; + + DefaultDataProvider.prototype.appendData = function (newData) {}; + + DefaultDataProvider.prototype.clean = function () {}; + + DefaultDataProvider.protoInitialize = function () { + // PENDING: To avoid potential incompat (e.g., prototype + // is visited somewhere), still init them on prototype. + var proto = DefaultDataProvider.prototype; + proto.pure = false; + proto.persistent = true; + }(); + + DefaultDataProvider.internalField = function () { + var _a; + + mountMethods = function (provider, data, source) { + var sourceFormat = source.sourceFormat; + var seriesLayoutBy = source.seriesLayoutBy; + var startIndex = source.startIndex; + var dimsDef = source.dimensionsDefine; + var methods = providerMethods[getMethodMapKey(sourceFormat, seriesLayoutBy)]; + + if ("development" !== 'production') { + assert(methods, 'Invalide sourceFormat: ' + sourceFormat); + } + + extend(provider, methods); + + if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { + provider.getItem = getItemForTypedArray; + provider.count = countForTypedArray; + provider.fillStorage = fillStorageForTypedArray; + } else { + var rawItemGetter = getRawSourceItemGetter(sourceFormat, seriesLayoutBy); + provider.getItem = bind(rawItemGetter, null, data, startIndex, dimsDef); + var rawCounter = getRawSourceDataCounter(sourceFormat, seriesLayoutBy); + provider.count = bind(rawCounter, null, data, startIndex, dimsDef); + } + }; + + var getItemForTypedArray = function (idx, out) { + idx = idx - this._offset; + out = out || []; + var data = this._data; + var dimSize = this._dimSize; + var offset = dimSize * idx; + + for (var i = 0; i < dimSize; i++) { + out[i] = data[offset + i]; + } + + return out; + }; + + var fillStorageForTypedArray = function (start, end, storage, extent) { + var data = this._data; + var dimSize = this._dimSize; + + for (var dim = 0; dim < dimSize; dim++) { + var dimExtent = extent[dim]; + var min = dimExtent[0] == null ? Infinity : dimExtent[0]; + var max = dimExtent[1] == null ? -Infinity : dimExtent[1]; + var count = end - start; + var arr = storage[dim]; + + for (var i = 0; i < count; i++) { + // appendData with TypedArray will always do replace in provider. + var val = data[i * dimSize + dim]; + arr[start + i] = val; + val < min && (min = val); + val > max && (max = val); + } + + dimExtent[0] = min; + dimExtent[1] = max; + } + }; + + var countForTypedArray = function () { + return this._data ? this._data.length / this._dimSize : 0; + }; + + providerMethods = (_a = {}, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = { + pure: true, + appendData: appendDataSimply + }, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = { + pure: true, + appendData: function () { + throw new Error('Do not support appendData when set seriesLayoutBy: "row".'); + } + }, _a[SOURCE_FORMAT_OBJECT_ROWS] = { + pure: true, + appendData: appendDataSimply + }, _a[SOURCE_FORMAT_KEYED_COLUMNS] = { + pure: true, + appendData: function (newData) { + var data = this._data; + each(newData, function (newCol, key) { + var oldCol = data[key] || (data[key] = []); + + for (var i = 0; i < (newCol || []).length; i++) { + oldCol.push(newCol[i]); + } + }); + } + }, _a[SOURCE_FORMAT_ORIGINAL] = { + appendData: appendDataSimply + }, _a[SOURCE_FORMAT_TYPED_ARRAY] = { + persistent: false, + pure: true, + appendData: function (newData) { + if ("development" !== 'production') { + assert(isTypedArray(newData), 'Added data must be TypedArray if data in initialization is TypedArray'); + } + + this._data = newData; + }, + // Clean self if data is already used. + clean: function () { + // PENDING + this._offset += this.count(); + this._data = null; + } + }, _a); + + function appendDataSimply(newData) { + for (var i = 0; i < newData.length; i++) { + this._data.push(newData[i]); + } + } + }(); + + return DefaultDataProvider; + }(); + + var getItemSimply = function (rawData, startIndex, dimsDef, idx) { + return rawData[idx]; + }; + + var rawSourceItemGetterMap = (_a = {}, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = function (rawData, startIndex, dimsDef, idx) { + return rawData[idx + startIndex]; + }, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = function (rawData, startIndex, dimsDef, idx, out) { + idx += startIndex; + var item = out || []; + var data = rawData; + + for (var i = 0; i < data.length; i++) { + var row = data[i]; + item[i] = row ? row[idx] : null; + } + + return item; + }, _a[SOURCE_FORMAT_OBJECT_ROWS] = getItemSimply, _a[SOURCE_FORMAT_KEYED_COLUMNS] = function (rawData, startIndex, dimsDef, idx, out) { + var item = out || []; + + for (var i = 0; i < dimsDef.length; i++) { + var dimName = dimsDef[i].name; + + if ("development" !== 'production') { + if (dimName == null) { + throw new Error(); + } + } + + var col = rawData[dimName]; + item[i] = col ? col[idx] : null; + } + + return item; + }, _a[SOURCE_FORMAT_ORIGINAL] = getItemSimply, _a); + function getRawSourceItemGetter(sourceFormat, seriesLayoutBy) { + var method = rawSourceItemGetterMap[getMethodMapKey(sourceFormat, seriesLayoutBy)]; + + if ("development" !== 'production') { + assert(method, 'Do not support get item on "' + sourceFormat + '", "' + seriesLayoutBy + '".'); + } + + return method; + } + + var countSimply = function (rawData, startIndex, dimsDef) { + return rawData.length; + }; + + var rawSourceDataCounterMap = (_b = {}, _b[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = function (rawData, startIndex, dimsDef) { + return Math.max(0, rawData.length - startIndex); + }, _b[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = function (rawData, startIndex, dimsDef) { + var row = rawData[0]; + return row ? Math.max(0, row.length - startIndex) : 0; + }, _b[SOURCE_FORMAT_OBJECT_ROWS] = countSimply, _b[SOURCE_FORMAT_KEYED_COLUMNS] = function (rawData, startIndex, dimsDef) { + var dimName = dimsDef[0].name; + + if ("development" !== 'production') { + if (dimName == null) { + throw new Error(); + } + } + + var col = rawData[dimName]; + return col ? col.length : 0; + }, _b[SOURCE_FORMAT_ORIGINAL] = countSimply, _b); + function getRawSourceDataCounter(sourceFormat, seriesLayoutBy) { + var method = rawSourceDataCounterMap[getMethodMapKey(sourceFormat, seriesLayoutBy)]; + + if ("development" !== 'production') { + assert(method, 'Do not suppport count on "' + sourceFormat + '", "' + seriesLayoutBy + '".'); + } + + return method; + } + + var getRawValueSimply = function (dataItem, dimIndex, property) { + return dataItem[dimIndex]; + }; + + var rawSourceValueGetterMap = (_c = {}, _c[SOURCE_FORMAT_ARRAY_ROWS] = getRawValueSimply, _c[SOURCE_FORMAT_OBJECT_ROWS] = function (dataItem, dimIndex, property) { + return dataItem[property]; + }, _c[SOURCE_FORMAT_KEYED_COLUMNS] = getRawValueSimply, _c[SOURCE_FORMAT_ORIGINAL] = function (dataItem, dimIndex, property) { + // FIXME: In some case (markpoint in geo (geo-map.html)), + // dataItem is {coord: [...]} + var value = getDataItemValue(dataItem); + return !(value instanceof Array) ? value : value[dimIndex]; + }, _c[SOURCE_FORMAT_TYPED_ARRAY] = getRawValueSimply, _c); + function getRawSourceValueGetter(sourceFormat) { + var method = rawSourceValueGetterMap[sourceFormat]; + + if ("development" !== 'production') { + assert(method, 'Do not suppport get value on "' + sourceFormat + '".'); + } + + return method; + } + + function getMethodMapKey(sourceFormat, seriesLayoutBy) { + return sourceFormat === SOURCE_FORMAT_ARRAY_ROWS ? sourceFormat + '_' + seriesLayoutBy : sourceFormat; + } // ??? FIXME can these logic be more neat: getRawValue, getRawDataItem, + // Consider persistent. + // Caution: why use raw value to display on label or tooltip? + // A reason is to avoid format. For example time value we do not know + // how to format is expected. More over, if stack is used, calculated + // value may be 0.91000000001, which have brings trouble to display. + // TODO: consider how to treat null/undefined/NaN when display? + + + function retrieveRawValue(data, dataIndex, // If dimIndex is null/undefined, return OptionDataItem. + // Otherwise, return OptionDataValue. + dim) { + if (!data) { + return; + } // Consider data may be not persistent. + + + var dataItem = data.getRawDataItem(dataIndex); + + if (dataItem == null) { + return; + } + + var store = data.getStore(); + var sourceFormat = store.getSource().sourceFormat; + + if (dim != null) { + var dimIndex = data.getDimensionIndex(dim); + var property = store.getDimensionProperty(dimIndex); + return getRawSourceValueGetter(sourceFormat)(dataItem, dimIndex, property); + } else { + var result = dataItem; + + if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { + result = getDataItemValue(dataItem); + } + + return result; + } + } + + var DIMENSION_LABEL_REG = /\{@(.+?)\}/g; + + var DataFormatMixin = + /** @class */ + function () { + function DataFormatMixin() {} + /** + * Get params for formatter + */ + + + DataFormatMixin.prototype.getDataParams = function (dataIndex, dataType) { + var data = this.getData(dataType); + var rawValue = this.getRawValue(dataIndex, dataType); + var rawDataIndex = data.getRawIndex(dataIndex); + var name = data.getName(dataIndex); + var itemOpt = data.getRawDataItem(dataIndex); + var style = data.getItemVisual(dataIndex, 'style'); + var color = style && style[data.getItemVisual(dataIndex, 'drawType') || 'fill']; + var borderColor = style && style.stroke; + var mainType = this.mainType; + var isSeries = mainType === 'series'; + var userOutput = data.userOutput && data.userOutput.get(); + return { + componentType: mainType, + componentSubType: this.subType, + componentIndex: this.componentIndex, + seriesType: isSeries ? this.subType : null, + seriesIndex: this.seriesIndex, + seriesId: isSeries ? this.id : null, + seriesName: isSeries ? this.name : null, + name: name, + dataIndex: rawDataIndex, + data: itemOpt, + dataType: dataType, + value: rawValue, + color: color, + borderColor: borderColor, + dimensionNames: userOutput ? userOutput.fullDimensions : null, + encode: userOutput ? userOutput.encode : null, + // Param name list for mapping `a`, `b`, `c`, `d`, `e` + $vars: ['seriesName', 'name', 'value'] + }; + }; + /** + * Format label + * @param dataIndex + * @param status 'normal' by default + * @param dataType + * @param labelDimIndex Only used in some chart that + * use formatter in different dimensions, like radar. + * @param formatter Formatter given outside. + * @return return null/undefined if no formatter + */ + + + DataFormatMixin.prototype.getFormattedLabel = function (dataIndex, status, dataType, labelDimIndex, formatter, extendParams) { + status = status || 'normal'; + var data = this.getData(dataType); + var params = this.getDataParams(dataIndex, dataType); + + if (extendParams) { + params.value = extendParams.interpolatedValue; + } + + if (labelDimIndex != null && isArray(params.value)) { + params.value = params.value[labelDimIndex]; + } + + if (!formatter) { + var itemModel = data.getItemModel(dataIndex); // @ts-ignore + + formatter = itemModel.get(status === 'normal' ? ['label', 'formatter'] : [status, 'label', 'formatter']); + } + + if (isFunction(formatter)) { + params.status = status; + params.dimensionIndex = labelDimIndex; + return formatter(params); + } else if (isString(formatter)) { + var str = formatTpl(formatter, params); // Support 'aaa{@[3]}bbb{@product}ccc'. + // Do not support '}' in dim name util have to. + + return str.replace(DIMENSION_LABEL_REG, function (origin, dimStr) { + var len = dimStr.length; + var dimLoose = dimStr; + + if (dimLoose.charAt(0) === '[' && dimLoose.charAt(len - 1) === ']') { + dimLoose = +dimLoose.slice(1, len - 1); // Also support: '[]' => 0 + + if ("development" !== 'production') { + if (isNaN(dimLoose)) { + error("Invalide label formatter: @" + dimStr + ", only support @[0], @[1], @[2], ..."); + } + } + } + + var val = retrieveRawValue(data, dataIndex, dimLoose); + + if (extendParams && isArray(extendParams.interpolatedValue)) { + var dimIndex = data.getDimensionIndex(dimLoose); + + if (dimIndex >= 0) { + val = extendParams.interpolatedValue[dimIndex]; + } + } + + return val != null ? val + '' : ''; + }); + } + }; + /** + * Get raw value in option + */ + + + DataFormatMixin.prototype.getRawValue = function (idx, dataType) { + return retrieveRawValue(this.getData(dataType), idx); + }; + /** + * Should be implemented. + * @param {number} dataIndex + * @param {boolean} [multipleSeries=false] + * @param {string} [dataType] + */ + + + DataFormatMixin.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + // Empty function + return; + }; + + return DataFormatMixin; + }(); + // but guess little chance has been used outside. Do we need to backward + // compat it? + // type TooltipFormatResultLegacyObject = { + // // `html` means the markup language text, either in 'html' or 'richText'. + // // The name `html` is not appropriate becuase in 'richText' it is not a HTML + // // string. But still support it for backward compat. + // html: string; + // markers: Dictionary<ColorString>; + // }; + + /** + * For backward compat, normalize the return from `formatTooltip`. + */ + + function normalizeTooltipFormatResult(result) { + var markupText; // let markers: Dictionary<ColorString>; + + var markupFragment; + + if (isObject(result)) { + if (result.type) { + markupFragment = result; + } else { + if ("development" !== 'production') { + console.warn('The return type of `formatTooltip` is not supported: ' + makePrintable(result)); + } + } // else { + // markupText = (result as TooltipFormatResultLegacyObject).html; + // markers = (result as TooltipFormatResultLegacyObject).markers; + // if (markersExisting) { + // markers = zrUtil.merge(markersExisting, markers); + // } + // } + + } else { + markupText = result; + } + + return { + text: markupText, + // markers: markers || markersExisting, + frag: markupFragment + }; + } + + /** + * @param {Object} define + * @return See the return of `createTask`. + */ + + function createTask(define) { + return new Task(define); + } + + var Task = + /** @class */ + function () { + function Task(define) { + define = define || {}; + this._reset = define.reset; + this._plan = define.plan; + this._count = define.count; + this._onDirty = define.onDirty; + this._dirty = true; + } + /** + * @param step Specified step. + * @param skip Skip customer perform call. + * @param modBy Sampling window size. + * @param modDataCount Sampling count. + * @return whether unfinished. + */ + + + Task.prototype.perform = function (performArgs) { + var upTask = this._upstream; + var skip = performArgs && performArgs.skip; // TODO some refactor. + // Pull data. Must pull data each time, because context.data + // may be updated by Series.setData. + + if (this._dirty && upTask) { + var context = this.context; + context.data = context.outputData = upTask.context.outputData; + } + + if (this.__pipeline) { + this.__pipeline.currentTask = this; + } + + var planResult; + + if (this._plan && !skip) { + planResult = this._plan(this.context); + } // Support sharding by mod, which changes the render sequence and makes the rendered graphic + // elements uniformed distributed when progress, especially when moving or zooming. + + + var lastModBy = normalizeModBy(this._modBy); + var lastModDataCount = this._modDataCount || 0; + var modBy = normalizeModBy(performArgs && performArgs.modBy); + var modDataCount = performArgs && performArgs.modDataCount || 0; + + if (lastModBy !== modBy || lastModDataCount !== modDataCount) { + planResult = 'reset'; + } + + function normalizeModBy(val) { + !(val >= 1) && (val = 1); // jshint ignore:line + + return val; + } + + var forceFirstProgress; + + if (this._dirty || planResult === 'reset') { + this._dirty = false; + forceFirstProgress = this._doReset(skip); + } + + this._modBy = modBy; + this._modDataCount = modDataCount; + var step = performArgs && performArgs.step; + + if (upTask) { + if ("development" !== 'production') { + assert(upTask._outputDueEnd != null); + } + + this._dueEnd = upTask._outputDueEnd; + } // DataTask or overallTask + else { + if ("development" !== 'production') { + assert(!this._progress || this._count); + } + + this._dueEnd = this._count ? this._count(this.context) : Infinity; + } // Note: Stubs, that its host overall task let it has progress, has progress. + // If no progress, pass index from upstream to downstream each time plan called. + + + if (this._progress) { + var start = this._dueIndex; + var end = Math.min(step != null ? this._dueIndex + step : Infinity, this._dueEnd); + + if (!skip && (forceFirstProgress || start < end)) { + var progress = this._progress; + + if (isArray(progress)) { + for (var i = 0; i < progress.length; i++) { + this._doProgress(progress[i], start, end, modBy, modDataCount); + } + } else { + this._doProgress(progress, start, end, modBy, modDataCount); + } + } + + this._dueIndex = end; // If no `outputDueEnd`, assume that output data and + // input data is the same, so use `dueIndex` as `outputDueEnd`. + + var outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : end; + + if ("development" !== 'production') { + // ??? Can not rollback. + assert(outputDueEnd >= this._outputDueEnd); + } + + this._outputDueEnd = outputDueEnd; + } else { + // (1) Some overall task has no progress. + // (2) Stubs, that its host overall task do not let it has progress, has no progress. + // This should always be performed so it can be passed to downstream. + this._dueIndex = this._outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : this._dueEnd; + } + + return this.unfinished(); + }; + + Task.prototype.dirty = function () { + this._dirty = true; + this._onDirty && this._onDirty(this.context); + }; + + Task.prototype._doProgress = function (progress, start, end, modBy, modDataCount) { + iterator.reset(start, end, modBy, modDataCount); + this._callingProgress = progress; + + this._callingProgress({ + start: start, + end: end, + count: end - start, + next: iterator.next + }, this.context); + }; + + Task.prototype._doReset = function (skip) { + this._dueIndex = this._outputDueEnd = this._dueEnd = 0; + this._settedOutputEnd = null; + var progress; + var forceFirstProgress; + + if (!skip && this._reset) { + progress = this._reset(this.context); + + if (progress && progress.progress) { + forceFirstProgress = progress.forceFirstProgress; + progress = progress.progress; + } // To simplify no progress checking, array must has item. + + + if (isArray(progress) && !progress.length) { + progress = null; + } + } + + this._progress = progress; + this._modBy = this._modDataCount = null; + var downstream = this._downstream; + downstream && downstream.dirty(); + return forceFirstProgress; + }; + + Task.prototype.unfinished = function () { + return this._progress && this._dueIndex < this._dueEnd; + }; + /** + * @param downTask The downstream task. + * @return The downstream task. + */ + + + Task.prototype.pipe = function (downTask) { + if ("development" !== 'production') { + assert(downTask && !downTask._disposed && downTask !== this); + } // If already downstream, do not dirty downTask. + + + if (this._downstream !== downTask || this._dirty) { + this._downstream = downTask; + downTask._upstream = this; + downTask.dirty(); + } + }; + + Task.prototype.dispose = function () { + if (this._disposed) { + return; + } + + this._upstream && (this._upstream._downstream = null); + this._downstream && (this._downstream._upstream = null); + this._dirty = false; + this._disposed = true; + }; + + Task.prototype.getUpstream = function () { + return this._upstream; + }; + + Task.prototype.getDownstream = function () { + return this._downstream; + }; + + Task.prototype.setOutputEnd = function (end) { + // This only happend in dataTask, dataZoom, map, currently. + // where dataZoom do not set end each time, but only set + // when reset. So we should record the setted end, in case + // that the stub of dataZoom perform again and earse the + // setted end by upstream. + this._outputDueEnd = this._settedOutputEnd = end; + }; + + return Task; + }(); + + var iterator = function () { + var end; + var current; + var modBy; + var modDataCount; + var winCount; + var it = { + reset: function (s, e, sStep, sCount) { + current = s; + end = e; + modBy = sStep; + modDataCount = sCount; + winCount = Math.ceil(modDataCount / modBy); + it.next = modBy > 1 && modDataCount > 0 ? modNext : sequentialNext; + } + }; + return it; + + function sequentialNext() { + return current < end ? current++ : null; + } + + function modNext() { + var dataIndex = current % winCount * modBy + Math.ceil(current / winCount); + var result = current >= end ? null : dataIndex < modDataCount ? dataIndex // If modDataCount is smaller than data.count() (consider `appendData` case), + // Use normal linear rendering mode. + : current; + current++; + return result; + } + }(); /////////////////////////////////////////////////////////// + // For stream debug (Should be commented out after used!) + // @usage: printTask(this, 'begin'); + // @usage: printTask(this, null, {someExtraProp}); + // @usage: Use `__idxInPipeline` as conditional breakpiont. + // + // window.printTask = function (task: any, prefix: string, extra: { [key: string]: unknown }): void { + // window.ecTaskUID == null && (window.ecTaskUID = 0); + // task.uidDebug == null && (task.uidDebug = `task_${window.ecTaskUID++}`); + // task.agent && task.agent.uidDebug == null && (task.agent.uidDebug = `task_${window.ecTaskUID++}`); + // let props = []; + // if (task.__pipeline) { + // let val = `${task.__idxInPipeline}/${task.__pipeline.tail.__idxInPipeline} ${task.agent ? '(stub)' : ''}`; + // props.push({text: '__idxInPipeline/total', value: val}); + // } else { + // let stubCount = 0; + // task.agentStubMap.each(() => stubCount++); + // props.push({text: 'idx', value: `overall (stubs: ${stubCount})`}); + // } + // props.push({text: 'uid', value: task.uidDebug}); + // if (task.__pipeline) { + // props.push({text: 'pipelineId', value: task.__pipeline.id}); + // task.agent && props.push( + // {text: 'stubFor', value: task.agent.uidDebug} + // ); + // } + // props.push( + // {text: 'dirty', value: task._dirty}, + // {text: 'dueIndex', value: task._dueIndex}, + // {text: 'dueEnd', value: task._dueEnd}, + // {text: 'outputDueEnd', value: task._outputDueEnd} + // ); + // if (extra) { + // Object.keys(extra).forEach(key => { + // props.push({text: key, value: extra[key]}); + // }); + // } + // let args = ['color: blue']; + // let msg = `%c[${prefix || 'T'}] %c` + props.map(item => ( + // args.push('color: green', 'color: red'), + // `${item.text}: %c${item.value}` + // )).join('%c, '); + // console.log.apply(console, [msg].concat(args)); + // // console.log(this); + // }; + // window.printPipeline = function (task: any, prefix: string) { + // const pipeline = task.__pipeline; + // let currTask = pipeline.head; + // while (currTask) { + // window.printTask(currTask, prefix); + // currTask = currTask._downstream; + // } + // }; + // window.showChain = function (chainHeadTask) { + // var chain = []; + // var task = chainHeadTask; + // while (task) { + // chain.push({ + // task: task, + // up: task._upstream, + // down: task._downstream, + // idxInPipeline: task.__idxInPipeline + // }); + // task = task._downstream; + // } + // return chain; + // }; + // window.findTaskInChain = function (task, chainHeadTask) { + // let chain = window.showChain(chainHeadTask); + // let result = []; + // for (let i = 0; i < chain.length; i++) { + // let chainItem = chain[i]; + // if (chainItem.task === task) { + // result.push(i); + // } + // } + // return result; + // }; + // window.printChainAEachInChainB = function (chainHeadTaskA, chainHeadTaskB) { + // let chainA = window.showChain(chainHeadTaskA); + // for (let i = 0; i < chainA.length; i++) { + // console.log('chainAIdx:', i, 'inChainB:', window.findTaskInChain(chainA[i].task, chainHeadTaskB)); + // } + // }; + + /** + * Convert raw the value in to inner value in List. + * + * [Performance sensitive] + * + * [Caution]: this is the key logic of user value parser. + * For backward compatibiliy, do not modify it until have to! + */ + + function parseDataValue(value, // For high performance, do not omit the second param. + opt) { + // Performance sensitive. + var dimType = opt && opt.type; + + if (dimType === 'ordinal') { + // If given value is a category string + return value; + } + + if (dimType === 'time' // spead up when using timestamp + && !isNumber(value) && value != null && value !== '-') { + value = +parseDate(value); + } // dimType defaults 'number'. + // If dimType is not ordinal and value is null or undefined or NaN or '-', + // parse to NaN. + // number-like string (like ' 123 ') can be converted to a number. + // where null/undefined or other string will be converted to NaN. + + + return value == null || value === '' ? NaN // If string (like '-'), using '+' parse to NaN + // If object, also parse to NaN + : +value; + } + var valueParserMap = createHashMap({ + 'number': function (val) { + // Do not use `numericToNumber` here. We have by defualt `numericToNumber`. + // Here the number parser can have loose rule: + // enable to cut suffix: "120px" => 120, "14%" => 14. + return parseFloat(val); + }, + 'time': function (val) { + // return timestamp. + return +parseDate(val); + }, + 'trim': function (val) { + return isString(val) ? trim(val) : val; + } + }); + function getRawValueParser(type) { + return valueParserMap.get(type); + } + var ORDER_COMPARISON_OP_MAP = { + lt: function (lval, rval) { + return lval < rval; + }, + lte: function (lval, rval) { + return lval <= rval; + }, + gt: function (lval, rval) { + return lval > rval; + }, + gte: function (lval, rval) { + return lval >= rval; + } + }; + + var FilterOrderComparator = + /** @class */ + function () { + function FilterOrderComparator(op, rval) { + if (!isNumber(rval)) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = 'rvalue of "<", ">", "<=", ">=" can only be number in filter.'; + } + + throwError(errMsg); + } + + this._opFn = ORDER_COMPARISON_OP_MAP[op]; + this._rvalFloat = numericToNumber(rval); + } // Performance sensitive. + + + FilterOrderComparator.prototype.evaluate = function (lval) { + // Most cases is 'number', and typeof maybe 10 times faseter than parseFloat. + return isNumber(lval) ? this._opFn(lval, this._rvalFloat) : this._opFn(numericToNumber(lval), this._rvalFloat); + }; + + return FilterOrderComparator; + }(); + + var SortOrderComparator = + /** @class */ + function () { + /** + * @param order by defualt: 'asc' + * @param incomparable by defualt: Always on the tail. + * That is, if 'asc' => 'max', if 'desc' => 'min' + * See the definition of "incomparable" in [SORT_COMPARISON_RULE] + */ + function SortOrderComparator(order, incomparable) { + var isDesc = order === 'desc'; + this._resultLT = isDesc ? 1 : -1; + + if (incomparable == null) { + incomparable = isDesc ? 'min' : 'max'; + } + + this._incomparable = incomparable === 'min' ? -Infinity : Infinity; + } // See [SORT_COMPARISON_RULE]. + // Performance sensitive. + + + SortOrderComparator.prototype.evaluate = function (lval, rval) { + // Most cases is 'number', and typeof maybe 10 times faseter than parseFloat. + var lvalFloat = isNumber(lval) ? lval : numericToNumber(lval); + var rvalFloat = isNumber(rval) ? rval : numericToNumber(rval); + var lvalNotNumeric = isNaN(lvalFloat); + var rvalNotNumeric = isNaN(rvalFloat); + + if (lvalNotNumeric) { + lvalFloat = this._incomparable; + } + + if (rvalNotNumeric) { + rvalFloat = this._incomparable; + } + + if (lvalNotNumeric && rvalNotNumeric) { + var lvalIsStr = isString(lval); + var rvalIsStr = isString(rval); + + if (lvalIsStr) { + lvalFloat = rvalIsStr ? lval : 0; + } + + if (rvalIsStr) { + rvalFloat = lvalIsStr ? rval : 0; + } + } + + return lvalFloat < rvalFloat ? this._resultLT : lvalFloat > rvalFloat ? -this._resultLT : 0; + }; + + return SortOrderComparator; + }(); + + var FilterEqualityComparator = + /** @class */ + function () { + function FilterEqualityComparator(isEq, rval) { + this._rval = rval; + this._isEQ = isEq; + this._rvalTypeof = typeof rval; + this._rvalFloat = numericToNumber(rval); + } // Performance sensitive. + + + FilterEqualityComparator.prototype.evaluate = function (lval) { + var eqResult = lval === this._rval; + + if (!eqResult) { + var lvalTypeof = typeof lval; + + if (lvalTypeof !== this._rvalTypeof && (lvalTypeof === 'number' || this._rvalTypeof === 'number')) { + eqResult = numericToNumber(lval) === this._rvalFloat; + } + } + + return this._isEQ ? eqResult : !eqResult; + }; + + return FilterEqualityComparator; + }(); + /** + * [FILTER_COMPARISON_RULE] + * `lt`|`lte`|`gt`|`gte`: + * + rval must be a number. And lval will be converted to number (`numericToNumber`) to compare. + * `eq`: + * + If same type, compare with `===`. + * + If there is one number, convert to number (`numericToNumber`) to compare. + * + Else return `false`. + * `ne`: + * + Not `eq`. + * + * + * [SORT_COMPARISON_RULE] + * All the values are grouped into three categories: + * + "numeric" (number and numeric string) + * + "non-numeric-string" (string that excluding numeric string) + * + "others" + * "numeric" vs "numeric": values are ordered by number order. + * "non-numeric-string" vs "non-numeric-string": values are ordered by ES spec (#sec-abstract-relational-comparison). + * "others" vs "others": do not change order (always return 0). + * "numeric" vs "non-numeric-string": "non-numeric-string" is treated as "incomparable". + * "number" vs "others": "others" is treated as "incomparable". + * "non-numeric-string" vs "others": "others" is treated as "incomparable". + * "incomparable" will be seen as -Infinity or Infinity (depends on the settings). + * MEMO: + * non-numeric string sort make sence when need to put the items with the same tag together. + * But if we support string sort, we still need to avoid the misleading like `'2' > '12'`, + * So we treat "numeric-string" sorted by number order rather than string comparison. + * + * + * [CHECK_LIST_OF_THE_RULE_DESIGN] + * + Do not support string comparison until required. And also need to + * void the misleading of "2" > "12". + * + Should avoid the misleading case: + * `" 22 " gte "22"` is `true` but `" 22 " eq "22"` is `false`. + * + JS bad case should be avoided: null <= 0, [] <= 0, ' ' <= 0, ... + * + Only "numeric" can be converted to comparable number, otherwise converted to NaN. + * See `util/number.ts#numericToNumber`. + * + * @return If `op` is not `RelationalOperator`, return null; + */ + + + function createFilterComparator(op, rval) { + return op === 'eq' || op === 'ne' ? new FilterEqualityComparator(op === 'eq', rval) : hasOwn(ORDER_COMPARISON_OP_MAP, op) ? new FilterOrderComparator(op, rval) : null; + } + + /** + * TODO: disable writable. + * This structure will be exposed to users. + */ + + var ExternalSource = + /** @class */ + function () { + function ExternalSource() {} + + ExternalSource.prototype.getRawData = function () { + // Only built-in transform available. + throw new Error('not supported'); + }; + + ExternalSource.prototype.getRawDataItem = function (dataIndex) { + // Only built-in transform available. + throw new Error('not supported'); + }; + + ExternalSource.prototype.cloneRawData = function () { + return; + }; + /** + * @return If dimension not found, return null/undefined. + */ + + + ExternalSource.prototype.getDimensionInfo = function (dim) { + return; + }; + /** + * dimensions defined if and only if either: + * (a) dataset.dimensions are declared. + * (b) dataset data include dimensions definitions in data (detected or via specified `sourceHeader`). + * If dimensions are defined, `dimensionInfoAll` is corresponding to + * the defined dimensions. + * Otherwise, `dimensionInfoAll` is determined by data columns. + * @return Always return an array (even empty array). + */ + + + ExternalSource.prototype.cloneAllDimensionInfo = function () { + return; + }; + + ExternalSource.prototype.count = function () { + return; + }; + /** + * Only support by dimension index. + * No need to support by dimension name in transform function, + * becuase transform function is not case-specific, no need to use name literally. + */ + + + ExternalSource.prototype.retrieveValue = function (dataIndex, dimIndex) { + return; + }; + + ExternalSource.prototype.retrieveValueFromItem = function (dataItem, dimIndex) { + return; + }; + + ExternalSource.prototype.convertValue = function (rawVal, dimInfo) { + return parseDataValue(rawVal, dimInfo); + }; + + return ExternalSource; + }(); + + function createExternalSource(internalSource, externalTransform) { + var extSource = new ExternalSource(); + var data = internalSource.data; + var sourceFormat = extSource.sourceFormat = internalSource.sourceFormat; + var sourceHeaderCount = internalSource.startIndex; + var errMsg = ''; + + if (internalSource.seriesLayoutBy !== SERIES_LAYOUT_BY_COLUMN) { + // For the logic simplicity in transformer, only 'culumn' is + // supported in data transform. Otherwise, the `dimensionsDefine` + // might be detected by 'row', which probably confuses users. + if ("development" !== 'production') { + errMsg = '`seriesLayoutBy` of upstream dataset can only be "column" in data transform.'; + } + + throwError(errMsg); + } // [MEMO] + // Create a new dimensions structure for exposing. + // Do not expose all dimension info to users directly. + // Becuase the dimension is probably auto detected from data and not might reliable. + // Should not lead the transformers to think that is relialbe and return it. + // See [DIMENSION_INHERIT_RULE] in `sourceManager.ts`. + + + var dimensions = []; + var dimsByName = {}; + var dimsDef = internalSource.dimensionsDefine; + + if (dimsDef) { + each(dimsDef, function (dimDef, idx) { + var name = dimDef.name; + var dimDefExt = { + index: idx, + name: name, + displayName: dimDef.displayName + }; + dimensions.push(dimDefExt); // Users probably not sepcify dimension name. For simplicity, data transform + // do not generate dimension name. + + if (name != null) { + // Dimension name should not be duplicated. + // For simplicity, data transform forbid name duplication, do not generate + // new name like module `completeDimensions.ts` did, but just tell users. + var errMsg_1 = ''; + + if (hasOwn(dimsByName, name)) { + if ("development" !== 'production') { + errMsg_1 = 'dimension name "' + name + '" duplicated.'; + } + + throwError(errMsg_1); + } + + dimsByName[name] = dimDefExt; + } + }); + } // If dimension definitions are not defined and can not be detected. + // e.g., pure data `[[11, 22], ...]`. + else { + for (var i = 0; i < internalSource.dimensionsDetectedCount || 0; i++) { + // Do not generete name or anything others. The consequence process in + // `transform` or `series` probably have there own name generation strategry. + dimensions.push({ + index: i + }); + } + } // Implement public methods: + + + var rawItemGetter = getRawSourceItemGetter(sourceFormat, SERIES_LAYOUT_BY_COLUMN); + + if (externalTransform.__isBuiltIn) { + extSource.getRawDataItem = function (dataIndex) { + return rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex); + }; + + extSource.getRawData = bind(getRawData, null, internalSource); + } + + extSource.cloneRawData = bind(cloneRawData, null, internalSource); + var rawCounter = getRawSourceDataCounter(sourceFormat, SERIES_LAYOUT_BY_COLUMN); + extSource.count = bind(rawCounter, null, data, sourceHeaderCount, dimensions); + var rawValueGetter = getRawSourceValueGetter(sourceFormat); + + extSource.retrieveValue = function (dataIndex, dimIndex) { + var rawItem = rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex); + return retrieveValueFromItem(rawItem, dimIndex); + }; + + var retrieveValueFromItem = extSource.retrieveValueFromItem = function (dataItem, dimIndex) { + if (dataItem == null) { + return; + } + + var dimDef = dimensions[dimIndex]; // When `dimIndex` is `null`, `rawValueGetter` return the whole item. + + if (dimDef) { + return rawValueGetter(dataItem, dimIndex, dimDef.name); + } + }; + + extSource.getDimensionInfo = bind(getDimensionInfo, null, dimensions, dimsByName); + extSource.cloneAllDimensionInfo = bind(cloneAllDimensionInfo, null, dimensions); + return extSource; + } + + function getRawData(upstream) { + var sourceFormat = upstream.sourceFormat; + + if (!isSupportedSourceFormat(sourceFormat)) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = '`getRawData` is not supported in source format ' + sourceFormat; + } + + throwError(errMsg); + } + + return upstream.data; + } + + function cloneRawData(upstream) { + var sourceFormat = upstream.sourceFormat; + var data = upstream.data; + + if (!isSupportedSourceFormat(sourceFormat)) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = '`cloneRawData` is not supported in source format ' + sourceFormat; + } + + throwError(errMsg); + } + + if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { + var result = []; + + for (var i = 0, len = data.length; i < len; i++) { + // Not strictly clone for performance + result.push(data[i].slice()); + } + + return result; + } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { + var result = []; + + for (var i = 0, len = data.length; i < len; i++) { + // Not strictly clone for performance + result.push(extend({}, data[i])); + } + + return result; + } + } + + function getDimensionInfo(dimensions, dimsByName, dim) { + if (dim == null) { + return; + } // Keep the same logic as `List::getDimension` did. + + + if (isNumber(dim) // If being a number-like string but not being defined a dimension name. + || !isNaN(dim) && !hasOwn(dimsByName, dim)) { + return dimensions[dim]; + } else if (hasOwn(dimsByName, dim)) { + return dimsByName[dim]; + } + } + + function cloneAllDimensionInfo(dimensions) { + return clone(dimensions); + } + + var externalTransformMap = createHashMap(); + function registerExternalTransform(externalTransform) { + externalTransform = clone(externalTransform); + var type = externalTransform.type; + var errMsg = ''; + + if (!type) { + if ("development" !== 'production') { + errMsg = 'Must have a `type` when `registerTransform`.'; + } + + throwError(errMsg); + } + + var typeParsed = type.split(':'); + + if (typeParsed.length !== 2) { + if ("development" !== 'production') { + errMsg = 'Name must include namespace like "ns:regression".'; + } + + throwError(errMsg); + } // Namespace 'echarts:xxx' is official namespace, where the transforms should + // be called directly via 'xxx' rather than 'echarts:xxx'. + + + var isBuiltIn = false; + + if (typeParsed[0] === 'echarts') { + type = typeParsed[1]; + isBuiltIn = true; + } + + externalTransform.__isBuiltIn = isBuiltIn; + externalTransformMap.set(type, externalTransform); + } + function applyDataTransform(rawTransOption, sourceList, infoForPrint) { + var pipedTransOption = normalizeToArray(rawTransOption); + var pipeLen = pipedTransOption.length; + var errMsg = ''; + + if (!pipeLen) { + if ("development" !== 'production') { + errMsg = 'If `transform` declared, it should at least contain one transform.'; + } + + throwError(errMsg); + } + + for (var i = 0, len = pipeLen; i < len; i++) { + var transOption = pipedTransOption[i]; + sourceList = applySingleDataTransform(transOption, sourceList, infoForPrint, pipeLen === 1 ? null : i); // piped transform only support single input, except the fist one. + // piped transform only support single output, except the last one. + + if (i !== len - 1) { + sourceList.length = Math.max(sourceList.length, 1); + } + } + + return sourceList; + } + + function applySingleDataTransform(transOption, upSourceList, infoForPrint, // If `pipeIndex` is null/undefined, no piped transform. + pipeIndex) { + var errMsg = ''; + + if (!upSourceList.length) { + if ("development" !== 'production') { + errMsg = 'Must have at least one upstream dataset.'; + } + + throwError(errMsg); + } + + if (!isObject(transOption)) { + if ("development" !== 'production') { + errMsg = 'transform declaration must be an object rather than ' + typeof transOption + '.'; + } + + throwError(errMsg); + } + + var transType = transOption.type; + var externalTransform = externalTransformMap.get(transType); + + if (!externalTransform) { + if ("development" !== 'production') { + errMsg = 'Can not find transform on type "' + transType + '".'; + } + + throwError(errMsg); + } // Prepare source + + + var extUpSourceList = map(upSourceList, function (upSource) { + return createExternalSource(upSource, externalTransform); + }); + var resultList = normalizeToArray(externalTransform.transform({ + upstream: extUpSourceList[0], + upstreamList: extUpSourceList, + config: clone(transOption.config) + })); + + if ("development" !== 'production') { + if (transOption.print) { + var printStrArr = map(resultList, function (extSource) { + var pipeIndexStr = pipeIndex != null ? ' === pipe index: ' + pipeIndex : ''; + return ['=== dataset index: ' + infoForPrint.datasetIndex + pipeIndexStr + ' ===', '- transform result data:', makePrintable(extSource.data), '- transform result dimensions:', makePrintable(extSource.dimensions)].join('\n'); + }).join('\n'); + log(printStrArr); + } + } + + return map(resultList, function (result, resultIndex) { + var errMsg = ''; + + if (!isObject(result)) { + if ("development" !== 'production') { + errMsg = 'A transform should not return some empty results.'; + } + + throwError(errMsg); + } + + if (!result.data) { + if ("development" !== 'production') { + errMsg = 'Transform result data should be not be null or undefined'; + } + + throwError(errMsg); + } + + var sourceFormat = detectSourceFormat(result.data); + + if (!isSupportedSourceFormat(sourceFormat)) { + if ("development" !== 'production') { + errMsg = 'Transform result data should be array rows or object rows.'; + } + + throwError(errMsg); + } + + var resultMetaRawOption; + var firstUpSource = upSourceList[0]; + /** + * Intuitively, the end users known the content of the original `dataset.source`, + * calucating the transform result in mind. + * Suppose the original `dataset.source` is: + * ```js + * [ + * ['product', '2012', '2013', '2014', '2015'], + * ['AAA', 41.1, 30.4, 65.1, 53.3], + * ['BBB', 86.5, 92.1, 85.7, 83.1], + * ['CCC', 24.1, 67.2, 79.5, 86.4] + * ] + * ``` + * The dimension info have to be detected from the source data. + * Some of the transformers (like filter, sort) will follow the dimension info + * of upstream, while others use new dimensions (like aggregate). + * Transformer can output a field `dimensions` to define the its own output dimensions. + * We also allow transformers to ignore the output `dimensions` field, and + * inherit the upstream dimensions definition. It can reduce the burden of handling + * dimensions in transformers. + * + * See also [DIMENSION_INHERIT_RULE] in `sourceManager.ts`. + */ + + if (firstUpSource && resultIndex === 0 // If transformer returns `dimensions`, it means that the transformer has different + // dimensions definitions. We do not inherit anything from upstream. + && !result.dimensions) { + var startIndex = firstUpSource.startIndex; // We copy the header of upstream to the result becuase: + // (1) The returned data always does not contain header line and can not be used + // as dimension-detection. In this case we can not use "detected dimensions" of + // upstream directly, because it might be detected based on different `seriesLayoutBy`. + // (2) We should support that the series read the upstream source in `seriesLayoutBy: 'row'`. + // So the original detected header should be add to the result, otherwise they can not be read. + + if (startIndex) { + result.data = firstUpSource.data.slice(0, startIndex).concat(result.data); + } + + resultMetaRawOption = { + seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN, + sourceHeader: startIndex, + dimensions: firstUpSource.metaRawOption.dimensions + }; + } else { + resultMetaRawOption = { + seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN, + sourceHeader: 0, + dimensions: result.dimensions + }; + } + + return createSource(result.data, resultMetaRawOption, null); + }); + } + + function isSupportedSourceFormat(sourceFormat) { + return sourceFormat === SOURCE_FORMAT_ARRAY_ROWS || sourceFormat === SOURCE_FORMAT_OBJECT_ROWS; + } + + var UNDEFINED = 'undefined'; + /* global Float64Array, Int32Array, Uint32Array, Uint16Array */ + // Caution: MUST not use `new CtorUint32Array(arr, 0, len)`, because the Ctor of array is + // different from the Ctor of typed array. + + var CtorUint32Array = typeof Uint32Array === UNDEFINED ? Array : Uint32Array; + var CtorUint16Array = typeof Uint16Array === UNDEFINED ? Array : Uint16Array; + var CtorInt32Array = typeof Int32Array === UNDEFINED ? Array : Int32Array; + var CtorFloat64Array = typeof Float64Array === UNDEFINED ? Array : Float64Array; + /** + * Multi dimensional data store + */ + + var dataCtors = { + 'float': CtorFloat64Array, + 'int': CtorInt32Array, + // Ordinal data type can be string or int + 'ordinal': Array, + 'number': Array, + 'time': CtorFloat64Array + }; + var defaultDimValueGetters; + + function getIndicesCtor(rawCount) { + // The possible max value in this._indicies is always this._rawCount despite of filtering. + return rawCount > 65535 ? CtorUint32Array : CtorUint16Array; + } + + function getInitialExtent() { + return [Infinity, -Infinity]; + } + + function cloneChunk(originalChunk) { + var Ctor = originalChunk.constructor; // Only shallow clone is enough when Array. + + return Ctor === Array ? originalChunk.slice() : new Ctor(originalChunk); + } + + function prepareStore(store, dimIdx, dimType, end, append) { + var DataCtor = dataCtors[dimType || 'float']; + + if (append) { + var oldStore = store[dimIdx]; + var oldLen = oldStore && oldStore.length; + + if (!(oldLen === end)) { + var newStore = new DataCtor(end); // The cost of the copy is probably inconsiderable + // within the initial chunkSize. + + for (var j = 0; j < oldLen; j++) { + newStore[j] = oldStore[j]; + } + + store[dimIdx] = newStore; + } + } else { + store[dimIdx] = new DataCtor(end); + } + } + /** + * Basically, DataStore API keep immutable. + */ + + var DataStore = + /** @class */ + function () { + function DataStore() { + this._chunks = []; // It will not be calculated util needed. + + this._rawExtent = []; + this._extent = []; + this._count = 0; + this._rawCount = 0; + this._calcDimNameToIdx = createHashMap(); + } + /** + * Initialize from data + */ + + + DataStore.prototype.initData = function (provider, inputDimensions, dimValueGetter) { + if ("development" !== 'production') { + assert(isFunction(provider.getItem) && isFunction(provider.count), 'Invalid data provider.'); + } + + this._provider = provider; // Clear + + this._chunks = []; + this._indices = null; + this.getRawIndex = this._getRawIdxIdentity; + var source = provider.getSource(); + var defaultGetter = this.defaultDimValueGetter = defaultDimValueGetters[source.sourceFormat]; // Default dim value getter + + this._dimValueGetter = dimValueGetter || defaultGetter; // Reset raw extent. + + this._rawExtent = []; + var willRetrieveDataByName = shouldRetrieveDataByName(source); + this._dimensions = map(inputDimensions, function (dim) { + if ("development" !== 'production') { + if (willRetrieveDataByName) { + assert(dim.property != null); + } + } + + return { + // Only pick these two props. Not leak other properties like orderMeta. + type: dim.type, + property: dim.property + }; + }); + + this._initDataFromProvider(0, provider.count()); + }; + + DataStore.prototype.getProvider = function () { + return this._provider; + }; + /** + * Caution: even when a `source` instance owned by a series, the created data store + * may still be shared by different sereis (the source hash does not use all `source` + * props, see `sourceManager`). In this case, the `source` props that are not used in + * hash (like `source.dimensionDefine`) probably only belongs to a certain series and + * thus should not be fetch here. + */ + + + DataStore.prototype.getSource = function () { + return this._provider.getSource(); + }; + /** + * @caution Only used in dataStack. + */ + + + DataStore.prototype.ensureCalculationDimension = function (dimName, type) { + var calcDimNameToIdx = this._calcDimNameToIdx; + var dimensions = this._dimensions; + var calcDimIdx = calcDimNameToIdx.get(dimName); + + if (calcDimIdx != null) { + if (dimensions[calcDimIdx].type === type) { + return calcDimIdx; + } + } else { + calcDimIdx = dimensions.length; + } + + dimensions[calcDimIdx] = { + type: type + }; + calcDimNameToIdx.set(dimName, calcDimIdx); + this._chunks[calcDimIdx] = new dataCtors[type || 'float'](this._rawCount); + this._rawExtent[calcDimIdx] = getInitialExtent(); + return calcDimIdx; + }; + + DataStore.prototype.collectOrdinalMeta = function (dimIdx, ordinalMeta) { + var chunk = this._chunks[dimIdx]; + var dim = this._dimensions[dimIdx]; + var rawExtents = this._rawExtent; + var offset = dim.ordinalOffset || 0; + var len = chunk.length; + + if (offset === 0) { + // We need to reset the rawExtent if collect is from start. + // Because this dimension may be guessed as number and calcuating a wrong extent. + rawExtents[dimIdx] = getInitialExtent(); + } + + var dimRawExtent = rawExtents[dimIdx]; // Parse from previous data offset. len may be changed after appendData + + for (var i = offset; i < len; i++) { + var val = chunk[i] = ordinalMeta.parseAndCollect(chunk[i]); + + if (!isNaN(val)) { + dimRawExtent[0] = Math.min(val, dimRawExtent[0]); + dimRawExtent[1] = Math.max(val, dimRawExtent[1]); + } + } + + dim.ordinalMeta = ordinalMeta; + dim.ordinalOffset = len; + dim.type = 'ordinal'; // Force to be ordinal + }; + + DataStore.prototype.getOrdinalMeta = function (dimIdx) { + var dimInfo = this._dimensions[dimIdx]; + var ordinalMeta = dimInfo.ordinalMeta; + return ordinalMeta; + }; + + DataStore.prototype.getDimensionProperty = function (dimIndex) { + var item = this._dimensions[dimIndex]; + return item && item.property; + }; + /** + * Caution: Can be only called on raw data (before `this._indices` created). + */ + + + DataStore.prototype.appendData = function (data) { + if ("development" !== 'production') { + assert(!this._indices, 'appendData can only be called on raw data.'); + } + + var provider = this._provider; + var start = this.count(); + provider.appendData(data); + var end = provider.count(); + + if (!provider.persistent) { + end += start; + } + + if (start < end) { + this._initDataFromProvider(start, end, true); + } + + return [start, end]; + }; + + DataStore.prototype.appendValues = function (values, minFillLen) { + var chunks = this._chunks; + var dimensions = this._dimensions; + var dimLen = dimensions.length; + var rawExtent = this._rawExtent; + var start = this.count(); + var end = start + Math.max(values.length, minFillLen || 0); + + for (var i = 0; i < dimLen; i++) { + var dim = dimensions[i]; + prepareStore(chunks, i, dim.type, end, true); + } + + var emptyDataItem = []; + + for (var idx = start; idx < end; idx++) { + var sourceIdx = idx - start; // Store the data by dimensions + + for (var dimIdx = 0; dimIdx < dimLen; dimIdx++) { + var dim = dimensions[dimIdx]; + var val = defaultDimValueGetters.arrayRows.call(this, values[sourceIdx] || emptyDataItem, dim.property, sourceIdx, dimIdx); + chunks[dimIdx][idx] = val; + var dimRawExtent = rawExtent[dimIdx]; + val < dimRawExtent[0] && (dimRawExtent[0] = val); + val > dimRawExtent[1] && (dimRawExtent[1] = val); + } + } + + this._rawCount = this._count = end; + return { + start: start, + end: end + }; + }; + + DataStore.prototype._initDataFromProvider = function (start, end, append) { + var provider = this._provider; + var chunks = this._chunks; + var dimensions = this._dimensions; + var dimLen = dimensions.length; + var rawExtent = this._rawExtent; + var dimNames = map(dimensions, function (dim) { + return dim.property; + }); + + for (var i = 0; i < dimLen; i++) { + var dim = dimensions[i]; + + if (!rawExtent[i]) { + rawExtent[i] = getInitialExtent(); + } + + prepareStore(chunks, i, dim.type, end, append); + } + + if (provider.fillStorage) { + provider.fillStorage(start, end, chunks, rawExtent); + } else { + var dataItem = []; + + for (var idx = start; idx < end; idx++) { + // NOTICE: Try not to write things into dataItem + dataItem = provider.getItem(idx, dataItem); // Each data item is value + // [1, 2] + // 2 + // Bar chart, line chart which uses category axis + // only gives the 'y' value. 'x' value is the indices of category + // Use a tempValue to normalize the value to be a (x, y) value + // Store the data by dimensions + + for (var dimIdx = 0; dimIdx < dimLen; dimIdx++) { + var dimStorage = chunks[dimIdx]; // PENDING NULL is empty or zero + + var val = this._dimValueGetter(dataItem, dimNames[dimIdx], idx, dimIdx); + + dimStorage[idx] = val; + var dimRawExtent = rawExtent[dimIdx]; + val < dimRawExtent[0] && (dimRawExtent[0] = val); + val > dimRawExtent[1] && (dimRawExtent[1] = val); + } + } + } + + if (!provider.persistent && provider.clean) { + // Clean unused data if data source is typed array. + provider.clean(); + } + + this._rawCount = this._count = end; // Reset data extent + + this._extent = []; + }; + + DataStore.prototype.count = function () { + return this._count; + }; + /** + * Get value. Return NaN if idx is out of range. + */ + + + DataStore.prototype.get = function (dim, idx) { + if (!(idx >= 0 && idx < this._count)) { + return NaN; + } + + var dimStore = this._chunks[dim]; + return dimStore ? dimStore[this.getRawIndex(idx)] : NaN; + }; + + DataStore.prototype.getValues = function (dimensions, idx) { + var values = []; + var dimArr = []; + + if (idx == null) { + idx = dimensions; // TODO get all from store? + + dimensions = []; // All dimensions + + for (var i = 0; i < this._dimensions.length; i++) { + dimArr.push(i); + } + } else { + dimArr = dimensions; + } + + for (var i = 0, len = dimArr.length; i < len; i++) { + values.push(this.get(dimArr[i], idx)); + } + + return values; + }; + /** + * @param dim concrete dim + */ + + + DataStore.prototype.getByRawIndex = function (dim, rawIdx) { + if (!(rawIdx >= 0 && rawIdx < this._rawCount)) { + return NaN; + } + + var dimStore = this._chunks[dim]; + return dimStore ? dimStore[rawIdx] : NaN; + }; + /** + * Get sum of data in one dimension + */ + + + DataStore.prototype.getSum = function (dim) { + var dimData = this._chunks[dim]; + var sum = 0; + + if (dimData) { + for (var i = 0, len = this.count(); i < len; i++) { + var value = this.get(dim, i); + + if (!isNaN(value)) { + sum += value; + } + } + } + + return sum; + }; + /** + * Get median of data in one dimension + */ + + + DataStore.prototype.getMedian = function (dim) { + var dimDataArray = []; // map all data of one dimension + + this.each([dim], function (val) { + if (!isNaN(val)) { + dimDataArray.push(val); + } + }); // TODO + // Use quick select? + + var sortedDimDataArray = dimDataArray.sort(function (a, b) { + return a - b; + }); + var len = this.count(); // calculate median + + return len === 0 ? 0 : len % 2 === 1 ? sortedDimDataArray[(len - 1) / 2] : (sortedDimDataArray[len / 2] + sortedDimDataArray[len / 2 - 1]) / 2; + }; + /** + * Retreive the index with given raw data index + */ + + + DataStore.prototype.indexOfRawIndex = function (rawIndex) { + if (rawIndex >= this._rawCount || rawIndex < 0) { + return -1; + } + + if (!this._indices) { + return rawIndex; + } // Indices are ascending + + + var indices = this._indices; // If rawIndex === dataIndex + + var rawDataIndex = indices[rawIndex]; + + if (rawDataIndex != null && rawDataIndex < this._count && rawDataIndex === rawIndex) { + return rawIndex; + } + + var left = 0; + var right = this._count - 1; + + while (left <= right) { + var mid = (left + right) / 2 | 0; + + if (indices[mid] < rawIndex) { + left = mid + 1; + } else if (indices[mid] > rawIndex) { + right = mid - 1; + } else { + return mid; + } + } + + return -1; + }; + /** + * Retreive the index of nearest value + * @param dim + * @param value + * @param [maxDistance=Infinity] + * @return If and only if multiple indices has + * the same value, they are put to the result. + */ + + + DataStore.prototype.indicesOfNearest = function (dim, value, maxDistance) { + var chunks = this._chunks; + var dimData = chunks[dim]; + var nearestIndices = []; + + if (!dimData) { + return nearestIndices; + } + + if (maxDistance == null) { + maxDistance = Infinity; + } + + var minDist = Infinity; + var minDiff = -1; + var nearestIndicesLen = 0; // Check the test case of `test/ut/spec/data/SeriesData.js`. + + for (var i = 0, len = this.count(); i < len; i++) { + var dataIndex = this.getRawIndex(i); + var diff = value - dimData[dataIndex]; + var dist = Math.abs(diff); + + if (dist <= maxDistance) { + // When the `value` is at the middle of `this.get(dim, i)` and `this.get(dim, i+1)`, + // we'd better not push both of them to `nearestIndices`, otherwise it is easy to + // get more than one item in `nearestIndices` (more specifically, in `tooltip`). + // So we chose the one that `diff >= 0` in this csae. + // But if `this.get(dim, i)` and `this.get(dim, j)` get the same value, both of them + // should be push to `nearestIndices`. + if (dist < minDist || dist === minDist && diff >= 0 && minDiff < 0) { + minDist = dist; + minDiff = diff; + nearestIndicesLen = 0; + } + + if (diff === minDiff) { + nearestIndices[nearestIndicesLen++] = i; + } + } + } + + nearestIndices.length = nearestIndicesLen; + return nearestIndices; + }; + + DataStore.prototype.getIndices = function () { + var newIndices; + var indices = this._indices; + + if (indices) { + var Ctor = indices.constructor; + var thisCount = this._count; // `new Array(a, b, c)` is different from `new Uint32Array(a, b, c)`. + + if (Ctor === Array) { + newIndices = new Ctor(thisCount); + + for (var i = 0; i < thisCount; i++) { + newIndices[i] = indices[i]; + } + } else { + newIndices = new Ctor(indices.buffer, 0, thisCount); + } + } else { + var Ctor = getIndicesCtor(this._rawCount); + newIndices = new Ctor(this.count()); + + for (var i = 0; i < newIndices.length; i++) { + newIndices[i] = i; + } + } + + return newIndices; + }; + /** + * Data filter. + */ + + + DataStore.prototype.filter = function (dims, cb) { + if (!this._count) { + return this; + } + + var newStore = this.clone(); + var count = newStore.count(); + var Ctor = getIndicesCtor(newStore._rawCount); + var newIndices = new Ctor(count); + var value = []; + var dimSize = dims.length; + var offset = 0; + var dim0 = dims[0]; + var chunks = newStore._chunks; + + for (var i = 0; i < count; i++) { + var keep = void 0; + var rawIdx = newStore.getRawIndex(i); // Simple optimization + + if (dimSize === 0) { + keep = cb(i); + } else if (dimSize === 1) { + var val = chunks[dim0][rawIdx]; + keep = cb(val, i); + } else { + var k = 0; + + for (; k < dimSize; k++) { + value[k] = chunks[dims[k]][rawIdx]; + } + + value[k] = i; + keep = cb.apply(null, value); + } + + if (keep) { + newIndices[offset++] = rawIdx; + } + } // Set indices after filtered. + + + if (offset < count) { + newStore._indices = newIndices; + } + + newStore._count = offset; // Reset data extent + + newStore._extent = []; + + newStore._updateGetRawIdx(); + + return newStore; + }; + /** + * Select data in range. (For optimization of filter) + * (Manually inline code, support 5 million data filtering in data zoom.) + */ + + + DataStore.prototype.selectRange = function (range) { + var newStore = this.clone(); + var len = newStore._count; + + if (!len) { + return this; + } + + var dims = keys(range); + var dimSize = dims.length; + + if (!dimSize) { + return this; + } + + var originalCount = newStore.count(); + var Ctor = getIndicesCtor(newStore._rawCount); + var newIndices = new Ctor(originalCount); + var offset = 0; + var dim0 = dims[0]; + var min = range[dim0][0]; + var max = range[dim0][1]; + var storeArr = newStore._chunks; + var quickFinished = false; + + if (!newStore._indices) { + // Extreme optimization for common case. About 2x faster in chrome. + var idx = 0; + + if (dimSize === 1) { + var dimStorage = storeArr[dims[0]]; + + for (var i = 0; i < len; i++) { + var val = dimStorage[i]; // NaN will not be filtered. Consider the case, in line chart, empty + // value indicates the line should be broken. But for the case like + // scatter plot, a data item with empty value will not be rendered, + // but the axis extent may be effected if some other dim of the data + // item has value. Fortunately it is not a significant negative effect. + + if (val >= min && val <= max || isNaN(val)) { + newIndices[offset++] = idx; + } + + idx++; + } + + quickFinished = true; + } else if (dimSize === 2) { + var dimStorage = storeArr[dims[0]]; + var dimStorage2 = storeArr[dims[1]]; + var min2 = range[dims[1]][0]; + var max2 = range[dims[1]][1]; + + for (var i = 0; i < len; i++) { + var val = dimStorage[i]; + var val2 = dimStorage2[i]; // Do not filter NaN, see comment above. + + if ((val >= min && val <= max || isNaN(val)) && (val2 >= min2 && val2 <= max2 || isNaN(val2))) { + newIndices[offset++] = idx; + } + + idx++; + } + + quickFinished = true; + } + } + + if (!quickFinished) { + if (dimSize === 1) { + for (var i = 0; i < originalCount; i++) { + var rawIndex = newStore.getRawIndex(i); + var val = storeArr[dims[0]][rawIndex]; // Do not filter NaN, see comment above. + + if (val >= min && val <= max || isNaN(val)) { + newIndices[offset++] = rawIndex; + } + } + } else { + for (var i = 0; i < originalCount; i++) { + var keep = true; + var rawIndex = newStore.getRawIndex(i); + + for (var k = 0; k < dimSize; k++) { + var dimk = dims[k]; + var val = storeArr[dimk][rawIndex]; // Do not filter NaN, see comment above. + + if (val < range[dimk][0] || val > range[dimk][1]) { + keep = false; + } + } + + if (keep) { + newIndices[offset++] = newStore.getRawIndex(i); + } + } + } + } // Set indices after filtered. + + + if (offset < originalCount) { + newStore._indices = newIndices; + } + + newStore._count = offset; // Reset data extent + + newStore._extent = []; + + newStore._updateGetRawIdx(); + + return newStore; + }; // /** + // * Data mapping to a plain array + // */ + // mapArray(dims: DimensionIndex[], cb: MapArrayCb): any[] { + // const result: any[] = []; + // this.each(dims, function () { + // result.push(cb && (cb as MapArrayCb).apply(null, arguments)); + // }); + // return result; + // } + + /** + * Data mapping to a new List with given dimensions + */ + + + DataStore.prototype.map = function (dims, cb) { + // TODO only clone picked chunks. + var target = this.clone(dims); + + this._updateDims(target, dims, cb); + + return target; + }; + /** + * @caution Danger!! Only used in dataStack. + */ + + + DataStore.prototype.modify = function (dims, cb) { + this._updateDims(this, dims, cb); + }; + + DataStore.prototype._updateDims = function (target, dims, cb) { + var targetChunks = target._chunks; + var tmpRetValue = []; + var dimSize = dims.length; + var dataCount = target.count(); + var values = []; + var rawExtent = target._rawExtent; + + for (var i = 0; i < dims.length; i++) { + rawExtent[dims[i]] = getInitialExtent(); + } + + for (var dataIndex = 0; dataIndex < dataCount; dataIndex++) { + var rawIndex = target.getRawIndex(dataIndex); + + for (var k = 0; k < dimSize; k++) { + values[k] = targetChunks[dims[k]][rawIndex]; + } + + values[dimSize] = dataIndex; + var retValue = cb && cb.apply(null, values); + + if (retValue != null) { + // a number or string (in oridinal dimension)? + if (typeof retValue !== 'object') { + tmpRetValue[0] = retValue; + retValue = tmpRetValue; + } + + for (var i = 0; i < retValue.length; i++) { + var dim = dims[i]; + var val = retValue[i]; + var rawExtentOnDim = rawExtent[dim]; + var dimStore = targetChunks[dim]; + + if (dimStore) { + dimStore[rawIndex] = val; + } + + if (val < rawExtentOnDim[0]) { + rawExtentOnDim[0] = val; + } + + if (val > rawExtentOnDim[1]) { + rawExtentOnDim[1] = val; + } + } + } + } + }; + /** + * Large data down sampling using largest-triangle-three-buckets + * @param {string} valueDimension + * @param {number} targetCount + */ + + + DataStore.prototype.lttbDownSample = function (valueDimension, rate) { + var target = this.clone([valueDimension], true); + var targetStorage = target._chunks; + var dimStore = targetStorage[valueDimension]; + var len = this.count(); + var sampledIndex = 0; + var frameSize = Math.floor(1 / rate); + var currentRawIndex = this.getRawIndex(0); + var maxArea; + var area; + var nextRawIndex; + var newIndices = new (getIndicesCtor(this._rawCount))(Math.min((Math.ceil(len / frameSize) + 2) * 2, len)); // First frame use the first data. + + newIndices[sampledIndex++] = currentRawIndex; + + for (var i = 1; i < len - 1; i += frameSize) { + var nextFrameStart = Math.min(i + frameSize, len - 1); + var nextFrameEnd = Math.min(i + frameSize * 2, len); + var avgX = (nextFrameEnd + nextFrameStart) / 2; + var avgY = 0; + + for (var idx = nextFrameStart; idx < nextFrameEnd; idx++) { + var rawIndex = this.getRawIndex(idx); + var y = dimStore[rawIndex]; + + if (isNaN(y)) { + continue; + } + + avgY += y; + } + + avgY /= nextFrameEnd - nextFrameStart; + var frameStart = i; + var frameEnd = Math.min(i + frameSize, len); + var pointAX = i - 1; + var pointAY = dimStore[currentRawIndex]; + maxArea = -1; + nextRawIndex = frameStart; + var firstNaNIndex = -1; + var countNaN = 0; // Find a point from current frame that construct a triangel with largest area with previous selected point + // And the average of next frame. + + for (var idx = frameStart; idx < frameEnd; idx++) { + var rawIndex = this.getRawIndex(idx); + var y = dimStore[rawIndex]; + + if (isNaN(y)) { + countNaN++; + + if (firstNaNIndex < 0) { + firstNaNIndex = rawIndex; + } + + continue; + } // Calculate triangle area over three buckets + + + area = Math.abs((pointAX - avgX) * (y - pointAY) - (pointAX - idx) * (avgY - pointAY)); + + if (area > maxArea) { + maxArea = area; + nextRawIndex = rawIndex; // Next a is this b + } + } + + if (countNaN > 0 && countNaN < frameEnd - frameStart) { + // Append first NaN point in every bucket. + // It is necessary to ensure the correct order of indices. + newIndices[sampledIndex++] = Math.min(firstNaNIndex, nextRawIndex); + nextRawIndex = Math.max(firstNaNIndex, nextRawIndex); + } + + newIndices[sampledIndex++] = nextRawIndex; + currentRawIndex = nextRawIndex; // This a is the next a (chosen b) + } // First frame use the last data. + + + newIndices[sampledIndex++] = this.getRawIndex(len - 1); + target._count = sampledIndex; + target._indices = newIndices; + target.getRawIndex = this._getRawIdx; + return target; + }; + /** + * Large data down sampling on given dimension + * @param sampleIndex Sample index for name and id + */ + + + DataStore.prototype.downSample = function (dimension, rate, sampleValue, sampleIndex) { + var target = this.clone([dimension], true); + var targetStorage = target._chunks; + var frameValues = []; + var frameSize = Math.floor(1 / rate); + var dimStore = targetStorage[dimension]; + var len = this.count(); + var rawExtentOnDim = target._rawExtent[dimension] = getInitialExtent(); + var newIndices = new (getIndicesCtor(this._rawCount))(Math.ceil(len / frameSize)); + var offset = 0; + + for (var i = 0; i < len; i += frameSize) { + // Last frame + if (frameSize > len - i) { + frameSize = len - i; + frameValues.length = frameSize; + } + + for (var k = 0; k < frameSize; k++) { + var dataIdx = this.getRawIndex(i + k); + frameValues[k] = dimStore[dataIdx]; + } + + var value = sampleValue(frameValues); + var sampleFrameIdx = this.getRawIndex(Math.min(i + sampleIndex(frameValues, value) || 0, len - 1)); // Only write value on the filtered data + + dimStore[sampleFrameIdx] = value; + + if (value < rawExtentOnDim[0]) { + rawExtentOnDim[0] = value; + } + + if (value > rawExtentOnDim[1]) { + rawExtentOnDim[1] = value; + } + + newIndices[offset++] = sampleFrameIdx; + } + + target._count = offset; + target._indices = newIndices; + + target._updateGetRawIdx(); + + return target; + }; + /** + * Data iteration + * @param ctx default this + * @example + * list.each('x', function (x, idx) {}); + * list.each(['x', 'y'], function (x, y, idx) {}); + * list.each(function (idx) {}) + */ + + + DataStore.prototype.each = function (dims, cb) { + if (!this._count) { + return; + } + + var dimSize = dims.length; + var chunks = this._chunks; + + for (var i = 0, len = this.count(); i < len; i++) { + var rawIdx = this.getRawIndex(i); // Simple optimization + + switch (dimSize) { + case 0: + cb(i); + break; + + case 1: + cb(chunks[dims[0]][rawIdx], i); + break; + + case 2: + cb(chunks[dims[0]][rawIdx], chunks[dims[1]][rawIdx], i); + break; + + default: + var k = 0; + var value = []; + + for (; k < dimSize; k++) { + value[k] = chunks[dims[k]][rawIdx]; + } // Index + + + value[k] = i; + cb.apply(null, value); + } + } + }; + /** + * Get extent of data in one dimension + */ + + + DataStore.prototype.getDataExtent = function (dim) { + // Make sure use concrete dim as cache name. + var dimData = this._chunks[dim]; + var initialExtent = getInitialExtent(); + + if (!dimData) { + return initialExtent; + } // Make more strict checkings to ensure hitting cache. + + + var currEnd = this.count(); // Consider the most cases when using data zoom, `getDataExtent` + // happened before filtering. We cache raw extent, which is not + // necessary to be cleared and recalculated when restore data. + + var useRaw = !this._indices; + var dimExtent; + + if (useRaw) { + return this._rawExtent[dim].slice(); + } + + dimExtent = this._extent[dim]; + + if (dimExtent) { + return dimExtent.slice(); + } + + dimExtent = initialExtent; + var min = dimExtent[0]; + var max = dimExtent[1]; + + for (var i = 0; i < currEnd; i++) { + var rawIdx = this.getRawIndex(i); + var value = dimData[rawIdx]; + value < min && (min = value); + value > max && (max = value); + } + + dimExtent = [min, max]; + this._extent[dim] = dimExtent; + return dimExtent; + }; + /** + * Get raw data item + */ + + + DataStore.prototype.getRawDataItem = function (idx) { + var rawIdx = this.getRawIndex(idx); + + if (!this._provider.persistent) { + var val = []; + var chunks = this._chunks; + + for (var i = 0; i < chunks.length; i++) { + val.push(chunks[i][rawIdx]); + } + + return val; + } else { + return this._provider.getItem(rawIdx); + } + }; + /** + * Clone shallow. + * + * @param clonedDims Determine which dims to clone. Will share the data if not specified. + */ + + + DataStore.prototype.clone = function (clonedDims, ignoreIndices) { + var target = new DataStore(); + var chunks = this._chunks; + var clonedDimsMap = clonedDims && reduce(clonedDims, function (obj, dimIdx) { + obj[dimIdx] = true; + return obj; + }, {}); + + if (clonedDimsMap) { + for (var i = 0; i < chunks.length; i++) { + // Not clone if dim is not picked. + target._chunks[i] = !clonedDimsMap[i] ? chunks[i] : cloneChunk(chunks[i]); + } + } else { + target._chunks = chunks; + } + + this._copyCommonProps(target); + + if (!ignoreIndices) { + target._indices = this._cloneIndices(); + } + + target._updateGetRawIdx(); + + return target; + }; + + DataStore.prototype._copyCommonProps = function (target) { + target._count = this._count; + target._rawCount = this._rawCount; + target._provider = this._provider; + target._dimensions = this._dimensions; + target._extent = clone(this._extent); + target._rawExtent = clone(this._rawExtent); + }; + + DataStore.prototype._cloneIndices = function () { + if (this._indices) { + var Ctor = this._indices.constructor; + var indices = void 0; + + if (Ctor === Array) { + var thisCount = this._indices.length; + indices = new Ctor(thisCount); + + for (var i = 0; i < thisCount; i++) { + indices[i] = this._indices[i]; + } + } else { + indices = new Ctor(this._indices); + } + + return indices; + } + + return null; + }; + + DataStore.prototype._getRawIdxIdentity = function (idx) { + return idx; + }; + + DataStore.prototype._getRawIdx = function (idx) { + if (idx < this._count && idx >= 0) { + return this._indices[idx]; + } + + return -1; + }; + + DataStore.prototype._updateGetRawIdx = function () { + this.getRawIndex = this._indices ? this._getRawIdx : this._getRawIdxIdentity; + }; + + DataStore.internalField = function () { + function getDimValueSimply(dataItem, property, dataIndex, dimIndex) { + return parseDataValue(dataItem[dimIndex], this._dimensions[dimIndex]); + } + + defaultDimValueGetters = { + arrayRows: getDimValueSimply, + objectRows: function (dataItem, property, dataIndex, dimIndex) { + return parseDataValue(dataItem[property], this._dimensions[dimIndex]); + }, + keyedColumns: getDimValueSimply, + original: function (dataItem, property, dataIndex, dimIndex) { + // Performance sensitive, do not use modelUtil.getDataItemValue. + // If dataItem is an plain object with no value field, the let `value` + // will be assigned with the object, but it will be tread correctly + // in the `convertValue`. + var value = dataItem && (dataItem.value == null ? dataItem : dataItem.value); + return parseDataValue(value instanceof Array ? value[dimIndex] // If value is a single number or something else not array. + : value, this._dimensions[dimIndex]); + }, + typedArray: function (dataItem, property, dataIndex, dimIndex) { + return dataItem[dimIndex]; + } + }; + }(); + + return DataStore; + }(); + + /** + * [REQUIREMENT_MEMO]: + * (0) `metaRawOption` means `dimensions`/`sourceHeader`/`seriesLayoutBy` in raw option. + * (1) Keep support the feature: `metaRawOption` can be specified both on `series` and + * `root-dataset`. Them on `series` has higher priority. + * (2) Do not support to set `metaRawOption` on a `non-root-dataset`, because it might + * confuse users: whether those props indicate how to visit the upstream source or visit + * the transform result source, and some transforms has nothing to do with these props, + * and some transforms might have multiple upstream. + * (3) Transforms should specify `metaRawOption` in each output, just like they can be + * declared in `root-dataset`. + * (4) At present only support visit source in `SERIES_LAYOUT_BY_COLUMN` in transforms. + * That is for reducing complexity in transfroms. + * PENDING: Whether to provide transposition transform? + * + * [IMPLEMENTAION_MEMO]: + * "sourceVisitConfig" are calculated from `metaRawOption` and `data`. + * They will not be calculated until `source` is about to be visited (to prevent from + * duplicate calcuation). `source` is visited only in series and input to transforms. + * + * [DIMENSION_INHERIT_RULE]: + * By default the dimensions are inherited from ancestors, unless a transform return + * a new dimensions definition. + * Consider the case: + * ```js + * dataset: [{ + * source: [ ['Product', 'Sales', 'Prise'], ['Cookies', 321, 44.21], ...] + * }, { + * transform: { type: 'filter', ... } + * }] + * dataset: [{ + * dimension: ['Product', 'Sales', 'Prise'], + * source: [ ['Cookies', 321, 44.21], ...] + * }, { + * transform: { type: 'filter', ... } + * }] + * ``` + * The two types of option should have the same behavior after transform. + * + * + * [SCENARIO]: + * (1) Provide source data directly: + * ```js + * series: { + * encode: {...}, + * dimensions: [...] + * seriesLayoutBy: 'row', + * data: [[...]] + * } + * ``` + * (2) Series refer to dataset. + * ```js + * series: [{ + * encode: {...} + * // Ignore datasetIndex means `datasetIndex: 0` + * // and the dimensions defination in dataset is used + * }, { + * encode: {...}, + * seriesLayoutBy: 'column', + * datasetIndex: 1 + * }] + * ``` + * (3) dataset transform + * ```js + * dataset: [{ + * source: [...] + * }, { + * source: [...] + * }, { + * // By default from 0. + * transform: { type: 'filter', config: {...} } + * }, { + * // Piped. + * transform: [ + * { type: 'filter', config: {...} }, + * { type: 'sort', config: {...} } + * ] + * }, { + * id: 'regressionData', + * fromDatasetIndex: 1, + * // Third-party transform + * transform: { type: 'ecStat:regression', config: {...} } + * }, { + * // retrieve the extra result. + * id: 'regressionFormula', + * fromDatasetId: 'regressionData', + * fromTransformResult: 1 + * }] + * ``` + */ + + var SourceManager = + /** @class */ + function () { + function SourceManager(sourceHost) { + // Cached source. Do not repeat calculating if not dirty. + this._sourceList = []; + this._storeList = []; // version sign of each upstream source manager. + + this._upstreamSignList = []; + this._versionSignBase = 0; + this._dirty = true; + this._sourceHost = sourceHost; + } + /** + * Mark dirty. + */ + + + SourceManager.prototype.dirty = function () { + this._setLocalSource([], []); + + this._storeList = []; + this._dirty = true; + }; + + SourceManager.prototype._setLocalSource = function (sourceList, upstreamSignList) { + this._sourceList = sourceList; + this._upstreamSignList = upstreamSignList; + this._versionSignBase++; + + if (this._versionSignBase > 9e10) { + this._versionSignBase = 0; + } + }; + /** + * For detecting whether the upstream source is dirty, so that + * the local cached source (in `_sourceList`) should be discarded. + */ + + + SourceManager.prototype._getVersionSign = function () { + return this._sourceHost.uid + '_' + this._versionSignBase; + }; + /** + * Always return a source instance. Otherwise throw error. + */ + + + SourceManager.prototype.prepareSource = function () { + // For the case that call `setOption` multiple time but no data changed, + // cache the result source to prevent from repeating transform. + if (this._isDirty()) { + this._createSource(); + + this._dirty = false; + } + }; + + SourceManager.prototype._createSource = function () { + this._setLocalSource([], []); + + var sourceHost = this._sourceHost; + + var upSourceMgrList = this._getUpstreamSourceManagers(); + + var hasUpstream = !!upSourceMgrList.length; + var resultSourceList; + var upstreamSignList; + + if (isSeries(sourceHost)) { + var seriesModel = sourceHost; + var data = void 0; + var sourceFormat = void 0; + var upSource = void 0; // Has upstream dataset + + if (hasUpstream) { + var upSourceMgr = upSourceMgrList[0]; + upSourceMgr.prepareSource(); + upSource = upSourceMgr.getSource(); + data = upSource.data; + sourceFormat = upSource.sourceFormat; + upstreamSignList = [upSourceMgr._getVersionSign()]; + } // Series data is from own. + else { + data = seriesModel.get('data', true); + sourceFormat = isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL; + upstreamSignList = []; + } // See [REQUIREMENT_MEMO], merge settings on series and parent dataset if it is root. + + + var newMetaRawOption = this._getSourceMetaRawOption() || {}; + var upMetaRawOption = upSource && upSource.metaRawOption || {}; + var seriesLayoutBy = retrieve2(newMetaRawOption.seriesLayoutBy, upMetaRawOption.seriesLayoutBy) || null; + var sourceHeader = retrieve2(newMetaRawOption.sourceHeader, upMetaRawOption.sourceHeader); // Note here we should not use `upSource.dimensionsDefine`. Consider the case: + // `upSource.dimensionsDefine` is detected by `seriesLayoutBy: 'column'`, + // but series need `seriesLayoutBy: 'row'`. + + var dimensions = retrieve2(newMetaRawOption.dimensions, upMetaRawOption.dimensions); // We share source with dataset as much as possible + // to avoid extra memroy cost of high dimensional data. + + var needsCreateSource = seriesLayoutBy !== upMetaRawOption.seriesLayoutBy || !!sourceHeader !== !!upMetaRawOption.sourceHeader || dimensions; + resultSourceList = needsCreateSource ? [createSource(data, { + seriesLayoutBy: seriesLayoutBy, + sourceHeader: sourceHeader, + dimensions: dimensions + }, sourceFormat)] : []; + } else { + var datasetModel = sourceHost; // Has upstream dataset. + + if (hasUpstream) { + var result = this._applyTransform(upSourceMgrList); + + resultSourceList = result.sourceList; + upstreamSignList = result.upstreamSignList; + } // Is root dataset. + else { + var sourceData = datasetModel.get('source', true); + resultSourceList = [createSource(sourceData, this._getSourceMetaRawOption(), null)]; + upstreamSignList = []; + } + } + + if ("development" !== 'production') { + assert(resultSourceList && upstreamSignList); + } + + this._setLocalSource(resultSourceList, upstreamSignList); + }; + + SourceManager.prototype._applyTransform = function (upMgrList) { + var datasetModel = this._sourceHost; + var transformOption = datasetModel.get('transform', true); + var fromTransformResult = datasetModel.get('fromTransformResult', true); + + if ("development" !== 'production') { + assert(fromTransformResult != null || transformOption != null); + } + + if (fromTransformResult != null) { + var errMsg = ''; + + if (upMgrList.length !== 1) { + if ("development" !== 'production') { + errMsg = 'When using `fromTransformResult`, there should be only one upstream dataset'; + } + + doThrow(errMsg); + } + } + + var sourceList; + var upSourceList = []; + var upstreamSignList = []; + each(upMgrList, function (upMgr) { + upMgr.prepareSource(); + var upSource = upMgr.getSource(fromTransformResult || 0); + var errMsg = ''; + + if (fromTransformResult != null && !upSource) { + if ("development" !== 'production') { + errMsg = 'Can not retrieve result by `fromTransformResult`: ' + fromTransformResult; + } + + doThrow(errMsg); + } + + upSourceList.push(upSource); + upstreamSignList.push(upMgr._getVersionSign()); + }); + + if (transformOption) { + sourceList = applyDataTransform(transformOption, upSourceList, { + datasetIndex: datasetModel.componentIndex + }); + } else if (fromTransformResult != null) { + sourceList = [cloneSourceShallow(upSourceList[0])]; + } + + return { + sourceList: sourceList, + upstreamSignList: upstreamSignList + }; + }; + + SourceManager.prototype._isDirty = function () { + if (this._dirty) { + return true; + } // All sourceList is from the some upsteam. + + + var upSourceMgrList = this._getUpstreamSourceManagers(); + + for (var i = 0; i < upSourceMgrList.length; i++) { + var upSrcMgr = upSourceMgrList[i]; + + if ( // Consider the case that there is ancestor diry, call it recursively. + // The performance is probably not an issue because usually the chain is not long. + upSrcMgr._isDirty() || this._upstreamSignList[i] !== upSrcMgr._getVersionSign()) { + return true; + } + } + }; + /** + * @param sourceIndex By defualt 0, means "main source". + * Most cases there is only one source. + */ + + + SourceManager.prototype.getSource = function (sourceIndex) { + sourceIndex = sourceIndex || 0; + var source = this._sourceList[sourceIndex]; + + if (!source) { + // Series may share source instance with dataset. + var upSourceMgrList = this._getUpstreamSourceManagers(); + + return upSourceMgrList[0] && upSourceMgrList[0].getSource(sourceIndex); + } + + return source; + }; + /** + * + * Get a data store which can be shared across series. + * Only available for series. + * + * @param seriesDimRequest Dimensions that are generated in series. + * Should have been sorted by `storeDimIndex` asc. + */ + + + SourceManager.prototype.getSharedDataStore = function (seriesDimRequest) { + if ("development" !== 'production') { + assert(isSeries(this._sourceHost), 'Can only call getDataStore on series source manager.'); + } + + var schema = seriesDimRequest.makeStoreSchema(); + return this._innerGetDataStore(schema.dimensions, seriesDimRequest.source, schema.hash); + }; + + SourceManager.prototype._innerGetDataStore = function (storeDims, seriesSource, sourceReadKey) { + // TODO Can use other sourceIndex? + var sourceIndex = 0; + var storeList = this._storeList; + var cachedStoreMap = storeList[sourceIndex]; + + if (!cachedStoreMap) { + cachedStoreMap = storeList[sourceIndex] = {}; + } + + var cachedStore = cachedStoreMap[sourceReadKey]; + + if (!cachedStore) { + var upSourceMgr = this._getUpstreamSourceManagers()[0]; + + if (isSeries(this._sourceHost) && upSourceMgr) { + cachedStore = upSourceMgr._innerGetDataStore(storeDims, seriesSource, sourceReadKey); + } else { + cachedStore = new DataStore(); // Always create store from source of series. + + cachedStore.initData(new DefaultDataProvider(seriesSource, storeDims.length), storeDims); + } + + cachedStoreMap[sourceReadKey] = cachedStore; + } + + return cachedStore; + }; + /** + * PEDING: Is it fast enough? + * If no upstream, return empty array. + */ + + + SourceManager.prototype._getUpstreamSourceManagers = function () { + // Always get the relationship from the raw option. + // Do not cache the link of the dependency graph, so that + // no need to update them when change happen. + var sourceHost = this._sourceHost; + + if (isSeries(sourceHost)) { + var datasetModel = querySeriesUpstreamDatasetModel(sourceHost); + return !datasetModel ? [] : [datasetModel.getSourceManager()]; + } else { + return map(queryDatasetUpstreamDatasetModels(sourceHost), function (datasetModel) { + return datasetModel.getSourceManager(); + }); + } + }; + + SourceManager.prototype._getSourceMetaRawOption = function () { + var sourceHost = this._sourceHost; + var seriesLayoutBy; + var sourceHeader; + var dimensions; + + if (isSeries(sourceHost)) { + seriesLayoutBy = sourceHost.get('seriesLayoutBy', true); + sourceHeader = sourceHost.get('sourceHeader', true); + dimensions = sourceHost.get('dimensions', true); + } // See [REQUIREMENT_MEMO], `non-root-dataset` do not support them. + else if (!this._getUpstreamSourceManagers().length) { + var model = sourceHost; + seriesLayoutBy = model.get('seriesLayoutBy', true); + sourceHeader = model.get('sourceHeader', true); + dimensions = model.get('dimensions', true); + } + + return { + seriesLayoutBy: seriesLayoutBy, + sourceHeader: sourceHeader, + dimensions: dimensions + }; + }; + + return SourceManager; + }(); + // disable the transform merge, but do not disable transfrom clone from rawOption. + + function disableTransformOptionMerge(datasetModel) { + var transformOption = datasetModel.option.transform; + transformOption && setAsPrimitive(datasetModel.option.transform); + } + + function isSeries(sourceHost) { + // Avoid circular dependency with Series.ts + return sourceHost.mainType === 'series'; + } + + function doThrow(errMsg) { + throw new Error(errMsg); + } + + var TOOLTIP_LINE_HEIGHT_CSS = 'line-height:1'; // TODO: more textStyle option + + function getTooltipTextStyle(textStyle, renderMode) { + var nameFontColor = textStyle.color || '#6e7079'; + var nameFontSize = textStyle.fontSize || 12; + var nameFontWeight = textStyle.fontWeight || '400'; + var valueFontColor = textStyle.color || '#464646'; + var valueFontSize = textStyle.fontSize || 14; + var valueFontWeight = textStyle.fontWeight || '900'; + + if (renderMode === 'html') { + // `textStyle` is probably from user input, should be encoded to reduce security risk. + return { + // eslint-disable-next-line max-len + nameStyle: "font-size:" + encodeHTML(nameFontSize + '') + "px;color:" + encodeHTML(nameFontColor) + ";font-weight:" + encodeHTML(nameFontWeight + ''), + // eslint-disable-next-line max-len + valueStyle: "font-size:" + encodeHTML(valueFontSize + '') + "px;color:" + encodeHTML(valueFontColor) + ";font-weight:" + encodeHTML(valueFontWeight + '') + }; + } else { + return { + nameStyle: { + fontSize: nameFontSize, + fill: nameFontColor, + fontWeight: nameFontWeight + }, + valueStyle: { + fontSize: valueFontSize, + fill: valueFontColor, + fontWeight: valueFontWeight + } + }; + } + } // See `TooltipMarkupLayoutIntent['innerGapLevel']`. + // (value from UI design) + + + var HTML_GAPS = [0, 10, 20, 30]; + var RICH_TEXT_GAPS = ['', '\n', '\n\n', '\n\n\n']; // eslint-disable-next-line max-len + + function createTooltipMarkup(type, option) { + option.type = type; + return option; + } + + function isSectionFragment(frag) { + return frag.type === 'section'; + } + + function getBuilder(frag) { + return isSectionFragment(frag) ? buildSection : buildNameValue; + } + + function getBlockGapLevel(frag) { + if (isSectionFragment(frag)) { + var gapLevel_1 = 0; + var subBlockLen = frag.blocks.length; + var hasInnerGap_1 = subBlockLen > 1 || subBlockLen > 0 && !frag.noHeader; + each(frag.blocks, function (subBlock) { + var subGapLevel = getBlockGapLevel(subBlock); // If the some of the sub-blocks have some gaps (like 10px) inside, this block + // should use a larger gap (like 20px) to distinguish those sub-blocks. + + if (subGapLevel >= gapLevel_1) { + gapLevel_1 = subGapLevel + +(hasInnerGap_1 && ( // 0 always can not be readable gap level. + !subGapLevel // If no header, always keep the sub gap level. Otherwise + // look weird in case `multipleSeries`. + || isSectionFragment(subBlock) && !subBlock.noHeader)); + } + }); + return gapLevel_1; + } + + return 0; + } + + function buildSection(ctx, fragment, topMarginForOuterGap, toolTipTextStyle) { + var noHeader = fragment.noHeader; + var gaps = getGap(getBlockGapLevel(fragment)); + var subMarkupTextList = []; + var subBlocks = fragment.blocks || []; + assert(!subBlocks || isArray(subBlocks)); + subBlocks = subBlocks || []; + var orderMode = ctx.orderMode; + + if (fragment.sortBlocks && orderMode) { + subBlocks = subBlocks.slice(); + var orderMap = { + valueAsc: 'asc', + valueDesc: 'desc' + }; + + if (hasOwn(orderMap, orderMode)) { + var comparator_1 = new SortOrderComparator(orderMap[orderMode], null); + subBlocks.sort(function (a, b) { + return comparator_1.evaluate(a.sortParam, b.sortParam); + }); + } // FIXME 'seriesDesc' necessary? + else if (orderMode === 'seriesDesc') { + subBlocks.reverse(); + } + } + + each(subBlocks, function (subBlock, idx) { + var valueFormatter = fragment.valueFormatter; + var subMarkupText = getBuilder(subBlock)( // Inherit valueFormatter + valueFormatter ? extend(extend({}, ctx), { + valueFormatter: valueFormatter + }) : ctx, subBlock, idx > 0 ? gaps.html : 0, toolTipTextStyle); + subMarkupText != null && subMarkupTextList.push(subMarkupText); + }); + var subMarkupText = ctx.renderMode === 'richText' ? subMarkupTextList.join(gaps.richText) : wrapBlockHTML(subMarkupTextList.join(''), noHeader ? topMarginForOuterGap : gaps.html); + + if (noHeader) { + return subMarkupText; + } + + var displayableHeader = makeValueReadable(fragment.header, 'ordinal', ctx.useUTC); + var nameStyle = getTooltipTextStyle(toolTipTextStyle, ctx.renderMode).nameStyle; + + if (ctx.renderMode === 'richText') { + return wrapInlineNameRichText(ctx, displayableHeader, nameStyle) + gaps.richText + subMarkupText; + } else { + return wrapBlockHTML("<div style=\"" + nameStyle + ";" + TOOLTIP_LINE_HEIGHT_CSS + ";\">" + encodeHTML(displayableHeader) + '</div>' + subMarkupText, topMarginForOuterGap); + } + } + + function buildNameValue(ctx, fragment, topMarginForOuterGap, toolTipTextStyle) { + var renderMode = ctx.renderMode; + var noName = fragment.noName; + var noValue = fragment.noValue; + var noMarker = !fragment.markerType; + var name = fragment.name; + var useUTC = ctx.useUTC; + + var valueFormatter = fragment.valueFormatter || ctx.valueFormatter || function (value) { + value = isArray(value) ? value : [value]; + return map(value, function (val, idx) { + return makeValueReadable(val, isArray(valueTypeOption) ? valueTypeOption[idx] : valueTypeOption, useUTC); + }); + }; + + if (noName && noValue) { + return; + } + + var markerStr = noMarker ? '' : ctx.markupStyleCreator.makeTooltipMarker(fragment.markerType, fragment.markerColor || '#333', renderMode); + var readableName = noName ? '' : makeValueReadable(name, 'ordinal', useUTC); + var valueTypeOption = fragment.valueType; + var readableValueList = noValue ? [] : valueFormatter(fragment.value); + var valueAlignRight = !noMarker || !noName; // It little weird if only value next to marker but far from marker. + + var valueCloseToMarker = !noMarker && noName; + + var _a = getTooltipTextStyle(toolTipTextStyle, renderMode), + nameStyle = _a.nameStyle, + valueStyle = _a.valueStyle; + + return renderMode === 'richText' ? (noMarker ? '' : markerStr) + (noName ? '' : wrapInlineNameRichText(ctx, readableName, nameStyle)) // Value has commas inside, so use ' ' as delimiter for multiple values. + + (noValue ? '' : wrapInlineValueRichText(ctx, readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)) : wrapBlockHTML((noMarker ? '' : markerStr) + (noName ? '' : wrapInlineNameHTML(readableName, !noMarker, nameStyle)) + (noValue ? '' : wrapInlineValueHTML(readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)), topMarginForOuterGap); + } + /** + * @return markupText. null/undefined means no content. + */ + + + function buildTooltipMarkup(fragment, markupStyleCreator, renderMode, orderMode, useUTC, toolTipTextStyle) { + if (!fragment) { + return; + } + + var builder = getBuilder(fragment); + var ctx = { + useUTC: useUTC, + renderMode: renderMode, + orderMode: orderMode, + markupStyleCreator: markupStyleCreator, + valueFormatter: fragment.valueFormatter + }; + return builder(ctx, fragment, 0, toolTipTextStyle); + } + + function getGap(gapLevel) { + return { + html: HTML_GAPS[gapLevel], + richText: RICH_TEXT_GAPS[gapLevel] + }; + } + + function wrapBlockHTML(encodedContent, topGap) { + var clearfix = '<div style="clear:both"></div>'; + var marginCSS = "margin: " + topGap + "px 0 0"; + return "<div style=\"" + marginCSS + ";" + TOOLTIP_LINE_HEIGHT_CSS + ";\">" + encodedContent + clearfix + '</div>'; + } + + function wrapInlineNameHTML(name, leftHasMarker, style) { + var marginCss = leftHasMarker ? 'margin-left:2px' : ''; + return "<span style=\"" + style + ";" + marginCss + "\">" + encodeHTML(name) + '</span>'; + } + + function wrapInlineValueHTML(valueList, alignRight, valueCloseToMarker, style) { + // Do not too close to marker, considering there are multiple values separated by spaces. + var paddingStr = valueCloseToMarker ? '10px' : '20px'; + var alignCSS = alignRight ? "float:right;margin-left:" + paddingStr : ''; + valueList = isArray(valueList) ? valueList : [valueList]; + return "<span style=\"" + alignCSS + ";" + style + "\">" // Value has commas inside, so use ' ' as delimiter for multiple values. + + map(valueList, function (value) { + return encodeHTML(value); + }).join(' ') + '</span>'; + } + + function wrapInlineNameRichText(ctx, name, style) { + return ctx.markupStyleCreator.wrapRichTextStyle(name, style); + } + + function wrapInlineValueRichText(ctx, values, alignRight, valueCloseToMarker, style) { + var styles = [style]; + var paddingLeft = valueCloseToMarker ? 10 : 20; + alignRight && styles.push({ + padding: [0, 0, 0, paddingLeft], + align: 'right' + }); // Value has commas inside, so use ' ' as delimiter for multiple values. + + return ctx.markupStyleCreator.wrapRichTextStyle(isArray(values) ? values.join(' ') : values, styles); + } + + function retrieveVisualColorForTooltipMarker(series, dataIndex) { + var style = series.getData().getItemVisual(dataIndex, 'style'); + var color = style[series.visualDrawType]; + return convertToColorString(color); + } + function getPaddingFromTooltipModel(model, renderMode) { + var padding = model.get('padding'); + return padding != null ? padding // We give slightly different to look pretty. + : renderMode === 'richText' ? [8, 10] : 10; + } + /** + * The major feature is generate styles for `renderMode: 'richText'`. + * But it also serves `renderMode: 'html'` to provide + * "renderMode-independent" API. + */ + + var TooltipMarkupStyleCreator = + /** @class */ + function () { + function TooltipMarkupStyleCreator() { + this.richTextStyles = {}; // Notice that "generate a style name" usuall happens repeatly when mouse moving and + // displaying a tooltip. So we put the `_nextStyleNameId` as a member of each creator + // rather than static shared by all creators (which will cause it increase to fast). + + this._nextStyleNameId = getRandomIdBase(); + } + + TooltipMarkupStyleCreator.prototype._generateStyleName = function () { + return '__EC_aUTo_' + this._nextStyleNameId++; + }; + + TooltipMarkupStyleCreator.prototype.makeTooltipMarker = function (markerType, colorStr, renderMode) { + var markerId = renderMode === 'richText' ? this._generateStyleName() : null; + var marker = getTooltipMarker({ + color: colorStr, + type: markerType, + renderMode: renderMode, + markerId: markerId + }); + + if (isString(marker)) { + return marker; + } else { + if ("development" !== 'production') { + assert(markerId); + } + + this.richTextStyles[markerId] = marker.style; + return marker.content; + } + }; + /** + * @usage + * ```ts + * const styledText = markupStyleCreator.wrapRichTextStyle([ + * // The styles will be auto merged. + * { + * fontSize: 12, + * color: 'blue' + * }, + * { + * padding: 20 + * } + * ]); + * ``` + */ + + + TooltipMarkupStyleCreator.prototype.wrapRichTextStyle = function (text, styles) { + var finalStl = {}; + + if (isArray(styles)) { + each(styles, function (stl) { + return extend(finalStl, stl); + }); + } else { + extend(finalStl, styles); + } + + var styleName = this._generateStyleName(); + + this.richTextStyles[styleName] = finalStl; + return "{" + styleName + "|" + text + "}"; + }; + + return TooltipMarkupStyleCreator; + }(); + + function defaultSeriesFormatTooltip(opt) { + var series = opt.series; + var dataIndex = opt.dataIndex; + var multipleSeries = opt.multipleSeries; + var data = series.getData(); + var tooltipDims = data.mapDimensionsAll('defaultedTooltip'); + var tooltipDimLen = tooltipDims.length; + var value = series.getRawValue(dataIndex); + var isValueArr = isArray(value); + var markerColor = retrieveVisualColorForTooltipMarker(series, dataIndex); // Complicated rule for pretty tooltip. + + var inlineValue; + var inlineValueType; + var subBlocks; + var sortParam; + + if (tooltipDimLen > 1 || isValueArr && !tooltipDimLen) { + var formatArrResult = formatTooltipArrayValue(value, series, dataIndex, tooltipDims, markerColor); + inlineValue = formatArrResult.inlineValues; + inlineValueType = formatArrResult.inlineValueTypes; + subBlocks = formatArrResult.blocks; // Only support tooltip sort by the first inline value. It's enough in most cases. + + sortParam = formatArrResult.inlineValues[0]; + } else if (tooltipDimLen) { + var dimInfo = data.getDimensionInfo(tooltipDims[0]); + sortParam = inlineValue = retrieveRawValue(data, dataIndex, tooltipDims[0]); + inlineValueType = dimInfo.type; + } else { + sortParam = inlineValue = isValueArr ? value[0] : value; + } // Do not show generated series name. It might not be readable. + + + var seriesNameSpecified = isNameSpecified(series); + var seriesName = seriesNameSpecified && series.name || ''; + var itemName = data.getName(dataIndex); + var inlineName = multipleSeries ? seriesName : itemName; + return createTooltipMarkup('section', { + header: seriesName, + // When series name not specified, do not show a header line with only '-'. + // This case alway happen in tooltip.trigger: 'item'. + noHeader: multipleSeries || !seriesNameSpecified, + sortParam: sortParam, + blocks: [createTooltipMarkup('nameValue', { + markerType: 'item', + markerColor: markerColor, + // Do not mix display seriesName and itemName in one tooltip, + // which might confuses users. + name: inlineName, + // name dimension might be auto assigned, where the name might + // be not readable. So we check trim here. + noName: !trim(inlineName), + value: inlineValue, + valueType: inlineValueType + })].concat(subBlocks || []) + }); + } + + function formatTooltipArrayValue(value, series, dataIndex, tooltipDims, colorStr) { + // check: category-no-encode-has-axis-data in dataset.html + var data = series.getData(); + var isValueMultipleLine = reduce(value, function (isValueMultipleLine, val, idx) { + var dimItem = data.getDimensionInfo(idx); + return isValueMultipleLine = isValueMultipleLine || dimItem && dimItem.tooltip !== false && dimItem.displayName != null; + }, false); + var inlineValues = []; + var inlineValueTypes = []; + var blocks = []; + tooltipDims.length ? each(tooltipDims, function (dim) { + setEachItem(retrieveRawValue(data, dataIndex, dim), dim); + }) // By default, all dims is used on tooltip. + : each(value, setEachItem); + + function setEachItem(val, dim) { + var dimInfo = data.getDimensionInfo(dim); // If `dimInfo.tooltip` is not set, show tooltip. + + if (!dimInfo || dimInfo.otherDims.tooltip === false) { + return; + } + + if (isValueMultipleLine) { + blocks.push(createTooltipMarkup('nameValue', { + markerType: 'subItem', + markerColor: colorStr, + name: dimInfo.displayName, + value: val, + valueType: dimInfo.type + })); + } else { + inlineValues.push(val); + inlineValueTypes.push(dimInfo.type); + } + } + + return { + inlineValues: inlineValues, + inlineValueTypes: inlineValueTypes, + blocks: blocks + }; + } + + var inner$1 = makeInner(); + + function getSelectionKey(data, dataIndex) { + return data.getName(dataIndex) || data.getId(dataIndex); + } + + var SERIES_UNIVERSAL_TRANSITION_PROP = '__universalTransitionEnabled'; + + var SeriesModel = + /** @class */ + function (_super) { + __extends(SeriesModel, _super); + + function SeriesModel() { + // [Caution]: Becuase this class or desecendants can be used as `XXX.extend(subProto)`, + // the class members must not be initialized in constructor or declaration place. + // Otherwise there is bad case: + // class A {xxx = 1;} + // enableClassExtend(A); + // class B extends A {} + // var C = B.extend({xxx: 5}); + // var c = new C(); + // console.log(c.xxx); // expect 5 but always 1. + var _this = _super !== null && _super.apply(this, arguments) || this; // --------------------------------------- + // Props about data selection + // --------------------------------------- + + + _this._selectedDataIndicesMap = {}; + return _this; + } + + SeriesModel.prototype.init = function (option, parentModel, ecModel) { + this.seriesIndex = this.componentIndex; + this.dataTask = createTask({ + count: dataTaskCount, + reset: dataTaskReset + }); + this.dataTask.context = { + model: this + }; + this.mergeDefaultAndTheme(option, ecModel); + var sourceManager = inner$1(this).sourceManager = new SourceManager(this); + sourceManager.prepareSource(); + var data = this.getInitialData(option, ecModel); + wrapData(data, this); + this.dataTask.context.data = data; + + if ("development" !== 'production') { + assert(data, 'getInitialData returned invalid data.'); + } + + inner$1(this).dataBeforeProcessed = data; // If we reverse the order (make data firstly, and then make + // dataBeforeProcessed by cloneShallow), cloneShallow will + // cause data.graph.data !== data when using + // module:echarts/data/Graph or module:echarts/data/Tree. + // See module:echarts/data/helper/linkSeriesData + // Theoretically, it is unreasonable to call `seriesModel.getData()` in the model + // init or merge stage, because the data can be restored. So we do not `restoreData` + // and `setData` here, which forbids calling `seriesModel.getData()` in this stage. + // Call `seriesModel.getRawData()` instead. + // this.restoreData(); + + autoSeriesName(this); + + this._initSelectedMapFromData(data); + }; + /** + * Util for merge default and theme to option + */ + + + SeriesModel.prototype.mergeDefaultAndTheme = function (option, ecModel) { + var layoutMode = fetchLayoutMode(this); + var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; // Backward compat: using subType on theme. + // But if name duplicate between series subType + // (for example: parallel) add component mainType, + // add suffix 'Series'. + + var themeSubType = this.subType; + + if (ComponentModel.hasClass(themeSubType)) { + themeSubType += 'Series'; + } + + merge(option, ecModel.getTheme().get(this.subType)); + merge(option, this.getDefaultOption()); // Default label emphasis `show` + + defaultEmphasis(option, 'label', ['show']); + this.fillDataTextStyle(option.data); + + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }; + + SeriesModel.prototype.mergeOption = function (newSeriesOption, ecModel) { + // this.settingTask.dirty(); + newSeriesOption = merge(this.option, newSeriesOption, true); + this.fillDataTextStyle(newSeriesOption.data); + var layoutMode = fetchLayoutMode(this); + + if (layoutMode) { + mergeLayoutParam(this.option, newSeriesOption, layoutMode); + } + + var sourceManager = inner$1(this).sourceManager; + sourceManager.dirty(); + sourceManager.prepareSource(); + var data = this.getInitialData(newSeriesOption, ecModel); + wrapData(data, this); + this.dataTask.dirty(); + this.dataTask.context.data = data; + inner$1(this).dataBeforeProcessed = data; + autoSeriesName(this); + + this._initSelectedMapFromData(data); + }; + + SeriesModel.prototype.fillDataTextStyle = function (data) { + // Default data label emphasis `show` + // FIXME Tree structure data ? + // FIXME Performance ? + if (data && !isTypedArray(data)) { + var props = ['show']; + + for (var i = 0; i < data.length; i++) { + if (data[i] && data[i].label) { + defaultEmphasis(data[i], 'label', props); + } + } + } + }; + /** + * Init a data structure from data related option in series + * Must be overriden. + */ + + + SeriesModel.prototype.getInitialData = function (option, ecModel) { + return; + }; + /** + * Append data to list + */ + + + SeriesModel.prototype.appendData = function (params) { + // FIXME ??? + // (1) If data from dataset, forbidden append. + // (2) support append data of dataset. + var data = this.getRawData(); + data.appendData(params.data); + }; + /** + * Consider some method like `filter`, `map` need make new data, + * We should make sure that `seriesModel.getData()` get correct + * data in the stream procedure. So we fetch data from upstream + * each time `task.perform` called. + */ + + + SeriesModel.prototype.getData = function (dataType) { + var task = getCurrentTask(this); + + if (task) { + var data = task.context.data; + return dataType == null ? data : data.getLinkedData(dataType); + } else { + // When series is not alive (that may happen when click toolbox + // restore or setOption with not merge mode), series data may + // be still need to judge animation or something when graphic + // elements want to know whether fade out. + return inner$1(this).data; + } + }; + + SeriesModel.prototype.getAllData = function () { + var mainData = this.getData(); + return mainData && mainData.getLinkedDataAll ? mainData.getLinkedDataAll() : [{ + data: mainData + }]; + }; + + SeriesModel.prototype.setData = function (data) { + var task = getCurrentTask(this); + + if (task) { + var context = task.context; // Consider case: filter, data sample. + // FIXME:TS never used, so comment it + // if (context.data !== data && task.modifyOutputEnd) { + // task.setOutputEnd(data.count()); + // } + + context.outputData = data; // Caution: setData should update context.data, + // Because getData may be called multiply in a + // single stage and expect to get the data just + // set. (For example, AxisProxy, x y both call + // getData and setDate sequentially). + // So the context.data should be fetched from + // upstream each time when a stage starts to be + // performed. + + if (task !== this.dataTask) { + context.data = data; + } + } + + inner$1(this).data = data; + }; + + SeriesModel.prototype.getEncode = function () { + var encode = this.get('encode', true); + + if (encode) { + return createHashMap(encode); + } + }; + + SeriesModel.prototype.getSourceManager = function () { + return inner$1(this).sourceManager; + }; + + SeriesModel.prototype.getSource = function () { + return this.getSourceManager().getSource(); + }; + /** + * Get data before processed + */ + + + SeriesModel.prototype.getRawData = function () { + return inner$1(this).dataBeforeProcessed; + }; + + SeriesModel.prototype.getColorBy = function () { + var colorBy = this.get('colorBy'); + return colorBy || 'series'; + }; + + SeriesModel.prototype.isColorBySeries = function () { + return this.getColorBy() === 'series'; + }; + /** + * Get base axis if has coordinate system and has axis. + * By default use coordSys.getBaseAxis(); + * Can be overrided for some chart. + * @return {type} description + */ + + + SeriesModel.prototype.getBaseAxis = function () { + var coordSys = this.coordinateSystem; // @ts-ignore + + return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis(); + }; + /** + * Default tooltip formatter + * + * @param dataIndex + * @param multipleSeries + * @param dataType + * @param renderMode valid values: 'html'(by default) and 'richText'. + * 'html' is used for rendering tooltip in extra DOM form, and the result + * string is used as DOM HTML content. + * 'richText' is used for rendering tooltip in rich text form, for those where + * DOM operation is not supported. + * @return formatted tooltip with `html` and `markers` + * Notice: The override method can also return string + */ + + + SeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + return defaultSeriesFormatTooltip({ + series: this, + dataIndex: dataIndex, + multipleSeries: multipleSeries + }); + }; + + SeriesModel.prototype.isAnimationEnabled = function () { + var ecModel = this.ecModel; // Disable animation if using echarts in node but not give ssr flag. + // In ssr mode, renderToString will generate svg with css animation. + + if (env.node && !(ecModel && ecModel.ssr)) { + return false; + } + + var animationEnabled = this.getShallow('animation'); + + if (animationEnabled) { + if (this.getData().count() > this.getShallow('animationThreshold')) { + animationEnabled = false; + } + } + + return !!animationEnabled; + }; + + SeriesModel.prototype.restoreData = function () { + this.dataTask.dirty(); + }; + + SeriesModel.prototype.getColorFromPalette = function (name, scope, requestColorNum) { + var ecModel = this.ecModel; // PENDING + + var color = PaletteMixin.prototype.getColorFromPalette.call(this, name, scope, requestColorNum); + + if (!color) { + color = ecModel.getColorFromPalette(name, scope, requestColorNum); + } + + return color; + }; + /** + * Use `data.mapDimensionsAll(coordDim)` instead. + * @deprecated + */ + + + SeriesModel.prototype.coordDimToDataDim = function (coordDim) { + return this.getRawData().mapDimensionsAll(coordDim); + }; + /** + * Get progressive rendering count each step + */ + + + SeriesModel.prototype.getProgressive = function () { + return this.get('progressive'); + }; + /** + * Get progressive rendering count each step + */ + + + SeriesModel.prototype.getProgressiveThreshold = function () { + return this.get('progressiveThreshold'); + }; // PENGING If selectedMode is null ? + + + SeriesModel.prototype.select = function (innerDataIndices, dataType) { + this._innerSelect(this.getData(dataType), innerDataIndices); + }; + + SeriesModel.prototype.unselect = function (innerDataIndices, dataType) { + var selectedMap = this.option.selectedMap; + + if (!selectedMap) { + return; + } + + var selectedMode = this.option.selectedMode; + var data = this.getData(dataType); + + if (selectedMode === 'series' || selectedMap === 'all') { + this.option.selectedMap = {}; + this._selectedDataIndicesMap = {}; + return; + } + + for (var i = 0; i < innerDataIndices.length; i++) { + var dataIndex = innerDataIndices[i]; + var nameOrId = getSelectionKey(data, dataIndex); + selectedMap[nameOrId] = false; + this._selectedDataIndicesMap[nameOrId] = -1; + } + }; + + SeriesModel.prototype.toggleSelect = function (innerDataIndices, dataType) { + var tmpArr = []; + + for (var i = 0; i < innerDataIndices.length; i++) { + tmpArr[0] = innerDataIndices[i]; + this.isSelected(innerDataIndices[i], dataType) ? this.unselect(tmpArr, dataType) : this.select(tmpArr, dataType); + } + }; + + SeriesModel.prototype.getSelectedDataIndices = function () { + if (this.option.selectedMap === 'all') { + return [].slice.call(this.getData().getIndices()); + } + + var selectedDataIndicesMap = this._selectedDataIndicesMap; + var nameOrIds = keys(selectedDataIndicesMap); + var dataIndices = []; + + for (var i = 0; i < nameOrIds.length; i++) { + var dataIndex = selectedDataIndicesMap[nameOrIds[i]]; + + if (dataIndex >= 0) { + dataIndices.push(dataIndex); + } + } + + return dataIndices; + }; + + SeriesModel.prototype.isSelected = function (dataIndex, dataType) { + var selectedMap = this.option.selectedMap; + + if (!selectedMap) { + return false; + } + + var data = this.getData(dataType); + return (selectedMap === 'all' || selectedMap[getSelectionKey(data, dataIndex)]) && !data.getItemModel(dataIndex).get(['select', 'disabled']); + }; + + SeriesModel.prototype.isUniversalTransitionEnabled = function () { + if (this[SERIES_UNIVERSAL_TRANSITION_PROP]) { + return true; + } + + var universalTransitionOpt = this.option.universalTransition; // Quick reject + + if (!universalTransitionOpt) { + return false; + } + + if (universalTransitionOpt === true) { + return true; + } // Can be simply 'universalTransition: true' + + + return universalTransitionOpt && universalTransitionOpt.enabled; + }; + + SeriesModel.prototype._innerSelect = function (data, innerDataIndices) { + var _a, _b; + + var option = this.option; + var selectedMode = option.selectedMode; + var len = innerDataIndices.length; + + if (!selectedMode || !len) { + return; + } + + if (selectedMode === 'series') { + option.selectedMap = 'all'; + } else if (selectedMode === 'multiple') { + if (!isObject(option.selectedMap)) { + option.selectedMap = {}; + } + + var selectedMap = option.selectedMap; + + for (var i = 0; i < len; i++) { + var dataIndex = innerDataIndices[i]; // TODO diffrent types of data share same object. + + var nameOrId = getSelectionKey(data, dataIndex); + selectedMap[nameOrId] = true; + this._selectedDataIndicesMap[nameOrId] = data.getRawIndex(dataIndex); + } + } else if (selectedMode === 'single' || selectedMode === true) { + var lastDataIndex = innerDataIndices[len - 1]; + var nameOrId = getSelectionKey(data, lastDataIndex); + option.selectedMap = (_a = {}, _a[nameOrId] = true, _a); + this._selectedDataIndicesMap = (_b = {}, _b[nameOrId] = data.getRawIndex(lastDataIndex), _b); + } + }; + + SeriesModel.prototype._initSelectedMapFromData = function (data) { + // Ignore select info in data if selectedMap exists. + // NOTE It's only for legacy usage. edge data is not supported. + if (this.option.selectedMap) { + return; + } + + var dataIndices = []; + + if (data.hasItemOption) { + data.each(function (idx) { + var rawItem = data.getRawDataItem(idx); + + if (rawItem && rawItem.selected) { + dataIndices.push(idx); + } + }); + } + + if (dataIndices.length > 0) { + this._innerSelect(data, dataIndices); + } + }; // /** + // * @see {module:echarts/stream/Scheduler} + // */ + // abstract pipeTask: null + + + SeriesModel.registerClass = function (clz) { + return ComponentModel.registerClass(clz); + }; + + SeriesModel.protoInitialize = function () { + var proto = SeriesModel.prototype; + proto.type = 'series.__base__'; + proto.seriesIndex = 0; + proto.ignoreStyleOnData = false; + proto.hasSymbolVisual = false; + proto.defaultSymbol = 'circle'; // Make sure the values can be accessed! + + proto.visualStyleAccessPath = 'itemStyle'; + proto.visualDrawType = 'fill'; + }(); + + return SeriesModel; + }(ComponentModel); + + mixin(SeriesModel, DataFormatMixin); + mixin(SeriesModel, PaletteMixin); + mountExtend(SeriesModel, ComponentModel); + /** + * MUST be called after `prepareSource` called + * Here we need to make auto series, especially for auto legend. But we + * do not modify series.name in option to avoid side effects. + */ + + function autoSeriesName(seriesModel) { + // User specified name has higher priority, otherwise it may cause + // series can not be queried unexpectedly. + var name = seriesModel.name; + + if (!isNameSpecified(seriesModel)) { + seriesModel.name = getSeriesAutoName(seriesModel) || name; + } + } + + function getSeriesAutoName(seriesModel) { + var data = seriesModel.getRawData(); + var dataDims = data.mapDimensionsAll('seriesName'); + var nameArr = []; + each(dataDims, function (dataDim) { + var dimInfo = data.getDimensionInfo(dataDim); + dimInfo.displayName && nameArr.push(dimInfo.displayName); + }); + return nameArr.join(' '); + } + + function dataTaskCount(context) { + return context.model.getRawData().count(); + } + + function dataTaskReset(context) { + var seriesModel = context.model; + seriesModel.setData(seriesModel.getRawData().cloneShallow()); + return dataTaskProgress; + } + + function dataTaskProgress(param, context) { + // Avoid repead cloneShallow when data just created in reset. + if (context.outputData && param.end > context.outputData.count()) { + context.model.getRawData().cloneShallow(context.outputData); + } + } // TODO refactor + + + function wrapData(data, seriesModel) { + each(concatArray(data.CHANGABLE_METHODS, data.DOWNSAMPLE_METHODS), function (methodName) { + data.wrapMethod(methodName, curry(onDataChange, seriesModel)); + }); + } + + function onDataChange(seriesModel, newList) { + var task = getCurrentTask(seriesModel); + + if (task) { + // Consider case: filter, selectRange + task.setOutputEnd((newList || this).count()); + } + + return newList; + } + + function getCurrentTask(seriesModel) { + var scheduler = (seriesModel.ecModel || {}).scheduler; + var pipeline = scheduler && scheduler.getPipeline(seriesModel.uid); + + if (pipeline) { + // When pipline finished, the currrentTask keep the last + // task (renderTask). + var task = pipeline.currentTask; + + if (task) { + var agentStubMap = task.agentStubMap; + + if (agentStubMap) { + task = agentStubMap.get(seriesModel.uid); + } + } + + return task; + } + } + + var ComponentView = + /** @class */ + function () { + function ComponentView() { + this.group = new Group(); + this.uid = getUID('viewComponent'); + } + + ComponentView.prototype.init = function (ecModel, api) {}; + + ComponentView.prototype.render = function (model, ecModel, api, payload) {}; + + ComponentView.prototype.dispose = function (ecModel, api) {}; + + ComponentView.prototype.updateView = function (model, ecModel, api, payload) {// Do nothing; + }; + + ComponentView.prototype.updateLayout = function (model, ecModel, api, payload) {// Do nothing; + }; + + ComponentView.prototype.updateVisual = function (model, ecModel, api, payload) {// Do nothing; + }; + /** + * Hook for toggle blur target series. + * Can be used in marker for blur or leave blur the markers + */ + + + ComponentView.prototype.toggleBlurSeries = function (seriesModels, isBlur, ecModel) {// Do nothing; + }; + /** + * Traverse the new rendered elements. + * + * It will traverse the new added element in progressive rendering. + * And traverse all in normal rendering. + */ + + + ComponentView.prototype.eachRendered = function (cb) { + var group = this.group; + + if (group) { + group.traverse(cb); + } + }; + + return ComponentView; + }(); + enableClassExtend(ComponentView); + enableClassManagement(ComponentView); + + /** + * @return {string} If large mode changed, return string 'reset'; + */ + + function createRenderPlanner() { + var inner = makeInner(); + return function (seriesModel) { + var fields = inner(seriesModel); + var pipelineContext = seriesModel.pipelineContext; + var originalLarge = !!fields.large; + var originalProgressive = !!fields.progressiveRender; // FIXME: if the planner works on a filtered series, `pipelineContext` does not + // exists. See #11611 . Probably we need to modify this structure, see the comment + // on `performRawSeries` in `Schedular.js`. + + var large = fields.large = !!(pipelineContext && pipelineContext.large); + var progressive = fields.progressiveRender = !!(pipelineContext && pipelineContext.progressiveRender); + return !!(originalLarge !== large || originalProgressive !== progressive) && 'reset'; + }; + } + + var inner$2 = makeInner(); + var renderPlanner = createRenderPlanner(); + + var ChartView = + /** @class */ + function () { + function ChartView() { + this.group = new Group(); + this.uid = getUID('viewChart'); + this.renderTask = createTask({ + plan: renderTaskPlan, + reset: renderTaskReset + }); + this.renderTask.context = { + view: this + }; + } + + ChartView.prototype.init = function (ecModel, api) {}; + + ChartView.prototype.render = function (seriesModel, ecModel, api, payload) { + if ("development" !== 'production') { + throw new Error('render method must been implemented'); + } + }; + /** + * Highlight series or specified data item. + */ + + + ChartView.prototype.highlight = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(payload && payload.dataType); + + if (!data) { + if ("development" !== 'production') { + error("Unknown dataType " + payload.dataType); + } + + return; + } + + toggleHighlight(data, payload, 'emphasis'); + }; + /** + * Downplay series or specified data item. + */ + + + ChartView.prototype.downplay = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(payload && payload.dataType); + + if (!data) { + if ("development" !== 'production') { + error("Unknown dataType " + payload.dataType); + } + + return; + } + + toggleHighlight(data, payload, 'normal'); + }; + /** + * Remove self. + */ + + + ChartView.prototype.remove = function (ecModel, api) { + this.group.removeAll(); + }; + /** + * Dispose self. + */ + + + ChartView.prototype.dispose = function (ecModel, api) {}; + + ChartView.prototype.updateView = function (seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; // FIXME never used? + + + ChartView.prototype.updateLayout = function (seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; // FIXME never used? + + + ChartView.prototype.updateVisual = function (seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; + /** + * Traverse the new rendered elements. + * + * It will traverse the new added element in progressive rendering. + * And traverse all in normal rendering. + */ + + + ChartView.prototype.eachRendered = function (cb) { + traverseElements(this.group, cb); + }; + + ChartView.markUpdateMethod = function (payload, methodName) { + inner$2(payload).updateMethod = methodName; + }; + + ChartView.protoInitialize = function () { + var proto = ChartView.prototype; + proto.type = 'chart'; + }(); + + return ChartView; + }(); + /** + * Set state of single element + */ + + function elSetState(el, state, highlightDigit) { + if (el && isHighDownDispatcher(el)) { + (state === 'emphasis' ? enterEmphasis : leaveEmphasis)(el, highlightDigit); + } + } + + function toggleHighlight(data, payload, state) { + var dataIndex = queryDataIndex(data, payload); + var highlightDigit = payload && payload.highlightKey != null ? getHighlightDigit(payload.highlightKey) : null; + + if (dataIndex != null) { + each(normalizeToArray(dataIndex), function (dataIdx) { + elSetState(data.getItemGraphicEl(dataIdx), state, highlightDigit); + }); + } else { + data.eachItemGraphicEl(function (el) { + elSetState(el, state, highlightDigit); + }); + } + } + + enableClassExtend(ChartView, ['dispose']); + enableClassManagement(ChartView); + + function renderTaskPlan(context) { + return renderPlanner(context.model); + } + + function renderTaskReset(context) { + var seriesModel = context.model; + var ecModel = context.ecModel; + var api = context.api; + var payload = context.payload; // FIXME: remove updateView updateVisual + + var progressiveRender = seriesModel.pipelineContext.progressiveRender; + var view = context.view; + var updateMethod = payload && inner$2(payload).updateMethod; + var methodName = progressiveRender ? 'incrementalPrepareRender' : updateMethod && view[updateMethod] ? updateMethod // `appendData` is also supported when data amount + // is less than progressive threshold. + : 'render'; + + if (methodName !== 'render') { + view[methodName](seriesModel, ecModel, api, payload); + } + + return progressMethodMap[methodName]; + } + + var progressMethodMap = { + incrementalPrepareRender: { + progress: function (params, context) { + context.view.incrementalRender(params, context.model, context.ecModel, context.api, context.payload); + } + }, + render: { + // Put view.render in `progress` to support appendData. But in this case + // view.render should not be called in reset, otherwise it will be called + // twise. Use `forceFirstProgress` to make sure that view.render is called + // in any cases. + forceFirstProgress: true, + progress: function (params, context) { + context.view.render(context.model, context.ecModel, context.api, context.payload); + } + } + }; + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + var ORIGIN_METHOD = '\0__throttleOriginMethod'; + var RATE = '\0__throttleRate'; + var THROTTLE_TYPE = '\0__throttleType'; + /** + * @public + * @param {(Function)} fn + * @param {number} [delay=0] Unit: ms. + * @param {boolean} [debounce=false] + * true: If call interval less than `delay`, only the last call works. + * false: If call interval less than `delay, call works on fixed rate. + * @return {(Function)} throttled fn. + */ + + function throttle(fn, delay, debounce) { + var currCall; + var lastCall = 0; + var lastExec = 0; + var timer = null; + var diff; + var scope; + var args; + var debounceNextCall; + delay = delay || 0; + + function exec() { + lastExec = new Date().getTime(); + timer = null; + fn.apply(scope, args || []); + } + + var cb = function () { + var cbArgs = []; + + for (var _i = 0; _i < arguments.length; _i++) { + cbArgs[_i] = arguments[_i]; + } + + currCall = new Date().getTime(); + scope = this; + args = cbArgs; + var thisDelay = debounceNextCall || delay; + var thisDebounce = debounceNextCall || debounce; + debounceNextCall = null; + diff = currCall - (thisDebounce ? lastCall : lastExec) - thisDelay; + clearTimeout(timer); // Here we should make sure that: the `exec` SHOULD NOT be called later + // than a new call of `cb`, that is, preserving the command order. Consider + // calculating "scale rate" when roaming as an example. When a call of `cb` + // happens, either the `exec` is called dierectly, or the call is delayed. + // But the delayed call should never be later than next call of `cb`. Under + // this assurance, we can simply update view state each time `dispatchAction` + // triggered by user roaming, but not need to add extra code to avoid the + // state being "rolled-back". + + if (thisDebounce) { + timer = setTimeout(exec, thisDelay); + } else { + if (diff >= 0) { + exec(); + } else { + timer = setTimeout(exec, -diff); + } + } + + lastCall = currCall; + }; + /** + * Clear throttle. + * @public + */ + + + cb.clear = function () { + if (timer) { + clearTimeout(timer); + timer = null; + } + }; + /** + * Enable debounce once. + */ + + + cb.debounceNextCall = function (debounceDelay) { + debounceNextCall = debounceDelay; + }; + + return cb; + } + /** + * Create throttle method or update throttle rate. + * + * @example + * ComponentView.prototype.render = function () { + * ... + * throttle.createOrUpdate( + * this, + * '_dispatchAction', + * this.model.get('throttle'), + * 'fixRate' + * ); + * }; + * ComponentView.prototype.remove = function () { + * throttle.clear(this, '_dispatchAction'); + * }; + * ComponentView.prototype.dispose = function () { + * throttle.clear(this, '_dispatchAction'); + * }; + * + */ + + function createOrUpdate(obj, fnAttr, rate, throttleType) { + var fn = obj[fnAttr]; + + if (!fn) { + return; + } + + var originFn = fn[ORIGIN_METHOD] || fn; + var lastThrottleType = fn[THROTTLE_TYPE]; + var lastRate = fn[RATE]; + + if (lastRate !== rate || lastThrottleType !== throttleType) { + if (rate == null || !throttleType) { + return obj[fnAttr] = originFn; + } + + fn = obj[fnAttr] = throttle(originFn, rate, throttleType === 'debounce'); + fn[ORIGIN_METHOD] = originFn; + fn[THROTTLE_TYPE] = throttleType; + fn[RATE] = rate; + } + + return fn; + } + /** + * Clear throttle. Example see throttle.createOrUpdate. + */ + + function clear(obj, fnAttr) { + var fn = obj[fnAttr]; + + if (fn && fn[ORIGIN_METHOD]) { + // Clear throttle + fn.clear && fn.clear(); + obj[fnAttr] = fn[ORIGIN_METHOD]; + } + } + + var inner$3 = makeInner(); + var defaultStyleMappers = { + itemStyle: makeStyleMapper(ITEM_STYLE_KEY_MAP, true), + lineStyle: makeStyleMapper(LINE_STYLE_KEY_MAP, true) + }; + var defaultColorKey = { + lineStyle: 'stroke', + itemStyle: 'fill' + }; + + function getStyleMapper(seriesModel, stylePath) { + var styleMapper = seriesModel.visualStyleMapper || defaultStyleMappers[stylePath]; + + if (!styleMapper) { + console.warn("Unkown style type '" + stylePath + "'."); + return defaultStyleMappers.itemStyle; + } + + return styleMapper; + } + + function getDefaultColorKey(seriesModel, stylePath) { + // return defaultColorKey[stylePath] || + var colorKey = seriesModel.visualDrawType || defaultColorKey[stylePath]; + + if (!colorKey) { + console.warn("Unkown style type '" + stylePath + "'."); + return 'fill'; + } + + return colorKey; + } + + var seriesStyleTask = { + createOnAllSeries: true, + performRawSeries: true, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle'; // Set in itemStyle + + var styleModel = seriesModel.getModel(stylePath); + var getStyle = getStyleMapper(seriesModel, stylePath); + var globalStyle = getStyle(styleModel); + var decalOption = styleModel.getShallow('decal'); + + if (decalOption) { + data.setVisual('decal', decalOption); + decalOption.dirty = true; + } // TODO + + + var colorKey = getDefaultColorKey(seriesModel, stylePath); + var color = globalStyle[colorKey]; // TODO style callback + + var colorCallback = isFunction(color) ? color : null; + var hasAutoColor = globalStyle.fill === 'auto' || globalStyle.stroke === 'auto'; // Get from color palette by default. + + if (!globalStyle[colorKey] || colorCallback || hasAutoColor) { + // Note: if some series has color specified (e.g., by itemStyle.color), we DO NOT + // make it effect palette. Bacause some scenarios users need to make some series + // transparent or as background, which should better not effect the palette. + var colorPalette = seriesModel.getColorFromPalette( // TODO series count changed. + seriesModel.name, null, ecModel.getSeriesCount()); + + if (!globalStyle[colorKey]) { + globalStyle[colorKey] = colorPalette; + data.setVisual('colorFromPalette', true); + } + + globalStyle.fill = globalStyle.fill === 'auto' || isFunction(globalStyle.fill) ? colorPalette : globalStyle.fill; + globalStyle.stroke = globalStyle.stroke === 'auto' || isFunction(globalStyle.stroke) ? colorPalette : globalStyle.stroke; + } + + data.setVisual('style', globalStyle); + data.setVisual('drawType', colorKey); // Only visible series has each data be visual encoded + + if (!ecModel.isSeriesFiltered(seriesModel) && colorCallback) { + data.setVisual('colorFromPalette', false); + return { + dataEach: function (data, idx) { + var dataParams = seriesModel.getDataParams(idx); + var itemStyle = extend({}, globalStyle); + itemStyle[colorKey] = colorCallback(dataParams); + data.setItemVisual(idx, 'style', itemStyle); + } + }; + } + } + }; + var sharedModel = new Model(); + var dataStyleTask = { + createOnAllSeries: true, + performRawSeries: true, + reset: function (seriesModel, ecModel) { + if (seriesModel.ignoreStyleOnData || ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var data = seriesModel.getData(); + var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle'; // Set in itemStyle + + var getStyle = getStyleMapper(seriesModel, stylePath); + var colorKey = data.getVisual('drawType'); + return { + dataEach: data.hasItemOption ? function (data, idx) { + // Not use getItemModel for performance considuration + var rawItem = data.getRawDataItem(idx); + + if (rawItem && rawItem[stylePath]) { + sharedModel.option = rawItem[stylePath]; + var style = getStyle(sharedModel); + var existsStyle = data.ensureUniqueItemVisual(idx, 'style'); + extend(existsStyle, style); + + if (sharedModel.option.decal) { + data.setItemVisual(idx, 'decal', sharedModel.option.decal); + sharedModel.option.decal.dirty = true; + } + + if (colorKey in style) { + data.setItemVisual(idx, 'colorFromPalette', false); + } + } + } : null + }; + } + }; // Pick color from palette for the data which has not been set with color yet. + // Note: do not support stream rendering. No such cases yet. + + var dataColorPaletteTask = { + performRawSeries: true, + overallReset: function (ecModel) { + // Each type of series use one scope. + // Pie and funnel are using diferrent scopes + var paletteScopeGroupByType = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var colorBy = seriesModel.getColorBy(); + + if (seriesModel.isColorBySeries()) { + return; + } + + var key = seriesModel.type + '-' + colorBy; + var colorScope = paletteScopeGroupByType.get(key); + + if (!colorScope) { + colorScope = {}; + paletteScopeGroupByType.set(key, colorScope); + } + + inner$3(seriesModel).scope = colorScope; + }); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.isColorBySeries() || ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var dataAll = seriesModel.getRawData(); + var idxMap = {}; + var data = seriesModel.getData(); + var colorScope = inner$3(seriesModel).scope; + var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle'; + var colorKey = getDefaultColorKey(seriesModel, stylePath); + data.each(function (idx) { + var rawIdx = data.getRawIndex(idx); + idxMap[rawIdx] = idx; + }); // Iterate on data before filtered. To make sure color from palette can be + // Consistent when toggling legend. + + dataAll.each(function (rawIdx) { + var idx = idxMap[rawIdx]; + var fromPalette = data.getItemVisual(idx, 'colorFromPalette'); // Get color from palette for each data only when the color is inherited from series color, which is + // also picked from color palette. So following situation is not in the case: + // 1. series.itemStyle.color is set + // 2. color is encoded by visualMap + + if (fromPalette) { + var itemStyle = data.ensureUniqueItemVisual(idx, 'style'); + var name_1 = dataAll.getName(rawIdx) || rawIdx + ''; + var dataCount = dataAll.count(); + itemStyle[colorKey] = seriesModel.getColorFromPalette(name_1, colorScope, dataCount); + } + }); + }); + } + }; + + var PI$3 = Math.PI; + /** + * @param {module:echarts/ExtensionAPI} api + * @param {Object} [opts] + * @param {string} [opts.text] + * @param {string} [opts.color] + * @param {string} [opts.textColor] + * @return {module:zrender/Element} + */ + + function defaultLoading(api, opts) { + opts = opts || {}; + defaults(opts, { + text: 'loading', + textColor: '#000', + fontSize: 12, + fontWeight: 'normal', + fontStyle: 'normal', + fontFamily: 'sans-serif', + maskColor: 'rgba(255, 255, 255, 0.8)', + showSpinner: true, + color: '#5470c6', + spinnerRadius: 10, + lineWidth: 5, + zlevel: 0 + }); + var group = new Group(); + var mask = new Rect({ + style: { + fill: opts.maskColor + }, + zlevel: opts.zlevel, + z: 10000 + }); + group.add(mask); + var textContent = new ZRText({ + style: { + text: opts.text, + fill: opts.textColor, + fontSize: opts.fontSize, + fontWeight: opts.fontWeight, + fontStyle: opts.fontStyle, + fontFamily: opts.fontFamily + }, + zlevel: opts.zlevel, + z: 10001 + }); + var labelRect = new Rect({ + style: { + fill: 'none' + }, + textContent: textContent, + textConfig: { + position: 'right', + distance: 10 + }, + zlevel: opts.zlevel, + z: 10001 + }); + group.add(labelRect); + var arc; + + if (opts.showSpinner) { + arc = new Arc({ + shape: { + startAngle: -PI$3 / 2, + endAngle: -PI$3 / 2 + 0.1, + r: opts.spinnerRadius + }, + style: { + stroke: opts.color, + lineCap: 'round', + lineWidth: opts.lineWidth + }, + zlevel: opts.zlevel, + z: 10001 + }); + arc.animateShape(true).when(1000, { + endAngle: PI$3 * 3 / 2 + }).start('circularInOut'); + arc.animateShape(true).when(1000, { + startAngle: PI$3 * 3 / 2 + }).delay(300).start('circularInOut'); + group.add(arc); + } // Inject resize + + + group.resize = function () { + var textWidth = textContent.getBoundingRect().width; + var r = opts.showSpinner ? opts.spinnerRadius : 0; // cx = (containerWidth - arcDiameter - textDistance - textWidth) / 2 + // textDistance needs to be calculated when both animation and text exist + + var cx = (api.getWidth() - r * 2 - (opts.showSpinner && textWidth ? 10 : 0) - textWidth) / 2 - (opts.showSpinner && textWidth ? 0 : 5 + textWidth / 2) // only show the text + + (opts.showSpinner ? 0 : textWidth / 2) // only show the spinner + + (textWidth ? 0 : r); + var cy = api.getHeight() / 2; + opts.showSpinner && arc.setShape({ + cx: cx, + cy: cy + }); + labelRect.setShape({ + x: cx - r, + y: cy - r, + width: r * 2, + height: r * 2 + }); + mask.setShape({ + x: 0, + y: 0, + width: api.getWidth(), + height: api.getHeight() + }); + }; + + group.resize(); + return group; + } + + var Scheduler = + /** @class */ + function () { + function Scheduler(ecInstance, api, dataProcessorHandlers, visualHandlers) { + // key: handlerUID + this._stageTaskMap = createHashMap(); + this.ecInstance = ecInstance; + this.api = api; // Fix current processors in case that in some rear cases that + // processors might be registered after echarts instance created. + // Register processors incrementally for a echarts instance is + // not supported by this stream architecture. + + dataProcessorHandlers = this._dataProcessorHandlers = dataProcessorHandlers.slice(); + visualHandlers = this._visualHandlers = visualHandlers.slice(); + this._allHandlers = dataProcessorHandlers.concat(visualHandlers); + } + + Scheduler.prototype.restoreData = function (ecModel, payload) { + // TODO: Only restore needed series and components, but not all components. + // Currently `restoreData` of all of the series and component will be called. + // But some independent components like `title`, `legend`, `graphic`, `toolbox`, + // `tooltip`, `axisPointer`, etc, do not need series refresh when `setOption`, + // and some components like coordinate system, axes, dataZoom, visualMap only + // need their target series refresh. + // (1) If we are implementing this feature some day, we should consider these cases: + // if a data processor depends on a component (e.g., dataZoomProcessor depends + // on the settings of `dataZoom`), it should be re-performed if the component + // is modified by `setOption`. + // (2) If a processor depends on sevral series, speicified by its `getTargetSeries`, + // it should be re-performed when the result array of `getTargetSeries` changed. + // We use `dependencies` to cover these issues. + // (3) How to update target series when coordinate system related components modified. + // TODO: simply the dirty mechanism? Check whether only the case here can set tasks dirty, + // and this case all of the tasks will be set as dirty. + ecModel.restoreData(payload); // Theoretically an overall task not only depends on each of its target series, but also + // depends on all of the series. + // The overall task is not in pipeline, and `ecModel.restoreData` only set pipeline tasks + // dirty. If `getTargetSeries` of an overall task returns nothing, we should also ensure + // that the overall task is set as dirty and to be performed, otherwise it probably cause + // state chaos. So we have to set dirty of all of the overall tasks manually, otherwise it + // probably cause state chaos (consider `dataZoomProcessor`). + + this._stageTaskMap.each(function (taskRecord) { + var overallTask = taskRecord.overallTask; + overallTask && overallTask.dirty(); + }); + }; // If seriesModel provided, incremental threshold is check by series data. + + + Scheduler.prototype.getPerformArgs = function (task, isBlock) { + // For overall task + if (!task.__pipeline) { + return; + } + + var pipeline = this._pipelineMap.get(task.__pipeline.id); + + var pCtx = pipeline.context; + var incremental = !isBlock && pipeline.progressiveEnabled && (!pCtx || pCtx.progressiveRender) && task.__idxInPipeline > pipeline.blockIndex; + var step = incremental ? pipeline.step : null; + var modDataCount = pCtx && pCtx.modDataCount; + var modBy = modDataCount != null ? Math.ceil(modDataCount / step) : null; + return { + step: step, + modBy: modBy, + modDataCount: modDataCount + }; + }; + + Scheduler.prototype.getPipeline = function (pipelineId) { + return this._pipelineMap.get(pipelineId); + }; + /** + * Current, progressive rendering starts from visual and layout. + * Always detect render mode in the same stage, avoiding that incorrect + * detection caused by data filtering. + * Caution: + * `updateStreamModes` use `seriesModel.getData()`. + */ + + + Scheduler.prototype.updateStreamModes = function (seriesModel, view) { + var pipeline = this._pipelineMap.get(seriesModel.uid); + + var data = seriesModel.getData(); + var dataLen = data.count(); // `progressiveRender` means that can render progressively in each + // animation frame. Note that some types of series do not provide + // `view.incrementalPrepareRender` but support `chart.appendData`. We + // use the term `incremental` but not `progressive` to describe the + // case that `chart.appendData`. + + var progressiveRender = pipeline.progressiveEnabled && view.incrementalPrepareRender && dataLen >= pipeline.threshold; + var large = seriesModel.get('large') && dataLen >= seriesModel.get('largeThreshold'); // TODO: modDataCount should not updated if `appendData`, otherwise cause whole repaint. + // see `test/candlestick-large3.html` + + var modDataCount = seriesModel.get('progressiveChunkMode') === 'mod' ? dataLen : null; + seriesModel.pipelineContext = pipeline.context = { + progressiveRender: progressiveRender, + modDataCount: modDataCount, + large: large + }; + }; + + Scheduler.prototype.restorePipelines = function (ecModel) { + var scheduler = this; + var pipelineMap = scheduler._pipelineMap = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var progressive = seriesModel.getProgressive(); + var pipelineId = seriesModel.uid; + pipelineMap.set(pipelineId, { + id: pipelineId, + head: null, + tail: null, + threshold: seriesModel.getProgressiveThreshold(), + progressiveEnabled: progressive && !(seriesModel.preventIncremental && seriesModel.preventIncremental()), + blockIndex: -1, + step: Math.round(progressive || 700), + count: 0 + }); + + scheduler._pipe(seriesModel, seriesModel.dataTask); + }); + }; + + Scheduler.prototype.prepareStageTasks = function () { + var stageTaskMap = this._stageTaskMap; + var ecModel = this.api.getModel(); + var api = this.api; + each(this._allHandlers, function (handler) { + var record = stageTaskMap.get(handler.uid) || stageTaskMap.set(handler.uid, {}); + var errMsg = ''; + + if ("development" !== 'production') { + // Currently do not need to support to sepecify them both. + errMsg = '"reset" and "overallReset" must not be both specified.'; + } + + assert(!(handler.reset && handler.overallReset), errMsg); + handler.reset && this._createSeriesStageTask(handler, record, ecModel, api); + handler.overallReset && this._createOverallStageTask(handler, record, ecModel, api); + }, this); + }; + + Scheduler.prototype.prepareView = function (view, model, ecModel, api) { + var renderTask = view.renderTask; + var context = renderTask.context; + context.model = model; + context.ecModel = ecModel; + context.api = api; + renderTask.__block = !view.incrementalPrepareRender; + + this._pipe(model, renderTask); + }; + + Scheduler.prototype.performDataProcessorTasks = function (ecModel, payload) { + // If we do not use `block` here, it should be considered when to update modes. + this._performStageTasks(this._dataProcessorHandlers, ecModel, payload, { + block: true + }); + }; + + Scheduler.prototype.performVisualTasks = function (ecModel, payload, opt) { + this._performStageTasks(this._visualHandlers, ecModel, payload, opt); + }; + + Scheduler.prototype._performStageTasks = function (stageHandlers, ecModel, payload, opt) { + opt = opt || {}; + var unfinished = false; + var scheduler = this; + each(stageHandlers, function (stageHandler, idx) { + if (opt.visualType && opt.visualType !== stageHandler.visualType) { + return; + } + + var stageHandlerRecord = scheduler._stageTaskMap.get(stageHandler.uid); + + var seriesTaskMap = stageHandlerRecord.seriesTaskMap; + var overallTask = stageHandlerRecord.overallTask; + + if (overallTask) { + var overallNeedDirty_1; + var agentStubMap = overallTask.agentStubMap; + agentStubMap.each(function (stub) { + if (needSetDirty(opt, stub)) { + stub.dirty(); + overallNeedDirty_1 = true; + } + }); + overallNeedDirty_1 && overallTask.dirty(); + scheduler.updatePayload(overallTask, payload); + var performArgs_1 = scheduler.getPerformArgs(overallTask, opt.block); // Execute stubs firstly, which may set the overall task dirty, + // then execute the overall task. And stub will call seriesModel.setData, + // which ensures that in the overallTask seriesModel.getData() will not + // return incorrect data. + + agentStubMap.each(function (stub) { + stub.perform(performArgs_1); + }); + + if (overallTask.perform(performArgs_1)) { + unfinished = true; + } + } else if (seriesTaskMap) { + seriesTaskMap.each(function (task, pipelineId) { + if (needSetDirty(opt, task)) { + task.dirty(); + } + + var performArgs = scheduler.getPerformArgs(task, opt.block); // FIXME + // if intending to decalare `performRawSeries` in handlers, only + // stream-independent (specifically, data item independent) operations can be + // performed. Because is a series is filtered, most of the tasks will not + // be performed. A stream-dependent operation probably cause wrong biz logic. + // Perhaps we should not provide a separate callback for this case instead + // of providing the config `performRawSeries`. The stream-dependent operaions + // and stream-independent operations should better not be mixed. + + performArgs.skip = !stageHandler.performRawSeries && ecModel.isSeriesFiltered(task.context.model); + scheduler.updatePayload(task, payload); + + if (task.perform(performArgs)) { + unfinished = true; + } + }); + } + }); + + function needSetDirty(opt, task) { + return opt.setDirty && (!opt.dirtyMap || opt.dirtyMap.get(task.__pipeline.id)); + } + + this.unfinished = unfinished || this.unfinished; + }; + + Scheduler.prototype.performSeriesTasks = function (ecModel) { + var unfinished; + ecModel.eachSeries(function (seriesModel) { + // Progress to the end for dataInit and dataRestore. + unfinished = seriesModel.dataTask.perform() || unfinished; + }); + this.unfinished = unfinished || this.unfinished; + }; + + Scheduler.prototype.plan = function () { + // Travel pipelines, check block. + this._pipelineMap.each(function (pipeline) { + var task = pipeline.tail; + + do { + if (task.__block) { + pipeline.blockIndex = task.__idxInPipeline; + break; + } + + task = task.getUpstream(); + } while (task); + }); + }; + + Scheduler.prototype.updatePayload = function (task, payload) { + payload !== 'remain' && (task.context.payload = payload); + }; + + Scheduler.prototype._createSeriesStageTask = function (stageHandler, stageHandlerRecord, ecModel, api) { + var scheduler = this; + var oldSeriesTaskMap = stageHandlerRecord.seriesTaskMap; // The count of stages are totally about only several dozen, so + // do not need to reuse the map. + + var newSeriesTaskMap = stageHandlerRecord.seriesTaskMap = createHashMap(); + var seriesType = stageHandler.seriesType; + var getTargetSeries = stageHandler.getTargetSeries; // If a stageHandler should cover all series, `createOnAllSeries` should be declared mandatorily, + // to avoid some typo or abuse. Otherwise if an extension do not specify a `seriesType`, + // it works but it may cause other irrelevant charts blocked. + + if (stageHandler.createOnAllSeries) { + ecModel.eachRawSeries(create); + } else if (seriesType) { + ecModel.eachRawSeriesByType(seriesType, create); + } else if (getTargetSeries) { + getTargetSeries(ecModel, api).each(create); + } + + function create(seriesModel) { + var pipelineId = seriesModel.uid; // Init tasks for each seriesModel only once. + // Reuse original task instance. + + var task = newSeriesTaskMap.set(pipelineId, oldSeriesTaskMap && oldSeriesTaskMap.get(pipelineId) || createTask({ + plan: seriesTaskPlan, + reset: seriesTaskReset, + count: seriesTaskCount + })); + task.context = { + model: seriesModel, + ecModel: ecModel, + api: api, + // PENDING: `useClearVisual` not used? + useClearVisual: stageHandler.isVisual && !stageHandler.isLayout, + plan: stageHandler.plan, + reset: stageHandler.reset, + scheduler: scheduler + }; + + scheduler._pipe(seriesModel, task); + } + }; + + Scheduler.prototype._createOverallStageTask = function (stageHandler, stageHandlerRecord, ecModel, api) { + var scheduler = this; + var overallTask = stageHandlerRecord.overallTask = stageHandlerRecord.overallTask // For overall task, the function only be called on reset stage. + || createTask({ + reset: overallTaskReset + }); + overallTask.context = { + ecModel: ecModel, + api: api, + overallReset: stageHandler.overallReset, + scheduler: scheduler + }; + var oldAgentStubMap = overallTask.agentStubMap; // The count of stages are totally about only several dozen, so + // do not need to reuse the map. + + var newAgentStubMap = overallTask.agentStubMap = createHashMap(); + var seriesType = stageHandler.seriesType; + var getTargetSeries = stageHandler.getTargetSeries; + var overallProgress = true; + var shouldOverallTaskDirty = false; // FIXME:TS never used, so comment it + // let modifyOutputEnd = stageHandler.modifyOutputEnd; + // An overall task with seriesType detected or has `getTargetSeries`, we add + // stub in each pipelines, it will set the overall task dirty when the pipeline + // progress. Moreover, to avoid call the overall task each frame (too frequent), + // we set the pipeline block. + + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = '"createOnAllSeries" do not supported for "overallReset", ' + 'becuase it will block all streams.'; + } + + assert(!stageHandler.createOnAllSeries, errMsg); + + if (seriesType) { + ecModel.eachRawSeriesByType(seriesType, createStub); + } else if (getTargetSeries) { + getTargetSeries(ecModel, api).each(createStub); + } // Otherwise, (usually it is legancy case), the overall task will only be + // executed when upstream dirty. Otherwise the progressive rendering of all + // pipelines will be disabled unexpectedly. But it still needs stubs to receive + // dirty info from upsteam. + else { + overallProgress = false; + each(ecModel.getSeries(), createStub); + } + + function createStub(seriesModel) { + var pipelineId = seriesModel.uid; + var stub = newAgentStubMap.set(pipelineId, oldAgentStubMap && oldAgentStubMap.get(pipelineId) || ( // When the result of `getTargetSeries` changed, the overallTask + // should be set as dirty and re-performed. + shouldOverallTaskDirty = true, createTask({ + reset: stubReset, + onDirty: stubOnDirty + }))); + stub.context = { + model: seriesModel, + overallProgress: overallProgress // FIXME:TS never used, so comment it + // modifyOutputEnd: modifyOutputEnd + + }; + stub.agent = overallTask; + stub.__block = overallProgress; + + scheduler._pipe(seriesModel, stub); + } + + if (shouldOverallTaskDirty) { + overallTask.dirty(); + } + }; + + Scheduler.prototype._pipe = function (seriesModel, task) { + var pipelineId = seriesModel.uid; + + var pipeline = this._pipelineMap.get(pipelineId); + + !pipeline.head && (pipeline.head = task); + pipeline.tail && pipeline.tail.pipe(task); + pipeline.tail = task; + task.__idxInPipeline = pipeline.count++; + task.__pipeline = pipeline; + }; + + Scheduler.wrapStageHandler = function (stageHandler, visualType) { + if (isFunction(stageHandler)) { + stageHandler = { + overallReset: stageHandler, + seriesType: detectSeriseType(stageHandler) + }; + } + + stageHandler.uid = getUID('stageHandler'); + visualType && (stageHandler.visualType = visualType); + return stageHandler; + }; + return Scheduler; + }(); + + function overallTaskReset(context) { + context.overallReset(context.ecModel, context.api, context.payload); + } + + function stubReset(context) { + return context.overallProgress && stubProgress; + } + + function stubProgress() { + this.agent.dirty(); + this.getDownstream().dirty(); + } + + function stubOnDirty() { + this.agent && this.agent.dirty(); + } + + function seriesTaskPlan(context) { + return context.plan ? context.plan(context.model, context.ecModel, context.api, context.payload) : null; + } + + function seriesTaskReset(context) { + if (context.useClearVisual) { + context.data.clearAllVisual(); + } + + var resetDefines = context.resetDefines = normalizeToArray(context.reset(context.model, context.ecModel, context.api, context.payload)); + return resetDefines.length > 1 ? map(resetDefines, function (v, idx) { + return makeSeriesTaskProgress(idx); + }) : singleSeriesTaskProgress; + } + + var singleSeriesTaskProgress = makeSeriesTaskProgress(0); + + function makeSeriesTaskProgress(resetDefineIdx) { + return function (params, context) { + var data = context.data; + var resetDefine = context.resetDefines[resetDefineIdx]; + + if (resetDefine && resetDefine.dataEach) { + for (var i = params.start; i < params.end; i++) { + resetDefine.dataEach(data, i); + } + } else if (resetDefine && resetDefine.progress) { + resetDefine.progress(params, data); + } + }; + } + + function seriesTaskCount(context) { + return context.data.count(); + } + /** + * Only some legacy stage handlers (usually in echarts extensions) are pure function. + * To ensure that they can work normally, they should work in block mode, that is, + * they should not be started util the previous tasks finished. So they cause the + * progressive rendering disabled. We try to detect the series type, to narrow down + * the block range to only the series type they concern, but not all series. + */ + + + function detectSeriseType(legacyFunc) { + seriesType = null; + + try { + // Assume there is no async when calling `eachSeriesByType`. + legacyFunc(ecModelMock, apiMock); + } catch (e) {} + + return seriesType; + } + + var ecModelMock = {}; + var apiMock = {}; + var seriesType; + mockMethods(ecModelMock, GlobalModel); + mockMethods(apiMock, ExtensionAPI); + + ecModelMock.eachSeriesByType = ecModelMock.eachRawSeriesByType = function (type) { + seriesType = type; + }; + + ecModelMock.eachComponent = function (cond) { + if (cond.mainType === 'series' && cond.subType) { + seriesType = cond.subType; + } + }; + + function mockMethods(target, Clz) { + /* eslint-disable */ + for (var name_1 in Clz.prototype) { + // Do not use hasOwnProperty + target[name_1] = noop; + } + /* eslint-enable */ + + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + var colorAll = ['#37A2DA', '#32C5E9', '#67E0E3', '#9FE6B8', '#FFDB5C', '#ff9f7f', '#fb7293', '#E062AE', '#E690D1', '#e7bcf3', '#9d96f5', '#8378EA', '#96BFFF']; + var lightTheme = { + color: colorAll, + colorLayer: [['#37A2DA', '#ffd85c', '#fd7b5f'], ['#37A2DA', '#67E0E3', '#FFDB5C', '#ff9f7f', '#E062AE', '#9d96f5'], ['#37A2DA', '#32C5E9', '#9FE6B8', '#FFDB5C', '#ff9f7f', '#fb7293', '#e7bcf3', '#8378EA', '#96BFFF'], colorAll] + }; + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + var contrastColor = '#B9B8CE'; + var backgroundColor = '#100C2A'; + + var axisCommon = function () { + return { + axisLine: { + lineStyle: { + color: contrastColor + } + }, + splitLine: { + lineStyle: { + color: '#484753' + } + }, + splitArea: { + areaStyle: { + color: ['rgba(255,255,255,0.02)', 'rgba(255,255,255,0.05)'] + } + }, + minorSplitLine: { + lineStyle: { + color: '#20203B' + } + } + }; + }; + + var colorPalette = ['#4992ff', '#7cffb2', '#fddd60', '#ff6e76', '#58d9f9', '#05c091', '#ff8a45', '#8d48e3', '#dd79ff']; + var theme = { + darkMode: true, + color: colorPalette, + backgroundColor: backgroundColor, + axisPointer: { + lineStyle: { + color: '#817f91' + }, + crossStyle: { + color: '#817f91' + }, + label: { + // TODO Contrast of label backgorundColor + color: '#fff' + } + }, + legend: { + textStyle: { + color: contrastColor + } + }, + textStyle: { + color: contrastColor + }, + title: { + textStyle: { + color: '#EEF1FA' + }, + subtextStyle: { + color: '#B9B8CE' + } + }, + toolbox: { + iconStyle: { + borderColor: contrastColor + } + }, + dataZoom: { + borderColor: '#71708A', + textStyle: { + color: contrastColor + }, + brushStyle: { + color: 'rgba(135,163,206,0.3)' + }, + handleStyle: { + color: '#353450', + borderColor: '#C5CBE3' + }, + moveHandleStyle: { + color: '#B0B6C3', + opacity: 0.3 + }, + fillerColor: 'rgba(135,163,206,0.2)', + emphasis: { + handleStyle: { + borderColor: '#91B7F2', + color: '#4D587D' + }, + moveHandleStyle: { + color: '#636D9A', + opacity: 0.7 + } + }, + dataBackground: { + lineStyle: { + color: '#71708A', + width: 1 + }, + areaStyle: { + color: '#71708A' + } + }, + selectedDataBackground: { + lineStyle: { + color: '#87A3CE' + }, + areaStyle: { + color: '#87A3CE' + } + } + }, + visualMap: { + textStyle: { + color: contrastColor + } + }, + timeline: { + lineStyle: { + color: contrastColor + }, + label: { + color: contrastColor + }, + controlStyle: { + color: contrastColor, + borderColor: contrastColor + } + }, + calendar: { + itemStyle: { + color: backgroundColor + }, + dayLabel: { + color: contrastColor + }, + monthLabel: { + color: contrastColor + }, + yearLabel: { + color: contrastColor + } + }, + timeAxis: axisCommon(), + logAxis: axisCommon(), + valueAxis: axisCommon(), + categoryAxis: axisCommon(), + line: { + symbol: 'circle' + }, + graph: { + color: colorPalette + }, + gauge: { + title: { + color: contrastColor + }, + axisLine: { + lineStyle: { + color: [[1, 'rgba(207,212,219,0.2)']] + } + }, + axisLabel: { + color: contrastColor + }, + detail: { + color: '#EEF1FA' + } + }, + candlestick: { + itemStyle: { + color: '#f64e56', + color0: '#54ea92', + borderColor: '#f64e56', + borderColor0: '#54ea92' // borderColor: '#ca2824', + // borderColor0: '#09a443' + + } + } + }; + theme.categoryAxis.splitLine.show = false; + + /** + * Usage of query: + * `chart.on('click', query, handler);` + * The `query` can be: + * + The component type query string, only `mainType` or `mainType.subType`, + * like: 'xAxis', 'series', 'xAxis.category' or 'series.line'. + * + The component query object, like: + * `{seriesIndex: 2}`, `{seriesName: 'xx'}`, `{seriesId: 'some'}`, + * `{xAxisIndex: 2}`, `{xAxisName: 'xx'}`, `{xAxisId: 'some'}`. + * + The data query object, like: + * `{dataIndex: 123}`, `{dataType: 'link'}`, `{name: 'some'}`. + * + The other query object (cmponent customized query), like: + * `{element: 'some'}` (only available in custom series). + * + * Caveat: If a prop in the `query` object is `null/undefined`, it is the + * same as there is no such prop in the `query` object. + */ + + var ECEventProcessor = + /** @class */ + function () { + function ECEventProcessor() {} + + ECEventProcessor.prototype.normalizeQuery = function (query) { + var cptQuery = {}; + var dataQuery = {}; + var otherQuery = {}; // `query` is `mainType` or `mainType.subType` of component. + + if (isString(query)) { + var condCptType = parseClassType(query); // `.main` and `.sub` may be ''. + + cptQuery.mainType = condCptType.main || null; + cptQuery.subType = condCptType.sub || null; + } // `query` is an object, convert to {mainType, index, name, id}. + else { + // `xxxIndex`, `xxxName`, `xxxId`, `name`, `dataIndex`, `dataType` is reserved, + // can not be used in `compomentModel.filterForExposedEvent`. + var suffixes_1 = ['Index', 'Name', 'Id']; + var dataKeys_1 = { + name: 1, + dataIndex: 1, + dataType: 1 + }; + each(query, function (val, key) { + var reserved = false; + + for (var i = 0; i < suffixes_1.length; i++) { + var propSuffix = suffixes_1[i]; + var suffixPos = key.lastIndexOf(propSuffix); + + if (suffixPos > 0 && suffixPos === key.length - propSuffix.length) { + var mainType = key.slice(0, suffixPos); // Consider `dataIndex`. + + if (mainType !== 'data') { + cptQuery.mainType = mainType; + cptQuery[propSuffix.toLowerCase()] = val; + reserved = true; + } + } + } + + if (dataKeys_1.hasOwnProperty(key)) { + dataQuery[key] = val; + reserved = true; + } + + if (!reserved) { + otherQuery[key] = val; + } + }); + } + + return { + cptQuery: cptQuery, + dataQuery: dataQuery, + otherQuery: otherQuery + }; + }; + + ECEventProcessor.prototype.filter = function (eventType, query) { + // They should be assigned before each trigger call. + var eventInfo = this.eventInfo; + + if (!eventInfo) { + return true; + } + + var targetEl = eventInfo.targetEl; + var packedEvent = eventInfo.packedEvent; + var model = eventInfo.model; + var view = eventInfo.view; // For event like 'globalout'. + + if (!model || !view) { + return true; + } + + var cptQuery = query.cptQuery; + var dataQuery = query.dataQuery; + return check(cptQuery, model, 'mainType') && check(cptQuery, model, 'subType') && check(cptQuery, model, 'index', 'componentIndex') && check(cptQuery, model, 'name') && check(cptQuery, model, 'id') && check(dataQuery, packedEvent, 'name') && check(dataQuery, packedEvent, 'dataIndex') && check(dataQuery, packedEvent, 'dataType') && (!view.filterForExposedEvent || view.filterForExposedEvent(eventType, query.otherQuery, targetEl, packedEvent)); + + function check(query, host, prop, propOnHost) { + return query[prop] == null || host[propOnHost || prop] === query[prop]; + } + }; + + ECEventProcessor.prototype.afterTrigger = function () { + // Make sure the eventInfo wont be used in next trigger. + this.eventInfo = null; + }; + + return ECEventProcessor; + }(); + + var SYMBOL_PROPS_WITH_CB = ['symbol', 'symbolSize', 'symbolRotate', 'symbolOffset']; + var SYMBOL_PROPS = SYMBOL_PROPS_WITH_CB.concat(['symbolKeepAspect']); // Encoding visual for all series include which is filtered for legend drawing + + var seriesSymbolTask = { + createOnAllSeries: true, + // For legend. + performRawSeries: true, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + + if (seriesModel.legendIcon) { + data.setVisual('legendIcon', seriesModel.legendIcon); + } + + if (!seriesModel.hasSymbolVisual) { + return; + } + + var symbolOptions = {}; + var symbolOptionsCb = {}; + var hasCallback = false; + + for (var i = 0; i < SYMBOL_PROPS_WITH_CB.length; i++) { + var symbolPropName = SYMBOL_PROPS_WITH_CB[i]; + var val = seriesModel.get(symbolPropName); + + if (isFunction(val)) { + hasCallback = true; + symbolOptionsCb[symbolPropName] = val; + } else { + symbolOptions[symbolPropName] = val; + } + } + + symbolOptions.symbol = symbolOptions.symbol || seriesModel.defaultSymbol; + data.setVisual(extend({ + legendIcon: seriesModel.legendIcon || symbolOptions.symbol, + symbolKeepAspect: seriesModel.get('symbolKeepAspect') + }, symbolOptions)); // Only visible series has each data be visual encoded + + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var symbolPropsCb = keys(symbolOptionsCb); + + function dataEach(data, idx) { + var rawValue = seriesModel.getRawValue(idx); + var params = seriesModel.getDataParams(idx); + + for (var i = 0; i < symbolPropsCb.length; i++) { + var symbolPropName = symbolPropsCb[i]; + data.setItemVisual(idx, symbolPropName, symbolOptionsCb[symbolPropName](rawValue, params)); + } + } + + return { + dataEach: hasCallback ? dataEach : null + }; + } + }; + var dataSymbolTask = { + createOnAllSeries: true, + // For legend. + performRawSeries: true, + reset: function (seriesModel, ecModel) { + if (!seriesModel.hasSymbolVisual) { + return; + } // Only visible series has each data be visual encoded + + + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var data = seriesModel.getData(); + + function dataEach(data, idx) { + var itemModel = data.getItemModel(idx); + + for (var i = 0; i < SYMBOL_PROPS.length; i++) { + var symbolPropName = SYMBOL_PROPS[i]; + var val = itemModel.getShallow(symbolPropName, true); + + if (val != null) { + data.setItemVisual(idx, symbolPropName, val); + } + } + } + + return { + dataEach: data.hasItemOption ? dataEach : null + }; + } + }; + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + function getItemVisualFromData(data, dataIndex, key) { + switch (key) { + case 'color': + var style = data.getItemVisual(dataIndex, 'style'); + return style[data.getVisual('drawType')]; + + case 'opacity': + return data.getItemVisual(dataIndex, 'style').opacity; + + case 'symbol': + case 'symbolSize': + case 'liftZ': + return data.getItemVisual(dataIndex, key); + + default: + if ("development" !== 'production') { + console.warn("Unknown visual type " + key); + } + + } + } + function getVisualFromData(data, key) { + switch (key) { + case 'color': + var style = data.getVisual('style'); + return style[data.getVisual('drawType')]; + + case 'opacity': + return data.getVisual('style').opacity; + + case 'symbol': + case 'symbolSize': + case 'liftZ': + return data.getVisual(key); + + default: + if ("development" !== 'production') { + console.warn("Unknown visual type " + key); + } + + } + } + function setItemVisualFromData(data, dataIndex, key, value) { + switch (key) { + case 'color': + // Make sure not sharing style object. + var style = data.ensureUniqueItemVisual(dataIndex, 'style'); + style[data.getVisual('drawType')] = value; // Mark the color has been changed, not from palette anymore + + data.setItemVisual(dataIndex, 'colorFromPalette', false); + break; + + case 'opacity': + data.ensureUniqueItemVisual(dataIndex, 'style').opacity = value; + break; + + case 'symbol': + case 'symbolSize': + case 'liftZ': + data.setItemVisual(dataIndex, key, value); + break; + + default: + if ("development" !== 'production') { + console.warn("Unknown visual type " + key); + } + + } + } + + // Inlucdes: pieSelect, pieUnSelect, pieToggleSelect, mapSelect, mapUnSelect, mapToggleSelect + + function createLegacyDataSelectAction(seriesType, ecRegisterAction) { + function getSeriesIndices(ecModel, payload) { + var seriesIndices = []; + ecModel.eachComponent({ + mainType: 'series', + subType: seriesType, + query: payload + }, function (seriesModel) { + seriesIndices.push(seriesModel.seriesIndex); + }); + return seriesIndices; + } + + each([[seriesType + 'ToggleSelect', 'toggleSelect'], [seriesType + 'Select', 'select'], [seriesType + 'UnSelect', 'unselect']], function (eventsMap) { + ecRegisterAction(eventsMap[0], function (payload, ecModel, api) { + payload = extend({}, payload); + + if ("development" !== 'production') { + deprecateReplaceLog(payload.type, eventsMap[1]); + } + + api.dispatchAction(extend(payload, { + type: eventsMap[1], + seriesIndex: getSeriesIndices(ecModel, payload) + })); + }); + }); + } + + function handleSeriesLegacySelectEvents(type, eventPostfix, ecIns, ecModel, payload) { + var legacyEventName = type + eventPostfix; + + if (!ecIns.isSilent(legacyEventName)) { + if ("development" !== 'production') { + deprecateLog("event " + legacyEventName + " is deprecated."); + } + + ecModel.eachComponent({ + mainType: 'series', + subType: 'pie' + }, function (seriesModel) { + var seriesIndex = seriesModel.seriesIndex; + var selectedMap = seriesModel.option.selectedMap; + var selected = payload.selected; + + for (var i = 0; i < selected.length; i++) { + if (selected[i].seriesIndex === seriesIndex) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload.fromActionPayload); + ecIns.trigger(legacyEventName, { + type: legacyEventName, + seriesId: seriesModel.id, + name: isArray(dataIndex) ? data.getName(dataIndex[0]) : data.getName(dataIndex), + selected: isString(selectedMap) ? selectedMap : extend({}, selectedMap) + }); + } + } + }); + } + } + + function handleLegacySelectEvents(messageCenter, ecIns, api) { + messageCenter.on('selectchanged', function (params) { + var ecModel = api.getModel(); + + if (params.isFromClick) { + handleSeriesLegacySelectEvents('map', 'selectchanged', ecIns, ecModel, params); + handleSeriesLegacySelectEvents('pie', 'selectchanged', ecIns, ecModel, params); + } else if (params.fromAction === 'select') { + handleSeriesLegacySelectEvents('map', 'selected', ecIns, ecModel, params); + handleSeriesLegacySelectEvents('pie', 'selected', ecIns, ecModel, params); + } else if (params.fromAction === 'unselect') { + handleSeriesLegacySelectEvents('map', 'unselected', ecIns, ecModel, params); + handleSeriesLegacySelectEvents('pie', 'unselected', ecIns, ecModel, params); + } + }); + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + function findEventDispatcher(target, det, returnFirstMatch) { + var found; + + while (target) { + if (det(target)) { + found = target; + + if (returnFirstMatch) { + break; + } + } + + target = target.__hostTarget || target.parent; + } + + return found; + } + + var wmUniqueIndex = Math.round(Math.random() * 9); + var supportDefineProperty = typeof Object.defineProperty === 'function'; + var WeakMap = (function () { + function WeakMap() { + this._id = '__ec_inner_' + wmUniqueIndex++; + } + WeakMap.prototype.get = function (key) { + return this._guard(key)[this._id]; + }; + WeakMap.prototype.set = function (key, value) { + var target = this._guard(key); + if (supportDefineProperty) { + Object.defineProperty(target, this._id, { + value: value, + enumerable: false, + configurable: true + }); + } + else { + target[this._id] = value; + } + return this; + }; + WeakMap.prototype["delete"] = function (key) { + if (this.has(key)) { + delete this._guard(key)[this._id]; + return true; + } + return false; + }; + WeakMap.prototype.has = function (key) { + return !!this._guard(key)[this._id]; + }; + WeakMap.prototype._guard = function (key) { + if (key !== Object(key)) { + throw TypeError('Value of WeakMap is not a non-null object.'); + } + return key; + }; + return WeakMap; + }()); + + /** + * Triangle shape + * @inner + */ + + var Triangle = Path.extend({ + type: 'triangle', + shape: { + cx: 0, + cy: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var cx = shape.cx; + var cy = shape.cy; + var width = shape.width / 2; + var height = shape.height / 2; + path.moveTo(cx, cy - height); + path.lineTo(cx + width, cy + height); + path.lineTo(cx - width, cy + height); + path.closePath(); + } + }); + /** + * Diamond shape + * @inner + */ + + var Diamond = Path.extend({ + type: 'diamond', + shape: { + cx: 0, + cy: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var cx = shape.cx; + var cy = shape.cy; + var width = shape.width / 2; + var height = shape.height / 2; + path.moveTo(cx, cy - height); + path.lineTo(cx + width, cy); + path.lineTo(cx, cy + height); + path.lineTo(cx - width, cy); + path.closePath(); + } + }); + /** + * Pin shape + * @inner + */ + + var Pin = Path.extend({ + type: 'pin', + shape: { + // x, y on the cusp + x: 0, + y: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var x = shape.x; + var y = shape.y; + var w = shape.width / 5 * 3; // Height must be larger than width + + var h = Math.max(w, shape.height); + var r = w / 2; // Dist on y with tangent point and circle center + + var dy = r * r / (h - r); + var cy = y - h + r + dy; + var angle = Math.asin(dy / r); // Dist on x with tangent point and circle center + + var dx = Math.cos(angle) * r; + var tanX = Math.sin(angle); + var tanY = Math.cos(angle); + var cpLen = r * 0.6; + var cpLen2 = r * 0.7; + path.moveTo(x - dx, cy + dy); + path.arc(x, cy, r, Math.PI - angle, Math.PI * 2 + angle); + path.bezierCurveTo(x + dx - tanX * cpLen, cy + dy + tanY * cpLen, x, y - cpLen2, x, y); + path.bezierCurveTo(x, y - cpLen2, x - dx + tanX * cpLen, cy + dy + tanY * cpLen, x - dx, cy + dy); + path.closePath(); + } + }); + /** + * Arrow shape + * @inner + */ + + var Arrow = Path.extend({ + type: 'arrow', + shape: { + x: 0, + y: 0, + width: 0, + height: 0 + }, + buildPath: function (ctx, shape) { + var height = shape.height; + var width = shape.width; + var x = shape.x; + var y = shape.y; + var dx = width / 3 * 2; + ctx.moveTo(x, y); + ctx.lineTo(x + dx, y + height); + ctx.lineTo(x, y + height / 4 * 3); + ctx.lineTo(x - dx, y + height); + ctx.lineTo(x, y); + ctx.closePath(); + } + }); + /** + * Map of path contructors + */ + // TODO Use function to build symbol path. + + var symbolCtors = { + line: Line, + rect: Rect, + roundRect: Rect, + square: Rect, + circle: Circle, + diamond: Diamond, + pin: Pin, + arrow: Arrow, + triangle: Triangle + }; + var symbolShapeMakers = { + line: function (x, y, w, h, shape) { + shape.x1 = x; + shape.y1 = y + h / 2; + shape.x2 = x + w; + shape.y2 = y + h / 2; + }, + rect: function (x, y, w, h, shape) { + shape.x = x; + shape.y = y; + shape.width = w; + shape.height = h; + }, + roundRect: function (x, y, w, h, shape) { + shape.x = x; + shape.y = y; + shape.width = w; + shape.height = h; + shape.r = Math.min(w, h) / 4; + }, + square: function (x, y, w, h, shape) { + var size = Math.min(w, h); + shape.x = x; + shape.y = y; + shape.width = size; + shape.height = size; + }, + circle: function (x, y, w, h, shape) { + // Put circle in the center of square + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.r = Math.min(w, h) / 2; + }, + diamond: function (x, y, w, h, shape) { + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.width = w; + shape.height = h; + }, + pin: function (x, y, w, h, shape) { + shape.x = x + w / 2; + shape.y = y + h / 2; + shape.width = w; + shape.height = h; + }, + arrow: function (x, y, w, h, shape) { + shape.x = x + w / 2; + shape.y = y + h / 2; + shape.width = w; + shape.height = h; + }, + triangle: function (x, y, w, h, shape) { + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.width = w; + shape.height = h; + } + }; + var symbolBuildProxies = {}; + each(symbolCtors, function (Ctor, name) { + symbolBuildProxies[name] = new Ctor(); + }); + var SymbolClz = Path.extend({ + type: 'symbol', + shape: { + symbolType: '', + x: 0, + y: 0, + width: 0, + height: 0 + }, + calculateTextPosition: function (out, config, rect) { + var res = calculateTextPosition(out, config, rect); + var shape = this.shape; + + if (shape && shape.symbolType === 'pin' && config.position === 'inside') { + res.y = rect.y + rect.height * 0.4; + } + + return res; + }, + buildPath: function (ctx, shape, inBundle) { + var symbolType = shape.symbolType; + + if (symbolType !== 'none') { + var proxySymbol = symbolBuildProxies[symbolType]; + + if (!proxySymbol) { + // Default rect + symbolType = 'rect'; + proxySymbol = symbolBuildProxies[symbolType]; + } + + symbolShapeMakers[symbolType](shape.x, shape.y, shape.width, shape.height, proxySymbol.shape); + proxySymbol.buildPath(ctx, proxySymbol.shape, inBundle); + } + } + }); // Provide setColor helper method to avoid determine if set the fill or stroke outside + + function symbolPathSetColor(color, innerColor) { + if (this.type !== 'image') { + var symbolStyle = this.style; + + if (this.__isEmptyBrush) { + symbolStyle.stroke = color; + symbolStyle.fill = innerColor || '#fff'; // TODO Same width with lineStyle in LineView + + symbolStyle.lineWidth = 2; + } else if (this.shape.symbolType === 'line') { + symbolStyle.stroke = color; + } else { + symbolStyle.fill = color; + } + + this.markRedraw(); + } + } + /** + * Create a symbol element with given symbol configuration: shape, x, y, width, height, color + */ + + + function createSymbol(symbolType, x, y, w, h, color, // whether to keep the ratio of w/h, + keepAspect) { + // TODO Support image object, DynamicImage. + var isEmpty = symbolType.indexOf('empty') === 0; + + if (isEmpty) { + symbolType = symbolType.substr(5, 1).toLowerCase() + symbolType.substr(6); + } + + var symbolPath; + + if (symbolType.indexOf('image://') === 0) { + symbolPath = makeImage(symbolType.slice(8), new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover'); + } else if (symbolType.indexOf('path://') === 0) { + symbolPath = makePath(symbolType.slice(7), {}, new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover'); + } else { + symbolPath = new SymbolClz({ + shape: { + symbolType: symbolType, + x: x, + y: y, + width: w, + height: h + } + }); + } + + symbolPath.__isEmptyBrush = isEmpty; // TODO Should deprecate setColor + + symbolPath.setColor = symbolPathSetColor; + + if (color) { + symbolPath.setColor(color); + } + + return symbolPath; + } + function normalizeSymbolSize(symbolSize) { + if (!isArray(symbolSize)) { + symbolSize = [+symbolSize, +symbolSize]; + } + + return [symbolSize[0] || 0, symbolSize[1] || 0]; + } + function normalizeSymbolOffset(symbolOffset, symbolSize) { + if (symbolOffset == null) { + return; + } + + if (!isArray(symbolOffset)) { + symbolOffset = [symbolOffset, symbolOffset]; + } + + return [parsePercent$1(symbolOffset[0], symbolSize[0]) || 0, parsePercent$1(retrieve2(symbolOffset[1], symbolOffset[0]), symbolSize[1]) || 0]; + } + + function isSafeNum(num) { + return isFinite(num); + } + function createLinearGradient(ctx, obj, rect) { + var x = obj.x == null ? 0 : obj.x; + var x2 = obj.x2 == null ? 1 : obj.x2; + var y = obj.y == null ? 0 : obj.y; + var y2 = obj.y2 == null ? 0 : obj.y2; + if (!obj.global) { + x = x * rect.width + rect.x; + x2 = x2 * rect.width + rect.x; + y = y * rect.height + rect.y; + y2 = y2 * rect.height + rect.y; + } + x = isSafeNum(x) ? x : 0; + x2 = isSafeNum(x2) ? x2 : 1; + y = isSafeNum(y) ? y : 0; + y2 = isSafeNum(y2) ? y2 : 0; + var canvasGradient = ctx.createLinearGradient(x, y, x2, y2); + return canvasGradient; + } + function createRadialGradient(ctx, obj, rect) { + var width = rect.width; + var height = rect.height; + var min = Math.min(width, height); + var x = obj.x == null ? 0.5 : obj.x; + var y = obj.y == null ? 0.5 : obj.y; + var r = obj.r == null ? 0.5 : obj.r; + if (!obj.global) { + x = x * width + rect.x; + y = y * height + rect.y; + r = r * min; + } + x = isSafeNum(x) ? x : 0.5; + y = isSafeNum(y) ? y : 0.5; + r = r >= 0 && isSafeNum(r) ? r : 0.5; + var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r); + return canvasGradient; + } + function getCanvasGradient(ctx, obj, rect) { + var canvasGradient = obj.type === 'radial' + ? createRadialGradient(ctx, obj, rect) + : createLinearGradient(ctx, obj, rect); + var colorStops = obj.colorStops; + for (var i = 0; i < colorStops.length; i++) { + canvasGradient.addColorStop(colorStops[i].offset, colorStops[i].color); + } + return canvasGradient; + } + function isClipPathChanged(clipPaths, prevClipPaths) { + if (clipPaths === prevClipPaths || (!clipPaths && !prevClipPaths)) { + return false; + } + if (!clipPaths || !prevClipPaths || (clipPaths.length !== prevClipPaths.length)) { + return true; + } + for (var i = 0; i < clipPaths.length; i++) { + if (clipPaths[i] !== prevClipPaths[i]) { + return true; + } + } + return false; + } + function parseInt10(val) { + return parseInt(val, 10); + } + function getSize(root, whIdx, opts) { + var wh = ['width', 'height'][whIdx]; + var cwh = ['clientWidth', 'clientHeight'][whIdx]; + var plt = ['paddingLeft', 'paddingTop'][whIdx]; + var prb = ['paddingRight', 'paddingBottom'][whIdx]; + if (opts[wh] != null && opts[wh] !== 'auto') { + return parseFloat(opts[wh]); + } + var stl = document.defaultView.getComputedStyle(root); + return ((root[cwh] || parseInt10(stl[wh]) || parseInt10(root.style[wh])) + - (parseInt10(stl[plt]) || 0) + - (parseInt10(stl[prb]) || 0)) | 0; + } + + function normalizeLineDash(lineType, lineWidth) { + if (!lineType || lineType === 'solid' || !(lineWidth > 0)) { + return null; + } + return lineType === 'dashed' + ? [4 * lineWidth, 2 * lineWidth] + : lineType === 'dotted' + ? [lineWidth] + : isNumber(lineType) + ? [lineType] : isArray(lineType) ? lineType : null; + } + function getLineDash(el) { + var style = el.style; + var lineDash = style.lineDash && style.lineWidth > 0 && normalizeLineDash(style.lineDash, style.lineWidth); + var lineDashOffset = style.lineDashOffset; + if (lineDash) { + var lineScale_1 = (style.strokeNoScale && el.getLineScale) ? el.getLineScale() : 1; + if (lineScale_1 && lineScale_1 !== 1) { + lineDash = map(lineDash, function (rawVal) { + return rawVal / lineScale_1; + }); + lineDashOffset /= lineScale_1; + } + } + return [lineDash, lineDashOffset]; + } + + var pathProxyForDraw = new PathProxy(true); + function styleHasStroke(style) { + var stroke = style.stroke; + return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0)); + } + function isValidStrokeFillStyle(strokeOrFill) { + return typeof strokeOrFill === 'string' && strokeOrFill !== 'none'; + } + function styleHasFill(style) { + var fill = style.fill; + return fill != null && fill !== 'none'; + } + function doFillPath(ctx, style) { + if (style.fillOpacity != null && style.fillOpacity !== 1) { + var originalGlobalAlpha = ctx.globalAlpha; + ctx.globalAlpha = style.fillOpacity * style.opacity; + ctx.fill(); + ctx.globalAlpha = originalGlobalAlpha; + } + else { + ctx.fill(); + } + } + function doStrokePath(ctx, style) { + if (style.strokeOpacity != null && style.strokeOpacity !== 1) { + var originalGlobalAlpha = ctx.globalAlpha; + ctx.globalAlpha = style.strokeOpacity * style.opacity; + ctx.stroke(); + ctx.globalAlpha = originalGlobalAlpha; + } + else { + ctx.stroke(); + } + } + function createCanvasPattern(ctx, pattern, el) { + var image = createOrUpdateImage(pattern.image, pattern.__image, el); + if (isImageReady(image)) { + var canvasPattern = ctx.createPattern(image, pattern.repeat || 'repeat'); + if (typeof DOMMatrix === 'function' + && canvasPattern + && canvasPattern.setTransform) { + var matrix = new DOMMatrix(); + matrix.translateSelf((pattern.x || 0), (pattern.y || 0)); + matrix.rotateSelf(0, 0, (pattern.rotation || 0) * RADIAN_TO_DEGREE); + matrix.scaleSelf((pattern.scaleX || 1), (pattern.scaleY || 1)); + canvasPattern.setTransform(matrix); + } + return canvasPattern; + } + } + function brushPath(ctx, el, style, inBatch) { + var _a; + var hasStroke = styleHasStroke(style); + var hasFill = styleHasFill(style); + var strokePercent = style.strokePercent; + var strokePart = strokePercent < 1; + var firstDraw = !el.path; + if ((!el.silent || strokePart) && firstDraw) { + el.createPathProxy(); + } + var path = el.path || pathProxyForDraw; + var dirtyFlag = el.__dirty; + if (!inBatch) { + var fill = style.fill; + var stroke = style.stroke; + var hasFillGradient = hasFill && !!fill.colorStops; + var hasStrokeGradient = hasStroke && !!stroke.colorStops; + var hasFillPattern = hasFill && !!fill.image; + var hasStrokePattern = hasStroke && !!stroke.image; + var fillGradient = void 0; + var strokeGradient = void 0; + var fillPattern = void 0; + var strokePattern = void 0; + var rect = void 0; + if (hasFillGradient || hasStrokeGradient) { + rect = el.getBoundingRect(); + } + if (hasFillGradient) { + fillGradient = dirtyFlag + ? getCanvasGradient(ctx, fill, rect) + : el.__canvasFillGradient; + el.__canvasFillGradient = fillGradient; + } + if (hasStrokeGradient) { + strokeGradient = dirtyFlag + ? getCanvasGradient(ctx, stroke, rect) + : el.__canvasStrokeGradient; + el.__canvasStrokeGradient = strokeGradient; + } + if (hasFillPattern) { + fillPattern = (dirtyFlag || !el.__canvasFillPattern) + ? createCanvasPattern(ctx, fill, el) + : el.__canvasFillPattern; + el.__canvasFillPattern = fillPattern; + } + if (hasStrokePattern) { + strokePattern = (dirtyFlag || !el.__canvasStrokePattern) + ? createCanvasPattern(ctx, stroke, el) + : el.__canvasStrokePattern; + el.__canvasStrokePattern = fillPattern; + } + if (hasFillGradient) { + ctx.fillStyle = fillGradient; + } + else if (hasFillPattern) { + if (fillPattern) { + ctx.fillStyle = fillPattern; + } + else { + hasFill = false; + } + } + if (hasStrokeGradient) { + ctx.strokeStyle = strokeGradient; + } + else if (hasStrokePattern) { + if (strokePattern) { + ctx.strokeStyle = strokePattern; + } + else { + hasStroke = false; + } + } + } + var scale = el.getGlobalScale(); + path.setScale(scale[0], scale[1], el.segmentIgnoreThreshold); + var lineDash; + var lineDashOffset; + if (ctx.setLineDash && style.lineDash) { + _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1]; + } + var needsRebuild = true; + if (firstDraw || (dirtyFlag & SHAPE_CHANGED_BIT)) { + path.setDPR(ctx.dpr); + if (strokePart) { + path.setContext(null); + } + else { + path.setContext(ctx); + needsRebuild = false; + } + path.reset(); + el.buildPath(path, el.shape, inBatch); + path.toStatic(); + el.pathUpdated(); + } + if (needsRebuild) { + path.rebuildPath(ctx, strokePart ? strokePercent : 1); + } + if (lineDash) { + ctx.setLineDash(lineDash); + ctx.lineDashOffset = lineDashOffset; + } + if (!inBatch) { + if (style.strokeFirst) { + if (hasStroke) { + doStrokePath(ctx, style); + } + if (hasFill) { + doFillPath(ctx, style); + } + } + else { + if (hasFill) { + doFillPath(ctx, style); + } + if (hasStroke) { + doStrokePath(ctx, style); + } + } + } + if (lineDash) { + ctx.setLineDash([]); + } + } + function brushImage(ctx, el, style) { + var image = el.__image = createOrUpdateImage(style.image, el.__image, el, el.onload); + if (!image || !isImageReady(image)) { + return; + } + var x = style.x || 0; + var y = style.y || 0; + var width = el.getWidth(); + var height = el.getHeight(); + var aspect = image.width / image.height; + if (width == null && height != null) { + width = height * aspect; + } + else if (height == null && width != null) { + height = width / aspect; + } + else if (width == null && height == null) { + width = image.width; + height = image.height; + } + if (style.sWidth && style.sHeight) { + var sx = style.sx || 0; + var sy = style.sy || 0; + ctx.drawImage(image, sx, sy, style.sWidth, style.sHeight, x, y, width, height); + } + else if (style.sx && style.sy) { + var sx = style.sx; + var sy = style.sy; + var sWidth = width - sx; + var sHeight = height - sy; + ctx.drawImage(image, sx, sy, sWidth, sHeight, x, y, width, height); + } + else { + ctx.drawImage(image, x, y, width, height); + } + } + function brushText(ctx, el, style) { + var _a; + var text = style.text; + text != null && (text += ''); + if (text) { + ctx.font = style.font || DEFAULT_FONT; + ctx.textAlign = style.textAlign; + ctx.textBaseline = style.textBaseline; + var lineDash = void 0; + var lineDashOffset = void 0; + if (ctx.setLineDash && style.lineDash) { + _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1]; + } + if (lineDash) { + ctx.setLineDash(lineDash); + ctx.lineDashOffset = lineDashOffset; + } + if (style.strokeFirst) { + if (styleHasStroke(style)) { + ctx.strokeText(text, style.x, style.y); + } + if (styleHasFill(style)) { + ctx.fillText(text, style.x, style.y); + } + } + else { + if (styleHasFill(style)) { + ctx.fillText(text, style.x, style.y); + } + if (styleHasStroke(style)) { + ctx.strokeText(text, style.x, style.y); + } + } + if (lineDash) { + ctx.setLineDash([]); + } + } + } + var SHADOW_NUMBER_PROPS = ['shadowBlur', 'shadowOffsetX', 'shadowOffsetY']; + var STROKE_PROPS = [ + ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10] + ]; + function bindCommonProps(ctx, style, prevStyle, forceSetAll, scope) { + var styleChanged = false; + if (!forceSetAll) { + prevStyle = prevStyle || {}; + if (style === prevStyle) { + return false; + } + } + if (forceSetAll || style.opacity !== prevStyle.opacity) { + flushPathDrawn(ctx, scope); + styleChanged = true; + var opacity = Math.max(Math.min(style.opacity, 1), 0); + ctx.globalAlpha = isNaN(opacity) ? DEFAULT_COMMON_STYLE.opacity : opacity; + } + if (forceSetAll || style.blend !== prevStyle.blend) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.globalCompositeOperation = style.blend || DEFAULT_COMMON_STYLE.blend; + } + for (var i = 0; i < SHADOW_NUMBER_PROPS.length; i++) { + var propName = SHADOW_NUMBER_PROPS[i]; + if (forceSetAll || style[propName] !== prevStyle[propName]) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx[propName] = ctx.dpr * (style[propName] || 0); + } + } + if (forceSetAll || style.shadowColor !== prevStyle.shadowColor) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.shadowColor = style.shadowColor || DEFAULT_COMMON_STYLE.shadowColor; + } + return styleChanged; + } + function bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetAll, scope) { + var style = getStyle(el, scope.inHover); + var prevStyle = forceSetAll + ? null + : (prevEl && getStyle(prevEl, scope.inHover) || {}); + if (style === prevStyle) { + return false; + } + var styleChanged = bindCommonProps(ctx, style, prevStyle, forceSetAll, scope); + if (forceSetAll || style.fill !== prevStyle.fill) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + isValidStrokeFillStyle(style.fill) && (ctx.fillStyle = style.fill); + } + if (forceSetAll || style.stroke !== prevStyle.stroke) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + isValidStrokeFillStyle(style.stroke) && (ctx.strokeStyle = style.stroke); + } + if (forceSetAll || style.opacity !== prevStyle.opacity) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.globalAlpha = style.opacity == null ? 1 : style.opacity; + } + if (el.hasStroke()) { + var lineWidth = style.lineWidth; + var newLineWidth = lineWidth / ((style.strokeNoScale && el.getLineScale) ? el.getLineScale() : 1); + if (ctx.lineWidth !== newLineWidth) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.lineWidth = newLineWidth; + } + } + for (var i = 0; i < STROKE_PROPS.length; i++) { + var prop = STROKE_PROPS[i]; + var propName = prop[0]; + if (forceSetAll || style[propName] !== prevStyle[propName]) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx[propName] = style[propName] || prop[1]; + } + } + return styleChanged; + } + function bindImageStyle(ctx, el, prevEl, forceSetAll, scope) { + return bindCommonProps(ctx, getStyle(el, scope.inHover), prevEl && getStyle(prevEl, scope.inHover), forceSetAll, scope); + } + function setContextTransform(ctx, el) { + var m = el.transform; + var dpr = ctx.dpr || 1; + if (m) { + ctx.setTransform(dpr * m[0], dpr * m[1], dpr * m[2], dpr * m[3], dpr * m[4], dpr * m[5]); + } + else { + ctx.setTransform(dpr, 0, 0, dpr, 0, 0); + } + } + function updateClipStatus(clipPaths, ctx, scope) { + var allClipped = false; + for (var i = 0; i < clipPaths.length; i++) { + var clipPath = clipPaths[i]; + allClipped = allClipped || clipPath.isZeroArea(); + setContextTransform(ctx, clipPath); + ctx.beginPath(); + clipPath.buildPath(ctx, clipPath.shape); + ctx.clip(); + } + scope.allClipped = allClipped; + } + function isTransformChanged(m0, m1) { + if (m0 && m1) { + return m0[0] !== m1[0] + || m0[1] !== m1[1] + || m0[2] !== m1[2] + || m0[3] !== m1[3] + || m0[4] !== m1[4] + || m0[5] !== m1[5]; + } + else if (!m0 && !m1) { + return false; + } + return true; + } + var DRAW_TYPE_PATH = 1; + var DRAW_TYPE_IMAGE = 2; + var DRAW_TYPE_TEXT = 3; + var DRAW_TYPE_INCREMENTAL = 4; + function canPathBatch(style) { + var hasFill = styleHasFill(style); + var hasStroke = styleHasStroke(style); + return !(style.lineDash + || !(+hasFill ^ +hasStroke) + || (hasFill && typeof style.fill !== 'string') + || (hasStroke && typeof style.stroke !== 'string') + || style.strokePercent < 1 + || style.strokeOpacity < 1 + || style.fillOpacity < 1); + } + function flushPathDrawn(ctx, scope) { + scope.batchFill && ctx.fill(); + scope.batchStroke && ctx.stroke(); + scope.batchFill = ''; + scope.batchStroke = ''; + } + function getStyle(el, inHover) { + return inHover ? (el.__hoverStyle || el.style) : el.style; + } + function brushSingle(ctx, el) { + brush(ctx, el, { inHover: false, viewWidth: 0, viewHeight: 0 }, true); + } + function brush(ctx, el, scope, isLast) { + var m = el.transform; + if (!el.shouldBePainted(scope.viewWidth, scope.viewHeight, false, false)) { + el.__dirty &= ~REDRAW_BIT; + el.__isRendered = false; + return; + } + var clipPaths = el.__clipPaths; + var prevElClipPaths = scope.prevElClipPaths; + var forceSetTransform = false; + var forceSetStyle = false; + if (!prevElClipPaths || isClipPathChanged(clipPaths, prevElClipPaths)) { + if (prevElClipPaths && prevElClipPaths.length) { + flushPathDrawn(ctx, scope); + ctx.restore(); + forceSetStyle = forceSetTransform = true; + scope.prevElClipPaths = null; + scope.allClipped = false; + scope.prevEl = null; + } + if (clipPaths && clipPaths.length) { + flushPathDrawn(ctx, scope); + ctx.save(); + updateClipStatus(clipPaths, ctx, scope); + forceSetTransform = true; + } + scope.prevElClipPaths = clipPaths; + } + if (scope.allClipped) { + el.__isRendered = false; + return; + } + el.beforeBrush && el.beforeBrush(); + el.innerBeforeBrush(); + var prevEl = scope.prevEl; + if (!prevEl) { + forceSetStyle = forceSetTransform = true; + } + var canBatchPath = el instanceof Path + && el.autoBatch + && canPathBatch(el.style); + if (forceSetTransform || isTransformChanged(m, prevEl.transform)) { + flushPathDrawn(ctx, scope); + setContextTransform(ctx, el); + } + else if (!canBatchPath) { + flushPathDrawn(ctx, scope); + } + var style = getStyle(el, scope.inHover); + if (el instanceof Path) { + if (scope.lastDrawType !== DRAW_TYPE_PATH) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_PATH; + } + bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetStyle, scope); + if (!canBatchPath || (!scope.batchFill && !scope.batchStroke)) { + ctx.beginPath(); + } + brushPath(ctx, el, style, canBatchPath); + if (canBatchPath) { + scope.batchFill = style.fill || ''; + scope.batchStroke = style.stroke || ''; + } + } + else { + if (el instanceof TSpan) { + if (scope.lastDrawType !== DRAW_TYPE_TEXT) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_TEXT; + } + bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetStyle, scope); + brushText(ctx, el, style); + } + else if (el instanceof ZRImage) { + if (scope.lastDrawType !== DRAW_TYPE_IMAGE) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_IMAGE; + } + bindImageStyle(ctx, el, prevEl, forceSetStyle, scope); + brushImage(ctx, el, style); + } + else if (el.getTemporalDisplayables) { + if (scope.lastDrawType !== DRAW_TYPE_INCREMENTAL) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_INCREMENTAL; + } + brushIncremental(ctx, el, scope); + } + } + if (canBatchPath && isLast) { + flushPathDrawn(ctx, scope); + } + el.innerAfterBrush(); + el.afterBrush && el.afterBrush(); + scope.prevEl = el; + el.__dirty = 0; + el.__isRendered = true; + } + function brushIncremental(ctx, el, scope) { + var displayables = el.getDisplayables(); + var temporalDisplayables = el.getTemporalDisplayables(); + ctx.save(); + var innerScope = { + prevElClipPaths: null, + prevEl: null, + allClipped: false, + viewWidth: scope.viewWidth, + viewHeight: scope.viewHeight, + inHover: scope.inHover + }; + var i; + var len; + for (i = el.getCursor(), len = displayables.length; i < len; i++) { + var displayable = displayables[i]; + displayable.beforeBrush && displayable.beforeBrush(); + displayable.innerBeforeBrush(); + brush(ctx, displayable, innerScope, i === len - 1); + displayable.innerAfterBrush(); + displayable.afterBrush && displayable.afterBrush(); + innerScope.prevEl = displayable; + } + for (var i_1 = 0, len_1 = temporalDisplayables.length; i_1 < len_1; i_1++) { + var displayable = temporalDisplayables[i_1]; + displayable.beforeBrush && displayable.beforeBrush(); + displayable.innerBeforeBrush(); + brush(ctx, displayable, innerScope, i_1 === len_1 - 1); + displayable.innerAfterBrush(); + displayable.afterBrush && displayable.afterBrush(); + innerScope.prevEl = displayable; + } + el.clearTemporalDisplayables(); + el.notClear = true; + ctx.restore(); + } + + var decalMap = new WeakMap(); + var decalCache = new LRU(100); + var decalKeys = ['symbol', 'symbolSize', 'symbolKeepAspect', 'color', 'backgroundColor', 'dashArrayX', 'dashArrayY', 'maxTileWidth', 'maxTileHeight']; + /** + * Create or update pattern image from decal options + * + * @param {InnerDecalObject | 'none'} decalObject decal options, 'none' if no decal + * @return {Pattern} pattern with generated image, null if no decal + */ + + function createOrUpdatePatternFromDecal(decalObject, api) { + if (decalObject === 'none') { + return null; + } + + var dpr = api.getDevicePixelRatio(); + var zr = api.getZr(); + var isSVG = zr.painter.type === 'svg'; + + if (decalObject.dirty) { + decalMap["delete"](decalObject); + } + + var oldPattern = decalMap.get(decalObject); + + if (oldPattern) { + return oldPattern; + } + + var decalOpt = defaults(decalObject, { + symbol: 'rect', + symbolSize: 1, + symbolKeepAspect: true, + color: 'rgba(0, 0, 0, 0.2)', + backgroundColor: null, + dashArrayX: 5, + dashArrayY: 5, + rotation: 0, + maxTileWidth: 512, + maxTileHeight: 512 + }); + + if (decalOpt.backgroundColor === 'none') { + decalOpt.backgroundColor = null; + } + + var pattern = { + repeat: 'repeat' + }; + setPatternnSource(pattern); + pattern.rotation = decalOpt.rotation; + pattern.scaleX = pattern.scaleY = isSVG ? 1 : 1 / dpr; + decalMap.set(decalObject, pattern); + decalObject.dirty = false; + return pattern; + + function setPatternnSource(pattern) { + var keys = [dpr]; + var isValidKey = true; + + for (var i = 0; i < decalKeys.length; ++i) { + var value = decalOpt[decalKeys[i]]; + + if (value != null && !isArray(value) && !isString(value) && !isNumber(value) && typeof value !== 'boolean') { + isValidKey = false; + break; + } + + keys.push(value); + } + + var cacheKey; + + if (isValidKey) { + cacheKey = keys.join(',') + (isSVG ? '-svg' : ''); + var cache = decalCache.get(cacheKey); + + if (cache) { + isSVG ? pattern.svgElement = cache : pattern.image = cache; + } + } + + var dashArrayX = normalizeDashArrayX(decalOpt.dashArrayX); + var dashArrayY = normalizeDashArrayY(decalOpt.dashArrayY); + var symbolArray = normalizeSymbolArray(decalOpt.symbol); + var lineBlockLengthsX = getLineBlockLengthX(dashArrayX); + var lineBlockLengthY = getLineBlockLengthY(dashArrayY); + var canvas = !isSVG && platformApi.createCanvas(); + var svgRoot = isSVG && { + tag: 'g', + attrs: {}, + key: 'dcl', + children: [] + }; + var pSize = getPatternSize(); + var ctx; + + if (canvas) { + canvas.width = pSize.width * dpr; + canvas.height = pSize.height * dpr; + ctx = canvas.getContext('2d'); + } + + brushDecal(); + + if (isValidKey) { + decalCache.put(cacheKey, canvas || svgRoot); + } + + pattern.image = canvas; + pattern.svgElement = svgRoot; + pattern.svgWidth = pSize.width; + pattern.svgHeight = pSize.height; + /** + * Get minumum length that can make a repeatable pattern. + * + * @return {Object} pattern width and height + */ + + function getPatternSize() { + /** + * For example, if dash is [[3, 2], [2, 1]] for X, it looks like + * |--- --- --- --- --- ... + * |-- -- -- -- -- -- -- -- ... + * |--- --- --- --- --- ... + * |-- -- -- -- -- -- -- -- ... + * So the minumum length of X is 15, + * which is the least common multiple of `3 + 2` and `2 + 1` + * |--- --- --- |--- --- ... + * |-- -- -- -- -- |-- -- -- ... + */ + var width = 1; + + for (var i = 0, xlen = lineBlockLengthsX.length; i < xlen; ++i) { + width = getLeastCommonMultiple(width, lineBlockLengthsX[i]); + } + + var symbolRepeats = 1; + + for (var i = 0, xlen = symbolArray.length; i < xlen; ++i) { + symbolRepeats = getLeastCommonMultiple(symbolRepeats, symbolArray[i].length); + } + + width *= symbolRepeats; + var height = lineBlockLengthY * lineBlockLengthsX.length * symbolArray.length; + + if ("development" !== 'production') { + var warn = function (attrName) { + /* eslint-disable-next-line */ + console.warn("Calculated decal size is greater than " + attrName + " due to decal option settings so " + attrName + " is used for the decal size. Please consider changing the decal option to make a smaller decal or set " + attrName + " to be larger to avoid incontinuity."); + }; + + if (width > decalOpt.maxTileWidth) { + warn('maxTileWidth'); + } + + if (height > decalOpt.maxTileHeight) { + warn('maxTileHeight'); + } + } + + return { + width: Math.max(1, Math.min(width, decalOpt.maxTileWidth)), + height: Math.max(1, Math.min(height, decalOpt.maxTileHeight)) + }; + } + + function brushDecal() { + if (ctx) { + ctx.clearRect(0, 0, canvas.width, canvas.height); + + if (decalOpt.backgroundColor) { + ctx.fillStyle = decalOpt.backgroundColor; + ctx.fillRect(0, 0, canvas.width, canvas.height); + } + } + + var ySum = 0; + + for (var i = 0; i < dashArrayY.length; ++i) { + ySum += dashArrayY[i]; + } + + if (ySum <= 0) { + // dashArrayY is 0, draw nothing + return; + } + + var y = -lineBlockLengthY; + var yId = 0; + var yIdTotal = 0; + var xId0 = 0; + + while (y < pSize.height) { + if (yId % 2 === 0) { + var symbolYId = yIdTotal / 2 % symbolArray.length; + var x = 0; + var xId1 = 0; + var xId1Total = 0; + + while (x < pSize.width * 2) { + var xSum = 0; + + for (var i = 0; i < dashArrayX[xId0].length; ++i) { + xSum += dashArrayX[xId0][i]; + } + + if (xSum <= 0) { + // Skip empty line + break; + } // E.g., [15, 5, 20, 5] draws only for 15 and 20 + + + if (xId1 % 2 === 0) { + var size = (1 - decalOpt.symbolSize) * 0.5; + var left = x + dashArrayX[xId0][xId1] * size; + var top_1 = y + dashArrayY[yId] * size; + var width = dashArrayX[xId0][xId1] * decalOpt.symbolSize; + var height = dashArrayY[yId] * decalOpt.symbolSize; + var symbolXId = xId1Total / 2 % symbolArray[symbolYId].length; + brushSymbol(left, top_1, width, height, symbolArray[symbolYId][symbolXId]); + } + + x += dashArrayX[xId0][xId1]; + ++xId1Total; + ++xId1; + + if (xId1 === dashArrayX[xId0].length) { + xId1 = 0; + } + } + + ++xId0; + + if (xId0 === dashArrayX.length) { + xId0 = 0; + } + } + + y += dashArrayY[yId]; + ++yIdTotal; + ++yId; + + if (yId === dashArrayY.length) { + yId = 0; + } + } + + function brushSymbol(x, y, width, height, symbolType) { + var scale = isSVG ? 1 : dpr; + var symbol = createSymbol(symbolType, x * scale, y * scale, width * scale, height * scale, decalOpt.color, decalOpt.symbolKeepAspect); + + if (isSVG) { + var symbolVNode = zr.painter.renderOneToVNode(symbol); + + if (symbolVNode) { + svgRoot.children.push(symbolVNode); + } + } else { + // Paint to canvas for all other renderers. + brushSingle(ctx, symbol); + } + } + } + } + } + /** + * Convert symbol array into normalized array + * + * @param {string | (string | string[])[]} symbol symbol input + * @return {string[][]} normolized symbol array + */ + + function normalizeSymbolArray(symbol) { + if (!symbol || symbol.length === 0) { + return [['rect']]; + } + + if (isString(symbol)) { + return [[symbol]]; + } + + var isAllString = true; + + for (var i = 0; i < symbol.length; ++i) { + if (!isString(symbol[i])) { + isAllString = false; + break; + } + } + + if (isAllString) { + return normalizeSymbolArray([symbol]); + } + + var result = []; + + for (var i = 0; i < symbol.length; ++i) { + if (isString(symbol[i])) { + result.push([symbol[i]]); + } else { + result.push(symbol[i]); + } + } + + return result; + } + /** + * Convert dash input into dashArray + * + * @param {DecalDashArrayX} dash dash input + * @return {number[][]} normolized dash array + */ + + + function normalizeDashArrayX(dash) { + if (!dash || dash.length === 0) { + return [[0, 0]]; + } + + if (isNumber(dash)) { + var dashValue = Math.ceil(dash); + return [[dashValue, dashValue]]; + } + /** + * [20, 5] should be normalized into [[20, 5]], + * while [20, [5, 10]] should be normalized into [[20, 20], [5, 10]] + */ + + + var isAllNumber = true; + + for (var i = 0; i < dash.length; ++i) { + if (!isNumber(dash[i])) { + isAllNumber = false; + break; + } + } + + if (isAllNumber) { + return normalizeDashArrayX([dash]); + } + + var result = []; + + for (var i = 0; i < dash.length; ++i) { + if (isNumber(dash[i])) { + var dashValue = Math.ceil(dash[i]); + result.push([dashValue, dashValue]); + } else { + var dashValue = map(dash[i], function (n) { + return Math.ceil(n); + }); + + if (dashValue.length % 2 === 1) { + // [4, 2, 1] means |---- - -- |---- - -- | + // so normalize it to be [4, 2, 1, 4, 2, 1] + result.push(dashValue.concat(dashValue)); + } else { + result.push(dashValue); + } + } + } + + return result; + } + /** + * Convert dash input into dashArray + * + * @param {DecalDashArrayY} dash dash input + * @return {number[]} normolized dash array + */ + + + function normalizeDashArrayY(dash) { + if (!dash || typeof dash === 'object' && dash.length === 0) { + return [0, 0]; + } + + if (isNumber(dash)) { + var dashValue_1 = Math.ceil(dash); + return [dashValue_1, dashValue_1]; + } + + var dashValue = map(dash, function (n) { + return Math.ceil(n); + }); + return dash.length % 2 ? dashValue.concat(dashValue) : dashValue; + } + /** + * Get block length of each line. A block is the length of dash line and space. + * For example, a line with [4, 1] has a dash line of 4 and a space of 1 after + * that, so the block length of this line is 5. + * + * @param {number[][]} dash dash arrary of X or Y + * @return {number[]} block length of each line + */ + + + function getLineBlockLengthX(dash) { + return map(dash, function (line) { + return getLineBlockLengthY(line); + }); + } + + function getLineBlockLengthY(dash) { + var blockLength = 0; + + for (var i = 0; i < dash.length; ++i) { + blockLength += dash[i]; + } + + if (dash.length % 2 === 1) { + // [4, 2, 1] means |---- - -- |---- - -- | + // So total length is (4 + 2 + 1) * 2 + return blockLength * 2; + } + + return blockLength; + } + + function decalVisual(ecModel, api) { + ecModel.eachRawSeries(function (seriesModel) { + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var data = seriesModel.getData(); + + if (data.hasItemVisual()) { + data.each(function (idx) { + var decal = data.getItemVisual(idx, 'decal'); + + if (decal) { + var itemStyle = data.ensureUniqueItemVisual(idx, 'style'); + itemStyle.decal = createOrUpdatePatternFromDecal(decal, api); + } + }); + } + + var decal = data.getVisual('decal'); + + if (decal) { + var style = data.getVisual('style'); + style.decal = createOrUpdatePatternFromDecal(decal, api); + } + }); + } + + var lifecycle = new Eventful(); + + // The implentations will be registered when installing the component. + // Avoid these code being bundled to the core module. + + var implsStore = {}; // TODO Type + + function registerImpl(name, impl) { + if ("development" !== 'production') { + if (implsStore[name]) { + error("Already has an implementation of " + name + "."); + } + } + + implsStore[name] = impl; + } + function getImpl(name) { + if ("development" !== 'production') { + if (!implsStore[name]) { + error("Implementation of " + name + " doesn't exists."); + } + } + + return implsStore[name]; + } + + var hasWindow = typeof window !== 'undefined'; + var version$1 = '5.3.3'; + var dependencies = { + zrender: '5.3.2' + }; + var TEST_FRAME_REMAIN_TIME = 1; + var PRIORITY_PROCESSOR_SERIES_FILTER = 800; // Some data processors depends on the stack result dimension (to calculate data extent). + // So data stack stage should be in front of data processing stage. + + var PRIORITY_PROCESSOR_DATASTACK = 900; // "Data filter" will block the stream, so it should be + // put at the begining of data processing. + + var PRIORITY_PROCESSOR_FILTER = 1000; + var PRIORITY_PROCESSOR_DEFAULT = 2000; + var PRIORITY_PROCESSOR_STATISTIC = 5000; + var PRIORITY_VISUAL_LAYOUT = 1000; + var PRIORITY_VISUAL_PROGRESSIVE_LAYOUT = 1100; + var PRIORITY_VISUAL_GLOBAL = 2000; + var PRIORITY_VISUAL_CHART = 3000; + var PRIORITY_VISUAL_COMPONENT = 4000; // Visual property in data. Greater than `PRIORITY_VISUAL_COMPONENT` to enable to + // overwrite the viusal result of component (like `visualMap`) + // using data item specific setting (like itemStyle.xxx on data item) + + var PRIORITY_VISUAL_CHART_DATA_CUSTOM = 4500; // Greater than `PRIORITY_VISUAL_CHART_DATA_CUSTOM` to enable to layout based on + // visual result like `symbolSize`. + + var PRIORITY_VISUAL_POST_CHART_LAYOUT = 4600; + var PRIORITY_VISUAL_BRUSH = 5000; + var PRIORITY_VISUAL_ARIA = 6000; + var PRIORITY_VISUAL_DECAL = 7000; + var PRIORITY = { + PROCESSOR: { + FILTER: PRIORITY_PROCESSOR_FILTER, + SERIES_FILTER: PRIORITY_PROCESSOR_SERIES_FILTER, + STATISTIC: PRIORITY_PROCESSOR_STATISTIC + }, + VISUAL: { + LAYOUT: PRIORITY_VISUAL_LAYOUT, + PROGRESSIVE_LAYOUT: PRIORITY_VISUAL_PROGRESSIVE_LAYOUT, + GLOBAL: PRIORITY_VISUAL_GLOBAL, + CHART: PRIORITY_VISUAL_CHART, + POST_CHART_LAYOUT: PRIORITY_VISUAL_POST_CHART_LAYOUT, + COMPONENT: PRIORITY_VISUAL_COMPONENT, + BRUSH: PRIORITY_VISUAL_BRUSH, + CHART_ITEM: PRIORITY_VISUAL_CHART_DATA_CUSTOM, + ARIA: PRIORITY_VISUAL_ARIA, + DECAL: PRIORITY_VISUAL_DECAL + } + }; // Main process have three entries: `setOption`, `dispatchAction` and `resize`, + // where they must not be invoked nestedly, except the only case: invoke + // dispatchAction with updateMethod "none" in main process. + // This flag is used to carry out this rule. + // All events will be triggered out side main process (i.e. when !this[IN_MAIN_PROCESS]). + + var IN_MAIN_PROCESS_KEY = '__flagInMainProcess'; + var PENDING_UPDATE = '__pendingUpdate'; + var STATUS_NEEDS_UPDATE_KEY = '__needsUpdateStatus'; + var ACTION_REG = /^[a-zA-Z0-9_]+$/; + var CONNECT_STATUS_KEY = '__connectUpdateStatus'; + var CONNECT_STATUS_PENDING = 0; + var CONNECT_STATUS_UPDATING = 1; + var CONNECT_STATUS_UPDATED = 2; + + function createRegisterEventWithLowercaseECharts(method) { + return function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + if (this.isDisposed()) { + disposedWarning(this.id); + return; + } + + return toLowercaseNameAndCallEventful(this, method, args); + }; + } + + function createRegisterEventWithLowercaseMessageCenter(method) { + return function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + return toLowercaseNameAndCallEventful(this, method, args); + }; + } + + function toLowercaseNameAndCallEventful(host, method, args) { + // `args[0]` is event name. Event name is all lowercase. + args[0] = args[0] && args[0].toLowerCase(); + return Eventful.prototype[method].apply(host, args); + } + + var MessageCenter = + /** @class */ + function (_super) { + __extends(MessageCenter, _super); + + function MessageCenter() { + return _super !== null && _super.apply(this, arguments) || this; + } + + return MessageCenter; + }(Eventful); + + var messageCenterProto = MessageCenter.prototype; + messageCenterProto.on = createRegisterEventWithLowercaseMessageCenter('on'); + messageCenterProto.off = createRegisterEventWithLowercaseMessageCenter('off'); // --------------------------------------- + // Internal method names for class ECharts + // --------------------------------------- + + var prepare; + var prepareView; + var updateDirectly; + var updateMethods; + var doConvertPixel; + var updateStreamModes; + var doDispatchAction; + var flushPendingActions; + var triggerUpdatedEvent; + var bindRenderedEvent; + var bindMouseEvent; + var render; + var renderComponents; + var renderSeries; + var createExtensionAPI; + var enableConnect; + var markStatusToUpdate; + var applyChangedStates; + + var ECharts = + /** @class */ + function (_super) { + __extends(ECharts, _super); + + function ECharts(dom, // Theme name or themeOption. + theme, opts) { + var _this = _super.call(this, new ECEventProcessor()) || this; + + _this._chartsViews = []; + _this._chartsMap = {}; + _this._componentsViews = []; + _this._componentsMap = {}; // Can't dispatch action during rendering procedure + + _this._pendingActions = []; + opts = opts || {}; // Get theme by name + + if (isString(theme)) { + theme = themeStorage[theme]; + } + + _this._dom = dom; + var defaultRenderer = 'canvas'; + var defaultUseDirtyRect = false; + + if ("development" !== 'production') { + var root = + /* eslint-disable-next-line */ + hasWindow ? window : global; + defaultRenderer = root.__ECHARTS__DEFAULT__RENDERER__ || defaultRenderer; + var devUseDirtyRect = root.__ECHARTS__DEFAULT__USE_DIRTY_RECT__; + defaultUseDirtyRect = devUseDirtyRect == null ? defaultUseDirtyRect : devUseDirtyRect; + } + + var zr = _this._zr = init(dom, { + renderer: opts.renderer || defaultRenderer, + devicePixelRatio: opts.devicePixelRatio, + width: opts.width, + height: opts.height, + ssr: opts.ssr, + useDirtyRect: opts.useDirtyRect == null ? defaultUseDirtyRect : opts.useDirtyRect + }); + _this._ssr = opts.ssr; // Expect 60 fps. + + _this._throttledZrFlush = throttle(bind(zr.flush, zr), 17); + theme = clone(theme); + theme && globalBackwardCompat(theme, true); + _this._theme = theme; + _this._locale = createLocaleObject(opts.locale || SYSTEM_LANG); + _this._coordSysMgr = new CoordinateSystemManager(); + var api = _this._api = createExtensionAPI(_this); // Sort on demand + + function prioritySortFunc(a, b) { + return a.__prio - b.__prio; + } + + sort(visualFuncs, prioritySortFunc); + sort(dataProcessorFuncs, prioritySortFunc); + _this._scheduler = new Scheduler(_this, api, dataProcessorFuncs, visualFuncs); + _this._messageCenter = new MessageCenter(); // Init mouse events + + _this._initEvents(); // In case some people write `window.onresize = chart.resize` + + + _this.resize = bind(_this.resize, _this); + zr.animation.on('frame', _this._onframe, _this); + bindRenderedEvent(zr, _this); + bindMouseEvent(zr, _this); // ECharts instance can be used as value. + + setAsPrimitive(_this); + return _this; + } + + ECharts.prototype._onframe = function () { + if (this._disposed) { + return; + } + + applyChangedStates(this); + var scheduler = this._scheduler; // Lazy update + + if (this[PENDING_UPDATE]) { + var silent = this[PENDING_UPDATE].silent; + this[IN_MAIN_PROCESS_KEY] = true; + + try { + prepare(this); + updateMethods.update.call(this, null, this[PENDING_UPDATE].updateParams); + } catch (e) { + this[IN_MAIN_PROCESS_KEY] = false; + this[PENDING_UPDATE] = null; + throw e; + } // At present, in each frame, zrender performs: + // (1) animation step forward. + // (2) trigger('frame') (where this `_onframe` is called) + // (3) zrender flush (render). + // If we do nothing here, since we use `setToFinal: true`, the step (3) above + // will render the final state of the elements before the real animation started. + + + this._zr.flush(); + + this[IN_MAIN_PROCESS_KEY] = false; + this[PENDING_UPDATE] = null; + flushPendingActions.call(this, silent); + triggerUpdatedEvent.call(this, silent); + } // Avoid do both lazy update and progress in one frame. + else if (scheduler.unfinished) { + // Stream progress. + var remainTime = TEST_FRAME_REMAIN_TIME; + var ecModel = this._model; + var api = this._api; + scheduler.unfinished = false; + + do { + var startTime = +new Date(); + scheduler.performSeriesTasks(ecModel); // Currently dataProcessorFuncs do not check threshold. + + scheduler.performDataProcessorTasks(ecModel); + updateStreamModes(this, ecModel); // Do not update coordinate system here. Because that coord system update in + // each frame is not a good user experience. So we follow the rule that + // the extent of the coordinate system is determin in the first frame (the + // frame is executed immedietely after task reset. + // this._coordSysMgr.update(ecModel, api); + // console.log('--- ec frame visual ---', remainTime); + + scheduler.performVisualTasks(ecModel); + renderSeries(this, this._model, api, 'remain', {}); + remainTime -= +new Date() - startTime; + } while (remainTime > 0 && scheduler.unfinished); // Call flush explicitly for trigger finished event. + + + if (!scheduler.unfinished) { + this._zr.flush(); + } // Else, zr flushing be ensue within the same frame, + // because zr flushing is after onframe event. + + } + }; + + ECharts.prototype.getDom = function () { + return this._dom; + }; + + ECharts.prototype.getId = function () { + return this.id; + }; + + ECharts.prototype.getZr = function () { + return this._zr; + }; + + ECharts.prototype.isSSR = function () { + return this._ssr; + }; + /* eslint-disable-next-line */ + + + ECharts.prototype.setOption = function (option, notMerge, lazyUpdate) { + if (this[IN_MAIN_PROCESS_KEY]) { + if ("development" !== 'production') { + error('`setOption` should not be called during main process.'); + } + + return; + } + + if (this._disposed) { + disposedWarning(this.id); + return; + } + + var silent; + var replaceMerge; + var transitionOpt; + + if (isObject(notMerge)) { + lazyUpdate = notMerge.lazyUpdate; + silent = notMerge.silent; + replaceMerge = notMerge.replaceMerge; + transitionOpt = notMerge.transition; + notMerge = notMerge.notMerge; + } + + this[IN_MAIN_PROCESS_KEY] = true; + + if (!this._model || notMerge) { + var optionManager = new OptionManager(this._api); + var theme = this._theme; + var ecModel = this._model = new GlobalModel(); + ecModel.scheduler = this._scheduler; + ecModel.ssr = this._ssr; + ecModel.init(null, null, null, theme, this._locale, optionManager); + } + + this._model.setOption(option, { + replaceMerge: replaceMerge + }, optionPreprocessorFuncs); + + var updateParams = { + seriesTransition: transitionOpt, + optionChanged: true + }; + + if (lazyUpdate) { + this[PENDING_UPDATE] = { + silent: silent, + updateParams: updateParams + }; + this[IN_MAIN_PROCESS_KEY] = false; // `setOption(option, {lazyMode: true})` may be called when zrender has been slept. + // It should wake it up to make sure zrender start to render at the next frame. + + this.getZr().wakeUp(); + } else { + try { + prepare(this); + updateMethods.update.call(this, null, updateParams); + } catch (e) { + this[PENDING_UPDATE] = null; + this[IN_MAIN_PROCESS_KEY] = false; + throw e; + } // Ensure zr refresh sychronously, and then pixel in canvas can be + // fetched after `setOption`. + + + if (!this._ssr) { + // not use flush when using ssr mode. + this._zr.flush(); + } + + this[PENDING_UPDATE] = null; + this[IN_MAIN_PROCESS_KEY] = false; + flushPendingActions.call(this, silent); + triggerUpdatedEvent.call(this, silent); + } + }; + /** + * @deprecated + */ + + + ECharts.prototype.setTheme = function () { + deprecateLog('ECharts#setTheme() is DEPRECATED in ECharts 3.0'); + }; // We don't want developers to use getModel directly. + + + ECharts.prototype.getModel = function () { + return this._model; + }; + + ECharts.prototype.getOption = function () { + return this._model && this._model.getOption(); + }; + + ECharts.prototype.getWidth = function () { + return this._zr.getWidth(); + }; + + ECharts.prototype.getHeight = function () { + return this._zr.getHeight(); + }; + + ECharts.prototype.getDevicePixelRatio = function () { + return this._zr.painter.dpr + /* eslint-disable-next-line */ + || hasWindow && window.devicePixelRatio || 1; + }; + /** + * Get canvas which has all thing rendered + * @deprecated Use renderToCanvas instead. + */ + + + ECharts.prototype.getRenderedCanvas = function (opts) { + if ("development" !== 'production') { + deprecateReplaceLog('getRenderedCanvas', 'renderToCanvas'); + } + + return this.renderToCanvas(opts); + }; + + ECharts.prototype.renderToCanvas = function (opts) { + opts = opts || {}; + var painter = this._zr.painter; + + if ("development" !== 'production') { + if (painter.type !== 'canvas') { + throw new Error('renderToCanvas can only be used in the canvas renderer.'); + } + } + + return painter.getRenderedCanvas({ + backgroundColor: opts.backgroundColor || this._model.get('backgroundColor'), + pixelRatio: opts.pixelRatio || this.getDevicePixelRatio() + }); + }; + + ECharts.prototype.renderToSVGString = function (opts) { + opts = opts || {}; + var painter = this._zr.painter; + + if ("development" !== 'production') { + if (painter.type !== 'svg') { + throw new Error('renderToSVGString can only be used in the svg renderer.'); + } + } + + return painter.renderToString({ + useViewBox: opts.useViewBox + }); + }; + /** + * Get svg data url + */ + + + ECharts.prototype.getSvgDataURL = function () { + if (!env.svgSupported) { + return; + } + + var zr = this._zr; + var list = zr.storage.getDisplayList(); // Stop animations + + each(list, function (el) { + el.stopAnimation(null, true); + }); + return zr.painter.toDataURL(); + }; + + ECharts.prototype.getDataURL = function (opts) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + opts = opts || {}; + var excludeComponents = opts.excludeComponents; + var ecModel = this._model; + var excludesComponentViews = []; + var self = this; + each(excludeComponents, function (componentType) { + ecModel.eachComponent({ + mainType: componentType + }, function (component) { + var view = self._componentsMap[component.__viewId]; + + if (!view.group.ignore) { + excludesComponentViews.push(view); + view.group.ignore = true; + } + }); + }); + var url = this._zr.painter.getType() === 'svg' ? this.getSvgDataURL() : this.renderToCanvas(opts).toDataURL('image/' + (opts && opts.type || 'png')); + each(excludesComponentViews, function (view) { + view.group.ignore = false; + }); + return url; + }; + + ECharts.prototype.getConnectedDataURL = function (opts) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + var isSvg = opts.type === 'svg'; + var groupId = this.group; + var mathMin = Math.min; + var mathMax = Math.max; + var MAX_NUMBER = Infinity; + + if (connectedGroups[groupId]) { + var left_1 = MAX_NUMBER; + var top_1 = MAX_NUMBER; + var right_1 = -MAX_NUMBER; + var bottom_1 = -MAX_NUMBER; + var canvasList_1 = []; + var dpr_1 = opts && opts.pixelRatio || this.getDevicePixelRatio(); + each(instances$1, function (chart, id) { + if (chart.group === groupId) { + var canvas = isSvg ? chart.getZr().painter.getSvgDom().innerHTML : chart.renderToCanvas(clone(opts)); + var boundingRect = chart.getDom().getBoundingClientRect(); + left_1 = mathMin(boundingRect.left, left_1); + top_1 = mathMin(boundingRect.top, top_1); + right_1 = mathMax(boundingRect.right, right_1); + bottom_1 = mathMax(boundingRect.bottom, bottom_1); + canvasList_1.push({ + dom: canvas, + left: boundingRect.left, + top: boundingRect.top + }); + } + }); + left_1 *= dpr_1; + top_1 *= dpr_1; + right_1 *= dpr_1; + bottom_1 *= dpr_1; + var width = right_1 - left_1; + var height = bottom_1 - top_1; + var targetCanvas = platformApi.createCanvas(); + var zr_1 = init(targetCanvas, { + renderer: isSvg ? 'svg' : 'canvas' + }); + zr_1.resize({ + width: width, + height: height + }); + + if (isSvg) { + var content_1 = ''; + each(canvasList_1, function (item) { + var x = item.left - left_1; + var y = item.top - top_1; + content_1 += '<g transform="translate(' + x + ',' + y + ')">' + item.dom + '</g>'; + }); + zr_1.painter.getSvgRoot().innerHTML = content_1; + + if (opts.connectedBackgroundColor) { + zr_1.painter.setBackgroundColor(opts.connectedBackgroundColor); + } + + zr_1.refreshImmediately(); + return zr_1.painter.toDataURL(); + } else { + // Background between the charts + if (opts.connectedBackgroundColor) { + zr_1.add(new Rect({ + shape: { + x: 0, + y: 0, + width: width, + height: height + }, + style: { + fill: opts.connectedBackgroundColor + } + })); + } + + each(canvasList_1, function (item) { + var img = new ZRImage({ + style: { + x: item.left * dpr_1 - left_1, + y: item.top * dpr_1 - top_1, + image: item.dom + } + }); + zr_1.add(img); + }); + zr_1.refreshImmediately(); + return targetCanvas.toDataURL('image/' + (opts && opts.type || 'png')); + } + } else { + return this.getDataURL(opts); + } + }; + + ECharts.prototype.convertToPixel = function (finder, value) { + return doConvertPixel(this, 'convertToPixel', finder, value); + }; + + ECharts.prototype.convertFromPixel = function (finder, value) { + return doConvertPixel(this, 'convertFromPixel', finder, value); + }; + /** + * Is the specified coordinate systems or components contain the given pixel point. + * @param {Array|number} value + * @return {boolean} result + */ + + + ECharts.prototype.containPixel = function (finder, value) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + var ecModel = this._model; + var result; + var findResult = parseFinder(ecModel, finder); + each(findResult, function (models, key) { + key.indexOf('Models') >= 0 && each(models, function (model) { + var coordSys = model.coordinateSystem; + + if (coordSys && coordSys.containPoint) { + result = result || !!coordSys.containPoint(value); + } else if (key === 'seriesModels') { + var view = this._chartsMap[model.__viewId]; + + if (view && view.containPoint) { + result = result || view.containPoint(value, model); + } else { + if ("development" !== 'production') { + console.warn(key + ': ' + (view ? 'The found component do not support containPoint.' : 'No view mapping to the found component.')); + } + } + } else { + if ("development" !== 'production') { + console.warn(key + ': containPoint is not supported'); + } + } + }, this); + }, this); + return !!result; + }; + /** + * Get visual from series or data. + * @param finder + * If string, e.g., 'series', means {seriesIndex: 0}. + * If Object, could contain some of these properties below: + * { + * seriesIndex / seriesId / seriesName, + * dataIndex / dataIndexInside + * } + * If dataIndex is not specified, series visual will be fetched, + * but not data item visual. + * If all of seriesIndex, seriesId, seriesName are not specified, + * visual will be fetched from first series. + * @param visualType 'color', 'symbol', 'symbolSize' + */ + + + ECharts.prototype.getVisual = function (finder, visualType) { + var ecModel = this._model; + var parsedFinder = parseFinder(ecModel, finder, { + defaultMainType: 'series' + }); + var seriesModel = parsedFinder.seriesModel; + + if ("development" !== 'production') { + if (!seriesModel) { + console.warn('There is no specified seires model'); + } + } + + var data = seriesModel.getData(); + var dataIndexInside = parsedFinder.hasOwnProperty('dataIndexInside') ? parsedFinder.dataIndexInside : parsedFinder.hasOwnProperty('dataIndex') ? data.indexOfRawIndex(parsedFinder.dataIndex) : null; + return dataIndexInside != null ? getItemVisualFromData(data, dataIndexInside, visualType) : getVisualFromData(data, visualType); + }; + /** + * Get view of corresponding component model + */ + + + ECharts.prototype.getViewOfComponentModel = function (componentModel) { + return this._componentsMap[componentModel.__viewId]; + }; + /** + * Get view of corresponding series model + */ + + + ECharts.prototype.getViewOfSeriesModel = function (seriesModel) { + return this._chartsMap[seriesModel.__viewId]; + }; + + ECharts.prototype._initEvents = function () { + var _this = this; + + each(MOUSE_EVENT_NAMES, function (eveName) { + var handler = function (e) { + var ecModel = _this.getModel(); + + var el = e.target; + var params; + var isGlobalOut = eveName === 'globalout'; // no e.target when 'globalout'. + + if (isGlobalOut) { + params = {}; + } else { + el && findEventDispatcher(el, function (parent) { + var ecData = getECData(parent); + + if (ecData && ecData.dataIndex != null) { + var dataModel = ecData.dataModel || ecModel.getSeriesByIndex(ecData.seriesIndex); + params = dataModel && dataModel.getDataParams(ecData.dataIndex, ecData.dataType) || {}; + return true; + } // If element has custom eventData of components + else if (ecData.eventData) { + params = extend({}, ecData.eventData); + return true; + } + }, true); + } // Contract: if params prepared in mouse event, + // these properties must be specified: + // { + // componentType: string (component main type) + // componentIndex: number + // } + // Otherwise event query can not work. + + + if (params) { + var componentType = params.componentType; + var componentIndex = params.componentIndex; // Special handling for historic reason: when trigger by + // markLine/markPoint/markArea, the componentType is + // 'markLine'/'markPoint'/'markArea', but we should better + // enable them to be queried by seriesIndex, since their + // option is set in each series. + + if (componentType === 'markLine' || componentType === 'markPoint' || componentType === 'markArea') { + componentType = 'series'; + componentIndex = params.seriesIndex; + } + + var model = componentType && componentIndex != null && ecModel.getComponent(componentType, componentIndex); + var view = model && _this[model.mainType === 'series' ? '_chartsMap' : '_componentsMap'][model.__viewId]; + + if ("development" !== 'production') { + // `event.componentType` and `event[componentTpype + 'Index']` must not + // be missed, otherwise there is no way to distinguish source component. + // See `dataFormat.getDataParams`. + if (!isGlobalOut && !(model && view)) { + console.warn('model or view can not be found by params'); + } + } + + params.event = e; + params.type = eveName; + _this._$eventProcessor.eventInfo = { + targetEl: el, + packedEvent: params, + model: model, + view: view + }; + + _this.trigger(eveName, params); + } + }; // Consider that some component (like tooltip, brush, ...) + // register zr event handler, but user event handler might + // do anything, such as call `setOption` or `dispatchAction`, + // which probably update any of the content and probably + // cause problem if it is called previous other inner handlers. + + + handler.zrEventfulCallAtLast = true; + + _this._zr.on(eveName, handler, _this); + }); + each(eventActionMap, function (actionType, eventType) { + _this._messageCenter.on(eventType, function (event) { + this.trigger(eventType, event); + }, _this); + }); // Extra events + // TODO register? + + each(['selectchanged'], function (eventType) { + _this._messageCenter.on(eventType, function (event) { + this.trigger(eventType, event); + }, _this); + }); + handleLegacySelectEvents(this._messageCenter, this, this._api); + }; + + ECharts.prototype.isDisposed = function () { + return this._disposed; + }; + + ECharts.prototype.clear = function () { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + this.setOption({ + series: [] + }, true); + }; + + ECharts.prototype.dispose = function () { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + this._disposed = true; + var dom = this.getDom(); + + if (dom) { + setAttribute(this.getDom(), DOM_ATTRIBUTE_KEY, ''); + } + + var chart = this; + var api = chart._api; + var ecModel = chart._model; + each(chart._componentsViews, function (component) { + component.dispose(ecModel, api); + }); + each(chart._chartsViews, function (chart) { + chart.dispose(ecModel, api); + }); // Dispose after all views disposed + + chart._zr.dispose(); // Set properties to null. + // To reduce the memory cost in case the top code still holds this instance unexpectedly. + + + chart._dom = chart._model = chart._chartsMap = chart._componentsMap = chart._chartsViews = chart._componentsViews = chart._scheduler = chart._api = chart._zr = chart._throttledZrFlush = chart._theme = chart._coordSysMgr = chart._messageCenter = null; + delete instances$1[chart.id]; + }; + /** + * Resize the chart + */ + + + ECharts.prototype.resize = function (opts) { + if (this[IN_MAIN_PROCESS_KEY]) { + if ("development" !== 'production') { + error('`resize` should not be called during main process.'); + } + + return; + } + + if (this._disposed) { + disposedWarning(this.id); + return; + } + + this._zr.resize(opts); + + var ecModel = this._model; // Resize loading effect + + this._loadingFX && this._loadingFX.resize(); + + if (!ecModel) { + return; + } + + var needPrepare = ecModel.resetOption('media'); + var silent = opts && opts.silent; // There is some real cases that: + // chart.setOption(option, { lazyUpdate: true }); + // chart.resize(); + + if (this[PENDING_UPDATE]) { + if (silent == null) { + silent = this[PENDING_UPDATE].silent; + } + + needPrepare = true; + this[PENDING_UPDATE] = null; + } + + this[IN_MAIN_PROCESS_KEY] = true; + + try { + needPrepare && prepare(this); + updateMethods.update.call(this, { + type: 'resize', + animation: extend({ + // Disable animation + duration: 0 + }, opts && opts.animation) + }); + } catch (e) { + this[IN_MAIN_PROCESS_KEY] = false; + throw e; + } + + this[IN_MAIN_PROCESS_KEY] = false; + flushPendingActions.call(this, silent); + triggerUpdatedEvent.call(this, silent); + }; + + ECharts.prototype.showLoading = function (name, cfg) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + if (isObject(name)) { + cfg = name; + name = ''; + } + + name = name || 'default'; + this.hideLoading(); + + if (!loadingEffects[name]) { + if ("development" !== 'production') { + console.warn('Loading effects ' + name + ' not exists.'); + } + + return; + } + + var el = loadingEffects[name](this._api, cfg); + var zr = this._zr; + this._loadingFX = el; + zr.add(el); + }; + /** + * Hide loading effect + */ + + + ECharts.prototype.hideLoading = function () { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + this._loadingFX && this._zr.remove(this._loadingFX); + this._loadingFX = null; + }; + + ECharts.prototype.makeActionFromEvent = function (eventObj) { + var payload = extend({}, eventObj); + payload.type = eventActionMap[eventObj.type]; + return payload; + }; + /** + * @param opt If pass boolean, means opt.silent + * @param opt.silent Default `false`. Whether trigger events. + * @param opt.flush Default `undefined`. + * true: Flush immediately, and then pixel in canvas can be fetched + * immediately. Caution: it might affect performance. + * false: Not flush. + * undefined: Auto decide whether perform flush. + */ + + + ECharts.prototype.dispatchAction = function (payload, opt) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + if (!isObject(opt)) { + opt = { + silent: !!opt + }; + } + + if (!actions[payload.type]) { + return; + } // Avoid dispatch action before setOption. Especially in `connect`. + + + if (!this._model) { + return; + } // May dispatchAction in rendering procedure + + + if (this[IN_MAIN_PROCESS_KEY]) { + this._pendingActions.push(payload); + + return; + } + + var silent = opt.silent; + doDispatchAction.call(this, payload, silent); + var flush = opt.flush; + + if (flush) { + this._zr.flush(); + } else if (flush !== false && env.browser.weChat) { + // In WeChat embeded browser, `requestAnimationFrame` and `setInterval` + // hang when sliding page (on touch event), which cause that zr does not + // refresh util user interaction finished, which is not expected. + // But `dispatchAction` may be called too frequently when pan on touch + // screen, which impacts performance if do not throttle them. + this._throttledZrFlush(); + } + + flushPendingActions.call(this, silent); + triggerUpdatedEvent.call(this, silent); + }; + + ECharts.prototype.updateLabelLayout = function () { + lifecycle.trigger('series:layoutlabels', this._model, this._api, { + // Not adding series labels. + // TODO + updatedSeries: [] + }); + }; + + ECharts.prototype.appendData = function (params) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + var seriesIndex = params.seriesIndex; + var ecModel = this.getModel(); + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); + + if ("development" !== 'production') { + assert(params.data && seriesModel); + } + + seriesModel.appendData(params); // Note: `appendData` does not support that update extent of coordinate + // system, util some scenario require that. In the expected usage of + // `appendData`, the initial extent of coordinate system should better + // be fixed by axis `min`/`max` setting or initial data, otherwise if + // the extent changed while `appendData`, the location of the painted + // graphic elements have to be changed, which make the usage of + // `appendData` meaningless. + + this._scheduler.unfinished = true; + this.getZr().wakeUp(); + }; // A work around for no `internal` modifier in ts yet but + // need to strictly hide private methods to JS users. + + + ECharts.internalField = function () { + prepare = function (ecIns) { + var scheduler = ecIns._scheduler; + scheduler.restorePipelines(ecIns._model); + scheduler.prepareStageTasks(); + prepareView(ecIns, true); + prepareView(ecIns, false); + scheduler.plan(); + }; + /** + * Prepare view instances of charts and components + */ + + + prepareView = function (ecIns, isComponent) { + var ecModel = ecIns._model; + var scheduler = ecIns._scheduler; + var viewList = isComponent ? ecIns._componentsViews : ecIns._chartsViews; + var viewMap = isComponent ? ecIns._componentsMap : ecIns._chartsMap; + var zr = ecIns._zr; + var api = ecIns._api; + + for (var i = 0; i < viewList.length; i++) { + viewList[i].__alive = false; + } + + isComponent ? ecModel.eachComponent(function (componentType, model) { + componentType !== 'series' && doPrepare(model); + }) : ecModel.eachSeries(doPrepare); + + function doPrepare(model) { + // By defaut view will be reused if possible for the case that `setOption` with "notMerge" + // mode and need to enable transition animation. (Usually, when they have the same id, or + // especially no id but have the same type & name & index. See the `model.id` generation + // rule in `makeIdAndName` and `viewId` generation rule here). + // But in `replaceMerge` mode, this feature should be able to disabled when it is clear that + // the new model has nothing to do with the old model. + var requireNewView = model.__requireNewView; // This command should not work twice. + + model.__requireNewView = false; // Consider: id same and type changed. + + var viewId = '_ec_' + model.id + '_' + model.type; + var view = !requireNewView && viewMap[viewId]; + + if (!view) { + var classType = parseClassType(model.type); + var Clazz = isComponent ? ComponentView.getClass(classType.main, classType.sub) : // FIXME:TS + // (ChartView as ChartViewConstructor).getClass('series', classType.sub) + // For backward compat, still support a chart type declared as only subType + // like "liquidfill", but recommend "series.liquidfill" + // But need a base class to make a type series. + ChartView.getClass(classType.sub); + + if ("development" !== 'production') { + assert(Clazz, classType.sub + ' does not exist.'); + } + + view = new Clazz(); + view.init(ecModel, api); + viewMap[viewId] = view; + viewList.push(view); + zr.add(view.group); + } + + model.__viewId = view.__id = viewId; + view.__alive = true; + view.__model = model; + view.group.__ecComponentInfo = { + mainType: model.mainType, + index: model.componentIndex + }; + !isComponent && scheduler.prepareView(view, model, ecModel, api); + } + + for (var i = 0; i < viewList.length;) { + var view = viewList[i]; + + if (!view.__alive) { + !isComponent && view.renderTask.dispose(); + zr.remove(view.group); + view.dispose(ecModel, api); + viewList.splice(i, 1); + + if (viewMap[view.__id] === view) { + delete viewMap[view.__id]; + } + + view.__id = view.group.__ecComponentInfo = null; + } else { + i++; + } + } + }; + + updateDirectly = function (ecIns, method, payload, mainType, subType) { + var ecModel = ecIns._model; + ecModel.setUpdatePayload(payload); // broadcast + + if (!mainType) { + // FIXME + // Chart will not be update directly here, except set dirty. + // But there is no such scenario now. + each([].concat(ecIns._componentsViews).concat(ecIns._chartsViews), callView); + return; + } + + var query = {}; + query[mainType + 'Id'] = payload[mainType + 'Id']; + query[mainType + 'Index'] = payload[mainType + 'Index']; + query[mainType + 'Name'] = payload[mainType + 'Name']; + var condition = { + mainType: mainType, + query: query + }; + subType && (condition.subType = subType); // subType may be '' by parseClassType; + + var excludeSeriesId = payload.excludeSeriesId; + var excludeSeriesIdMap; + + if (excludeSeriesId != null) { + excludeSeriesIdMap = createHashMap(); + each(normalizeToArray(excludeSeriesId), function (id) { + var modelId = convertOptionIdName(id, null); + + if (modelId != null) { + excludeSeriesIdMap.set(modelId, true); + } + }); + } // If dispatchAction before setOption, do nothing. + + + ecModel && ecModel.eachComponent(condition, function (model) { + var isExcluded = excludeSeriesIdMap && excludeSeriesIdMap.get(model.id) !== null; + + if (isExcluded) { + return; + } + + if (isHighDownPayload(payload)) { + if (model instanceof SeriesModel) { + if (payload.type === HIGHLIGHT_ACTION_TYPE && !payload.notBlur && !model.get(['emphasis', 'disabled'])) { + blurSeriesFromHighlightPayload(model, payload, ecIns._api); + } + } else { + var _a = findComponentHighDownDispatchers(model.mainType, model.componentIndex, payload.name, ecIns._api), + focusSelf = _a.focusSelf, + dispatchers = _a.dispatchers; + + if (payload.type === HIGHLIGHT_ACTION_TYPE && focusSelf && !payload.notBlur) { + blurComponent(model.mainType, model.componentIndex, ecIns._api); + } // PENDING: + // Whether to put this "enter emphasis" code in `ComponentView`, + // which will be the same as `ChartView` but might be not necessary + // and will be far from this logic. + + + if (dispatchers) { + each(dispatchers, function (dispatcher) { + payload.type === HIGHLIGHT_ACTION_TYPE ? enterEmphasis(dispatcher) : leaveEmphasis(dispatcher); + }); + } + } + } else if (isSelectChangePayload(payload)) { + // TODO geo + if (model instanceof SeriesModel) { + toggleSelectionFromPayload(model, payload, ecIns._api); + updateSeriesElementSelection(model); + markStatusToUpdate(ecIns); + } + } + }, ecIns); + ecModel && ecModel.eachComponent(condition, function (model) { + var isExcluded = excludeSeriesIdMap && excludeSeriesIdMap.get(model.id) !== null; + + if (isExcluded) { + return; + } + callView(ecIns[mainType === 'series' ? '_chartsMap' : '_componentsMap'][model.__viewId]); + }, ecIns); + + function callView(view) { + view && view.__alive && view[method] && view[method](view.__model, ecModel, ecIns._api, payload); + } + }; + + updateMethods = { + prepareAndUpdate: function (payload) { + prepare(this); + updateMethods.update.call(this, payload, { + // Needs to mark option changed if newOption is given. + // It's from MagicType. + // TODO If use a separate flag optionChanged in payload? + optionChanged: payload.newOption != null + }); + }, + update: function (payload, updateParams) { + var ecModel = this._model; + var api = this._api; + var zr = this._zr; + var coordSysMgr = this._coordSysMgr; + var scheduler = this._scheduler; // update before setOption + + if (!ecModel) { + return; + } + + ecModel.setUpdatePayload(payload); + scheduler.restoreData(ecModel, payload); + scheduler.performSeriesTasks(ecModel); // TODO + // Save total ecModel here for undo/redo (after restoring data and before processing data). + // Undo (restoration of total ecModel) can be carried out in 'action' or outside API call. + // Create new coordinate system each update + // In LineView may save the old coordinate system and use it to get the orignal point + + coordSysMgr.create(ecModel, api); + scheduler.performDataProcessorTasks(ecModel, payload); // Current stream render is not supported in data process. So we can update + // stream modes after data processing, where the filtered data is used to + // deteming whether use progressive rendering. + + updateStreamModes(this, ecModel); // We update stream modes before coordinate system updated, then the modes info + // can be fetched when coord sys updating (consider the barGrid extent fix). But + // the drawback is the full coord info can not be fetched. Fortunately this full + // coord is not requied in stream mode updater currently. + + coordSysMgr.update(ecModel, api); + clearColorPalette(ecModel); + scheduler.performVisualTasks(ecModel, payload); + render(this, ecModel, api, payload, updateParams); // Set background + + var backgroundColor = ecModel.get('backgroundColor') || 'transparent'; + var darkMode = ecModel.get('darkMode'); + zr.setBackgroundColor(backgroundColor); // Force set dark mode. + + if (darkMode != null && darkMode !== 'auto') { + zr.setDarkMode(darkMode); + } + + lifecycle.trigger('afterupdate', ecModel, api); + }, + updateTransform: function (payload) { + var _this = this; + + var ecModel = this._model; + var api = this._api; // update before setOption + + if (!ecModel) { + return; + } + + ecModel.setUpdatePayload(payload); // ChartView.markUpdateMethod(payload, 'updateTransform'); + + var componentDirtyList = []; + ecModel.eachComponent(function (componentType, componentModel) { + if (componentType === 'series') { + return; + } + + var componentView = _this.getViewOfComponentModel(componentModel); + + if (componentView && componentView.__alive) { + if (componentView.updateTransform) { + var result = componentView.updateTransform(componentModel, ecModel, api, payload); + result && result.update && componentDirtyList.push(componentView); + } else { + componentDirtyList.push(componentView); + } + } + }); + var seriesDirtyMap = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var chartView = _this._chartsMap[seriesModel.__viewId]; + + if (chartView.updateTransform) { + var result = chartView.updateTransform(seriesModel, ecModel, api, payload); + result && result.update && seriesDirtyMap.set(seriesModel.uid, 1); + } else { + seriesDirtyMap.set(seriesModel.uid, 1); + } + }); + clearColorPalette(ecModel); // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline. + // this._scheduler.performVisualTasks(ecModel, payload, 'layout', true); + + this._scheduler.performVisualTasks(ecModel, payload, { + setDirty: true, + dirtyMap: seriesDirtyMap + }); // Currently, not call render of components. Geo render cost a lot. + // renderComponents(ecIns, ecModel, api, payload, componentDirtyList); + + + renderSeries(this, ecModel, api, payload, {}, seriesDirtyMap); + lifecycle.trigger('afterupdate', ecModel, api); + }, + updateView: function (payload) { + var ecModel = this._model; // update before setOption + + if (!ecModel) { + return; + } + + ecModel.setUpdatePayload(payload); + ChartView.markUpdateMethod(payload, 'updateView'); + clearColorPalette(ecModel); // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline. + + this._scheduler.performVisualTasks(ecModel, payload, { + setDirty: true + }); + + render(this, ecModel, this._api, payload, {}); + lifecycle.trigger('afterupdate', ecModel, this._api); + }, + updateVisual: function (payload) { + // updateMethods.update.call(this, payload); + var _this = this; + + var ecModel = this._model; // update before setOption + + if (!ecModel) { + return; + } + + ecModel.setUpdatePayload(payload); // clear all visual + + ecModel.eachSeries(function (seriesModel) { + seriesModel.getData().clearAllVisual(); + }); // Perform visual + + ChartView.markUpdateMethod(payload, 'updateVisual'); + clearColorPalette(ecModel); // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline. + + this._scheduler.performVisualTasks(ecModel, payload, { + visualType: 'visual', + setDirty: true + }); + + ecModel.eachComponent(function (componentType, componentModel) { + if (componentType !== 'series') { + var componentView = _this.getViewOfComponentModel(componentModel); + + componentView && componentView.__alive && componentView.updateVisual(componentModel, ecModel, _this._api, payload); + } + }); + ecModel.eachSeries(function (seriesModel) { + var chartView = _this._chartsMap[seriesModel.__viewId]; + chartView.updateVisual(seriesModel, ecModel, _this._api, payload); + }); + lifecycle.trigger('afterupdate', ecModel, this._api); + }, + updateLayout: function (payload) { + updateMethods.update.call(this, payload); + } + }; + + doConvertPixel = function (ecIns, methodName, finder, value) { + if (ecIns._disposed) { + disposedWarning(ecIns.id); + return; + } + + var ecModel = ecIns._model; + + var coordSysList = ecIns._coordSysMgr.getCoordinateSystems(); + + var result; + var parsedFinder = parseFinder(ecModel, finder); + + for (var i = 0; i < coordSysList.length; i++) { + var coordSys = coordSysList[i]; + + if (coordSys[methodName] && (result = coordSys[methodName](ecModel, parsedFinder, value)) != null) { + return result; + } + } + + if ("development" !== 'production') { + console.warn('No coordinate system that supports ' + methodName + ' found by the given finder.'); + } + }; + + updateStreamModes = function (ecIns, ecModel) { + var chartsMap = ecIns._chartsMap; + var scheduler = ecIns._scheduler; + ecModel.eachSeries(function (seriesModel) { + scheduler.updateStreamModes(seriesModel, chartsMap[seriesModel.__viewId]); + }); + }; + + doDispatchAction = function (payload, silent) { + var _this = this; + + var ecModel = this.getModel(); + var payloadType = payload.type; + var escapeConnect = payload.escapeConnect; + var actionWrap = actions[payloadType]; + var actionInfo = actionWrap.actionInfo; + var cptTypeTmp = (actionInfo.update || 'update').split(':'); + var updateMethod = cptTypeTmp.pop(); + var cptType = cptTypeTmp[0] != null && parseClassType(cptTypeTmp[0]); + this[IN_MAIN_PROCESS_KEY] = true; + var payloads = [payload]; + var batched = false; // Batch action + + if (payload.batch) { + batched = true; + payloads = map(payload.batch, function (item) { + item = defaults(extend({}, item), payload); + item.batch = null; + return item; + }); + } + + var eventObjBatch = []; + var eventObj; + var isSelectChange = isSelectChangePayload(payload); + var isHighDown = isHighDownPayload(payload); // Only leave blur once if there are multiple batches. + + if (isHighDown) { + allLeaveBlur(this._api); + } + + each(payloads, function (batchItem) { + // Action can specify the event by return it. + eventObj = actionWrap.action(batchItem, _this._model, _this._api); // Emit event outside + + eventObj = eventObj || extend({}, batchItem); // Convert type to eventType + + eventObj.type = actionInfo.event || eventObj.type; + eventObjBatch.push(eventObj); // light update does not perform data process, layout and visual. + + if (isHighDown) { + var _a = preParseFinder(payload), + queryOptionMap = _a.queryOptionMap, + mainTypeSpecified = _a.mainTypeSpecified; + + var componentMainType = mainTypeSpecified ? queryOptionMap.keys()[0] : 'series'; + updateDirectly(_this, updateMethod, batchItem, componentMainType); + markStatusToUpdate(_this); + } else if (isSelectChange) { + // At present `dispatchAction({ type: 'select', ... })` is not supported on components. + // geo still use 'geoselect'. + updateDirectly(_this, updateMethod, batchItem, 'series'); + markStatusToUpdate(_this); + } else if (cptType) { + updateDirectly(_this, updateMethod, batchItem, cptType.main, cptType.sub); + } + }); + + if (updateMethod !== 'none' && !isHighDown && !isSelectChange && !cptType) { + try { + // Still dirty + if (this[PENDING_UPDATE]) { + prepare(this); + updateMethods.update.call(this, payload); + this[PENDING_UPDATE] = null; + } else { + updateMethods[updateMethod].call(this, payload); + } + } catch (e) { + this[IN_MAIN_PROCESS_KEY] = false; + throw e; + } + } // Follow the rule of action batch + + + if (batched) { + eventObj = { + type: actionInfo.event || payloadType, + escapeConnect: escapeConnect, + batch: eventObjBatch + }; + } else { + eventObj = eventObjBatch[0]; + } + + this[IN_MAIN_PROCESS_KEY] = false; + + if (!silent) { + var messageCenter = this._messageCenter; + messageCenter.trigger(eventObj.type, eventObj); // Extra triggered 'selectchanged' event + + if (isSelectChange) { + var newObj = { + type: 'selectchanged', + escapeConnect: escapeConnect, + selected: getAllSelectedIndices(ecModel), + isFromClick: payload.isFromClick || false, + fromAction: payload.type, + fromActionPayload: payload + }; + messageCenter.trigger(newObj.type, newObj); + } + } + }; + + flushPendingActions = function (silent) { + var pendingActions = this._pendingActions; + + while (pendingActions.length) { + var payload = pendingActions.shift(); + doDispatchAction.call(this, payload, silent); + } + }; + + triggerUpdatedEvent = function (silent) { + !silent && this.trigger('updated'); + }; + /** + * Event `rendered` is triggered when zr + * rendered. It is useful for realtime + * snapshot (reflect animation). + * + * Event `finished` is triggered when: + * (1) zrender rendering finished. + * (2) initial animation finished. + * (3) progressive rendering finished. + * (4) no pending action. + * (5) no delayed setOption needs to be processed. + */ + + + bindRenderedEvent = function (zr, ecIns) { + zr.on('rendered', function (params) { + ecIns.trigger('rendered', params); // The `finished` event should not be triggered repeatly, + // so it should only be triggered when rendering indeed happend + // in zrender. (Consider the case that dipatchAction is keep + // triggering when mouse move). + + if ( // Although zr is dirty if initial animation is not finished + // and this checking is called on frame, we also check + // animation finished for robustness. + zr.animation.isFinished() && !ecIns[PENDING_UPDATE] && !ecIns._scheduler.unfinished && !ecIns._pendingActions.length) { + ecIns.trigger('finished'); + } + }); + }; + + bindMouseEvent = function (zr, ecIns) { + zr.on('mouseover', function (e) { + var el = e.target; + var dispatcher = findEventDispatcher(el, isHighDownDispatcher); + + if (dispatcher) { + handleGlobalMouseOverForHighDown(dispatcher, e, ecIns._api); + markStatusToUpdate(ecIns); + } + }).on('mouseout', function (e) { + var el = e.target; + var dispatcher = findEventDispatcher(el, isHighDownDispatcher); + + if (dispatcher) { + handleGlobalMouseOutForHighDown(dispatcher, e, ecIns._api); + markStatusToUpdate(ecIns); + } + }).on('click', function (e) { + var el = e.target; + var dispatcher = findEventDispatcher(el, function (target) { + return getECData(target).dataIndex != null; + }, true); + + if (dispatcher) { + var actionType = dispatcher.selected ? 'unselect' : 'select'; + var ecData = getECData(dispatcher); + + ecIns._api.dispatchAction({ + type: actionType, + dataType: ecData.dataType, + dataIndexInside: ecData.dataIndex, + seriesIndex: ecData.seriesIndex, + isFromClick: true + }); + } + }); + }; + + function clearColorPalette(ecModel) { + ecModel.clearColorPalette(); + ecModel.eachSeries(function (seriesModel) { + seriesModel.clearColorPalette(); + }); + } + + function allocateZlevels(ecModel) { + var componentZLevels = []; + var seriesZLevels = []; + var hasSeperateZLevel = false; + ecModel.eachComponent(function (componentType, componentModel) { + var zlevel = componentModel.get('zlevel') || 0; + var z = componentModel.get('z') || 0; + var zlevelKey = componentModel.getZLevelKey(); + hasSeperateZLevel = hasSeperateZLevel || !!zlevelKey; + (componentType === 'series' ? seriesZLevels : componentZLevels).push({ + zlevel: zlevel, + z: z, + idx: componentModel.componentIndex, + type: componentType, + key: zlevelKey + }); + }); + + if (hasSeperateZLevel) { + // Series after component + var zLevels = componentZLevels.concat(seriesZLevels); + var lastSeriesZLevel_1; + var lastSeriesKey_1; + sort(zLevels, function (a, b) { + if (a.zlevel === b.zlevel) { + return a.z - b.z; + } + + return a.zlevel - b.zlevel; + }); + each(zLevels, function (item) { + var componentModel = ecModel.getComponent(item.type, item.idx); + var zlevel = item.zlevel; + var key = item.key; + + if (lastSeriesZLevel_1 != null) { + zlevel = Math.max(lastSeriesZLevel_1, zlevel); + } + + if (key) { + if (zlevel === lastSeriesZLevel_1 && key !== lastSeriesKey_1) { + zlevel++; + } + + lastSeriesKey_1 = key; + } else if (lastSeriesKey_1) { + if (zlevel === lastSeriesZLevel_1) { + zlevel++; + } + + lastSeriesKey_1 = ''; + } + + lastSeriesZLevel_1 = zlevel; + componentModel.setZLevel(zlevel); + }); + } + } + + render = function (ecIns, ecModel, api, payload, updateParams) { + allocateZlevels(ecModel); + renderComponents(ecIns, ecModel, api, payload, updateParams); + each(ecIns._chartsViews, function (chart) { + chart.__alive = false; + }); + renderSeries(ecIns, ecModel, api, payload, updateParams); // Remove groups of unrendered charts + + each(ecIns._chartsViews, function (chart) { + if (!chart.__alive) { + chart.remove(ecModel, api); + } + }); + }; + + renderComponents = function (ecIns, ecModel, api, payload, updateParams, dirtyList) { + each(dirtyList || ecIns._componentsViews, function (componentView) { + var componentModel = componentView.__model; + clearStates(componentModel, componentView); + componentView.render(componentModel, ecModel, api, payload); + updateZ(componentModel, componentView); + updateStates(componentModel, componentView); + }); + }; + /** + * Render each chart and component + */ + + + renderSeries = function (ecIns, ecModel, api, payload, updateParams, dirtyMap) { + // Render all charts + var scheduler = ecIns._scheduler; + updateParams = extend(updateParams || {}, { + updatedSeries: ecModel.getSeries() + }); // TODO progressive? + + lifecycle.trigger('series:beforeupdate', ecModel, api, updateParams); + var unfinished = false; + ecModel.eachSeries(function (seriesModel) { + var chartView = ecIns._chartsMap[seriesModel.__viewId]; + chartView.__alive = true; + var renderTask = chartView.renderTask; + scheduler.updatePayload(renderTask, payload); // TODO states on marker. + + clearStates(seriesModel, chartView); + + if (dirtyMap && dirtyMap.get(seriesModel.uid)) { + renderTask.dirty(); + } + + if (renderTask.perform(scheduler.getPerformArgs(renderTask))) { + unfinished = true; + } + + chartView.group.silent = !!seriesModel.get('silent'); // Should not call markRedraw on group, because it will disable zrender + // increamental render (alway render from the __startIndex each frame) + // chartView.group.markRedraw(); + + updateBlend(seriesModel, chartView); + updateSeriesElementSelection(seriesModel); + }); + scheduler.unfinished = unfinished || scheduler.unfinished; + lifecycle.trigger('series:layoutlabels', ecModel, api, updateParams); // transition after label is layouted. + + lifecycle.trigger('series:transition', ecModel, api, updateParams); + ecModel.eachSeries(function (seriesModel) { + var chartView = ecIns._chartsMap[seriesModel.__viewId]; // Update Z after labels updated. Before applying states. + + updateZ(seriesModel, chartView); // NOTE: Update states after label is updated. + // label should be in normal status when layouting. + + updateStates(seriesModel, chartView); + }); // If use hover layer + + updateHoverLayerStatus(ecIns, ecModel); + lifecycle.trigger('series:afterupdate', ecModel, api, updateParams); + }; + + markStatusToUpdate = function (ecIns) { + ecIns[STATUS_NEEDS_UPDATE_KEY] = true; // Wake up zrender if it's sleep. Let it update states in the next frame. + + ecIns.getZr().wakeUp(); + }; + + applyChangedStates = function (ecIns) { + if (!ecIns[STATUS_NEEDS_UPDATE_KEY]) { + return; + } + + ecIns.getZr().storage.traverse(function (el) { + // Not applied on removed elements, it may still in fading. + if (isElementRemoved(el)) { + return; + } + + applyElementStates(el); + }); + ecIns[STATUS_NEEDS_UPDATE_KEY] = false; + }; + + function applyElementStates(el) { + var newStates = []; + var oldStates = el.currentStates; // Keep other states. + + for (var i = 0; i < oldStates.length; i++) { + var stateName = oldStates[i]; + + if (!(stateName === 'emphasis' || stateName === 'blur' || stateName === 'select')) { + newStates.push(stateName); + } + } // Only use states when it's exists. + + + if (el.selected && el.states.select) { + newStates.push('select'); + } + + if (el.hoverState === HOVER_STATE_EMPHASIS && el.states.emphasis) { + newStates.push('emphasis'); + } else if (el.hoverState === HOVER_STATE_BLUR && el.states.blur) { + newStates.push('blur'); + } + + el.useStates(newStates); + } + + function updateHoverLayerStatus(ecIns, ecModel) { + var zr = ecIns._zr; + var storage = zr.storage; + var elCount = 0; + storage.traverse(function (el) { + if (!el.isGroup) { + elCount++; + } + }); + + if (elCount > ecModel.get('hoverLayerThreshold') && !env.node && !env.worker) { + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.preventUsingHoverLayer) { + return; + } + + var chartView = ecIns._chartsMap[seriesModel.__viewId]; + + if (chartView.__alive) { + chartView.eachRendered(function (el) { + if (el.states.emphasis) { + el.states.emphasis.hoverLayer = true; + } + }); + } + }); + } + } + /** + * Update chart and blend. + */ + + function updateBlend(seriesModel, chartView) { + var blendMode = seriesModel.get('blendMode') || null; + chartView.eachRendered(function (el) { + // FIXME marker and other components + if (!el.isGroup) { + // DONT mark the element dirty. In case element is incremental and don't wan't to rerender. + el.style.blend = blendMode; + } + }); + } + + function updateZ(model, view) { + if (model.preventAutoZ) { + return; + } + + var z = model.get('z') || 0; + var zlevel = model.get('zlevel') || 0; // Set z and zlevel + + view.eachRendered(function (el) { + doUpdateZ(el, z, zlevel, -Infinity); // Don't traverse the children because it has been traversed in _updateZ. + + return true; + }); + } + + function doUpdateZ(el, z, zlevel, maxZ2) { + // Group may also have textContent + var label = el.getTextContent(); + var labelLine = el.getTextGuideLine(); + var isGroup = el.isGroup; + + if (isGroup) { + // set z & zlevel of children elements of Group + var children = el.childrenRef(); + + for (var i = 0; i < children.length; i++) { + maxZ2 = Math.max(doUpdateZ(children[i], z, zlevel, maxZ2), maxZ2); + } + } else { + // not Group + el.z = z; + el.zlevel = zlevel; + maxZ2 = Math.max(el.z2, maxZ2); + } // always set z and zlevel if label/labelLine exists + + + if (label) { + label.z = z; + label.zlevel = zlevel; // lift z2 of text content + // TODO if el.emphasis.z2 is spcefied, what about textContent. + + isFinite(maxZ2) && (label.z2 = maxZ2 + 2); + } + + if (labelLine) { + var textGuideLineConfig = el.textGuideLineConfig; + labelLine.z = z; + labelLine.zlevel = zlevel; + isFinite(maxZ2) && (labelLine.z2 = maxZ2 + (textGuideLineConfig && textGuideLineConfig.showAbove ? 1 : -1)); + } + + return maxZ2; + } // Clear states without animation. + // TODO States on component. + + + function clearStates(model, view) { + view.eachRendered(function (el) { + // Not applied on removed elements, it may still in fading. + if (isElementRemoved(el)) { + return; + } + + var textContent = el.getTextContent(); + var textGuide = el.getTextGuideLine(); + + if (el.stateTransition) { + el.stateTransition = null; + } + + if (textContent && textContent.stateTransition) { + textContent.stateTransition = null; + } + + if (textGuide && textGuide.stateTransition) { + textGuide.stateTransition = null; + } // TODO If el is incremental. + + + if (el.hasState()) { + el.prevStates = el.currentStates; + el.clearStates(); + } else if (el.prevStates) { + el.prevStates = null; + } + }); + } + + function updateStates(model, view) { + var stateAnimationModel = model.getModel('stateAnimation'); + var enableAnimation = model.isAnimationEnabled(); + var duration = stateAnimationModel.get('duration'); + var stateTransition = duration > 0 ? { + duration: duration, + delay: stateAnimationModel.get('delay'), + easing: stateAnimationModel.get('easing') // additive: stateAnimationModel.get('additive') + + } : null; + view.eachRendered(function (el) { + if (el.states && el.states.emphasis) { + // Not applied on removed elements, it may still in fading. + if (isElementRemoved(el)) { + return; + } + + if (el instanceof Path) { + savePathStates(el); + } // Only updated on changed element. In case element is incremental and don't wan't to rerender. + // TODO, a more proper way? + + + if (el.__dirty) { + var prevStates = el.prevStates; // Restore states without animation + + if (prevStates) { + el.useStates(prevStates); + } + } // Update state transition and enable animation again. + + + if (enableAnimation) { + el.stateTransition = stateTransition; + var textContent = el.getTextContent(); + var textGuide = el.getTextGuideLine(); // TODO Is it necessary to animate label? + + if (textContent) { + textContent.stateTransition = stateTransition; + } + + if (textGuide) { + textGuide.stateTransition = stateTransition; + } + } // The use higlighted and selected flag to toggle states. + + + if (el.__dirty) { + applyElementStates(el); + } + } + }); + } + + createExtensionAPI = function (ecIns) { + return new ( + /** @class */ + function (_super) { + __extends(class_1, _super); + + function class_1() { + return _super !== null && _super.apply(this, arguments) || this; + } + + class_1.prototype.getCoordinateSystems = function () { + return ecIns._coordSysMgr.getCoordinateSystems(); + }; + + class_1.prototype.getComponentByElement = function (el) { + while (el) { + var modelInfo = el.__ecComponentInfo; + + if (modelInfo != null) { + return ecIns._model.getComponent(modelInfo.mainType, modelInfo.index); + } + + el = el.parent; + } + }; + + class_1.prototype.enterEmphasis = function (el, highlightDigit) { + enterEmphasis(el, highlightDigit); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.leaveEmphasis = function (el, highlightDigit) { + leaveEmphasis(el, highlightDigit); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.enterBlur = function (el) { + enterBlur(el); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.leaveBlur = function (el) { + leaveBlur(el); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.enterSelect = function (el) { + enterSelect(el); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.leaveSelect = function (el) { + leaveSelect(el); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.getModel = function () { + return ecIns.getModel(); + }; + + class_1.prototype.getViewOfComponentModel = function (componentModel) { + return ecIns.getViewOfComponentModel(componentModel); + }; + + class_1.prototype.getViewOfSeriesModel = function (seriesModel) { + return ecIns.getViewOfSeriesModel(seriesModel); + }; + + return class_1; + }(ExtensionAPI))(ecIns); + }; + + enableConnect = function (chart) { + function updateConnectedChartsStatus(charts, status) { + for (var i = 0; i < charts.length; i++) { + var otherChart = charts[i]; + otherChart[CONNECT_STATUS_KEY] = status; + } + } + + each(eventActionMap, function (actionType, eventType) { + chart._messageCenter.on(eventType, function (event) { + if (connectedGroups[chart.group] && chart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_PENDING) { + if (event && event.escapeConnect) { + return; + } + + var action_1 = chart.makeActionFromEvent(event); + var otherCharts_1 = []; + each(instances$1, function (otherChart) { + if (otherChart !== chart && otherChart.group === chart.group) { + otherCharts_1.push(otherChart); + } + }); + updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_PENDING); + each(otherCharts_1, function (otherChart) { + if (otherChart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_UPDATING) { + otherChart.dispatchAction(action_1); + } + }); + updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_UPDATED); + } + }); + }); + }; + }(); + + return ECharts; + }(Eventful); + + var echartsProto = ECharts.prototype; + echartsProto.on = createRegisterEventWithLowercaseECharts('on'); + echartsProto.off = createRegisterEventWithLowercaseECharts('off'); + /** + * @deprecated + */ + // @ts-ignore + + echartsProto.one = function (eventName, cb, ctx) { + var self = this; + deprecateLog('ECharts#one is deprecated.'); + + function wrapped() { + var args2 = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args2[_i] = arguments[_i]; + } + + cb && cb.apply && cb.apply(this, args2); // @ts-ignore + + self.off(eventName, wrapped); + } + + this.on.call(this, eventName, wrapped, ctx); + }; + + var MOUSE_EVENT_NAMES = ['click', 'dblclick', 'mouseover', 'mouseout', 'mousemove', 'mousedown', 'mouseup', 'globalout', 'contextmenu']; + + function disposedWarning(id) { + if ("development" !== 'production') { + console.warn('Instance ' + id + ' has been disposed'); + } + } + + var actions = {}; + /** + * Map eventType to actionType + */ + + var eventActionMap = {}; + var dataProcessorFuncs = []; + var optionPreprocessorFuncs = []; + var visualFuncs = []; + var themeStorage = {}; + var loadingEffects = {}; + var instances$1 = {}; + var connectedGroups = {}; + var idBase = +new Date() - 0; + var groupIdBase = +new Date() - 0; + var DOM_ATTRIBUTE_KEY = '_echarts_instance_'; + /** + * @param opts.devicePixelRatio Use window.devicePixelRatio by default + * @param opts.renderer Can choose 'canvas' or 'svg' to render the chart. + * @param opts.width Use clientWidth of the input `dom` by default. + * Can be 'auto' (the same as null/undefined) + * @param opts.height Use clientHeight of the input `dom` by default. + * Can be 'auto' (the same as null/undefined) + * @param opts.locale Specify the locale. + * @param opts.useDirtyRect Enable dirty rectangle rendering or not. + */ + + function init$1(dom, theme, opts) { + var isClient = !(opts && opts.ssr); + + if (isClient) { + if ("development" !== 'production') { + if (!dom) { + throw new Error('Initialize failed: invalid dom.'); + } + } + + var existInstance = getInstanceByDom(dom); + + if (existInstance) { + if ("development" !== 'production') { + console.warn('There is a chart instance already initialized on the dom.'); + } + + return existInstance; + } + + if ("development" !== 'production') { + if (isDom(dom) && dom.nodeName.toUpperCase() !== 'CANVAS' && (!dom.clientWidth && (!opts || opts.width == null) || !dom.clientHeight && (!opts || opts.height == null))) { + console.warn('Can\'t get DOM width or height. Please check ' + 'dom.clientWidth and dom.clientHeight. They should not be 0.' + 'For example, you may need to call this in the callback ' + 'of window.onload.'); + } + } + } + + var chart = new ECharts(dom, theme, opts); + chart.id = 'ec_' + idBase++; + instances$1[chart.id] = chart; + isClient && setAttribute(dom, DOM_ATTRIBUTE_KEY, chart.id); + enableConnect(chart); + lifecycle.trigger('afterinit', chart); + return chart; + } + /** + * @usage + * (A) + * ```js + * let chart1 = echarts.init(dom1); + * let chart2 = echarts.init(dom2); + * chart1.group = 'xxx'; + * chart2.group = 'xxx'; + * echarts.connect('xxx'); + * ``` + * (B) + * ```js + * let chart1 = echarts.init(dom1); + * let chart2 = echarts.init(dom2); + * echarts.connect('xxx', [chart1, chart2]); + * ``` + */ + + function connect(groupId) { + // Is array of charts + if (isArray(groupId)) { + var charts = groupId; + groupId = null; // If any chart has group + + each(charts, function (chart) { + if (chart.group != null) { + groupId = chart.group; + } + }); + groupId = groupId || 'g_' + groupIdBase++; + each(charts, function (chart) { + chart.group = groupId; + }); + } + + connectedGroups[groupId] = true; + return groupId; + } + /** + * @deprecated + */ + + function disConnect(groupId) { + connectedGroups[groupId] = false; + } + /** + * Alias and backword compat + */ + + var disconnect = disConnect; + /** + * Dispose a chart instance + */ + + function dispose$1(chart) { + if (isString(chart)) { + chart = instances$1[chart]; + } else if (!(chart instanceof ECharts)) { + // Try to treat as dom + chart = getInstanceByDom(chart); + } + + if (chart instanceof ECharts && !chart.isDisposed()) { + chart.dispose(); + } + } + function getInstanceByDom(dom) { + return instances$1[getAttribute(dom, DOM_ATTRIBUTE_KEY)]; + } + function getInstanceById(key) { + return instances$1[key]; + } + /** + * Register theme + */ + + function registerTheme(name, theme) { + themeStorage[name] = theme; + } + /** + * Register option preprocessor + */ + + function registerPreprocessor(preprocessorFunc) { + if (indexOf(optionPreprocessorFuncs, preprocessorFunc) < 0) { + optionPreprocessorFuncs.push(preprocessorFunc); + } + } + function registerProcessor(priority, processor) { + normalizeRegister(dataProcessorFuncs, priority, processor, PRIORITY_PROCESSOR_DEFAULT); + } + /** + * Register postIniter + * @param {Function} postInitFunc + */ + + function registerPostInit(postInitFunc) { + registerUpdateLifecycle('afterinit', postInitFunc); + } + /** + * Register postUpdater + * @param {Function} postUpdateFunc + */ + + function registerPostUpdate(postUpdateFunc) { + registerUpdateLifecycle('afterupdate', postUpdateFunc); + } + function registerUpdateLifecycle(name, cb) { + lifecycle.on(name, cb); + } + function registerAction(actionInfo, eventName, action) { + if (isFunction(eventName)) { + action = eventName; + eventName = ''; + } + + var actionType = isObject(actionInfo) ? actionInfo.type : [actionInfo, actionInfo = { + event: eventName + }][0]; // Event name is all lowercase + + actionInfo.event = (actionInfo.event || actionType).toLowerCase(); + eventName = actionInfo.event; + + if (eventActionMap[eventName]) { + // Already registered. + return; + } // Validate action type and event name. + + + assert(ACTION_REG.test(actionType) && ACTION_REG.test(eventName)); + + if (!actions[actionType]) { + actions[actionType] = { + action: action, + actionInfo: actionInfo + }; + } + + eventActionMap[eventName] = actionType; + } + function registerCoordinateSystem(type, coordSysCreator) { + CoordinateSystemManager.register(type, coordSysCreator); + } + /** + * Get dimensions of specified coordinate system. + * @param {string} type + * @return {Array.<string|Object>} + */ + + function getCoordinateSystemDimensions(type) { + var coordSysCreator = CoordinateSystemManager.get(type); + + if (coordSysCreator) { + return coordSysCreator.getDimensionsInfo ? coordSysCreator.getDimensionsInfo() : coordSysCreator.dimensions.slice(); + } + } + + function registerLayout(priority, layoutTask) { + normalizeRegister(visualFuncs, priority, layoutTask, PRIORITY_VISUAL_LAYOUT, 'layout'); + } + + function registerVisual(priority, visualTask) { + normalizeRegister(visualFuncs, priority, visualTask, PRIORITY_VISUAL_CHART, 'visual'); + } + var registeredTasks = []; + + function normalizeRegister(targetList, priority, fn, defaultPriority, visualType) { + if (isFunction(priority) || isObject(priority)) { + fn = priority; + priority = defaultPriority; + } + + if ("development" !== 'production') { + if (isNaN(priority) || priority == null) { + throw new Error('Illegal priority'); + } // Check duplicate + + + each(targetList, function (wrap) { + assert(wrap.__raw !== fn); + }); + } // Already registered + + + if (indexOf(registeredTasks, fn) >= 0) { + return; + } + + registeredTasks.push(fn); + var stageHandler = Scheduler.wrapStageHandler(fn, visualType); + stageHandler.__prio = priority; + stageHandler.__raw = fn; + targetList.push(stageHandler); + } + + function registerLoading(name, loadingFx) { + loadingEffects[name] = loadingFx; + } + /** + * ZRender need a canvas context to do measureText. + * But in node environment canvas may be created by node-canvas. + * So we need to specify how to create a canvas instead of using document.createElement('canvas') + * + * + * @deprecated use setPlatformAPI({ createCanvas }) instead. + * + * @example + * let Canvas = require('canvas'); + * let echarts = require('echarts'); + * echarts.setCanvasCreator(function () { + * // Small size is enough. + * return new Canvas(32, 32); + * }); + */ + + function setCanvasCreator(creator) { + if ("development" !== 'production') { + deprecateLog('setCanvasCreator is deprecated. Use setPlatformAPI({ createCanvas }) instead.'); + } + + setPlatformAPI({ + createCanvas: creator + }); + } + /** + * The parameters and usage: see `geoSourceManager.registerMap`. + * Compatible with previous `echarts.registerMap`. + */ + + function registerMap(mapName, geoJson, specialAreas) { + var registerMap = getImpl('registerMap'); + registerMap && registerMap(mapName, geoJson, specialAreas); + } + function getMap(mapName) { + var getMap = getImpl('getMap'); + return getMap && getMap(mapName); + } + var registerTransform = registerExternalTransform; + /** + * Globa dispatchAction to a specified chart instance. + */ + // export function dispatchAction(payload: { chartId: string } & Payload, opt?: Parameters<ECharts['dispatchAction']>[1]) { + // if (!payload || !payload.chartId) { + // // Must have chartId to find chart + // return; + // } + // const chart = instances[payload.chartId]; + // if (chart) { + // chart.dispatchAction(payload, opt); + // } + // } + // Buitlin global visual + + registerVisual(PRIORITY_VISUAL_GLOBAL, seriesStyleTask); + registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataStyleTask); + registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataColorPaletteTask); + registerVisual(PRIORITY_VISUAL_GLOBAL, seriesSymbolTask); + registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataSymbolTask); + registerVisual(PRIORITY_VISUAL_DECAL, decalVisual); + registerPreprocessor(globalBackwardCompat); + registerProcessor(PRIORITY_PROCESSOR_DATASTACK, dataStack); + registerLoading('default', defaultLoading); // Default actions + + registerAction({ + type: HIGHLIGHT_ACTION_TYPE, + event: HIGHLIGHT_ACTION_TYPE, + update: HIGHLIGHT_ACTION_TYPE + }, noop); + registerAction({ + type: DOWNPLAY_ACTION_TYPE, + event: DOWNPLAY_ACTION_TYPE, + update: DOWNPLAY_ACTION_TYPE + }, noop); + registerAction({ + type: SELECT_ACTION_TYPE, + event: SELECT_ACTION_TYPE, + update: SELECT_ACTION_TYPE + }, noop); + registerAction({ + type: UNSELECT_ACTION_TYPE, + event: UNSELECT_ACTION_TYPE, + update: UNSELECT_ACTION_TYPE + }, noop); + registerAction({ + type: TOGGLE_SELECT_ACTION_TYPE, + event: TOGGLE_SELECT_ACTION_TYPE, + update: TOGGLE_SELECT_ACTION_TYPE + }, noop); // Default theme + + registerTheme('light', lightTheme); + registerTheme('dark', theme); // For backward compatibility, where the namespace `dataTool` will + // be mounted on `echarts` is the extension `dataTool` is imported. + + var dataTool = {}; + + var extensions = []; + var extensionRegisters = { + registerPreprocessor: registerPreprocessor, + registerProcessor: registerProcessor, + registerPostInit: registerPostInit, + registerPostUpdate: registerPostUpdate, + registerUpdateLifecycle: registerUpdateLifecycle, + registerAction: registerAction, + registerCoordinateSystem: registerCoordinateSystem, + registerLayout: registerLayout, + registerVisual: registerVisual, + registerTransform: registerTransform, + registerLoading: registerLoading, + registerMap: registerMap, + registerImpl: registerImpl, + PRIORITY: PRIORITY, + ComponentModel: ComponentModel, + ComponentView: ComponentView, + SeriesModel: SeriesModel, + ChartView: ChartView, + // TODO Use ComponentModel and SeriesModel instead of Constructor + registerComponentModel: function (ComponentModelClass) { + ComponentModel.registerClass(ComponentModelClass); + }, + registerComponentView: function (ComponentViewClass) { + ComponentView.registerClass(ComponentViewClass); + }, + registerSeriesModel: function (SeriesModelClass) { + SeriesModel.registerClass(SeriesModelClass); + }, + registerChartView: function (ChartViewClass) { + ChartView.registerClass(ChartViewClass); + }, + registerSubTypeDefaulter: function (componentType, defaulter) { + ComponentModel.registerSubTypeDefaulter(componentType, defaulter); + }, + registerPainter: function (painterType, PainterCtor) { + registerPainter(painterType, PainterCtor); + } + }; + function use(ext) { + if (isArray(ext)) { + // use([ChartLine, ChartBar]); + each(ext, function (singleExt) { + use(singleExt); + }); + return; + } + + if (indexOf(extensions, ext) >= 0) { + return; + } + + extensions.push(ext); + + if (isFunction(ext)) { + ext = { + install: ext + }; + } + + ext.install(extensionRegisters); + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + function dataIndexMapValueLength(valNumOrArrLengthMoreThan2) { + return valNumOrArrLengthMoreThan2 == null ? 0 : valNumOrArrLengthMoreThan2.length || 1; + } + + function defaultKeyGetter(item) { + return item; + } + + var DataDiffer = + /** @class */ + function () { + /** + * @param context Can be visited by this.context in callback. + */ + function DataDiffer(oldArr, newArr, oldKeyGetter, newKeyGetter, context, // By default: 'oneToOne'. + diffMode) { + this._old = oldArr; + this._new = newArr; + this._oldKeyGetter = oldKeyGetter || defaultKeyGetter; + this._newKeyGetter = newKeyGetter || defaultKeyGetter; // Visible in callback via `this.context`; + + this.context = context; + this._diffModeMultiple = diffMode === 'multiple'; + } + /** + * Callback function when add a data + */ + + + DataDiffer.prototype.add = function (func) { + this._add = func; + return this; + }; + /** + * Callback function when update a data + */ + + + DataDiffer.prototype.update = function (func) { + this._update = func; + return this; + }; + /** + * Callback function when update a data and only work in `cbMode: 'byKey'`. + */ + + + DataDiffer.prototype.updateManyToOne = function (func) { + this._updateManyToOne = func; + return this; + }; + /** + * Callback function when update a data and only work in `cbMode: 'byKey'`. + */ + + + DataDiffer.prototype.updateOneToMany = function (func) { + this._updateOneToMany = func; + return this; + }; + /** + * Callback function when update a data and only work in `cbMode: 'byKey'`. + */ + + + DataDiffer.prototype.updateManyToMany = function (func) { + this._updateManyToMany = func; + return this; + }; + /** + * Callback function when remove a data + */ + + + DataDiffer.prototype.remove = function (func) { + this._remove = func; + return this; + }; + + DataDiffer.prototype.execute = function () { + this[this._diffModeMultiple ? '_executeMultiple' : '_executeOneToOne'](); + }; + + DataDiffer.prototype._executeOneToOne = function () { + var oldArr = this._old; + var newArr = this._new; + var newDataIndexMap = {}; + var oldDataKeyArr = new Array(oldArr.length); + var newDataKeyArr = new Array(newArr.length); + + this._initIndexMap(oldArr, null, oldDataKeyArr, '_oldKeyGetter'); + + this._initIndexMap(newArr, newDataIndexMap, newDataKeyArr, '_newKeyGetter'); + + for (var i = 0; i < oldArr.length; i++) { + var oldKey = oldDataKeyArr[i]; + var newIdxMapVal = newDataIndexMap[oldKey]; + var newIdxMapValLen = dataIndexMapValueLength(newIdxMapVal); // idx can never be empty array here. see 'set null' logic below. + + if (newIdxMapValLen > 1) { + // Consider there is duplicate key (for example, use dataItem.name as key). + // We should make sure every item in newArr and oldArr can be visited. + var newIdx = newIdxMapVal.shift(); + + if (newIdxMapVal.length === 1) { + newDataIndexMap[oldKey] = newIdxMapVal[0]; + } + + this._update && this._update(newIdx, i); + } else if (newIdxMapValLen === 1) { + newDataIndexMap[oldKey] = null; + this._update && this._update(newIdxMapVal, i); + } else { + this._remove && this._remove(i); + } + } + + this._performRestAdd(newDataKeyArr, newDataIndexMap); + }; + /** + * For example, consider the case: + * oldData: [o0, o1, o2, o3, o4, o5, o6, o7], + * newData: [n0, n1, n2, n3, n4, n5, n6, n7, n8], + * Where: + * o0, o1, n0 has key 'a' (many to one) + * o5, n4, n5, n6 has key 'b' (one to many) + * o2, n1 has key 'c' (one to one) + * n2, n3 has key 'd' (add) + * o3, o4 has key 'e' (remove) + * o6, o7, n7, n8 has key 'f' (many to many, treated as add and remove) + * Then: + * (The order of the following directives are not ensured.) + * this._updateManyToOne(n0, [o0, o1]); + * this._updateOneToMany([n4, n5, n6], o5); + * this._update(n1, o2); + * this._remove(o3); + * this._remove(o4); + * this._remove(o6); + * this._remove(o7); + * this._add(n2); + * this._add(n3); + * this._add(n7); + * this._add(n8); + */ + + + DataDiffer.prototype._executeMultiple = function () { + var oldArr = this._old; + var newArr = this._new; + var oldDataIndexMap = {}; + var newDataIndexMap = {}; + var oldDataKeyArr = []; + var newDataKeyArr = []; + + this._initIndexMap(oldArr, oldDataIndexMap, oldDataKeyArr, '_oldKeyGetter'); + + this._initIndexMap(newArr, newDataIndexMap, newDataKeyArr, '_newKeyGetter'); + + for (var i = 0; i < oldDataKeyArr.length; i++) { + var oldKey = oldDataKeyArr[i]; + var oldIdxMapVal = oldDataIndexMap[oldKey]; + var newIdxMapVal = newDataIndexMap[oldKey]; + var oldIdxMapValLen = dataIndexMapValueLength(oldIdxMapVal); + var newIdxMapValLen = dataIndexMapValueLength(newIdxMapVal); + + if (oldIdxMapValLen > 1 && newIdxMapValLen === 1) { + this._updateManyToOne && this._updateManyToOne(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen === 1 && newIdxMapValLen > 1) { + this._updateOneToMany && this._updateOneToMany(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen === 1 && newIdxMapValLen === 1) { + this._update && this._update(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen > 1 && newIdxMapValLen > 1) { + this._updateManyToMany && this._updateManyToMany(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen > 1) { + for (var i_1 = 0; i_1 < oldIdxMapValLen; i_1++) { + this._remove && this._remove(oldIdxMapVal[i_1]); + } + } else { + this._remove && this._remove(oldIdxMapVal); + } + } + + this._performRestAdd(newDataKeyArr, newDataIndexMap); + }; + + DataDiffer.prototype._performRestAdd = function (newDataKeyArr, newDataIndexMap) { + for (var i = 0; i < newDataKeyArr.length; i++) { + var newKey = newDataKeyArr[i]; + var newIdxMapVal = newDataIndexMap[newKey]; + var idxMapValLen = dataIndexMapValueLength(newIdxMapVal); + + if (idxMapValLen > 1) { + for (var j = 0; j < idxMapValLen; j++) { + this._add && this._add(newIdxMapVal[j]); + } + } else if (idxMapValLen === 1) { + this._add && this._add(newIdxMapVal); + } // Support both `newDataKeyArr` are duplication removed or not removed. + + + newDataIndexMap[newKey] = null; + } + }; + + DataDiffer.prototype._initIndexMap = function (arr, // Can be null. + map, // In 'byKey', the output `keyArr` is duplication removed. + // In 'byIndex', the output `keyArr` is not duplication removed and + // its indices are accurately corresponding to `arr`. + keyArr, keyGetterName) { + var cbModeMultiple = this._diffModeMultiple; + + for (var i = 0; i < arr.length; i++) { + // Add prefix to avoid conflict with Object.prototype. + var key = '_ec_' + this[keyGetterName](arr[i], i); + + if (!cbModeMultiple) { + keyArr[i] = key; + } + + if (!map) { + continue; + } + + var idxMapVal = map[key]; + var idxMapValLen = dataIndexMapValueLength(idxMapVal); + + if (idxMapValLen === 0) { + // Simple optimize: in most cases, one index has one key, + // do not need array. + map[key] = i; + + if (cbModeMultiple) { + keyArr.push(key); + } + } else if (idxMapValLen === 1) { + map[key] = [idxMapVal, i]; + } else { + idxMapVal.push(i); + } + } + }; + + return DataDiffer; + }(); + + var DimensionUserOuput = + /** @class */ + function () { + function DimensionUserOuput(encode, dimRequest) { + this._encode = encode; + this._schema = dimRequest; + } + + DimensionUserOuput.prototype.get = function () { + return { + // Do not generate full dimension name until fist used. + fullDimensions: this._getFullDimensionNames(), + encode: this._encode + }; + }; + /** + * Get all data store dimension names. + * Theoretically a series data store is defined both by series and used dataset (if any). + * If some dimensions are omitted for performance reason in `this.dimensions`, + * the dimension name may not be auto-generated if user does not specify a dimension name. + * In this case, the dimension name is `null`/`undefined`. + */ + + + DimensionUserOuput.prototype._getFullDimensionNames = function () { + if (!this._cachedDimNames) { + this._cachedDimNames = this._schema ? this._schema.makeOutputDimensionNames() : []; + } + + return this._cachedDimNames; + }; + + return DimensionUserOuput; + }(); + function summarizeDimensions(data, schema) { + var summary = {}; + var encode = summary.encode = {}; + var notExtraCoordDimMap = createHashMap(); + var defaultedLabel = []; + var defaultedTooltip = []; + var userOutputEncode = {}; + each(data.dimensions, function (dimName) { + var dimItem = data.getDimensionInfo(dimName); + var coordDim = dimItem.coordDim; + + if (coordDim) { + if ("development" !== 'production') { + assert(VISUAL_DIMENSIONS.get(coordDim) == null); + } + + var coordDimIndex = dimItem.coordDimIndex; + getOrCreateEncodeArr(encode, coordDim)[coordDimIndex] = dimName; + + if (!dimItem.isExtraCoord) { + notExtraCoordDimMap.set(coordDim, 1); // Use the last coord dim (and label friendly) as default label, + // because when dataset is used, it is hard to guess which dimension + // can be value dimension. If both show x, y on label is not look good, + // and conventionally y axis is focused more. + + if (mayLabelDimType(dimItem.type)) { + defaultedLabel[0] = dimName; + } // User output encode do not contain generated coords. + // And it only has index. User can use index to retrieve value from the raw item array. + + + getOrCreateEncodeArr(userOutputEncode, coordDim)[coordDimIndex] = data.getDimensionIndex(dimItem.name); + } + + if (dimItem.defaultTooltip) { + defaultedTooltip.push(dimName); + } + } + + VISUAL_DIMENSIONS.each(function (v, otherDim) { + var encodeArr = getOrCreateEncodeArr(encode, otherDim); + var dimIndex = dimItem.otherDims[otherDim]; + + if (dimIndex != null && dimIndex !== false) { + encodeArr[dimIndex] = dimItem.name; + } + }); + }); + var dataDimsOnCoord = []; + var encodeFirstDimNotExtra = {}; + notExtraCoordDimMap.each(function (v, coordDim) { + var dimArr = encode[coordDim]; + encodeFirstDimNotExtra[coordDim] = dimArr[0]; // Not necessary to remove duplicate, because a data + // dim canot on more than one coordDim. + + dataDimsOnCoord = dataDimsOnCoord.concat(dimArr); + }); + summary.dataDimsOnCoord = dataDimsOnCoord; + summary.dataDimIndicesOnCoord = map(dataDimsOnCoord, function (dimName) { + return data.getDimensionInfo(dimName).storeDimIndex; + }); + summary.encodeFirstDimNotExtra = encodeFirstDimNotExtra; + var encodeLabel = encode.label; // FIXME `encode.label` is not recommanded, because formatter can not be set + // in this way. Use label.formatter instead. May be remove this approach someday. + + if (encodeLabel && encodeLabel.length) { + defaultedLabel = encodeLabel.slice(); + } + + var encodeTooltip = encode.tooltip; + + if (encodeTooltip && encodeTooltip.length) { + defaultedTooltip = encodeTooltip.slice(); + } else if (!defaultedTooltip.length) { + defaultedTooltip = defaultedLabel.slice(); + } + + encode.defaultedLabel = defaultedLabel; + encode.defaultedTooltip = defaultedTooltip; + summary.userOutput = new DimensionUserOuput(userOutputEncode, schema); + return summary; + } + + function getOrCreateEncodeArr(encode, dim) { + if (!encode.hasOwnProperty(dim)) { + encode[dim] = []; + } + + return encode[dim]; + } // FIXME:TS should be type `AxisType` + + + function getDimensionTypeByAxis(axisType) { + return axisType === 'category' ? 'ordinal' : axisType === 'time' ? 'time' : 'float'; + } + + function mayLabelDimType(dimType) { + // In most cases, ordinal and time do not suitable for label. + // Ordinal info can be displayed on axis. Time is too long. + return !(dimType === 'ordinal' || dimType === 'time'); + } // function findTheLastDimMayLabel(data) { + // // Get last value dim + // let dimensions = data.dimensions.slice(); + // let valueType; + // let valueDim; + // while (dimensions.length && ( + // valueDim = dimensions.pop(), + // valueType = data.getDimensionInfo(valueDim).type, + // valueType === 'ordinal' || valueType === 'time' + // )) {} // jshint ignore:line + // return valueDim; + // } + + var SeriesDimensionDefine = + /** @class */ + function () { + /** + * @param opt All of the fields will be shallow copied. + */ + function SeriesDimensionDefine(opt) { + /** + * The format of `otherDims` is: + * ```js + * { + * tooltip?: number + * label?: number + * itemName?: number + * seriesName?: number + * } + * ``` + * + * A `series.encode` can specified these fields: + * ```js + * encode: { + * // "3, 1, 5" is the index of data dimension. + * tooltip: [3, 1, 5], + * label: [0, 3], + * ... + * } + * ``` + * `otherDims` is the parse result of the `series.encode` above, like: + * ```js + * // Suppose the index of this data dimension is `3`. + * this.otherDims = { + * // `3` is at the index `0` of the `encode.tooltip` + * tooltip: 0, + * // `3` is at the index `1` of the `encode.label` + * label: 1 + * }; + * ``` + * + * This prop should never be `null`/`undefined` after initialized. + */ + this.otherDims = {}; + + if (opt != null) { + extend(this, opt); + } + } + + return SeriesDimensionDefine; + }(); + + var inner$4 = makeInner(); + var dimTypeShort = { + float: 'f', + int: 'i', + ordinal: 'o', + number: 'n', + time: 't' + }; + /** + * Represents the dimension requirement of a series. + * + * NOTICE: + * When there are too many dimensions in dataset and many series, only the used dimensions + * (i.e., used by coord sys and declared in `series.encode`) are add to `dimensionDefineList`. + * But users may query data by other unused dimension names. + * In this case, users can only query data if and only if they have defined dimension names + * via ec option, so we provide `getDimensionIndexFromSource`, which only query them from + * `source` dimensions. + */ + + var SeriesDataSchema = + /** @class */ + function () { + function SeriesDataSchema(opt) { + this.dimensions = opt.dimensions; + this._dimOmitted = opt.dimensionOmitted; + this.source = opt.source; + this._fullDimCount = opt.fullDimensionCount; + + this._updateDimOmitted(opt.dimensionOmitted); + } + + SeriesDataSchema.prototype.isDimensionOmitted = function () { + return this._dimOmitted; + }; + + SeriesDataSchema.prototype._updateDimOmitted = function (dimensionOmitted) { + this._dimOmitted = dimensionOmitted; + + if (!dimensionOmitted) { + return; + } + + if (!this._dimNameMap) { + this._dimNameMap = ensureSourceDimNameMap(this.source); + } + }; + /** + * @caution Can only be used when `dimensionOmitted: true`. + * + * Get index by user defined dimension name (i.e., not internal generate name). + * That is, get index from `dimensionsDefine`. + * If no `dimensionsDefine`, or no name get, return -1. + */ + + + SeriesDataSchema.prototype.getSourceDimensionIndex = function (dimName) { + return retrieve2(this._dimNameMap.get(dimName), -1); + }; + /** + * @caution Can only be used when `dimensionOmitted: true`. + * + * Notice: may return `null`/`undefined` if user not specify dimension names. + */ + + + SeriesDataSchema.prototype.getSourceDimension = function (dimIndex) { + var dimensionsDefine = this.source.dimensionsDefine; + + if (dimensionsDefine) { + return dimensionsDefine[dimIndex]; + } + }; + + SeriesDataSchema.prototype.makeStoreSchema = function () { + var dimCount = this._fullDimCount; + var willRetrieveDataByName = shouldRetrieveDataByName(this.source); + var makeHashStrict = !shouldOmitUnusedDimensions(dimCount); // If source don't have dimensions or series don't omit unsed dimensions. + // Generate from seriesDimList directly + + var dimHash = ''; + var dims = []; + + for (var fullDimIdx = 0, seriesDimIdx = 0; fullDimIdx < dimCount; fullDimIdx++) { + var property = void 0; + var type = void 0; + var ordinalMeta = void 0; + var seriesDimDef = this.dimensions[seriesDimIdx]; // The list has been sorted by `storeDimIndex` asc. + + if (seriesDimDef && seriesDimDef.storeDimIndex === fullDimIdx) { + property = willRetrieveDataByName ? seriesDimDef.name : null; + type = seriesDimDef.type; + ordinalMeta = seriesDimDef.ordinalMeta; + seriesDimIdx++; + } else { + var sourceDimDef = this.getSourceDimension(fullDimIdx); + + if (sourceDimDef) { + property = willRetrieveDataByName ? sourceDimDef.name : null; + type = sourceDimDef.type; + } + } + + dims.push({ + property: property, + type: type, + ordinalMeta: ordinalMeta + }); // If retrieving data by index, + // use <index, type, ordinalMeta> to determine whether data can be shared. + // (Becuase in this case there might be no dimension name defined in dataset, but indices always exists). + // (indices are always 0, 1, 2, ..., so we can ignore them to shorten the hash). + // Otherwise if retrieving data by property name (like `data: [{aa: 123, bb: 765}, ...]`), + // use <property, type, ordinalMeta> in hash. + + if (willRetrieveDataByName && property != null // For data stack, we have make sure each series has its own dim on this store. + // So we do not add property to hash to make sure they can share this store. + && (!seriesDimDef || !seriesDimDef.isCalculationCoord)) { + dimHash += makeHashStrict // Use escape character '`' in case that property name contains '$'. + ? property.replace(/\`/g, '`1').replace(/\$/g, '`2') // For better performance, when there are large dimensions, tolerant this defects that hardly meet. + : property; + } + + dimHash += '$'; + dimHash += dimTypeShort[type] || 'f'; + + if (ordinalMeta) { + dimHash += ordinalMeta.uid; + } + + dimHash += '$'; + } // Source from endpoint(usually series) will be read differently + // when seriesLayoutBy or startIndex(which is affected by sourceHeader) are different. + // So we use this three props as key. + + + var source = this.source; + var hash = [source.seriesLayoutBy, source.startIndex, dimHash].join('$$'); + return { + dimensions: dims, + hash: hash + }; + }; + + SeriesDataSchema.prototype.makeOutputDimensionNames = function () { + var result = []; + + for (var fullDimIdx = 0, seriesDimIdx = 0; fullDimIdx < this._fullDimCount; fullDimIdx++) { + var name_1 = void 0; + var seriesDimDef = this.dimensions[seriesDimIdx]; // The list has been sorted by `storeDimIndex` asc. + + if (seriesDimDef && seriesDimDef.storeDimIndex === fullDimIdx) { + if (!seriesDimDef.isCalculationCoord) { + name_1 = seriesDimDef.name; + } + + seriesDimIdx++; + } else { + var sourceDimDef = this.getSourceDimension(fullDimIdx); + + if (sourceDimDef) { + name_1 = sourceDimDef.name; + } + } + + result.push(name_1); + } + + return result; + }; + + SeriesDataSchema.prototype.appendCalculationDimension = function (dimDef) { + this.dimensions.push(dimDef); + dimDef.isCalculationCoord = true; + this._fullDimCount++; // If append dimension on a data store, consider the store + // might be shared by different series, series dimensions not + // really map to store dimensions. + + this._updateDimOmitted(true); + }; + + return SeriesDataSchema; + }(); + function isSeriesDataSchema(schema) { + return schema instanceof SeriesDataSchema; + } + function createDimNameMap(dimsDef) { + var dataDimNameMap = createHashMap(); + + for (var i = 0; i < (dimsDef || []).length; i++) { + var dimDefItemRaw = dimsDef[i]; + var userDimName = isObject(dimDefItemRaw) ? dimDefItemRaw.name : dimDefItemRaw; + + if (userDimName != null && dataDimNameMap.get(userDimName) == null) { + dataDimNameMap.set(userDimName, i); + } + } + + return dataDimNameMap; + } + function ensureSourceDimNameMap(source) { + var innerSource = inner$4(source); + return innerSource.dimNameMap || (innerSource.dimNameMap = createDimNameMap(source.dimensionsDefine)); + } + function shouldOmitUnusedDimensions(dimCount) { + return dimCount > 30; + } + + var isObject$2 = isObject; + var map$1 = map; + var CtorInt32Array$1 = typeof Int32Array === 'undefined' ? Array : Int32Array; // Use prefix to avoid index to be the same as otherIdList[idx], + // which will cause weird udpate animation. + + var ID_PREFIX = 'e\0\0'; + var INDEX_NOT_FOUND = -1; // type SeriesDimensionIndex = DimensionIndex; + + var TRANSFERABLE_PROPERTIES = ['hasItemOption', '_nameList', '_idList', '_invertedIndicesMap', '_dimSummary', 'userOutput', '_rawData', '_dimValueGetter', '_nameDimIdx', '_idDimIdx', '_nameRepeatCount']; + var CLONE_PROPERTIES = ['_approximateExtent']; // ----------------------------- + // Internal method declarations: + // ----------------------------- + + var prepareInvertedIndex; + var getId; + var getIdNameFromStore; + var normalizeDimensions; + var transferProperties; + var cloneListForMapAndSample; + var makeIdFromName; + + var SeriesData = + /** @class */ + function () { + /** + * @param dimensionsInput.dimensions + * For example, ['someDimName', {name: 'someDimName', type: 'someDimType'}, ...]. + * Dimensions should be concrete names like x, y, z, lng, lat, angle, radius + */ + function SeriesData(dimensionsInput, hostModel) { + this.type = 'list'; + this._dimOmitted = false; + this._nameList = []; + this._idList = []; // Models of data option is stored sparse for optimizing memory cost + // Never used yet (not used yet). + // private _optionModels: Model[] = []; + // Global visual properties after visual coding + + this._visual = {}; // Globel layout properties. + + this._layout = {}; // Item visual properties after visual coding + + this._itemVisuals = []; // Item layout properties after layout + + this._itemLayouts = []; // Graphic elemnents + + this._graphicEls = []; // key: dim, value: extent + + this._approximateExtent = {}; + this._calculationInfo = {}; // Having detected that there is data item is non primitive type + // (in type `OptionDataItemObject`). + // Like `data: [ { value: xx, itemStyle: {...} }, ...]` + // At present it only happen in `SOURCE_FORMAT_ORIGINAL`. + + this.hasItemOption = false; // Methods that create a new list based on this list should be listed here. + // Notice that those method should `RETURN` the new list. + + this.TRANSFERABLE_METHODS = ['cloneShallow', 'downSample', 'lttbDownSample', 'map']; // Methods that change indices of this list should be listed here. + + this.CHANGABLE_METHODS = ['filterSelf', 'selectRange']; + this.DOWNSAMPLE_METHODS = ['downSample', 'lttbDownSample']; + var dimensions; + var assignStoreDimIdx = false; + + if (isSeriesDataSchema(dimensionsInput)) { + dimensions = dimensionsInput.dimensions; + this._dimOmitted = dimensionsInput.isDimensionOmitted(); + this._schema = dimensionsInput; + } else { + assignStoreDimIdx = true; + dimensions = dimensionsInput; + } + + dimensions = dimensions || ['x', 'y']; + var dimensionInfos = {}; + var dimensionNames = []; + var invertedIndicesMap = {}; + var needsHasOwn = false; + var emptyObj = {}; + + for (var i = 0; i < dimensions.length; i++) { + // Use the original dimensions[i], where other flag props may exists. + var dimInfoInput = dimensions[i]; + var dimensionInfo = isString(dimInfoInput) ? new SeriesDimensionDefine({ + name: dimInfoInput + }) : !(dimInfoInput instanceof SeriesDimensionDefine) ? new SeriesDimensionDefine(dimInfoInput) : dimInfoInput; + var dimensionName = dimensionInfo.name; + dimensionInfo.type = dimensionInfo.type || 'float'; + + if (!dimensionInfo.coordDim) { + dimensionInfo.coordDim = dimensionName; + dimensionInfo.coordDimIndex = 0; + } + + var otherDims = dimensionInfo.otherDims = dimensionInfo.otherDims || {}; + dimensionNames.push(dimensionName); + dimensionInfos[dimensionName] = dimensionInfo; + + if (emptyObj[dimensionName] != null) { + needsHasOwn = true; + } + + if (dimensionInfo.createInvertedIndices) { + invertedIndicesMap[dimensionName] = []; + } + + if (otherDims.itemName === 0) { + this._nameDimIdx = i; + } + + if (otherDims.itemId === 0) { + this._idDimIdx = i; + } + + if ("development" !== 'production') { + assert(assignStoreDimIdx || dimensionInfo.storeDimIndex >= 0); + } + + if (assignStoreDimIdx) { + dimensionInfo.storeDimIndex = i; + } + } + + this.dimensions = dimensionNames; + this._dimInfos = dimensionInfos; + + this._initGetDimensionInfo(needsHasOwn); + + this.hostModel = hostModel; + this._invertedIndicesMap = invertedIndicesMap; + + if (this._dimOmitted) { + var dimIdxToName_1 = this._dimIdxToName = createHashMap(); + each(dimensionNames, function (dimName) { + dimIdxToName_1.set(dimensionInfos[dimName].storeDimIndex, dimName); + }); + } + } + /** + * + * Get concrete dimension name by dimension name or dimension index. + * If input a dimension name, do not validate whether the dimension name exits. + * + * @caution + * @param dim Must make sure the dimension is `SeriesDimensionLoose`. + * Because only those dimensions will have auto-generated dimension names if not + * have a user-specified name, and other dimensions will get a return of null/undefined. + * + * @notice Becuause of this reason, should better use `getDimensionIndex` instead, for examples: + * ```js + * const val = data.getStore().get(data.getDimensionIndex(dim), dataIdx); + * ``` + * + * @return Concrete dim name. + */ + + + SeriesData.prototype.getDimension = function (dim) { + var dimIdx = this._recognizeDimIndex(dim); + + if (dimIdx == null) { + return dim; + } + + dimIdx = dim; + + if (!this._dimOmitted) { + return this.dimensions[dimIdx]; + } // Retrieve from series dimension definition becuase it probably contains + // generated dimension name (like 'x', 'y'). + + + var dimName = this._dimIdxToName.get(dimIdx); + + if (dimName != null) { + return dimName; + } + + var sourceDimDef = this._schema.getSourceDimension(dimIdx); + + if (sourceDimDef) { + return sourceDimDef.name; + } + }; + /** + * Get dimension index in data store. Return -1 if not found. + * Can be used to index value from getRawValue. + */ + + + SeriesData.prototype.getDimensionIndex = function (dim) { + var dimIdx = this._recognizeDimIndex(dim); + + if (dimIdx != null) { + return dimIdx; + } + + if (dim == null) { + return -1; + } + + var dimInfo = this._getDimInfo(dim); + + return dimInfo ? dimInfo.storeDimIndex : this._dimOmitted ? this._schema.getSourceDimensionIndex(dim) : -1; + }; + /** + * The meanings of the input parameter `dim`: + * + * + If dim is a number (e.g., `1`), it means the index of the dimension. + * For example, `getDimension(0)` will return 'x' or 'lng' or 'radius'. + * + If dim is a number-like string (e.g., `"1"`): + * + If there is the same concrete dim name defined in `series.dimensions` or `dataset.dimensions`, + * it means that concrete name. + * + If not, it will be converted to a number, which means the index of the dimension. + * (why? because of the backward compatbility. We have been tolerating number-like string in + * dimension setting, although now it seems that it is not a good idea.) + * For example, `visualMap[i].dimension: "1"` is the same meaning as `visualMap[i].dimension: 1`, + * if no dimension name is defined as `"1"`. + * + If dim is a not-number-like string, it means the concrete dim name. + * For example, it can be be default name `"x"`, `"y"`, `"z"`, `"lng"`, `"lat"`, `"angle"`, `"radius"`, + * or customized in `dimensions` property of option like `"age"`. + * + * @return recogonized `DimensionIndex`. Otherwise return null/undefined (means that dim is `DimensionName`). + */ + + + SeriesData.prototype._recognizeDimIndex = function (dim) { + if (isNumber(dim) // If being a number-like string but not being defined as a dimension name. + || dim != null && !isNaN(dim) && !this._getDimInfo(dim) && (!this._dimOmitted || this._schema.getSourceDimensionIndex(dim) < 0)) { + return +dim; + } + }; + + SeriesData.prototype._getStoreDimIndex = function (dim) { + var dimIdx = this.getDimensionIndex(dim); + + if ("development" !== 'production') { + if (dimIdx == null) { + throw new Error('Unkown dimension ' + dim); + } + } + + return dimIdx; + }; + /** + * Get type and calculation info of particular dimension + * @param dim + * Dimension can be concrete names like x, y, z, lng, lat, angle, radius + * Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius' + */ + + + SeriesData.prototype.getDimensionInfo = function (dim) { + // Do not clone, because there may be categories in dimInfo. + return this._getDimInfo(this.getDimension(dim)); + }; + + SeriesData.prototype._initGetDimensionInfo = function (needsHasOwn) { + var dimensionInfos = this._dimInfos; + this._getDimInfo = needsHasOwn ? function (dimName) { + return dimensionInfos.hasOwnProperty(dimName) ? dimensionInfos[dimName] : undefined; + } : function (dimName) { + return dimensionInfos[dimName]; + }; + }; + /** + * concrete dimension name list on coord. + */ + + + SeriesData.prototype.getDimensionsOnCoord = function () { + return this._dimSummary.dataDimsOnCoord.slice(); + }; + + SeriesData.prototype.mapDimension = function (coordDim, idx) { + var dimensionsSummary = this._dimSummary; + + if (idx == null) { + return dimensionsSummary.encodeFirstDimNotExtra[coordDim]; + } + + var dims = dimensionsSummary.encode[coordDim]; + return dims ? dims[idx] : null; + }; + + SeriesData.prototype.mapDimensionsAll = function (coordDim) { + var dimensionsSummary = this._dimSummary; + var dims = dimensionsSummary.encode[coordDim]; + return (dims || []).slice(); + }; + + SeriesData.prototype.getStore = function () { + return this._store; + }; + /** + * Initialize from data + * @param data source or data or data store. + * @param nameList The name of a datum is used on data diff and + * default label/tooltip. + * A name can be specified in encode.itemName, + * or dataItem.name (only for series option data), + * or provided in nameList from outside. + */ + + + SeriesData.prototype.initData = function (data, nameList, dimValueGetter) { + var _this = this; + + var store; + + if (data instanceof DataStore) { + store = data; + } + + if (!store) { + var dimensions = this.dimensions; + var provider = isSourceInstance(data) || isArrayLike(data) ? new DefaultDataProvider(data, dimensions.length) : data; + store = new DataStore(); + var dimensionInfos = map$1(dimensions, function (dimName) { + return { + type: _this._dimInfos[dimName].type, + property: dimName + }; + }); + store.initData(provider, dimensionInfos, dimValueGetter); + } + + this._store = store; // Reset + + this._nameList = (nameList || []).slice(); + this._idList = []; + this._nameRepeatCount = {}; + + this._doInit(0, store.count()); // Cache summary info for fast visit. See "dimensionHelper". + // Needs to be initialized after store is prepared. + + + this._dimSummary = summarizeDimensions(this, this._schema); + this.userOutput = this._dimSummary.userOutput; + }; + /** + * Caution: Can be only called on raw data (before `this._indices` created). + */ + + + SeriesData.prototype.appendData = function (data) { + var range = this._store.appendData(data); + + this._doInit(range[0], range[1]); + }; + /** + * Caution: Can be only called on raw data (before `this._indices` created). + * This method does not modify `rawData` (`dataProvider`), but only + * add values to store. + * + * The final count will be increased by `Math.max(values.length, names.length)`. + * + * @param values That is the SourceType: 'arrayRows', like + * [ + * [12, 33, 44], + * [NaN, 43, 1], + * ['-', 'asdf', 0] + * ] + * Each item is exaclty cooresponding to a dimension. + */ + + + SeriesData.prototype.appendValues = function (values, names) { + var _a = this._store.appendValues(values, names.length), + start = _a.start, + end = _a.end; + + var shouldMakeIdFromName = this._shouldMakeIdFromName(); + + this._updateOrdinalMeta(); + + if (names) { + for (var idx = start; idx < end; idx++) { + var sourceIdx = idx - start; + this._nameList[idx] = names[sourceIdx]; + + if (shouldMakeIdFromName) { + makeIdFromName(this, idx); + } + } + } + }; + + SeriesData.prototype._updateOrdinalMeta = function () { + var store = this._store; + var dimensions = this.dimensions; + + for (var i = 0; i < dimensions.length; i++) { + var dimInfo = this._dimInfos[dimensions[i]]; + + if (dimInfo.ordinalMeta) { + store.collectOrdinalMeta(dimInfo.storeDimIndex, dimInfo.ordinalMeta); + } + } + }; + + SeriesData.prototype._shouldMakeIdFromName = function () { + var provider = this._store.getProvider(); + + return this._idDimIdx == null && provider.getSource().sourceFormat !== SOURCE_FORMAT_TYPED_ARRAY && !provider.fillStorage; + }; + + SeriesData.prototype._doInit = function (start, end) { + if (start >= end) { + return; + } + + var store = this._store; + var provider = store.getProvider(); + + this._updateOrdinalMeta(); + + var nameList = this._nameList; + var idList = this._idList; + var sourceFormat = provider.getSource().sourceFormat; + var isFormatOriginal = sourceFormat === SOURCE_FORMAT_ORIGINAL; // Each data item is value + // [1, 2] + // 2 + // Bar chart, line chart which uses category axis + // only gives the 'y' value. 'x' value is the indices of category + // Use a tempValue to normalize the value to be a (x, y) value + // If dataItem is {name: ...} or {id: ...}, it has highest priority. + // This kind of ids and names are always stored `_nameList` and `_idList`. + + if (isFormatOriginal && !provider.pure) { + var sharedDataItem = []; + + for (var idx = start; idx < end; idx++) { + // NOTICE: Try not to write things into dataItem + var dataItem = provider.getItem(idx, sharedDataItem); + + if (!this.hasItemOption && isDataItemOption(dataItem)) { + this.hasItemOption = true; + } + + if (dataItem) { + var itemName = dataItem.name; + + if (nameList[idx] == null && itemName != null) { + nameList[idx] = convertOptionIdName(itemName, null); + } + + var itemId = dataItem.id; + + if (idList[idx] == null && itemId != null) { + idList[idx] = convertOptionIdName(itemId, null); + } + } + } + } + + if (this._shouldMakeIdFromName()) { + for (var idx = start; idx < end; idx++) { + makeIdFromName(this, idx); + } + } + + prepareInvertedIndex(this); + }; + /** + * PENDING: In fact currently this function is only used to short-circuit + * the calling of `scale.unionExtentFromData` when data have been filtered by modules + * like "dataZoom". `scale.unionExtentFromData` is used to calculate data extent for series on + * an axis, but if a "axis related data filter module" is used, the extent of the axis have + * been fixed and no need to calling `scale.unionExtentFromData` actually. + * But if we add "custom data filter" in future, which is not "axis related", this method may + * be still needed. + * + * Optimize for the scenario that data is filtered by a given extent. + * Consider that if data amount is more than hundreds of thousand, + * extent calculation will cost more than 10ms and the cache will + * be erased because of the filtering. + */ + + + SeriesData.prototype.getApproximateExtent = function (dim) { + return this._approximateExtent[dim] || this._store.getDataExtent(this._getStoreDimIndex(dim)); + }; + /** + * Calculate extent on a filtered data might be time consuming. + * Approximate extent is only used for: calculte extent of filtered data outside. + */ + + + SeriesData.prototype.setApproximateExtent = function (extent, dim) { + dim = this.getDimension(dim); + this._approximateExtent[dim] = extent.slice(); + }; + + SeriesData.prototype.getCalculationInfo = function (key) { + return this._calculationInfo[key]; + }; + + SeriesData.prototype.setCalculationInfo = function (key, value) { + isObject$2(key) ? extend(this._calculationInfo, key) : this._calculationInfo[key] = value; + }; + /** + * @return Never be null/undefined. `number` will be converted to string. Becuase: + * In most cases, name is used in display, where returning a string is more convenient. + * In other cases, name is used in query (see `indexOfName`), where we can keep the + * rule that name `2` equals to name `'2'`. + */ + + + SeriesData.prototype.getName = function (idx) { + var rawIndex = this.getRawIndex(idx); + var name = this._nameList[rawIndex]; + + if (name == null && this._nameDimIdx != null) { + name = getIdNameFromStore(this, this._nameDimIdx, rawIndex); + } + + if (name == null) { + name = ''; + } + + return name; + }; + + SeriesData.prototype._getCategory = function (dimIdx, idx) { + var ordinal = this._store.get(dimIdx, idx); + + var ordinalMeta = this._store.getOrdinalMeta(dimIdx); + + if (ordinalMeta) { + return ordinalMeta.categories[ordinal]; + } + + return ordinal; + }; + /** + * @return Never null/undefined. `number` will be converted to string. Becuase: + * In all cases having encountered at present, id is used in making diff comparison, which + * are usually based on hash map. We can keep the rule that the internal id are always string + * (treat `2` is the same as `'2'`) to make the related logic simple. + */ + + + SeriesData.prototype.getId = function (idx) { + return getId(this, this.getRawIndex(idx)); + }; + + SeriesData.prototype.count = function () { + return this._store.count(); + }; + /** + * Get value. Return NaN if idx is out of range. + * + * @notice Should better to use `data.getStore().get(dimIndex, dataIdx)` instead. + */ + + + SeriesData.prototype.get = function (dim, idx) { + var store = this._store; + var dimInfo = this._dimInfos[dim]; + + if (dimInfo) { + return store.get(dimInfo.storeDimIndex, idx); + } + }; + /** + * @notice Should better to use `data.getStore().getByRawIndex(dimIndex, dataIdx)` instead. + */ + + + SeriesData.prototype.getByRawIndex = function (dim, rawIdx) { + var store = this._store; + var dimInfo = this._dimInfos[dim]; + + if (dimInfo) { + return store.getByRawIndex(dimInfo.storeDimIndex, rawIdx); + } + }; + + SeriesData.prototype.getIndices = function () { + return this._store.getIndices(); + }; + + SeriesData.prototype.getDataExtent = function (dim) { + return this._store.getDataExtent(this._getStoreDimIndex(dim)); + }; + + SeriesData.prototype.getSum = function (dim) { + return this._store.getSum(this._getStoreDimIndex(dim)); + }; + + SeriesData.prototype.getMedian = function (dim) { + return this._store.getMedian(this._getStoreDimIndex(dim)); + }; + + SeriesData.prototype.getValues = function (dimensions, idx) { + var _this = this; + + var store = this._store; + return isArray(dimensions) ? store.getValues(map$1(dimensions, function (dim) { + return _this._getStoreDimIndex(dim); + }), idx) : store.getValues(dimensions); + }; + /** + * If value is NaN. Inlcuding '-' + * Only check the coord dimensions. + */ + + + SeriesData.prototype.hasValue = function (idx) { + var dataDimIndicesOnCoord = this._dimSummary.dataDimIndicesOnCoord; + + for (var i = 0, len = dataDimIndicesOnCoord.length; i < len; i++) { + // Ordinal type originally can be string or number. + // But when an ordinal type is used on coord, it can + // not be string but only number. So we can also use isNaN. + if (isNaN(this._store.get(dataDimIndicesOnCoord[i], idx))) { + return false; + } + } + + return true; + }; + /** + * Retreive the index with given name + */ + + + SeriesData.prototype.indexOfName = function (name) { + for (var i = 0, len = this._store.count(); i < len; i++) { + if (this.getName(i) === name) { + return i; + } + } + + return -1; + }; + + SeriesData.prototype.getRawIndex = function (idx) { + return this._store.getRawIndex(idx); + }; + + SeriesData.prototype.indexOfRawIndex = function (rawIndex) { + return this._store.indexOfRawIndex(rawIndex); + }; + /** + * Only support the dimension which inverted index created. + * Do not support other cases until required. + * @param dim concrete dim + * @param value ordinal index + * @return rawIndex + */ + + + SeriesData.prototype.rawIndexOf = function (dim, value) { + var invertedIndices = dim && this._invertedIndicesMap[dim]; + + if ("development" !== 'production') { + if (!invertedIndices) { + throw new Error('Do not supported yet'); + } + } + + var rawIndex = invertedIndices[value]; + + if (rawIndex == null || isNaN(rawIndex)) { + return INDEX_NOT_FOUND; + } + + return rawIndex; + }; + /** + * Retreive the index of nearest value + * @param dim + * @param value + * @param [maxDistance=Infinity] + * @return If and only if multiple indices has + * the same value, they are put to the result. + */ + + + SeriesData.prototype.indicesOfNearest = function (dim, value, maxDistance) { + return this._store.indicesOfNearest(this._getStoreDimIndex(dim), value, maxDistance); + }; + + SeriesData.prototype.each = function (dims, cb, ctx) { + + if (isFunction(dims)) { + ctx = cb; + cb = dims; + dims = []; + } // ctxCompat just for compat echarts3 + + + var fCtx = ctx || this; + var dimIndices = map$1(normalizeDimensions(dims), this._getStoreDimIndex, this); + + this._store.each(dimIndices, fCtx ? bind(cb, fCtx) : cb); + }; + + SeriesData.prototype.filterSelf = function (dims, cb, ctx) { + + if (isFunction(dims)) { + ctx = cb; + cb = dims; + dims = []; + } // ctxCompat just for compat echarts3 + + + var fCtx = ctx || this; + var dimIndices = map$1(normalizeDimensions(dims), this._getStoreDimIndex, this); + this._store = this._store.filter(dimIndices, fCtx ? bind(cb, fCtx) : cb); + return this; + }; + /** + * Select data in range. (For optimization of filter) + * (Manually inline code, support 5 million data filtering in data zoom.) + */ + + + SeriesData.prototype.selectRange = function (range) { + + var _this = this; + + var innerRange = {}; + var dims = keys(range); + each(dims, function (dim) { + var dimIdx = _this._getStoreDimIndex(dim); + + innerRange[dimIdx] = range[dim]; + }); + this._store = this._store.selectRange(innerRange); + return this; + }; + /* eslint-enable max-len */ + + + SeriesData.prototype.mapArray = function (dims, cb, ctx) { + + if (isFunction(dims)) { + ctx = cb; + cb = dims; + dims = []; + } // ctxCompat just for compat echarts3 + + + ctx = ctx || this; + var result = []; + this.each(dims, function () { + result.push(cb && cb.apply(this, arguments)); + }, ctx); + return result; + }; + + SeriesData.prototype.map = function (dims, cb, ctx, ctxCompat) { + + var fCtx = ctx || ctxCompat || this; + var dimIndices = map$1(normalizeDimensions(dims), this._getStoreDimIndex, this); + var list = cloneListForMapAndSample(this); + list._store = this._store.map(dimIndices, fCtx ? bind(cb, fCtx) : cb); + return list; + }; + + SeriesData.prototype.modify = function (dims, cb, ctx, ctxCompat) { + var _this = this; // ctxCompat just for compat echarts3 + + + var fCtx = ctx || ctxCompat || this; + + if ("development" !== 'production') { + each(normalizeDimensions(dims), function (dim) { + var dimInfo = _this.getDimensionInfo(dim); + + if (!dimInfo.isCalculationCoord) { + console.error('Danger: only stack dimension can be modified'); + } + }); + } + + var dimIndices = map$1(normalizeDimensions(dims), this._getStoreDimIndex, this); // If do shallow clone here, if there are too many stacked series, + // it still cost lots of memory, becuase `_store.dimensions` are not shared. + // We should consider there probably be shallow clone happen in each sereis + // in consequent filter/map. + + this._store.modify(dimIndices, fCtx ? bind(cb, fCtx) : cb); + }; + /** + * Large data down sampling on given dimension + * @param sampleIndex Sample index for name and id + */ + + + SeriesData.prototype.downSample = function (dimension, rate, sampleValue, sampleIndex) { + var list = cloneListForMapAndSample(this); + list._store = this._store.downSample(this._getStoreDimIndex(dimension), rate, sampleValue, sampleIndex); + return list; + }; + /** + * Large data down sampling using largest-triangle-three-buckets + * @param {string} valueDimension + * @param {number} targetCount + */ + + + SeriesData.prototype.lttbDownSample = function (valueDimension, rate) { + var list = cloneListForMapAndSample(this); + list._store = this._store.lttbDownSample(this._getStoreDimIndex(valueDimension), rate); + return list; + }; + + SeriesData.prototype.getRawDataItem = function (idx) { + return this._store.getRawDataItem(idx); + }; + /** + * Get model of one data item. + */ + // TODO: Type of data item + + + SeriesData.prototype.getItemModel = function (idx) { + var hostModel = this.hostModel; + var dataItem = this.getRawDataItem(idx); + return new Model(dataItem, hostModel, hostModel && hostModel.ecModel); + }; + /** + * Create a data differ + */ + + + SeriesData.prototype.diff = function (otherList) { + var thisList = this; + return new DataDiffer(otherList ? otherList.getStore().getIndices() : [], this.getStore().getIndices(), function (idx) { + return getId(otherList, idx); + }, function (idx) { + return getId(thisList, idx); + }); + }; + /** + * Get visual property. + */ + + + SeriesData.prototype.getVisual = function (key) { + var visual = this._visual; + return visual && visual[key]; + }; + + SeriesData.prototype.setVisual = function (kvObj, val) { + this._visual = this._visual || {}; + + if (isObject$2(kvObj)) { + extend(this._visual, kvObj); + } else { + this._visual[kvObj] = val; + } + }; + /** + * Get visual property of single data item + */ + // eslint-disable-next-line + + + SeriesData.prototype.getItemVisual = function (idx, key) { + var itemVisual = this._itemVisuals[idx]; + var val = itemVisual && itemVisual[key]; + + if (val == null) { + // Use global visual property + return this.getVisual(key); + } + + return val; + }; + /** + * If exists visual property of single data item + */ + + + SeriesData.prototype.hasItemVisual = function () { + return this._itemVisuals.length > 0; + }; + /** + * Make sure itemVisual property is unique + */ + // TODO: use key to save visual to reduce memory. + + + SeriesData.prototype.ensureUniqueItemVisual = function (idx, key) { + var itemVisuals = this._itemVisuals; + var itemVisual = itemVisuals[idx]; + + if (!itemVisual) { + itemVisual = itemVisuals[idx] = {}; + } + + var val = itemVisual[key]; + + if (val == null) { + val = this.getVisual(key); // TODO Performance? + + if (isArray(val)) { + val = val.slice(); + } else if (isObject$2(val)) { + val = extend({}, val); + } + + itemVisual[key] = val; + } + + return val; + }; // eslint-disable-next-line + + + SeriesData.prototype.setItemVisual = function (idx, key, value) { + var itemVisual = this._itemVisuals[idx] || {}; + this._itemVisuals[idx] = itemVisual; + + if (isObject$2(key)) { + extend(itemVisual, key); + } else { + itemVisual[key] = value; + } + }; + /** + * Clear itemVisuals and list visual. + */ + + + SeriesData.prototype.clearAllVisual = function () { + this._visual = {}; + this._itemVisuals = []; + }; + + SeriesData.prototype.setLayout = function (key, val) { + isObject$2(key) ? extend(this._layout, key) : this._layout[key] = val; + }; + /** + * Get layout property. + */ + + + SeriesData.prototype.getLayout = function (key) { + return this._layout[key]; + }; + /** + * Get layout of single data item + */ + + + SeriesData.prototype.getItemLayout = function (idx) { + return this._itemLayouts[idx]; + }; + /** + * Set layout of single data item + */ + + + SeriesData.prototype.setItemLayout = function (idx, layout, merge) { + this._itemLayouts[idx] = merge ? extend(this._itemLayouts[idx] || {}, layout) : layout; + }; + /** + * Clear all layout of single data item + */ + + + SeriesData.prototype.clearItemLayouts = function () { + this._itemLayouts.length = 0; + }; + /** + * Set graphic element relative to data. It can be set as null + */ + + + SeriesData.prototype.setItemGraphicEl = function (idx, el) { + var seriesIndex = this.hostModel && this.hostModel.seriesIndex; + setCommonECData(seriesIndex, this.dataType, idx, el); + this._graphicEls[idx] = el; + }; + + SeriesData.prototype.getItemGraphicEl = function (idx) { + return this._graphicEls[idx]; + }; + + SeriesData.prototype.eachItemGraphicEl = function (cb, context) { + each(this._graphicEls, function (el, idx) { + if (el) { + cb && cb.call(context, el, idx); + } + }); + }; + /** + * Shallow clone a new list except visual and layout properties, and graph elements. + * New list only change the indices. + */ + + + SeriesData.prototype.cloneShallow = function (list) { + if (!list) { + list = new SeriesData(this._schema ? this._schema : map$1(this.dimensions, this._getDimInfo, this), this.hostModel); + } + + transferProperties(list, this); + list._store = this._store; + return list; + }; + /** + * Wrap some method to add more feature + */ + + + SeriesData.prototype.wrapMethod = function (methodName, injectFunction) { + var originalMethod = this[methodName]; + + if (!isFunction(originalMethod)) { + return; + } + + this.__wrappedMethods = this.__wrappedMethods || []; + + this.__wrappedMethods.push(methodName); + + this[methodName] = function () { + var res = originalMethod.apply(this, arguments); + return injectFunction.apply(this, [res].concat(slice(arguments))); + }; + }; // ---------------------------------------------------------- + // A work around for internal method visiting private member. + // ---------------------------------------------------------- + + + SeriesData.internalField = function () { + prepareInvertedIndex = function (data) { + var invertedIndicesMap = data._invertedIndicesMap; + each(invertedIndicesMap, function (invertedIndices, dim) { + var dimInfo = data._dimInfos[dim]; // Currently, only dimensions that has ordinalMeta can create inverted indices. + + var ordinalMeta = dimInfo.ordinalMeta; + var store = data._store; + + if (ordinalMeta) { + invertedIndices = invertedIndicesMap[dim] = new CtorInt32Array$1(ordinalMeta.categories.length); // The default value of TypedArray is 0. To avoid miss + // mapping to 0, we should set it as INDEX_NOT_FOUND. + + for (var i = 0; i < invertedIndices.length; i++) { + invertedIndices[i] = INDEX_NOT_FOUND; + } + + for (var i = 0; i < store.count(); i++) { + // Only support the case that all values are distinct. + invertedIndices[store.get(dimInfo.storeDimIndex, i)] = i; + } + } + }); + }; + + getIdNameFromStore = function (data, dimIdx, idx) { + return convertOptionIdName(data._getCategory(dimIdx, idx), null); + }; + /** + * @see the comment of `List['getId']`. + */ + + + getId = function (data, rawIndex) { + var id = data._idList[rawIndex]; + + if (id == null && data._idDimIdx != null) { + id = getIdNameFromStore(data, data._idDimIdx, rawIndex); + } + + if (id == null) { + id = ID_PREFIX + rawIndex; + } + + return id; + }; + + normalizeDimensions = function (dimensions) { + if (!isArray(dimensions)) { + dimensions = dimensions != null ? [dimensions] : []; + } + + return dimensions; + }; + /** + * Data in excludeDimensions is copied, otherwise transfered. + */ + + + cloneListForMapAndSample = function (original) { + var list = new SeriesData(original._schema ? original._schema : map$1(original.dimensions, original._getDimInfo, original), original.hostModel); // FIXME If needs stackedOn, value may already been stacked + + transferProperties(list, original); + return list; + }; + + transferProperties = function (target, source) { + each(TRANSFERABLE_PROPERTIES.concat(source.__wrappedMethods || []), function (propName) { + if (source.hasOwnProperty(propName)) { + target[propName] = source[propName]; + } + }); + target.__wrappedMethods = source.__wrappedMethods; + each(CLONE_PROPERTIES, function (propName) { + target[propName] = clone(source[propName]); + }); + target._calculationInfo = extend({}, source._calculationInfo); + }; + + makeIdFromName = function (data, idx) { + var nameList = data._nameList; + var idList = data._idList; + var nameDimIdx = data._nameDimIdx; + var idDimIdx = data._idDimIdx; + var name = nameList[idx]; + var id = idList[idx]; + + if (name == null && nameDimIdx != null) { + nameList[idx] = name = getIdNameFromStore(data, nameDimIdx, idx); + } + + if (id == null && idDimIdx != null) { + idList[idx] = id = getIdNameFromStore(data, idDimIdx, idx); + } + + if (id == null && name != null) { + var nameRepeatCount = data._nameRepeatCount; + var nmCnt = nameRepeatCount[name] = (nameRepeatCount[name] || 0) + 1; + id = name; + + if (nmCnt > 1) { + id += '__ec__' + nmCnt; + } + + idList[idx] = id; + } + }; + }(); + + return SeriesData; + }(); + + /** + * For outside usage compat (like echarts-gl are using it). + */ + + function createDimensions(source, opt) { + return prepareSeriesDataSchema(source, opt).dimensions; + } + /** + * This method builds the relationship between: + * + "what the coord sys or series requires (see `coordDimensions`)", + * + "what the user defines (in `encode` and `dimensions`, see `opt.dimensionsDefine` and `opt.encodeDefine`)" + * + "what the data source provids (see `source`)". + * + * Some guess strategy will be adapted if user does not define something. + * If no 'value' dimension specified, the first no-named dimension will be + * named as 'value'. + * + * @return The results are always sorted by `storeDimIndex` asc. + */ + + function prepareSeriesDataSchema( // TODO: TYPE completeDimensions type + source, opt) { + if (!isSourceInstance(source)) { + source = createSourceFromSeriesDataOption(source); + } + + opt = opt || {}; + var sysDims = opt.coordDimensions || []; + var dimsDef = opt.dimensionsDefine || source.dimensionsDefine || []; + var coordDimNameMap = createHashMap(); + var resultList = []; + var dimCount = getDimCount(source, sysDims, dimsDef, opt.dimensionsCount); // Try to ignore unsed dimensions if sharing a high dimension datastore + // 30 is an experience value. + + var omitUnusedDimensions = opt.canOmitUnusedDimensions && shouldOmitUnusedDimensions(dimCount); + var isUsingSourceDimensionsDef = dimsDef === source.dimensionsDefine; + var dataDimNameMap = isUsingSourceDimensionsDef ? ensureSourceDimNameMap(source) : createDimNameMap(dimsDef); + var encodeDef = opt.encodeDefine; + + if (!encodeDef && opt.encodeDefaulter) { + encodeDef = opt.encodeDefaulter(source, dimCount); + } + + var encodeDefMap = createHashMap(encodeDef); + var indicesMap = new CtorInt32Array(dimCount); + + for (var i = 0; i < indicesMap.length; i++) { + indicesMap[i] = -1; + } + + function getResultItem(dimIdx) { + var idx = indicesMap[dimIdx]; + + if (idx < 0) { + var dimDefItemRaw = dimsDef[dimIdx]; + var dimDefItem = isObject(dimDefItemRaw) ? dimDefItemRaw : { + name: dimDefItemRaw + }; + var resultItem = new SeriesDimensionDefine(); + var userDimName = dimDefItem.name; + + if (userDimName != null && dataDimNameMap.get(userDimName) != null) { + // Only if `series.dimensions` is defined in option + // displayName, will be set, and dimension will be diplayed vertically in + // tooltip by default. + resultItem.name = resultItem.displayName = userDimName; + } + + dimDefItem.type != null && (resultItem.type = dimDefItem.type); + dimDefItem.displayName != null && (resultItem.displayName = dimDefItem.displayName); + var newIdx = resultList.length; + indicesMap[dimIdx] = newIdx; + resultItem.storeDimIndex = dimIdx; + resultList.push(resultItem); + return resultItem; + } + + return resultList[idx]; + } + + if (!omitUnusedDimensions) { + for (var i = 0; i < dimCount; i++) { + getResultItem(i); + } + } // Set `coordDim` and `coordDimIndex` by `encodeDefMap` and normalize `encodeDefMap`. + + + encodeDefMap.each(function (dataDimsRaw, coordDim) { + var dataDims = normalizeToArray(dataDimsRaw).slice(); // Note: It is allowed that `dataDims.length` is `0`, e.g., options is + // `{encode: {x: -1, y: 1}}`. Should not filter anything in + // this case. + + if (dataDims.length === 1 && !isString(dataDims[0]) && dataDims[0] < 0) { + encodeDefMap.set(coordDim, false); + return; + } + + var validDataDims = encodeDefMap.set(coordDim, []); + each(dataDims, function (resultDimIdxOrName, idx) { + // The input resultDimIdx can be dim name or index. + var resultDimIdx = isString(resultDimIdxOrName) ? dataDimNameMap.get(resultDimIdxOrName) : resultDimIdxOrName; + + if (resultDimIdx != null && resultDimIdx < dimCount) { + validDataDims[idx] = resultDimIdx; + applyDim(getResultItem(resultDimIdx), coordDim, idx); + } + }); + }); // Apply templetes and default order from `sysDims`. + + var availDimIdx = 0; + each(sysDims, function (sysDimItemRaw) { + var coordDim; + var sysDimItemDimsDef; + var sysDimItemOtherDims; + var sysDimItem; + + if (isString(sysDimItemRaw)) { + coordDim = sysDimItemRaw; + sysDimItem = {}; + } else { + sysDimItem = sysDimItemRaw; + coordDim = sysDimItem.name; + var ordinalMeta = sysDimItem.ordinalMeta; + sysDimItem.ordinalMeta = null; + sysDimItem = extend({}, sysDimItem); + sysDimItem.ordinalMeta = ordinalMeta; // `coordDimIndex` should not be set directly. + + sysDimItemDimsDef = sysDimItem.dimsDef; + sysDimItemOtherDims = sysDimItem.otherDims; + sysDimItem.name = sysDimItem.coordDim = sysDimItem.coordDimIndex = sysDimItem.dimsDef = sysDimItem.otherDims = null; + } + + var dataDims = encodeDefMap.get(coordDim); // negative resultDimIdx means no need to mapping. + + if (dataDims === false) { + return; + } + + dataDims = normalizeToArray(dataDims); // dimensions provides default dim sequences. + + if (!dataDims.length) { + for (var i = 0; i < (sysDimItemDimsDef && sysDimItemDimsDef.length || 1); i++) { + while (availDimIdx < dimCount && getResultItem(availDimIdx).coordDim != null) { + availDimIdx++; + } + + availDimIdx < dimCount && dataDims.push(availDimIdx++); + } + } // Apply templates. + + + each(dataDims, function (resultDimIdx, coordDimIndex) { + var resultItem = getResultItem(resultDimIdx); // Coordinate system has a higher priority on dim type than source. + + if (isUsingSourceDimensionsDef && sysDimItem.type != null) { + resultItem.type = sysDimItem.type; + } + + applyDim(defaults(resultItem, sysDimItem), coordDim, coordDimIndex); + + if (resultItem.name == null && sysDimItemDimsDef) { + var sysDimItemDimsDefItem = sysDimItemDimsDef[coordDimIndex]; + !isObject(sysDimItemDimsDefItem) && (sysDimItemDimsDefItem = { + name: sysDimItemDimsDefItem + }); + resultItem.name = resultItem.displayName = sysDimItemDimsDefItem.name; + resultItem.defaultTooltip = sysDimItemDimsDefItem.defaultTooltip; + } // FIXME refactor, currently only used in case: {otherDims: {tooltip: false}} + + + sysDimItemOtherDims && defaults(resultItem.otherDims, sysDimItemOtherDims); + }); + }); + + function applyDim(resultItem, coordDim, coordDimIndex) { + if (VISUAL_DIMENSIONS.get(coordDim) != null) { + resultItem.otherDims[coordDim] = coordDimIndex; + } else { + resultItem.coordDim = coordDim; + resultItem.coordDimIndex = coordDimIndex; + coordDimNameMap.set(coordDim, true); + } + } // Make sure the first extra dim is 'value'. + + + var generateCoord = opt.generateCoord; + var generateCoordCount = opt.generateCoordCount; + var fromZero = generateCoordCount != null; + generateCoordCount = generateCoord ? generateCoordCount || 1 : 0; + var extra = generateCoord || 'value'; + + function ifNoNameFillWithCoordName(resultItem) { + if (resultItem.name == null) { + // Duplication will be removed in the next step. + resultItem.name = resultItem.coordDim; + } + } // Set dim `name` and other `coordDim` and other props. + + + if (!omitUnusedDimensions) { + for (var resultDimIdx = 0; resultDimIdx < dimCount; resultDimIdx++) { + var resultItem = getResultItem(resultDimIdx); + var coordDim = resultItem.coordDim; + + if (coordDim == null) { + // TODO no need to generate coordDim for isExtraCoord? + resultItem.coordDim = genCoordDimName(extra, coordDimNameMap, fromZero); + resultItem.coordDimIndex = 0; // Series specified generateCoord is using out. + + if (!generateCoord || generateCoordCount <= 0) { + resultItem.isExtraCoord = true; + } + + generateCoordCount--; + } + + ifNoNameFillWithCoordName(resultItem); + + if (resultItem.type == null && (guessOrdinal(source, resultDimIdx) === BE_ORDINAL.Must // Consider the case: + // { + // dataset: {source: [ + // ['2001', 123], + // ['2002', 456], + // ... + // ['The others', 987], + // ]}, + // series: {type: 'pie'} + // } + // The first colum should better be treated as a "ordinal" although it + // might not able to be detected as an "ordinal" by `guessOrdinal`. + || resultItem.isExtraCoord && (resultItem.otherDims.itemName != null || resultItem.otherDims.seriesName != null))) { + resultItem.type = 'ordinal'; + } + } + } else { + each(resultList, function (resultItem) { + // PENDING: guessOrdinal or let user specify type: 'ordinal' manually? + ifNoNameFillWithCoordName(resultItem); + }); // Sort dimensions: there are some rule that use the last dim as label, + // and for some latter travel process easier. + + resultList.sort(function (item0, item1) { + return item0.storeDimIndex - item1.storeDimIndex; + }); + } + + removeDuplication(resultList); + return new SeriesDataSchema({ + source: source, + dimensions: resultList, + fullDimensionCount: dimCount, + dimensionOmitted: omitUnusedDimensions + }); + } + + function removeDuplication(result) { + var duplicationMap = createHashMap(); + + for (var i = 0; i < result.length; i++) { + var dim = result[i]; + var dimOriginalName = dim.name; + var count = duplicationMap.get(dimOriginalName) || 0; + + if (count > 0) { + // Starts from 0. + dim.name = dimOriginalName + (count - 1); + } + + count++; + duplicationMap.set(dimOriginalName, count); + } + } // ??? TODO + // Originally detect dimCount by data[0]. Should we + // optimize it to only by sysDims and dimensions and encode. + // So only necessary dims will be initialized. + // But + // (1) custom series should be considered. where other dims + // may be visited. + // (2) sometimes user need to calcualte bubble size or use visualMap + // on other dimensions besides coordSys needed. + // So, dims that is not used by system, should be shared in data store? + + + function getDimCount(source, sysDims, dimsDef, optDimCount) { + // Note that the result dimCount should not small than columns count + // of data, otherwise `dataDimNameMap` checking will be incorrect. + var dimCount = Math.max(source.dimensionsDetectedCount || 1, sysDims.length, dimsDef.length, optDimCount || 0); + each(sysDims, function (sysDimItem) { + var sysDimItemDimsDef; + + if (isObject(sysDimItem) && (sysDimItemDimsDef = sysDimItem.dimsDef)) { + dimCount = Math.max(dimCount, sysDimItemDimsDef.length); + } + }); + return dimCount; + } + + function genCoordDimName(name, map, fromZero) { + var mapData = map.data; + + if (fromZero || mapData.hasOwnProperty(name)) { + var i = 0; + + while (mapData.hasOwnProperty(name + i)) { + i++; + } + + name += i; + } + + map.set(name, true); + return name; + } + + /** + * @class + * For example: + * { + * coordSysName: 'cartesian2d', + * coordSysDims: ['x', 'y', ...], + * axisMap: HashMap({ + * x: xAxisModel, + * y: yAxisModel + * }), + * categoryAxisMap: HashMap({ + * x: xAxisModel, + * y: undefined + * }), + * // The index of the first category axis in `coordSysDims`. + * // `null/undefined` means no category axis exists. + * firstCategoryDimIndex: 1, + * // To replace user specified encode. + * } + */ + + var CoordSysInfo = + /** @class */ + function () { + function CoordSysInfo(coordSysName) { + this.coordSysDims = []; + this.axisMap = createHashMap(); + this.categoryAxisMap = createHashMap(); + this.coordSysName = coordSysName; + } + + return CoordSysInfo; + }(); + + function getCoordSysInfoBySeries(seriesModel) { + var coordSysName = seriesModel.get('coordinateSystem'); + var result = new CoordSysInfo(coordSysName); + var fetch = fetchers[coordSysName]; + + if (fetch) { + fetch(seriesModel, result, result.axisMap, result.categoryAxisMap); + return result; + } + } + var fetchers = { + cartesian2d: function (seriesModel, result, axisMap, categoryAxisMap) { + var xAxisModel = seriesModel.getReferringComponents('xAxis', SINGLE_REFERRING).models[0]; + var yAxisModel = seriesModel.getReferringComponents('yAxis', SINGLE_REFERRING).models[0]; + + if ("development" !== 'production') { + if (!xAxisModel) { + throw new Error('xAxis "' + retrieve(seriesModel.get('xAxisIndex'), seriesModel.get('xAxisId'), 0) + '" not found'); + } + + if (!yAxisModel) { + throw new Error('yAxis "' + retrieve(seriesModel.get('xAxisIndex'), seriesModel.get('yAxisId'), 0) + '" not found'); + } + } + + result.coordSysDims = ['x', 'y']; + axisMap.set('x', xAxisModel); + axisMap.set('y', yAxisModel); + + if (isCategory(xAxisModel)) { + categoryAxisMap.set('x', xAxisModel); + result.firstCategoryDimIndex = 0; + } + + if (isCategory(yAxisModel)) { + categoryAxisMap.set('y', yAxisModel); + result.firstCategoryDimIndex == null && (result.firstCategoryDimIndex = 1); + } + }, + singleAxis: function (seriesModel, result, axisMap, categoryAxisMap) { + var singleAxisModel = seriesModel.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0]; + + if ("development" !== 'production') { + if (!singleAxisModel) { + throw new Error('singleAxis should be specified.'); + } + } + + result.coordSysDims = ['single']; + axisMap.set('single', singleAxisModel); + + if (isCategory(singleAxisModel)) { + categoryAxisMap.set('single', singleAxisModel); + result.firstCategoryDimIndex = 0; + } + }, + polar: function (seriesModel, result, axisMap, categoryAxisMap) { + var polarModel = seriesModel.getReferringComponents('polar', SINGLE_REFERRING).models[0]; + var radiusAxisModel = polarModel.findAxisModel('radiusAxis'); + var angleAxisModel = polarModel.findAxisModel('angleAxis'); + + if ("development" !== 'production') { + if (!angleAxisModel) { + throw new Error('angleAxis option not found'); + } + + if (!radiusAxisModel) { + throw new Error('radiusAxis option not found'); + } + } + + result.coordSysDims = ['radius', 'angle']; + axisMap.set('radius', radiusAxisModel); + axisMap.set('angle', angleAxisModel); + + if (isCategory(radiusAxisModel)) { + categoryAxisMap.set('radius', radiusAxisModel); + result.firstCategoryDimIndex = 0; + } + + if (isCategory(angleAxisModel)) { + categoryAxisMap.set('angle', angleAxisModel); + result.firstCategoryDimIndex == null && (result.firstCategoryDimIndex = 1); + } + }, + geo: function (seriesModel, result, axisMap, categoryAxisMap) { + result.coordSysDims = ['lng', 'lat']; + }, + parallel: function (seriesModel, result, axisMap, categoryAxisMap) { + var ecModel = seriesModel.ecModel; + var parallelModel = ecModel.getComponent('parallel', seriesModel.get('parallelIndex')); + var coordSysDims = result.coordSysDims = parallelModel.dimensions.slice(); + each(parallelModel.parallelAxisIndex, function (axisIndex, index) { + var axisModel = ecModel.getComponent('parallelAxis', axisIndex); + var axisDim = coordSysDims[index]; + axisMap.set(axisDim, axisModel); + + if (isCategory(axisModel)) { + categoryAxisMap.set(axisDim, axisModel); + + if (result.firstCategoryDimIndex == null) { + result.firstCategoryDimIndex = index; + } + } + }); + } + }; + + function isCategory(axisModel) { + return axisModel.get('type') === 'category'; + } + + /** + * Note that it is too complicated to support 3d stack by value + * (have to create two-dimension inverted index), so in 3d case + * we just support that stacked by index. + * + * @param seriesModel + * @param dimensionsInput The same as the input of <module:echarts/data/SeriesData>. + * The input will be modified. + * @param opt + * @param opt.stackedCoordDimension Specify a coord dimension if needed. + * @param opt.byIndex=false + * @return calculationInfo + * { + * stackedDimension: string + * stackedByDimension: string + * isStackedByIndex: boolean + * stackedOverDimension: string + * stackResultDimension: string + * } + */ + + function enableDataStack(seriesModel, dimensionsInput, opt) { + opt = opt || {}; + var byIndex = opt.byIndex; + var stackedCoordDimension = opt.stackedCoordDimension; + var dimensionDefineList; + var schema; + var store; + + if (isLegacyDimensionsInput(dimensionsInput)) { + dimensionDefineList = dimensionsInput; + } else { + schema = dimensionsInput.schema; + dimensionDefineList = schema.dimensions; + store = dimensionsInput.store; + } // Compatibal: when `stack` is set as '', do not stack. + + + var mayStack = !!(seriesModel && seriesModel.get('stack')); + var stackedByDimInfo; + var stackedDimInfo; + var stackResultDimension; + var stackedOverDimension; + each(dimensionDefineList, function (dimensionInfo, index) { + if (isString(dimensionInfo)) { + dimensionDefineList[index] = dimensionInfo = { + name: dimensionInfo + }; + } + + if (mayStack && !dimensionInfo.isExtraCoord) { + // Find the first ordinal dimension as the stackedByDimInfo. + if (!byIndex && !stackedByDimInfo && dimensionInfo.ordinalMeta) { + stackedByDimInfo = dimensionInfo; + } // Find the first stackable dimension as the stackedDimInfo. + + + if (!stackedDimInfo && dimensionInfo.type !== 'ordinal' && dimensionInfo.type !== 'time' && (!stackedCoordDimension || stackedCoordDimension === dimensionInfo.coordDim)) { + stackedDimInfo = dimensionInfo; + } + } + }); + + if (stackedDimInfo && !byIndex && !stackedByDimInfo) { + // Compatible with previous design, value axis (time axis) only stack by index. + // It may make sense if the user provides elaborately constructed data. + byIndex = true; + } // Add stack dimension, they can be both calculated by coordinate system in `unionExtent`. + // That put stack logic in List is for using conveniently in echarts extensions, but it + // might not be a good way. + + + if (stackedDimInfo) { + // Use a weird name that not duplicated with other names. + // Also need to use seriesModel.id as postfix because different + // series may share same data store. The stack dimension needs to be distinguished. + stackResultDimension = '__\0ecstackresult_' + seriesModel.id; + stackedOverDimension = '__\0ecstackedover_' + seriesModel.id; // Create inverted index to fast query index by value. + + if (stackedByDimInfo) { + stackedByDimInfo.createInvertedIndices = true; + } + + var stackedDimCoordDim_1 = stackedDimInfo.coordDim; + var stackedDimType = stackedDimInfo.type; + var stackedDimCoordIndex_1 = 0; + each(dimensionDefineList, function (dimensionInfo) { + if (dimensionInfo.coordDim === stackedDimCoordDim_1) { + stackedDimCoordIndex_1++; + } + }); + var stackedOverDimensionDefine = { + name: stackResultDimension, + coordDim: stackedDimCoordDim_1, + coordDimIndex: stackedDimCoordIndex_1, + type: stackedDimType, + isExtraCoord: true, + isCalculationCoord: true, + storeDimIndex: dimensionDefineList.length + }; + var stackResultDimensionDefine = { + name: stackedOverDimension, + // This dimension contains stack base (generally, 0), so do not set it as + // `stackedDimCoordDim` to avoid extent calculation, consider log scale. + coordDim: stackedOverDimension, + coordDimIndex: stackedDimCoordIndex_1 + 1, + type: stackedDimType, + isExtraCoord: true, + isCalculationCoord: true, + storeDimIndex: dimensionDefineList.length + 1 + }; + + if (schema) { + if (store) { + stackedOverDimensionDefine.storeDimIndex = store.ensureCalculationDimension(stackedOverDimension, stackedDimType); + stackResultDimensionDefine.storeDimIndex = store.ensureCalculationDimension(stackResultDimension, stackedDimType); + } + + schema.appendCalculationDimension(stackedOverDimensionDefine); + schema.appendCalculationDimension(stackResultDimensionDefine); + } else { + dimensionDefineList.push(stackedOverDimensionDefine); + dimensionDefineList.push(stackResultDimensionDefine); + } + } + + return { + stackedDimension: stackedDimInfo && stackedDimInfo.name, + stackedByDimension: stackedByDimInfo && stackedByDimInfo.name, + isStackedByIndex: byIndex, + stackedOverDimension: stackedOverDimension, + stackResultDimension: stackResultDimension + }; + } + + function isLegacyDimensionsInput(dimensionsInput) { + return !isSeriesDataSchema(dimensionsInput.schema); + } + + function isDimensionStacked(data, stackedDim) { + // Each single series only maps to one pair of axis. So we do not need to + // check stackByDim, whatever stacked by a dimension or stacked by index. + return !!stackedDim && stackedDim === data.getCalculationInfo('stackedDimension'); + } + function getStackedDimension(data, targetDim) { + return isDimensionStacked(data, targetDim) ? data.getCalculationInfo('stackResultDimension') : targetDim; + } + + function getCoordSysDimDefs(seriesModel, coordSysInfo) { + var coordSysName = seriesModel.get('coordinateSystem'); + var registeredCoordSys = CoordinateSystemManager.get(coordSysName); + var coordSysDimDefs; + + if (coordSysInfo && coordSysInfo.coordSysDims) { + coordSysDimDefs = map(coordSysInfo.coordSysDims, function (dim) { + var dimInfo = { + name: dim + }; + var axisModel = coordSysInfo.axisMap.get(dim); + + if (axisModel) { + var axisType = axisModel.get('type'); + dimInfo.type = getDimensionTypeByAxis(axisType); + } + + return dimInfo; + }); + } + + if (!coordSysDimDefs) { + // Get dimensions from registered coordinate system + coordSysDimDefs = registeredCoordSys && (registeredCoordSys.getDimensionsInfo ? registeredCoordSys.getDimensionsInfo() : registeredCoordSys.dimensions.slice()) || ['x', 'y']; + } + + return coordSysDimDefs; + } + + function injectOrdinalMeta(dimInfoList, createInvertedIndices, coordSysInfo) { + var firstCategoryDimIndex; + var hasNameEncode; + coordSysInfo && each(dimInfoList, function (dimInfo, dimIndex) { + var coordDim = dimInfo.coordDim; + var categoryAxisModel = coordSysInfo.categoryAxisMap.get(coordDim); + + if (categoryAxisModel) { + if (firstCategoryDimIndex == null) { + firstCategoryDimIndex = dimIndex; + } + + dimInfo.ordinalMeta = categoryAxisModel.getOrdinalMeta(); + + if (createInvertedIndices) { + dimInfo.createInvertedIndices = true; + } + } + + if (dimInfo.otherDims.itemName != null) { + hasNameEncode = true; + } + }); + + if (!hasNameEncode && firstCategoryDimIndex != null) { + dimInfoList[firstCategoryDimIndex].otherDims.itemName = 0; + } + + return firstCategoryDimIndex; + } + /** + * Caution: there are side effects to `sourceManager` in this method. + * Should better only be called in `Series['getInitialData']`. + */ + + + function createSeriesData(sourceRaw, seriesModel, opt) { + opt = opt || {}; + var sourceManager = seriesModel.getSourceManager(); + var source; + var isOriginalSource = false; + + if (sourceRaw) { + isOriginalSource = true; + source = createSourceFromSeriesDataOption(sourceRaw); + } else { + source = sourceManager.getSource(); // Is series.data. not dataset. + + isOriginalSource = source.sourceFormat === SOURCE_FORMAT_ORIGINAL; + } + + var coordSysInfo = getCoordSysInfoBySeries(seriesModel); + var coordSysDimDefs = getCoordSysDimDefs(seriesModel, coordSysInfo); + var useEncodeDefaulter = opt.useEncodeDefaulter; + var encodeDefaulter = isFunction(useEncodeDefaulter) ? useEncodeDefaulter : useEncodeDefaulter ? curry(makeSeriesEncodeForAxisCoordSys, coordSysDimDefs, seriesModel) : null; + var createDimensionOptions = { + coordDimensions: coordSysDimDefs, + generateCoord: opt.generateCoord, + encodeDefine: seriesModel.getEncode(), + encodeDefaulter: encodeDefaulter, + canOmitUnusedDimensions: !isOriginalSource + }; + var schema = prepareSeriesDataSchema(source, createDimensionOptions); + var firstCategoryDimIndex = injectOrdinalMeta(schema.dimensions, opt.createInvertedIndices, coordSysInfo); + var store = !isOriginalSource ? sourceManager.getSharedDataStore(schema) : null; + var stackCalculationInfo = enableDataStack(seriesModel, { + schema: schema, + store: store + }); + var data = new SeriesData(schema, seriesModel); + data.setCalculationInfo(stackCalculationInfo); + var dimValueGetter = firstCategoryDimIndex != null && isNeedCompleteOrdinalData(source) ? function (itemOpt, dimName, dataIndex, dimIndex) { + // Use dataIndex as ordinal value in categoryAxis + return dimIndex === firstCategoryDimIndex ? dataIndex : this.defaultDimValueGetter(itemOpt, dimName, dataIndex, dimIndex); + } : null; + data.hasItemOption = false; + data.initData( // Try to reuse the data store in sourceManager if using dataset. + isOriginalSource ? source : store, null, dimValueGetter); + return data; + } + + function isNeedCompleteOrdinalData(source) { + if (source.sourceFormat === SOURCE_FORMAT_ORIGINAL) { + var sampleItem = firstDataNotNull(source.data || []); + return !isArray(getDataItemValue(sampleItem)); + } + } + + function firstDataNotNull(arr) { + var i = 0; + + while (i < arr.length && arr[i] == null) { + i++; + } + + return arr[i]; + } + + var Scale = + /** @class */ + function () { + function Scale(setting) { + this._setting = setting || {}; + this._extent = [Infinity, -Infinity]; + } + + Scale.prototype.getSetting = function (name) { + return this._setting[name]; + }; + /** + * Set extent from data + */ + + + Scale.prototype.unionExtent = function (other) { + var extent = this._extent; + other[0] < extent[0] && (extent[0] = other[0]); + other[1] > extent[1] && (extent[1] = other[1]); // not setExtent because in log axis it may transformed to power + // this.setExtent(extent[0], extent[1]); + }; + /** + * Set extent from data + */ + + + Scale.prototype.unionExtentFromData = function (data, dim) { + this.unionExtent(data.getApproximateExtent(dim)); + }; + /** + * Get extent + * + * Extent is always in increase order. + */ + + + Scale.prototype.getExtent = function () { + return this._extent.slice(); + }; + /** + * Set extent + */ + + + Scale.prototype.setExtent = function (start, end) { + var thisExtent = this._extent; + + if (!isNaN(start)) { + thisExtent[0] = start; + } + + if (!isNaN(end)) { + thisExtent[1] = end; + } + }; + /** + * If value is in extent range + */ + + + Scale.prototype.isInExtentRange = function (value) { + return this._extent[0] <= value && this._extent[1] >= value; + }; + /** + * When axis extent depends on data and no data exists, + * axis ticks should not be drawn, which is named 'blank'. + */ + + + Scale.prototype.isBlank = function () { + return this._isBlank; + }; + /** + * When axis extent depends on data and no data exists, + * axis ticks should not be drawn, which is named 'blank'. + */ + + + Scale.prototype.setBlank = function (isBlank) { + this._isBlank = isBlank; + }; + + return Scale; + }(); + + enableClassManagement(Scale); + + var uidBase = 0; + + var OrdinalMeta = + /** @class */ + function () { + function OrdinalMeta(opt) { + this.categories = opt.categories || []; + this._needCollect = opt.needCollect; + this._deduplication = opt.deduplication; + this.uid = ++uidBase; + } + + OrdinalMeta.createByAxisModel = function (axisModel) { + var option = axisModel.option; + var data = option.data; + var categories = data && map(data, getName); + return new OrdinalMeta({ + categories: categories, + needCollect: !categories, + // deduplication is default in axis. + deduplication: option.dedplication !== false + }); + }; + + OrdinalMeta.prototype.getOrdinal = function (category) { + // @ts-ignore + return this._getOrCreateMap().get(category); + }; + /** + * @return The ordinal. If not found, return NaN. + */ + + + OrdinalMeta.prototype.parseAndCollect = function (category) { + var index; + var needCollect = this._needCollect; // The value of category dim can be the index of the given category set. + // This feature is only supported when !needCollect, because we should + // consider a common case: a value is 2017, which is a number but is + // expected to be tread as a category. This case usually happen in dataset, + // where it happent to be no need of the index feature. + + if (!isString(category) && !needCollect) { + return category; + } // Optimize for the scenario: + // category is ['2012-01-01', '2012-01-02', ...], where the input + // data has been ensured not duplicate and is large data. + // Notice, if a dataset dimension provide categroies, usually echarts + // should remove duplication except user tell echarts dont do that + // (set axis.deduplication = false), because echarts do not know whether + // the values in the category dimension has duplication (consider the + // parallel-aqi example) + + + if (needCollect && !this._deduplication) { + index = this.categories.length; + this.categories[index] = category; + return index; + } + + var map = this._getOrCreateMap(); // @ts-ignore + + + index = map.get(category); + + if (index == null) { + if (needCollect) { + index = this.categories.length; + this.categories[index] = category; // @ts-ignore + + map.set(category, index); + } else { + index = NaN; + } + } + + return index; + }; // Consider big data, do not create map until needed. + + + OrdinalMeta.prototype._getOrCreateMap = function () { + return this._map || (this._map = createHashMap(this.categories)); + }; + + return OrdinalMeta; + }(); + + function getName(obj) { + if (isObject(obj) && obj.value != null) { + return obj.value; + } else { + return obj + ''; + } + } + + function isValueNice(val) { + var exp10 = Math.pow(10, quantityExponent(Math.abs(val))); + var f = Math.abs(val / exp10); + return f === 0 || f === 1 || f === 2 || f === 3 || f === 5; + } + function isIntervalOrLogScale(scale) { + return scale.type === 'interval' || scale.type === 'log'; + } + /** + * @param extent Both extent[0] and extent[1] should be valid number. + * Should be extent[0] < extent[1]. + * @param splitNumber splitNumber should be >= 1. + */ + + function intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval) { + var result = {}; + var span = extent[1] - extent[0]; + var interval = result.interval = nice(span / splitNumber, true); + + if (minInterval != null && interval < minInterval) { + interval = result.interval = minInterval; + } + + if (maxInterval != null && interval > maxInterval) { + interval = result.interval = maxInterval; + } // Tow more digital for tick. + + + var precision = result.intervalPrecision = getIntervalPrecision(interval); // Niced extent inside original extent + + var niceTickExtent = result.niceTickExtent = [round(Math.ceil(extent[0] / interval) * interval, precision), round(Math.floor(extent[1] / interval) * interval, precision)]; + fixExtent(niceTickExtent, extent); + return result; + } + function increaseInterval(interval) { + var exp10 = Math.pow(10, quantityExponent(interval)); // Increase interval + + var f = interval / exp10; + + if (!f) { + f = 1; + } else if (f === 2) { + f = 3; + } else if (f === 3) { + f = 5; + } else { + // f is 1 or 5 + f *= 2; + } + + return round(f * exp10); + } + /** + * @return interval precision + */ + + function getIntervalPrecision(interval) { + // Tow more digital for tick. + return getPrecision(interval) + 2; + } + + function clamp(niceTickExtent, idx, extent) { + niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]); + } // In some cases (e.g., splitNumber is 1), niceTickExtent may be out of extent. + + + function fixExtent(niceTickExtent, extent) { + !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]); + !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]); + clamp(niceTickExtent, 0, extent); + clamp(niceTickExtent, 1, extent); + + if (niceTickExtent[0] > niceTickExtent[1]) { + niceTickExtent[0] = niceTickExtent[1]; + } + } + function contain$1(val, extent) { + return val >= extent[0] && val <= extent[1]; + } + function normalize$1(val, extent) { + if (extent[1] === extent[0]) { + return 0.5; + } + + return (val - extent[0]) / (extent[1] - extent[0]); + } + function scale$2(val, extent) { + return val * (extent[1] - extent[0]) + extent[0]; + } + + var OrdinalScale = + /** @class */ + function (_super) { + __extends(OrdinalScale, _super); + + function OrdinalScale(setting) { + var _this = _super.call(this, setting) || this; + + _this.type = 'ordinal'; + + var ordinalMeta = _this.getSetting('ordinalMeta'); // Caution: Should not use instanceof, consider ec-extensions using + // import approach to get OrdinalMeta class. + + + if (!ordinalMeta) { + ordinalMeta = new OrdinalMeta({}); + } + + if (isArray(ordinalMeta)) { + ordinalMeta = new OrdinalMeta({ + categories: map(ordinalMeta, function (item) { + return isObject(item) ? item.value : item; + }) + }); + } + + _this._ordinalMeta = ordinalMeta; + _this._extent = _this.getSetting('extent') || [0, ordinalMeta.categories.length - 1]; + return _this; + } + + OrdinalScale.prototype.parse = function (val) { + // Caution: Math.round(null) will return `0` rather than `NaN` + if (val == null) { + return NaN; + } + + return isString(val) ? this._ordinalMeta.getOrdinal(val) // val might be float. + : Math.round(val); + }; + + OrdinalScale.prototype.contain = function (rank) { + rank = this.parse(rank); + return contain$1(rank, this._extent) && this._ordinalMeta.categories[rank] != null; + }; + /** + * Normalize given rank or name to linear [0, 1] + * @param val raw ordinal number. + * @return normalized value in [0, 1]. + */ + + + OrdinalScale.prototype.normalize = function (val) { + val = this._getTickNumber(this.parse(val)); + return normalize$1(val, this._extent); + }; + /** + * @param val normalized value in [0, 1]. + * @return raw ordinal number. + */ + + + OrdinalScale.prototype.scale = function (val) { + val = Math.round(scale$2(val, this._extent)); + return this.getRawOrdinalNumber(val); + }; + + OrdinalScale.prototype.getTicks = function () { + var ticks = []; + var extent = this._extent; + var rank = extent[0]; + + while (rank <= extent[1]) { + ticks.push({ + value: rank + }); + rank++; + } + + return ticks; + }; + + OrdinalScale.prototype.getMinorTicks = function (splitNumber) { + // Not support. + return; + }; + /** + * @see `Ordinal['_ordinalNumbersByTick']` + */ + + + OrdinalScale.prototype.setSortInfo = function (info) { + if (info == null) { + this._ordinalNumbersByTick = this._ticksByOrdinalNumber = null; + return; + } + + var infoOrdinalNumbers = info.ordinalNumbers; + var ordinalsByTick = this._ordinalNumbersByTick = []; + var ticksByOrdinal = this._ticksByOrdinalNumber = []; // Unnecessary support negative tick in `realtimeSort`. + + var tickNum = 0; + var allCategoryLen = this._ordinalMeta.categories.length; + + for (var len = Math.min(allCategoryLen, infoOrdinalNumbers.length); tickNum < len; ++tickNum) { + var ordinalNumber = infoOrdinalNumbers[tickNum]; + ordinalsByTick[tickNum] = ordinalNumber; + ticksByOrdinal[ordinalNumber] = tickNum; + } // Handle that `series.data` only covers part of the `axis.category.data`. + + + var unusedOrdinal = 0; + + for (; tickNum < allCategoryLen; ++tickNum) { + while (ticksByOrdinal[unusedOrdinal] != null) { + unusedOrdinal++; + } + ordinalsByTick.push(unusedOrdinal); + ticksByOrdinal[unusedOrdinal] = tickNum; + } + }; + + OrdinalScale.prototype._getTickNumber = function (ordinal) { + var ticksByOrdinalNumber = this._ticksByOrdinalNumber; // also support ordinal out of range of `ordinalMeta.categories.length`, + // where ordinal numbers are used as tick value directly. + + return ticksByOrdinalNumber && ordinal >= 0 && ordinal < ticksByOrdinalNumber.length ? ticksByOrdinalNumber[ordinal] : ordinal; + }; + /** + * @usage + * ```js + * const ordinalNumber = ordinalScale.getRawOrdinalNumber(tickVal); + * + * // case0 + * const rawOrdinalValue = axisModel.getCategories()[ordinalNumber]; + * // case1 + * const rawOrdinalValue = this._ordinalMeta.categories[ordinalNumber]; + * // case2 + * const coord = axis.dataToCoord(ordinalNumber); + * ``` + * + * @param {OrdinalNumber} tickNumber index of display + */ + + + OrdinalScale.prototype.getRawOrdinalNumber = function (tickNumber) { + var ordinalNumbersByTick = this._ordinalNumbersByTick; // tickNumber may be out of range, e.g., when axis max is larger than `ordinalMeta.categories.length`., + // where ordinal numbers are used as tick value directly. + + return ordinalNumbersByTick && tickNumber >= 0 && tickNumber < ordinalNumbersByTick.length ? ordinalNumbersByTick[tickNumber] : tickNumber; + }; + /** + * Get item on tick + */ + + + OrdinalScale.prototype.getLabel = function (tick) { + if (!this.isBlank()) { + var ordinalNumber = this.getRawOrdinalNumber(tick.value); + var cateogry = this._ordinalMeta.categories[ordinalNumber]; // Note that if no data, ordinalMeta.categories is an empty array. + // Return empty if it's not exist. + + return cateogry == null ? '' : cateogry + ''; + } + }; + + OrdinalScale.prototype.count = function () { + return this._extent[1] - this._extent[0] + 1; + }; + + OrdinalScale.prototype.unionExtentFromData = function (data, dim) { + this.unionExtent(data.getApproximateExtent(dim)); + }; + /** + * @override + * If value is in extent range + */ + + + OrdinalScale.prototype.isInExtentRange = function (value) { + value = this._getTickNumber(value); + return this._extent[0] <= value && this._extent[1] >= value; + }; + + OrdinalScale.prototype.getOrdinalMeta = function () { + return this._ordinalMeta; + }; + + OrdinalScale.prototype.calcNiceTicks = function () {}; + + OrdinalScale.prototype.calcNiceExtent = function () {}; + + OrdinalScale.type = 'ordinal'; + return OrdinalScale; + }(Scale); + + Scale.registerClass(OrdinalScale); + + var roundNumber = round; + + var IntervalScale = + /** @class */ + function (_super) { + __extends(IntervalScale, _super); + + function IntervalScale() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'interval'; // Step is calculated in adjustExtent. + + _this._interval = 0; + _this._intervalPrecision = 2; + return _this; + } + + IntervalScale.prototype.parse = function (val) { + return val; + }; + + IntervalScale.prototype.contain = function (val) { + return contain$1(val, this._extent); + }; + + IntervalScale.prototype.normalize = function (val) { + return normalize$1(val, this._extent); + }; + + IntervalScale.prototype.scale = function (val) { + return scale$2(val, this._extent); + }; + + IntervalScale.prototype.setExtent = function (start, end) { + var thisExtent = this._extent; // start,end may be a Number like '25',so... + + if (!isNaN(start)) { + thisExtent[0] = parseFloat(start); + } + + if (!isNaN(end)) { + thisExtent[1] = parseFloat(end); + } + }; + + IntervalScale.prototype.unionExtent = function (other) { + var extent = this._extent; + other[0] < extent[0] && (extent[0] = other[0]); + other[1] > extent[1] && (extent[1] = other[1]); // unionExtent may called by it's sub classes + + this.setExtent(extent[0], extent[1]); + }; + + IntervalScale.prototype.getInterval = function () { + return this._interval; + }; + + IntervalScale.prototype.setInterval = function (interval) { + this._interval = interval; // Dropped auto calculated niceExtent and use user setted extent + // We assume user wan't to set both interval, min, max to get a better result + + this._niceExtent = this._extent.slice(); + this._intervalPrecision = getIntervalPrecision(interval); + }; + /** + * @param expandToNicedExtent Whether expand the ticks to niced extent. + */ + + + IntervalScale.prototype.getTicks = function (expandToNicedExtent) { + var interval = this._interval; + var extent = this._extent; + var niceTickExtent = this._niceExtent; + var intervalPrecision = this._intervalPrecision; + var ticks = []; // If interval is 0, return []; + + if (!interval) { + return ticks; + } // Consider this case: using dataZoom toolbox, zoom and zoom. + + + var safeLimit = 10000; + + if (extent[0] < niceTickExtent[0]) { + if (expandToNicedExtent) { + ticks.push({ + value: roundNumber(niceTickExtent[0] - interval, intervalPrecision) + }); + } else { + ticks.push({ + value: extent[0] + }); + } + } + + var tick = niceTickExtent[0]; + + while (tick <= niceTickExtent[1]) { + ticks.push({ + value: tick + }); // Avoid rounding error + + tick = roundNumber(tick + interval, intervalPrecision); + + if (tick === ticks[ticks.length - 1].value) { + // Consider out of safe float point, e.g., + // -3711126.9907707 + 2e-10 === -3711126.9907707 + break; + } + + if (ticks.length > safeLimit) { + return []; + } + } // Consider this case: the last item of ticks is smaller + // than niceTickExtent[1] and niceTickExtent[1] === extent[1]. + + + var lastNiceTick = ticks.length ? ticks[ticks.length - 1].value : niceTickExtent[1]; + + if (extent[1] > lastNiceTick) { + if (expandToNicedExtent) { + ticks.push({ + value: roundNumber(lastNiceTick + interval, intervalPrecision) + }); + } else { + ticks.push({ + value: extent[1] + }); + } + } + + return ticks; + }; + + IntervalScale.prototype.getMinorTicks = function (splitNumber) { + var ticks = this.getTicks(true); + var minorTicks = []; + var extent = this.getExtent(); + + for (var i = 1; i < ticks.length; i++) { + var nextTick = ticks[i]; + var prevTick = ticks[i - 1]; + var count = 0; + var minorTicksGroup = []; + var interval = nextTick.value - prevTick.value; + var minorInterval = interval / splitNumber; + + while (count < splitNumber - 1) { + var minorTick = roundNumber(prevTick.value + (count + 1) * minorInterval); // For the first and last interval. The count may be less than splitNumber. + + if (minorTick > extent[0] && minorTick < extent[1]) { + minorTicksGroup.push(minorTick); + } + + count++; + } + + minorTicks.push(minorTicksGroup); + } + + return minorTicks; + }; + /** + * @param opt.precision If 'auto', use nice presision. + * @param opt.pad returns 1.50 but not 1.5 if precision is 2. + */ + + + IntervalScale.prototype.getLabel = function (data, opt) { + if (data == null) { + return ''; + } + + var precision = opt && opt.precision; + + if (precision == null) { + precision = getPrecision(data.value) || 0; + } else if (precision === 'auto') { + // Should be more precise then tick. + precision = this._intervalPrecision; + } // (1) If `precision` is set, 12.005 should be display as '12.00500'. + // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'. + + + var dataNum = roundNumber(data.value, precision, true); + return addCommas(dataNum); + }; + /** + * @param splitNumber By default `5`. + */ + + + IntervalScale.prototype.calcNiceTicks = function (splitNumber, minInterval, maxInterval) { + splitNumber = splitNumber || 5; + var extent = this._extent; + var span = extent[1] - extent[0]; + + if (!isFinite(span)) { + return; + } // User may set axis min 0 and data are all negative + // FIXME If it needs to reverse ? + + + if (span < 0) { + span = -span; + extent.reverse(); + } + + var result = intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval); + this._intervalPrecision = result.intervalPrecision; + this._interval = result.interval; + this._niceExtent = result.niceTickExtent; + }; + + IntervalScale.prototype.calcNiceExtent = function (opt) { + var extent = this._extent; // If extent start and end are same, expand them + + if (extent[0] === extent[1]) { + if (extent[0] !== 0) { + // Expand extent + var expandSize = extent[0]; // In the fowllowing case + // Axis has been fixed max 100 + // Plus data are all 100 and axis extent are [100, 100]. + // Extend to the both side will cause expanded max is larger than fixed max. + // So only expand to the smaller side. + + if (!opt.fixMax) { + extent[1] += expandSize / 2; + extent[0] -= expandSize / 2; + } else { + extent[0] -= expandSize / 2; + } + } else { + extent[1] = 1; + } + } + + var span = extent[1] - extent[0]; // If there are no data and extent are [Infinity, -Infinity] + + if (!isFinite(span)) { + extent[0] = 0; + extent[1] = 1; + } + + this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval); // let extent = this._extent; + + var interval = this._interval; + + if (!opt.fixMin) { + extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval); + } + + if (!opt.fixMax) { + extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval); + } + }; + + IntervalScale.prototype.setNiceExtent = function (min, max) { + this._niceExtent = [min, max]; + }; + + IntervalScale.type = 'interval'; + return IntervalScale; + }(Scale); + + Scale.registerClass(IntervalScale); + + /* global Float32Array */ + + var supportFloat32Array = typeof Float32Array !== 'undefined'; + var Float32ArrayCtor = !supportFloat32Array ? Array : Float32Array; + function createFloat32Array(arg) { + if (isArray(arg)) { + // Return self directly if don't support TypedArray. + return supportFloat32Array ? new Float32Array(arg) : arg; + } // Else is number + + + return new Float32ArrayCtor(arg); + } + + var STACK_PREFIX = '__ec_stack_'; + + function getSeriesStackId(seriesModel) { + return seriesModel.get('stack') || STACK_PREFIX + seriesModel.seriesIndex; + } + + function getAxisKey(axis) { + return axis.dim + axis.index; + } + /** + * @return {Object} {width, offset, offsetCenter} If axis.type is not 'category', return undefined. + */ + + + function getLayoutOnAxis(opt) { + var params = []; + var baseAxis = opt.axis; + var axisKey = 'axis0'; + + if (baseAxis.type !== 'category') { + return; + } + + var bandWidth = baseAxis.getBandWidth(); + + for (var i = 0; i < opt.count || 0; i++) { + params.push(defaults({ + bandWidth: bandWidth, + axisKey: axisKey, + stackId: STACK_PREFIX + i + }, opt)); + } + + var widthAndOffsets = doCalBarWidthAndOffset(params); + var result = []; + + for (var i = 0; i < opt.count; i++) { + var item = widthAndOffsets[axisKey][STACK_PREFIX + i]; + item.offsetCenter = item.offset + item.width / 2; + result.push(item); + } + + return result; + } + function prepareLayoutBarSeries(seriesType, ecModel) { + var seriesModels = []; + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + // Check series coordinate, do layout for cartesian2d only + if (isOnCartesian(seriesModel)) { + seriesModels.push(seriesModel); + } + }); + return seriesModels; + } + /** + * Map from (baseAxis.dim + '_' + baseAxis.index) to min gap of two adjacent + * values. + * This works for time axes, value axes, and log axes. + * For a single time axis, return value is in the form like + * {'x_0': [1000000]}. + * The value of 1000000 is in milliseconds. + */ + + function getValueAxesMinGaps(barSeries) { + /** + * Map from axis.index to values. + * For a single time axis, axisValues is in the form like + * {'x_0': [1495555200000, 1495641600000, 1495728000000]}. + * Items in axisValues[x], e.g. 1495555200000, are time values of all + * series. + */ + var axisValues = {}; + each(barSeries, function (seriesModel) { + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + + if (baseAxis.type !== 'time' && baseAxis.type !== 'value') { + return; + } + + var data = seriesModel.getData(); + var key = baseAxis.dim + '_' + baseAxis.index; + var dimIdx = data.getDimensionIndex(data.mapDimension(baseAxis.dim)); + var store = data.getStore(); + + for (var i = 0, cnt = store.count(); i < cnt; ++i) { + var value = store.get(dimIdx, i); + + if (!axisValues[key]) { + // No previous data for the axis + axisValues[key] = [value]; + } else { + // No value in previous series + axisValues[key].push(value); + } // Ignore duplicated time values in the same axis + + } + }); + var axisMinGaps = {}; + + for (var key in axisValues) { + if (axisValues.hasOwnProperty(key)) { + var valuesInAxis = axisValues[key]; + + if (valuesInAxis) { + // Sort axis values into ascending order to calculate gaps + valuesInAxis.sort(function (a, b) { + return a - b; + }); + var min = null; + + for (var j = 1; j < valuesInAxis.length; ++j) { + var delta = valuesInAxis[j] - valuesInAxis[j - 1]; + + if (delta > 0) { + // Ignore 0 delta because they are of the same axis value + min = min === null ? delta : Math.min(min, delta); + } + } // Set to null if only have one data + + + axisMinGaps[key] = min; + } + } + } + + return axisMinGaps; + } + + function makeColumnLayout(barSeries) { + var axisMinGaps = getValueAxesMinGaps(barSeries); + var seriesInfoList = []; + each(barSeries, function (seriesModel) { + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var axisExtent = baseAxis.getExtent(); + var bandWidth; + + if (baseAxis.type === 'category') { + bandWidth = baseAxis.getBandWidth(); + } else if (baseAxis.type === 'value' || baseAxis.type === 'time') { + var key = baseAxis.dim + '_' + baseAxis.index; + var minGap = axisMinGaps[key]; + var extentSpan = Math.abs(axisExtent[1] - axisExtent[0]); + var scale = baseAxis.scale.getExtent(); + var scaleSpan = Math.abs(scale[1] - scale[0]); + bandWidth = minGap ? extentSpan / scaleSpan * minGap : extentSpan; // When there is only one data value + } else { + var data = seriesModel.getData(); + bandWidth = Math.abs(axisExtent[1] - axisExtent[0]) / data.count(); + } + + var barWidth = parsePercent$1(seriesModel.get('barWidth'), bandWidth); + var barMaxWidth = parsePercent$1(seriesModel.get('barMaxWidth'), bandWidth); + var barMinWidth = parsePercent$1( // barMinWidth by default is 0.5 / 1 in cartesian. Because in value axis, + // the auto-calculated bar width might be less than 0.5 / 1. + seriesModel.get('barMinWidth') || (isInLargeMode(seriesModel) ? 0.5 : 1), bandWidth); + var barGap = seriesModel.get('barGap'); + var barCategoryGap = seriesModel.get('barCategoryGap'); + seriesInfoList.push({ + bandWidth: bandWidth, + barWidth: barWidth, + barMaxWidth: barMaxWidth, + barMinWidth: barMinWidth, + barGap: barGap, + barCategoryGap: barCategoryGap, + axisKey: getAxisKey(baseAxis), + stackId: getSeriesStackId(seriesModel) + }); + }); + return doCalBarWidthAndOffset(seriesInfoList); + } + + function doCalBarWidthAndOffset(seriesInfoList) { + // Columns info on each category axis. Key is cartesian name + var columnsMap = {}; + each(seriesInfoList, function (seriesInfo, idx) { + var axisKey = seriesInfo.axisKey; + var bandWidth = seriesInfo.bandWidth; + var columnsOnAxis = columnsMap[axisKey] || { + bandWidth: bandWidth, + remainedWidth: bandWidth, + autoWidthCount: 0, + categoryGap: null, + gap: '20%', + stacks: {} + }; + var stacks = columnsOnAxis.stacks; + columnsMap[axisKey] = columnsOnAxis; + var stackId = seriesInfo.stackId; + + if (!stacks[stackId]) { + columnsOnAxis.autoWidthCount++; + } + + stacks[stackId] = stacks[stackId] || { + width: 0, + maxWidth: 0 + }; // Caution: In a single coordinate system, these barGrid attributes + // will be shared by series. Consider that they have default values, + // only the attributes set on the last series will work. + // Do not change this fact unless there will be a break change. + + var barWidth = seriesInfo.barWidth; + + if (barWidth && !stacks[stackId].width) { + // See #6312, do not restrict width. + stacks[stackId].width = barWidth; + barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth); + columnsOnAxis.remainedWidth -= barWidth; + } + + var barMaxWidth = seriesInfo.barMaxWidth; + barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth); + var barMinWidth = seriesInfo.barMinWidth; + barMinWidth && (stacks[stackId].minWidth = barMinWidth); + var barGap = seriesInfo.barGap; + barGap != null && (columnsOnAxis.gap = barGap); + var barCategoryGap = seriesInfo.barCategoryGap; + barCategoryGap != null && (columnsOnAxis.categoryGap = barCategoryGap); + }); + var result = {}; + each(columnsMap, function (columnsOnAxis, coordSysName) { + result[coordSysName] = {}; + var stacks = columnsOnAxis.stacks; + var bandWidth = columnsOnAxis.bandWidth; + var categoryGapPercent = columnsOnAxis.categoryGap; + + if (categoryGapPercent == null) { + var columnCount = keys(stacks).length; // More columns in one group + // the spaces between group is smaller. Or the column will be too thin. + + categoryGapPercent = Math.max(35 - columnCount * 4, 15) + '%'; + } + + var categoryGap = parsePercent$1(categoryGapPercent, bandWidth); + var barGapPercent = parsePercent$1(columnsOnAxis.gap, 1); + var remainedWidth = columnsOnAxis.remainedWidth; + var autoWidthCount = columnsOnAxis.autoWidthCount; + var autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); // Find if any auto calculated bar exceeded maxBarWidth + + each(stacks, function (column) { + var maxWidth = column.maxWidth; + var minWidth = column.minWidth; + + if (!column.width) { + var finalWidth = autoWidth; + + if (maxWidth && maxWidth < finalWidth) { + finalWidth = Math.min(maxWidth, remainedWidth); + } // `minWidth` has higher priority. `minWidth` decide that wheter the + // bar is able to be visible. So `minWidth` should not be restricted + // by `maxWidth` or `remainedWidth` (which is from `bandWidth`). In + // the extreme cases for `value` axis, bars are allowed to overlap + // with each other if `minWidth` specified. + + + if (minWidth && minWidth > finalWidth) { + finalWidth = minWidth; + } + + if (finalWidth !== autoWidth) { + column.width = finalWidth; + remainedWidth -= finalWidth + barGapPercent * finalWidth; + autoWidthCount--; + } + } else { + // `barMinWidth/barMaxWidth` has higher priority than `barWidth`, as + // CSS does. Becuase barWidth can be a percent value, where + // `barMaxWidth` can be used to restrict the final width. + var finalWidth = column.width; + + if (maxWidth) { + finalWidth = Math.min(finalWidth, maxWidth); + } // `minWidth` has higher priority, as described above + + + if (minWidth) { + finalWidth = Math.max(finalWidth, minWidth); + } + + column.width = finalWidth; + remainedWidth -= finalWidth + barGapPercent * finalWidth; + autoWidthCount--; + } + }); // Recalculate width again + + autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + var widthSum = 0; + var lastColumn; + each(stacks, function (column, idx) { + if (!column.width) { + column.width = autoWidth; + } + + lastColumn = column; + widthSum += column.width * (1 + barGapPercent); + }); + + if (lastColumn) { + widthSum -= lastColumn.width * barGapPercent; + } + + var offset = -widthSum / 2; + each(stacks, function (column, stackId) { + result[coordSysName][stackId] = result[coordSysName][stackId] || { + bandWidth: bandWidth, + offset: offset, + width: column.width + }; + offset += column.width * (1 + barGapPercent); + }); + }); + return result; + } + + function retrieveColumnLayout(barWidthAndOffset, axis, seriesModel) { + if (barWidthAndOffset && axis) { + var result = barWidthAndOffset[getAxisKey(axis)]; + + if (result != null && seriesModel != null) { + return result[getSeriesStackId(seriesModel)]; + } + + return result; + } + } + function layout(seriesType, ecModel) { + var seriesModels = prepareLayoutBarSeries(seriesType, ecModel); + var barWidthAndOffset = makeColumnLayout(seriesModels); + each(seriesModels, function (seriesModel) { + var data = seriesModel.getData(); + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var stackId = getSeriesStackId(seriesModel); + var columnLayoutInfo = barWidthAndOffset[getAxisKey(baseAxis)][stackId]; + var columnOffset = columnLayoutInfo.offset; + var columnWidth = columnLayoutInfo.width; + data.setLayout({ + bandWidth: columnLayoutInfo.bandWidth, + offset: columnOffset, + size: columnWidth + }); + }); + } // TODO: Do not support stack in large mode yet. + + function createProgressiveLayout(seriesType) { + return { + seriesType: seriesType, + plan: createRenderPlanner(), + reset: function (seriesModel) { + if (!isOnCartesian(seriesModel)) { + return; + } + + var data = seriesModel.getData(); + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var valueAxis = cartesian.getOtherAxis(baseAxis); + var valueDimIdx = data.getDimensionIndex(data.mapDimension(valueAxis.dim)); + var baseDimIdx = data.getDimensionIndex(data.mapDimension(baseAxis.dim)); + var drawBackground = seriesModel.get('showBackground', true); + var valueDim = data.mapDimension(valueAxis.dim); + var stackResultDim = data.getCalculationInfo('stackResultDimension'); + var stacked = isDimensionStacked(data, valueDim) && !!data.getCalculationInfo('stackedOnSeries'); + var isValueAxisH = valueAxis.isHorizontal(); + var valueAxisStart = getValueAxisStart(baseAxis, valueAxis); + var isLarge = isInLargeMode(seriesModel); + var barMinHeight = seriesModel.get('barMinHeight') || 0; + var stackedDimIdx = stackResultDim && data.getDimensionIndex(stackResultDim); // Layout info. + + var columnWidth = data.getLayout('size'); + var columnOffset = data.getLayout('offset'); + return { + progress: function (params, data) { + var count = params.count; + var largePoints = isLarge && createFloat32Array(count * 3); + var largeBackgroundPoints = isLarge && drawBackground && createFloat32Array(count * 3); + var largeDataIndices = isLarge && createFloat32Array(count); + var coordLayout = cartesian.master.getRect(); + var bgSize = isValueAxisH ? coordLayout.width : coordLayout.height; + var dataIndex; + var store = data.getStore(); + var idxOffset = 0; + + while ((dataIndex = params.next()) != null) { + var value = store.get(stacked ? stackedDimIdx : valueDimIdx, dataIndex); + var baseValue = store.get(baseDimIdx, dataIndex); + var baseCoord = valueAxisStart; + var startValue = void 0; // Because of the barMinHeight, we can not use the value in + // stackResultDimension directly. + + if (stacked) { + startValue = +value - store.get(valueDimIdx, dataIndex); + } + + var x = void 0; + var y = void 0; + var width = void 0; + var height = void 0; + + if (isValueAxisH) { + var coord = cartesian.dataToPoint([value, baseValue]); + + if (stacked) { + var startCoord = cartesian.dataToPoint([startValue, baseValue]); + baseCoord = startCoord[0]; + } + + x = baseCoord; + y = coord[1] + columnOffset; + width = coord[0] - baseCoord; + height = columnWidth; + + if (Math.abs(width) < barMinHeight) { + width = (width < 0 ? -1 : 1) * barMinHeight; + } + } else { + var coord = cartesian.dataToPoint([baseValue, value]); + + if (stacked) { + var startCoord = cartesian.dataToPoint([baseValue, startValue]); + baseCoord = startCoord[1]; + } + + x = coord[0] + columnOffset; + y = baseCoord; + width = columnWidth; + height = coord[1] - baseCoord; + + if (Math.abs(height) < barMinHeight) { + // Include zero to has a positive bar + height = (height <= 0 ? -1 : 1) * barMinHeight; + } + } + + if (!isLarge) { + data.setItemLayout(dataIndex, { + x: x, + y: y, + width: width, + height: height + }); + } else { + largePoints[idxOffset] = x; + largePoints[idxOffset + 1] = y; + largePoints[idxOffset + 2] = isValueAxisH ? width : height; + + if (largeBackgroundPoints) { + largeBackgroundPoints[idxOffset] = isValueAxisH ? coordLayout.x : x; + largeBackgroundPoints[idxOffset + 1] = isValueAxisH ? y : coordLayout.y; + largeBackgroundPoints[idxOffset + 2] = bgSize; + } + + largeDataIndices[dataIndex] = dataIndex; + } + + idxOffset += 3; + } + + if (isLarge) { + data.setLayout({ + largePoints: largePoints, + largeDataIndices: largeDataIndices, + largeBackgroundPoints: largeBackgroundPoints, + valueAxisHorizontal: isValueAxisH + }); + } + } + }; + } + }; + } + + function isOnCartesian(seriesModel) { + return seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'cartesian2d'; + } + + function isInLargeMode(seriesModel) { + return seriesModel.pipelineContext && seriesModel.pipelineContext.large; + } // See cases in `test/bar-start.html` and `#7412`, `#8747`. + + + function getValueAxisStart(baseAxis, valueAxis) { + return valueAxis.toGlobalCoord(valueAxis.dataToCoord(valueAxis.type === 'log' ? 1 : 0)); + } + + var bisect = function (a, x, lo, hi) { + while (lo < hi) { + var mid = lo + hi >>> 1; + + if (a[mid][1] < x) { + lo = mid + 1; + } else { + hi = mid; + } + } + + return lo; + }; + + var TimeScale = + /** @class */ + function (_super) { + __extends(TimeScale, _super); + + function TimeScale(settings) { + var _this = _super.call(this, settings) || this; + + _this.type = 'time'; + return _this; + } + /** + * Get label is mainly for other components like dataZoom, tooltip. + */ + + + TimeScale.prototype.getLabel = function (tick) { + var useUTC = this.getSetting('useUTC'); + return format(tick.value, fullLeveledFormatter[getDefaultFormatPrecisionOfInterval(getPrimaryTimeUnit(this._minLevelUnit))] || fullLeveledFormatter.second, useUTC, this.getSetting('locale')); + }; + + TimeScale.prototype.getFormattedLabel = function (tick, idx, labelFormatter) { + var isUTC = this.getSetting('useUTC'); + var lang = this.getSetting('locale'); + return leveledFormat(tick, idx, labelFormatter, lang, isUTC); + }; + /** + * @override + */ + + + TimeScale.prototype.getTicks = function () { + var interval = this._interval; + var extent = this._extent; + var ticks = []; // If interval is 0, return []; + + if (!interval) { + return ticks; + } + + ticks.push({ + value: extent[0], + level: 0 + }); + var useUTC = this.getSetting('useUTC'); + var innerTicks = getIntervalTicks(this._minLevelUnit, this._approxInterval, useUTC, extent); + ticks = ticks.concat(innerTicks); + ticks.push({ + value: extent[1], + level: 0 + }); + return ticks; + }; + + TimeScale.prototype.calcNiceExtent = function (opt) { + var extent = this._extent; // If extent start and end are same, expand them + + if (extent[0] === extent[1]) { + // Expand extent + extent[0] -= ONE_DAY; + extent[1] += ONE_DAY; + } // If there are no data and extent are [Infinity, -Infinity] + + + if (extent[1] === -Infinity && extent[0] === Infinity) { + var d = new Date(); + extent[1] = +new Date(d.getFullYear(), d.getMonth(), d.getDate()); + extent[0] = extent[1] - ONE_DAY; + } + + this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval); + }; + + TimeScale.prototype.calcNiceTicks = function (approxTickNum, minInterval, maxInterval) { + approxTickNum = approxTickNum || 10; + var extent = this._extent; + var span = extent[1] - extent[0]; + this._approxInterval = span / approxTickNum; + + if (minInterval != null && this._approxInterval < minInterval) { + this._approxInterval = minInterval; + } + + if (maxInterval != null && this._approxInterval > maxInterval) { + this._approxInterval = maxInterval; + } + + var scaleIntervalsLen = scaleIntervals.length; + var idx = Math.min(bisect(scaleIntervals, this._approxInterval, 0, scaleIntervalsLen), scaleIntervalsLen - 1); // Interval that can be used to calculate ticks + + this._interval = scaleIntervals[idx][1]; // Min level used when picking ticks from top down. + // We check one more level to avoid the ticks are to sparse in some case. + + this._minLevelUnit = scaleIntervals[Math.max(idx - 1, 0)][0]; + }; + + TimeScale.prototype.parse = function (val) { + // val might be float. + return isNumber(val) ? val : +parseDate(val); + }; + + TimeScale.prototype.contain = function (val) { + return contain$1(this.parse(val), this._extent); + }; + + TimeScale.prototype.normalize = function (val) { + return normalize$1(this.parse(val), this._extent); + }; + + TimeScale.prototype.scale = function (val) { + return scale$2(val, this._extent); + }; + + TimeScale.type = 'time'; + return TimeScale; + }(IntervalScale); + /** + * This implementation was originally copied from "d3.js" + * <https://github.com/d3/d3/blob/b516d77fb8566b576088e73410437494717ada26/src/time/scale.js> + * with some modifications made for this program. + * See the license statement at the head of this file. + */ + + + var scaleIntervals = [// Format interval + ['second', ONE_SECOND], ['minute', ONE_MINUTE], ['hour', ONE_HOUR], ['quarter-day', ONE_HOUR * 6], ['half-day', ONE_HOUR * 12], ['day', ONE_DAY * 1.2], ['half-week', ONE_DAY * 3.5], ['week', ONE_DAY * 7], ['month', ONE_DAY * 31], ['quarter', ONE_DAY * 95], ['half-year', ONE_YEAR / 2], ['year', ONE_YEAR] // 1Y + ]; + + function isUnitValueSame(unit, valueA, valueB, isUTC) { + var dateA = parseDate(valueA); + var dateB = parseDate(valueB); + + var isSame = function (unit) { + return getUnitValue(dateA, unit, isUTC) === getUnitValue(dateB, unit, isUTC); + }; + + var isSameYear = function () { + return isSame('year'); + }; // const isSameHalfYear = () => isSameYear() && isSame('half-year'); + // const isSameQuater = () => isSameYear() && isSame('quarter'); + + + var isSameMonth = function () { + return isSameYear() && isSame('month'); + }; + + var isSameDay = function () { + return isSameMonth() && isSame('day'); + }; // const isSameHalfDay = () => isSameDay() && isSame('half-day'); + + + var isSameHour = function () { + return isSameDay() && isSame('hour'); + }; + + var isSameMinute = function () { + return isSameHour() && isSame('minute'); + }; + + var isSameSecond = function () { + return isSameMinute() && isSame('second'); + }; + + var isSameMilliSecond = function () { + return isSameSecond() && isSame('millisecond'); + }; + + switch (unit) { + case 'year': + return isSameYear(); + + case 'month': + return isSameMonth(); + + case 'day': + return isSameDay(); + + case 'hour': + return isSameHour(); + + case 'minute': + return isSameMinute(); + + case 'second': + return isSameSecond(); + + case 'millisecond': + return isSameMilliSecond(); + } + } // const primaryUnitGetters = { + // year: fullYearGetterName(), + // month: monthGetterName(), + // day: dateGetterName(), + // hour: hoursGetterName(), + // minute: minutesGetterName(), + // second: secondsGetterName(), + // millisecond: millisecondsGetterName() + // }; + // const primaryUnitUTCGetters = { + // year: fullYearGetterName(true), + // month: monthGetterName(true), + // day: dateGetterName(true), + // hour: hoursGetterName(true), + // minute: minutesGetterName(true), + // second: secondsGetterName(true), + // millisecond: millisecondsGetterName(true) + // }; + // function moveTick(date: Date, unitName: TimeUnit, step: number, isUTC: boolean) { + // step = step || 1; + // switch (getPrimaryTimeUnit(unitName)) { + // case 'year': + // date[fullYearSetterName(isUTC)](date[fullYearGetterName(isUTC)]() + step); + // break; + // case 'month': + // date[monthSetterName(isUTC)](date[monthGetterName(isUTC)]() + step); + // break; + // case 'day': + // date[dateSetterName(isUTC)](date[dateGetterName(isUTC)]() + step); + // break; + // case 'hour': + // date[hoursSetterName(isUTC)](date[hoursGetterName(isUTC)]() + step); + // break; + // case 'minute': + // date[minutesSetterName(isUTC)](date[minutesGetterName(isUTC)]() + step); + // break; + // case 'second': + // date[secondsSetterName(isUTC)](date[secondsGetterName(isUTC)]() + step); + // break; + // case 'millisecond': + // date[millisecondsSetterName(isUTC)](date[millisecondsGetterName(isUTC)]() + step); + // break; + // } + // return date.getTime(); + // } + // const DATE_INTERVALS = [[8, 7.5], [4, 3.5], [2, 1.5]]; + // const MONTH_INTERVALS = [[6, 5.5], [3, 2.5], [2, 1.5]]; + // const MINUTES_SECONDS_INTERVALS = [[30, 30], [20, 20], [15, 15], [10, 10], [5, 5], [2, 2]]; + + + function getDateInterval(approxInterval, daysInMonth) { + approxInterval /= ONE_DAY; + return approxInterval > 16 ? 16 // Math.floor(daysInMonth / 2) + 1 // In this case we only want one tick betwen two month. + : approxInterval > 7.5 ? 7 // TODO week 7 or day 8? + : approxInterval > 3.5 ? 4 : approxInterval > 1.5 ? 2 : 1; + } + + function getMonthInterval(approxInterval) { + var APPROX_ONE_MONTH = 30 * ONE_DAY; + approxInterval /= APPROX_ONE_MONTH; + return approxInterval > 6 ? 6 : approxInterval > 3 ? 3 : approxInterval > 2 ? 2 : 1; + } + + function getHourInterval(approxInterval) { + approxInterval /= ONE_HOUR; + return approxInterval > 12 ? 12 : approxInterval > 6 ? 6 : approxInterval > 3.5 ? 4 : approxInterval > 2 ? 2 : 1; + } + + function getMinutesAndSecondsInterval(approxInterval, isMinutes) { + approxInterval /= isMinutes ? ONE_MINUTE : ONE_SECOND; + return approxInterval > 30 ? 30 : approxInterval > 20 ? 20 : approxInterval > 15 ? 15 : approxInterval > 10 ? 10 : approxInterval > 5 ? 5 : approxInterval > 2 ? 2 : 1; + } + + function getMillisecondsInterval(approxInterval) { + return nice(approxInterval, true); + } + + function getFirstTimestampOfUnit(date, unitName, isUTC) { + var outDate = new Date(date); + + switch (getPrimaryTimeUnit(unitName)) { + case 'year': + case 'month': + outDate[monthSetterName(isUTC)](0); + + case 'day': + outDate[dateSetterName(isUTC)](1); + + case 'hour': + outDate[hoursSetterName(isUTC)](0); + + case 'minute': + outDate[minutesSetterName(isUTC)](0); + + case 'second': + outDate[secondsSetterName(isUTC)](0); + outDate[millisecondsSetterName(isUTC)](0); + } + + return outDate.getTime(); + } + + function getIntervalTicks(bottomUnitName, approxInterval, isUTC, extent) { + var safeLimit = 10000; + var unitNames = timeUnits; + var iter = 0; + + function addTicksInSpan(interval, minTimestamp, maxTimestamp, getMethodName, setMethodName, isDate, out) { + var date = new Date(minTimestamp); + var dateTime = minTimestamp; + var d = date[getMethodName](); // if (isDate) { + // d -= 1; // Starts with 0; PENDING + // } + + while (dateTime < maxTimestamp && dateTime <= extent[1]) { + out.push({ + value: dateTime + }); + d += interval; + date[setMethodName](d); + dateTime = date.getTime(); + } // This extra tick is for calcuating ticks of next level. Will not been added to the final result + + + out.push({ + value: dateTime, + notAdd: true + }); + } + + function addLevelTicks(unitName, lastLevelTicks, levelTicks) { + var newAddedTicks = []; + var isFirstLevel = !lastLevelTicks.length; + + if (isUnitValueSame(getPrimaryTimeUnit(unitName), extent[0], extent[1], isUTC)) { + return; + } + + if (isFirstLevel) { + lastLevelTicks = [{ + // TODO Optimize. Not include so may ticks. + value: getFirstTimestampOfUnit(new Date(extent[0]), unitName, isUTC) + }, { + value: extent[1] + }]; + } + + for (var i = 0; i < lastLevelTicks.length - 1; i++) { + var startTick = lastLevelTicks[i].value; + var endTick = lastLevelTicks[i + 1].value; + + if (startTick === endTick) { + continue; + } + + var interval = void 0; + var getterName = void 0; + var setterName = void 0; + var isDate = false; + + switch (unitName) { + case 'year': + interval = Math.max(1, Math.round(approxInterval / ONE_DAY / 365)); + getterName = fullYearGetterName(isUTC); + setterName = fullYearSetterName(isUTC); + break; + + case 'half-year': + case 'quarter': + case 'month': + interval = getMonthInterval(approxInterval); + getterName = monthGetterName(isUTC); + setterName = monthSetterName(isUTC); + break; + + case 'week': // PENDING If week is added. Ignore day. + + case 'half-week': + case 'day': + interval = getDateInterval(approxInterval); // Use 32 days and let interval been 16 + + getterName = dateGetterName(isUTC); + setterName = dateSetterName(isUTC); + isDate = true; + break; + + case 'half-day': + case 'quarter-day': + case 'hour': + interval = getHourInterval(approxInterval); + getterName = hoursGetterName(isUTC); + setterName = hoursSetterName(isUTC); + break; + + case 'minute': + interval = getMinutesAndSecondsInterval(approxInterval, true); + getterName = minutesGetterName(isUTC); + setterName = minutesSetterName(isUTC); + break; + + case 'second': + interval = getMinutesAndSecondsInterval(approxInterval, false); + getterName = secondsGetterName(isUTC); + setterName = secondsSetterName(isUTC); + break; + + case 'millisecond': + interval = getMillisecondsInterval(approxInterval); + getterName = millisecondsGetterName(isUTC); + setterName = millisecondsSetterName(isUTC); + break; + } + + addTicksInSpan(interval, startTick, endTick, getterName, setterName, isDate, newAddedTicks); + + if (unitName === 'year' && levelTicks.length > 1 && i === 0) { + // Add nearest years to the left extent. + levelTicks.unshift({ + value: levelTicks[0].value - interval + }); + } + } + + for (var i = 0; i < newAddedTicks.length; i++) { + levelTicks.push(newAddedTicks[i]); + } // newAddedTicks.length && console.log(unitName, newAddedTicks); + + + return newAddedTicks; + } + + var levelsTicks = []; + var currentLevelTicks = []; + var tickCount = 0; + var lastLevelTickCount = 0; + + for (var i = 0; i < unitNames.length && iter++ < safeLimit; ++i) { + var primaryTimeUnit = getPrimaryTimeUnit(unitNames[i]); + + if (!isPrimaryTimeUnit(unitNames[i])) { + // TODO + continue; + } + + addLevelTicks(unitNames[i], levelsTicks[levelsTicks.length - 1] || [], currentLevelTicks); + var nextPrimaryTimeUnit = unitNames[i + 1] ? getPrimaryTimeUnit(unitNames[i + 1]) : null; + + if (primaryTimeUnit !== nextPrimaryTimeUnit) { + if (currentLevelTicks.length) { + lastLevelTickCount = tickCount; // Remove the duplicate so the tick count can be precisely. + + currentLevelTicks.sort(function (a, b) { + return a.value - b.value; + }); + var levelTicksRemoveDuplicated = []; + + for (var i_1 = 0; i_1 < currentLevelTicks.length; ++i_1) { + var tickValue = currentLevelTicks[i_1].value; + + if (i_1 === 0 || currentLevelTicks[i_1 - 1].value !== tickValue) { + levelTicksRemoveDuplicated.push(currentLevelTicks[i_1]); + + if (tickValue >= extent[0] && tickValue <= extent[1]) { + tickCount++; + } + } + } + + var targetTickNum = (extent[1] - extent[0]) / approxInterval; // Added too much in this level and not too less in last level + + if (tickCount > targetTickNum * 1.5 && lastLevelTickCount > targetTickNum / 1.5) { + break; + } // Only treat primary time unit as one level. + + + levelsTicks.push(levelTicksRemoveDuplicated); + + if (tickCount > targetTickNum || bottomUnitName === unitNames[i]) { + break; + } + } // Reset if next unitName is primary + + + currentLevelTicks = []; + } + } + + if ("development" !== 'production') { + if (iter >= safeLimit) { + warn('Exceed safe limit.'); + } + } + + var levelsTicksInExtent = filter(map(levelsTicks, function (levelTicks) { + return filter(levelTicks, function (tick) { + return tick.value >= extent[0] && tick.value <= extent[1] && !tick.notAdd; + }); + }), function (levelTicks) { + return levelTicks.length > 0; + }); + var ticks = []; + var maxLevel = levelsTicksInExtent.length - 1; + + for (var i = 0; i < levelsTicksInExtent.length; ++i) { + var levelTicks = levelsTicksInExtent[i]; + + for (var k = 0; k < levelTicks.length; ++k) { + ticks.push({ + value: levelTicks[k].value, + level: maxLevel - i + }); + } + } + + ticks.sort(function (a, b) { + return a.value - b.value; + }); // Remove duplicates + + var result = []; + + for (var i = 0; i < ticks.length; ++i) { + if (i === 0 || ticks[i].value !== ticks[i - 1].value) { + result.push(ticks[i]); + } + } + + return result; + } + + Scale.registerClass(TimeScale); + + var scaleProto = Scale.prototype; // FIXME:TS refactor: not good to call it directly with `this`? + + var intervalScaleProto = IntervalScale.prototype; + var roundingErrorFix = round; + var mathFloor = Math.floor; + var mathCeil = Math.ceil; + var mathPow$1 = Math.pow; + var mathLog = Math.log; + + var LogScale = + /** @class */ + function (_super) { + __extends(LogScale, _super); + + function LogScale() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'log'; + _this.base = 10; + _this._originalScale = new IntervalScale(); // FIXME:TS actually used by `IntervalScale` + + _this._interval = 0; + return _this; + } + /** + * @param Whether expand the ticks to niced extent. + */ + + + LogScale.prototype.getTicks = function (expandToNicedExtent) { + var originalScale = this._originalScale; + var extent = this._extent; + var originalExtent = originalScale.getExtent(); + var ticks = intervalScaleProto.getTicks.call(this, expandToNicedExtent); + return map(ticks, function (tick) { + var val = tick.value; + var powVal = round(mathPow$1(this.base, val)); // Fix #4158 + + powVal = val === extent[0] && this._fixMin ? fixRoundingError(powVal, originalExtent[0]) : powVal; + powVal = val === extent[1] && this._fixMax ? fixRoundingError(powVal, originalExtent[1]) : powVal; + return { + value: powVal + }; + }, this); + }; + + LogScale.prototype.setExtent = function (start, end) { + var base = this.base; + start = mathLog(start) / mathLog(base); + end = mathLog(end) / mathLog(base); + intervalScaleProto.setExtent.call(this, start, end); + }; + /** + * @return {number} end + */ + + + LogScale.prototype.getExtent = function () { + var base = this.base; + var extent = scaleProto.getExtent.call(this); + extent[0] = mathPow$1(base, extent[0]); + extent[1] = mathPow$1(base, extent[1]); // Fix #4158 + + var originalScale = this._originalScale; + var originalExtent = originalScale.getExtent(); + this._fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0])); + this._fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1])); + return extent; + }; + + LogScale.prototype.unionExtent = function (extent) { + this._originalScale.unionExtent(extent); + + var base = this.base; + extent[0] = mathLog(extent[0]) / mathLog(base); + extent[1] = mathLog(extent[1]) / mathLog(base); + scaleProto.unionExtent.call(this, extent); + }; + + LogScale.prototype.unionExtentFromData = function (data, dim) { + // TODO + // filter value that <= 0 + this.unionExtent(data.getApproximateExtent(dim)); + }; + /** + * Update interval and extent of intervals for nice ticks + * @param approxTickNum default 10 Given approx tick number + */ + + + LogScale.prototype.calcNiceTicks = function (approxTickNum) { + approxTickNum = approxTickNum || 10; + var extent = this._extent; + var span = extent[1] - extent[0]; + + if (span === Infinity || span <= 0) { + return; + } + + var interval = quantity(span); + var err = approxTickNum / span * interval; // Filter ticks to get closer to the desired count. + + if (err <= 0.5) { + interval *= 10; + } // Interval should be integer + + + while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) { + interval *= 10; + } + + var niceExtent = [round(mathCeil(extent[0] / interval) * interval), round(mathFloor(extent[1] / interval) * interval)]; + this._interval = interval; + this._niceExtent = niceExtent; + }; + + LogScale.prototype.calcNiceExtent = function (opt) { + intervalScaleProto.calcNiceExtent.call(this, opt); + this._fixMin = opt.fixMin; + this._fixMax = opt.fixMax; + }; + + LogScale.prototype.parse = function (val) { + return val; + }; + + LogScale.prototype.contain = function (val) { + val = mathLog(val) / mathLog(this.base); + return contain$1(val, this._extent); + }; + + LogScale.prototype.normalize = function (val) { + val = mathLog(val) / mathLog(this.base); + return normalize$1(val, this._extent); + }; + + LogScale.prototype.scale = function (val) { + val = scale$2(val, this._extent); + return mathPow$1(this.base, val); + }; + + LogScale.type = 'log'; + return LogScale; + }(Scale); + + var proto = LogScale.prototype; + proto.getMinorTicks = intervalScaleProto.getMinorTicks; + proto.getLabel = intervalScaleProto.getLabel; + + function fixRoundingError(val, originalVal) { + return roundingErrorFix(val, getPrecision(originalVal)); + } + + Scale.registerClass(LogScale); + + var ScaleRawExtentInfo = + /** @class */ + function () { + function ScaleRawExtentInfo(scale, model, // Usually: data extent from all series on this axis. + originalExtent) { + this._prepareParams(scale, model, originalExtent); + } + /** + * Parameters depending on ouside (like model, user callback) + * are prepared and fixed here. + */ + + + ScaleRawExtentInfo.prototype._prepareParams = function (scale, model, // Usually: data extent from all series on this axis. + dataExtent) { + if (dataExtent[1] < dataExtent[0]) { + dataExtent = [NaN, NaN]; + } + + this._dataMin = dataExtent[0]; + this._dataMax = dataExtent[1]; + var isOrdinal = this._isOrdinal = scale.type === 'ordinal'; + this._needCrossZero = scale.type === 'interval' && model.getNeedCrossZero && model.getNeedCrossZero(); + var modelMinRaw = this._modelMinRaw = model.get('min', true); + + if (isFunction(modelMinRaw)) { + // This callback alway provide users the full data extent (before data filtered). + this._modelMinNum = parseAxisModelMinMax(scale, modelMinRaw({ + min: dataExtent[0], + max: dataExtent[1] + })); + } else if (modelMinRaw !== 'dataMin') { + this._modelMinNum = parseAxisModelMinMax(scale, modelMinRaw); + } + + var modelMaxRaw = this._modelMaxRaw = model.get('max', true); + + if (isFunction(modelMaxRaw)) { + // This callback alway provide users the full data extent (before data filtered). + this._modelMaxNum = parseAxisModelMinMax(scale, modelMaxRaw({ + min: dataExtent[0], + max: dataExtent[1] + })); + } else if (modelMaxRaw !== 'dataMax') { + this._modelMaxNum = parseAxisModelMinMax(scale, modelMaxRaw); + } + + if (isOrdinal) { + // FIXME: there is a flaw here: if there is no "block" data processor like `dataZoom`, + // and progressive rendering is using, here the category result might just only contain + // the processed chunk rather than the entire result. + this._axisDataLen = model.getCategories().length; + } else { + var boundaryGap = model.get('boundaryGap'); + var boundaryGapArr = isArray(boundaryGap) ? boundaryGap : [boundaryGap || 0, boundaryGap || 0]; + + if (typeof boundaryGapArr[0] === 'boolean' || typeof boundaryGapArr[1] === 'boolean') { + if ("development" !== 'production') { + console.warn('Boolean type for boundaryGap is only ' + 'allowed for ordinal axis. Please use string in ' + 'percentage instead, e.g., "20%". Currently, ' + 'boundaryGap is set to be 0.'); + } + + this._boundaryGapInner = [0, 0]; + } else { + this._boundaryGapInner = [parsePercent(boundaryGapArr[0], 1), parsePercent(boundaryGapArr[1], 1)]; + } + } + }; + /** + * Calculate extent by prepared parameters. + * This method has no external dependency and can be called duplicatedly, + * getting the same result. + * If parameters changed, should call this method to recalcuate. + */ + + + ScaleRawExtentInfo.prototype.calculate = function () { + // Notice: When min/max is not set (that is, when there are null/undefined, + // which is the most common case), these cases should be ensured: + // (1) For 'ordinal', show all axis.data. + // (2) For others: + // + `boundaryGap` is applied (if min/max set, boundaryGap is + // disabled). + // + If `needCrossZero`, min/max should be zero, otherwise, min/max should + // be the result that originalExtent enlarged by boundaryGap. + // (3) If no data, it should be ensured that `scale.setBlank` is set. + var isOrdinal = this._isOrdinal; + var dataMin = this._dataMin; + var dataMax = this._dataMax; + var axisDataLen = this._axisDataLen; + var boundaryGapInner = this._boundaryGapInner; + var span = !isOrdinal ? dataMax - dataMin || Math.abs(dataMin) : null; // Currently if a `'value'` axis model min is specified as 'dataMin'/'dataMax', + // `boundaryGap` will not be used. It's the different from specifying as `null`/`undefined`. + + var min = this._modelMinRaw === 'dataMin' ? dataMin : this._modelMinNum; + var max = this._modelMaxRaw === 'dataMax' ? dataMax : this._modelMaxNum; // If `_modelMinNum`/`_modelMaxNum` is `null`/`undefined`, should not be fixed. + + var minFixed = min != null; + var maxFixed = max != null; + + if (min == null) { + min = isOrdinal ? axisDataLen ? 0 : NaN : dataMin - boundaryGapInner[0] * span; + } + + if (max == null) { + max = isOrdinal ? axisDataLen ? axisDataLen - 1 : NaN : dataMax + boundaryGapInner[1] * span; + } + + (min == null || !isFinite(min)) && (min = NaN); + (max == null || !isFinite(max)) && (max = NaN); + var isBlank = eqNaN(min) || eqNaN(max) || isOrdinal && !axisDataLen; // If data extent modified, need to recalculated to ensure cross zero. + + if (this._needCrossZero) { + // Axis is over zero and min is not set + if (min > 0 && max > 0 && !minFixed) { + min = 0; // minFixed = true; + } // Axis is under zero and max is not set + + + if (min < 0 && max < 0 && !maxFixed) { + max = 0; // maxFixed = true; + } // PENDING: + // When `needCrossZero` and all data is positive/negative, should it be ensured + // that the results processed by boundaryGap are positive/negative? + // If so, here `minFixed`/`maxFixed` need to be set. + + } + + var determinedMin = this._determinedMin; + var determinedMax = this._determinedMax; + + if (determinedMin != null) { + min = determinedMin; + minFixed = true; + } + + if (determinedMax != null) { + max = determinedMax; + maxFixed = true; + } // Ensure min/max be finite number or NaN here. (not to be null/undefined) + // `NaN` means min/max axis is blank. + + + return { + min: min, + max: max, + minFixed: minFixed, + maxFixed: maxFixed, + isBlank: isBlank + }; + }; + + ScaleRawExtentInfo.prototype.modifyDataMinMax = function (minMaxName, val) { + if ("development" !== 'production') { + assert(!this.frozen); + } + + this[DATA_MIN_MAX_ATTR[minMaxName]] = val; + }; + + ScaleRawExtentInfo.prototype.setDeterminedMinMax = function (minMaxName, val) { + var attr = DETERMINED_MIN_MAX_ATTR[minMaxName]; + + if ("development" !== 'production') { + assert(!this.frozen // Earse them usually means logic flaw. + && this[attr] == null); + } + + this[attr] = val; + }; + + ScaleRawExtentInfo.prototype.freeze = function () { + // @ts-ignore + this.frozen = true; + }; + + return ScaleRawExtentInfo; + }(); + var DETERMINED_MIN_MAX_ATTR = { + min: '_determinedMin', + max: '_determinedMax' + }; + var DATA_MIN_MAX_ATTR = { + min: '_dataMin', + max: '_dataMax' + }; + /** + * Get scale min max and related info only depends on model settings. + * This method can be called after coordinate system created. + * For example, in data processing stage. + * + * Scale extent info probably be required multiple times during a workflow. + * For example: + * (1) `dataZoom` depends it to get the axis extent in "100%" state. + * (2) `processor/extentCalculator` depends it to make sure whether axis extent is specified. + * (3) `coordSys.update` use it to finally decide the scale extent. + * But the callback of `min`/`max` should not be called multiple times. + * The code below should not be implemented repeatedly either. + * So we cache the result in the scale instance, which will be recreated at the begining + * of the workflow (because `scale` instance will be recreated each round of the workflow). + */ + + function ensureScaleRawExtentInfo(scale, model, // Usually: data extent from all series on this axis. + originalExtent) { + // Do not permit to recreate. + var rawExtentInfo = scale.rawExtentInfo; + + if (rawExtentInfo) { + return rawExtentInfo; + } + + rawExtentInfo = new ScaleRawExtentInfo(scale, model, originalExtent); // @ts-ignore + + scale.rawExtentInfo = rawExtentInfo; + return rawExtentInfo; + } + function parseAxisModelMinMax(scale, minMax) { + return minMax == null ? null : eqNaN(minMax) ? NaN : scale.parse(minMax); + } + + /** + * Get axis scale extent before niced. + * Item of returned array can only be number (including Infinity and NaN). + * + * Caution: + * Precondition of calling this method: + * The scale extent has been initialized using series data extent via + * `scale.setExtent` or `scale.unionExtentFromData`; + */ + + function getScaleExtent(scale, model) { + var scaleType = scale.type; + var rawExtentResult = ensureScaleRawExtentInfo(scale, model, scale.getExtent()).calculate(); + scale.setBlank(rawExtentResult.isBlank); + var min = rawExtentResult.min; + var max = rawExtentResult.max; // If bars are placed on a base axis of type time or interval account for axis boundary overflow and current axis + // is base axis + // FIXME + // (1) Consider support value axis, where below zero and axis `onZero` should be handled properly. + // (2) Refactor the logic with `barGrid`. Is it not need to `makeBarWidthAndOffsetInfo` twice with different extent? + // Should not depend on series type `bar`? + // (3) Fix that might overlap when using dataZoom. + // (4) Consider other chart types using `barGrid`? + // See #6728, #4862, `test/bar-overflow-time-plot.html` + + var ecModel = model.ecModel; + + if (ecModel && scaleType === 'time' + /*|| scaleType === 'interval' */ + ) { + var barSeriesModels = prepareLayoutBarSeries('bar', ecModel); + var isBaseAxisAndHasBarSeries_1 = false; + each(barSeriesModels, function (seriesModel) { + isBaseAxisAndHasBarSeries_1 = isBaseAxisAndHasBarSeries_1 || seriesModel.getBaseAxis() === model.axis; + }); + + if (isBaseAxisAndHasBarSeries_1) { + // Calculate placement of bars on axis. TODO should be decoupled + // with barLayout + var barWidthAndOffset = makeColumnLayout(barSeriesModels); // Adjust axis min and max to account for overflow + + var adjustedScale = adjustScaleForOverflow(min, max, model, barWidthAndOffset); + min = adjustedScale.min; + max = adjustedScale.max; + } + } + + return { + extent: [min, max], + // "fix" means "fixed", the value should not be + // changed in the subsequent steps. + fixMin: rawExtentResult.minFixed, + fixMax: rawExtentResult.maxFixed + }; + } + + function adjustScaleForOverflow(min, max, model, // Only support cartesian coord yet. + barWidthAndOffset) { + // Get Axis Length + var axisExtent = model.axis.getExtent(); + var axisLength = axisExtent[1] - axisExtent[0]; // Get bars on current base axis and calculate min and max overflow + + var barsOnCurrentAxis = retrieveColumnLayout(barWidthAndOffset, model.axis); + + if (barsOnCurrentAxis === undefined) { + return { + min: min, + max: max + }; + } + + var minOverflow = Infinity; + each(barsOnCurrentAxis, function (item) { + minOverflow = Math.min(item.offset, minOverflow); + }); + var maxOverflow = -Infinity; + each(barsOnCurrentAxis, function (item) { + maxOverflow = Math.max(item.offset + item.width, maxOverflow); + }); + minOverflow = Math.abs(minOverflow); + maxOverflow = Math.abs(maxOverflow); + var totalOverFlow = minOverflow + maxOverflow; // Calculate required buffer based on old range and overflow + + var oldRange = max - min; + var oldRangePercentOfNew = 1 - (minOverflow + maxOverflow) / axisLength; + var overflowBuffer = oldRange / oldRangePercentOfNew - oldRange; + max += overflowBuffer * (maxOverflow / totalOverFlow); + min -= overflowBuffer * (minOverflow / totalOverFlow); + return { + min: min, + max: max + }; + } // Precondition of calling this method: + // The scale extent has been initailized using series data extent via + // `scale.setExtent` or `scale.unionExtentFromData`; + + + function niceScaleExtent(scale, inModel) { + var model = inModel; + var extentInfo = getScaleExtent(scale, model); + var extent = extentInfo.extent; + var splitNumber = model.get('splitNumber'); + + if (scale instanceof LogScale) { + scale.base = model.get('logBase'); + } + + var scaleType = scale.type; + var interval = model.get('interval'); + var isIntervalOrTime = scaleType === 'interval' || scaleType === 'time'; + scale.setExtent(extent[0], extent[1]); + scale.calcNiceExtent({ + splitNumber: splitNumber, + fixMin: extentInfo.fixMin, + fixMax: extentInfo.fixMax, + minInterval: isIntervalOrTime ? model.get('minInterval') : null, + maxInterval: isIntervalOrTime ? model.get('maxInterval') : null + }); // If some one specified the min, max. And the default calculated interval + // is not good enough. He can specify the interval. It is often appeared + // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard + // to be 60. + // FIXME + + if (interval != null) { + scale.setInterval && scale.setInterval(interval); + } + } + /** + * @param axisType Default retrieve from model.type + */ + + function createScaleByModel(model, axisType) { + axisType = axisType || model.get('type'); + + if (axisType) { + switch (axisType) { + // Buildin scale + case 'category': + return new OrdinalScale({ + ordinalMeta: model.getOrdinalMeta ? model.getOrdinalMeta() : model.getCategories(), + extent: [Infinity, -Infinity] + }); + + case 'time': + return new TimeScale({ + locale: model.ecModel.getLocaleModel(), + useUTC: model.ecModel.get('useUTC') + }); + + default: + // case 'value'/'interval', 'log', or others. + return new (Scale.getClass(axisType) || IntervalScale)(); + } + } + } + /** + * Check if the axis cross 0 + */ + + function ifAxisCrossZero(axis) { + var dataExtent = axis.scale.getExtent(); + var min = dataExtent[0]; + var max = dataExtent[1]; + return !(min > 0 && max > 0 || min < 0 && max < 0); + } + /** + * @param axis + * @return Label formatter function. + * param: {number} tickValue, + * param: {number} idx, the index in all ticks. + * If category axis, this param is not required. + * return: {string} label string. + */ + + function makeLabelFormatter(axis) { + var labelFormatter = axis.getLabelModel().get('formatter'); + var categoryTickStart = axis.type === 'category' ? axis.scale.getExtent()[0] : null; + + if (axis.scale.type === 'time') { + return function (tpl) { + return function (tick, idx) { + return axis.scale.getFormattedLabel(tick, idx, tpl); + }; + }(labelFormatter); + } else if (isString(labelFormatter)) { + return function (tpl) { + return function (tick) { + // For category axis, get raw value; for numeric axis, + // get formatted label like '1,333,444'. + var label = axis.scale.getLabel(tick); + var text = tpl.replace('{value}', label != null ? label : ''); + return text; + }; + }(labelFormatter); + } else if (isFunction(labelFormatter)) { + return function (cb) { + return function (tick, idx) { + // The original intention of `idx` is "the index of the tick in all ticks". + // But the previous implementation of category axis do not consider the + // `axisLabel.interval`, which cause that, for example, the `interval` is + // `1`, then the ticks "name5", "name7", "name9" are displayed, where the + // corresponding `idx` are `0`, `2`, `4`, but not `0`, `1`, `2`. So we keep + // the definition here for back compatibility. + if (categoryTickStart != null) { + idx = tick.value - categoryTickStart; + } + + return cb(getAxisRawValue(axis, tick), idx, tick.level != null ? { + level: tick.level + } : null); + }; + }(labelFormatter); + } else { + return function (tick) { + return axis.scale.getLabel(tick); + }; + } + } + function getAxisRawValue(axis, tick) { + // In category axis with data zoom, tick is not the original + // index of axis.data. So tick should not be exposed to user + // in category axis. + return axis.type === 'category' ? axis.scale.getLabel(tick) : tick.value; + } + /** + * @param axis + * @return Be null/undefined if no labels. + */ + + function estimateLabelUnionRect(axis) { + var axisModel = axis.model; + var scale = axis.scale; + + if (!axisModel.get(['axisLabel', 'show']) || scale.isBlank()) { + return; + } + + var realNumberScaleTicks; + var tickCount; + var categoryScaleExtent = scale.getExtent(); // Optimize for large category data, avoid call `getTicks()`. + + if (scale instanceof OrdinalScale) { + tickCount = scale.count(); + } else { + realNumberScaleTicks = scale.getTicks(); + tickCount = realNumberScaleTicks.length; + } + + var axisLabelModel = axis.getLabelModel(); + var labelFormatter = makeLabelFormatter(axis); + var rect; + var step = 1; // Simple optimization for large amount of labels + + if (tickCount > 40) { + step = Math.ceil(tickCount / 40); + } + + for (var i = 0; i < tickCount; i += step) { + var tick = realNumberScaleTicks ? realNumberScaleTicks[i] : { + value: categoryScaleExtent[0] + i + }; + var label = labelFormatter(tick, i); + var unrotatedSingleRect = axisLabelModel.getTextRect(label); + var singleRect = rotateTextRect(unrotatedSingleRect, axisLabelModel.get('rotate') || 0); + rect ? rect.union(singleRect) : rect = singleRect; + } + + return rect; + } + + function rotateTextRect(textRect, rotate) { + var rotateRadians = rotate * Math.PI / 180; + var beforeWidth = textRect.width; + var beforeHeight = textRect.height; + var afterWidth = beforeWidth * Math.abs(Math.cos(rotateRadians)) + Math.abs(beforeHeight * Math.sin(rotateRadians)); + var afterHeight = beforeWidth * Math.abs(Math.sin(rotateRadians)) + Math.abs(beforeHeight * Math.cos(rotateRadians)); + var rotatedRect = new BoundingRect(textRect.x, textRect.y, afterWidth, afterHeight); + return rotatedRect; + } + /** + * @param model axisLabelModel or axisTickModel + * @return {number|String} Can be null|'auto'|number|function + */ + + + function getOptionCategoryInterval(model) { + var interval = model.get('interval'); + return interval == null ? 'auto' : interval; + } + /** + * Set `categoryInterval` as 0 implicitly indicates that + * show all labels reguardless of overlap. + * @param {Object} axis axisModel.axis + */ + + function shouldShowAllLabels(axis) { + return axis.type === 'category' && getOptionCategoryInterval(axis.getLabelModel()) === 0; + } + function getDataDimensionsOnAxis(data, axisDim) { + // Remove duplicated dat dimensions caused by `getStackedDimension`. + var dataDimMap = {}; // Currently `mapDimensionsAll` will contain stack result dimension ('__\0ecstackresult'). + // PENDING: is it reasonable? Do we need to remove the original dim from "coord dim" since + // there has been stacked result dim? + + each(data.mapDimensionsAll(axisDim), function (dataDim) { + // For example, the extent of the original dimension + // is [0.1, 0.5], the extent of the `stackResultDimension` + // is [7, 9], the final extent should NOT include [0.1, 0.5], + // because there is no graphic corresponding to [0.1, 0.5]. + // See the case in `test/area-stack.html` `main1`, where area line + // stack needs `yAxis` not start from 0. + dataDimMap[getStackedDimension(data, dataDim)] = true; + }); + return keys(dataDimMap); + } + function unionAxisExtentFromData(dataExtent, data, axisDim) { + if (data) { + each(getDataDimensionsOnAxis(data, axisDim), function (dim) { + var seriesExtent = data.getApproximateExtent(dim); + seriesExtent[0] < dataExtent[0] && (dataExtent[0] = seriesExtent[0]); + seriesExtent[1] > dataExtent[1] && (dataExtent[1] = seriesExtent[1]); + }); + } + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var AxisModelCommonMixin = + /** @class */ + function () { + function AxisModelCommonMixin() {} + + AxisModelCommonMixin.prototype.getNeedCrossZero = function () { + var option = this.option; + return !option.scale; + }; + /** + * Should be implemented by each axis model if necessary. + * @return coordinate system model + */ + + + AxisModelCommonMixin.prototype.getCoordSysModel = function () { + return; + }; + + return AxisModelCommonMixin; + }(); + + /** + * Create a muti dimension List structure from seriesModel. + */ + + function createList(seriesModel) { + return createSeriesData(null, seriesModel); + } // export function createGraph(seriesModel) { + var dataStack$1 = { + isDimensionStacked: isDimensionStacked, + enableDataStack: enableDataStack, + getStackedDimension: getStackedDimension + }; + /** + * Create scale + * @param {Array.<number>} dataExtent + * @param {Object|module:echarts/Model} option If `optoin.type` + * is secified, it can only be `'value'` currently. + */ + + function createScale(dataExtent, option) { + var axisModel = option; + + if (!(option instanceof Model)) { + axisModel = new Model(option); // FIXME + // Currently AxisModelCommonMixin has nothing to do with the + // the requirements of `axisHelper.createScaleByModel`. For + // example the method `getCategories` and `getOrdinalMeta` + // are required for `'category'` axis, and ecModel are required + // for `'time'` axis. But occationally echarts-gl happened + // to only use `'value'` axis. + // zrUtil.mixin(axisModel, AxisModelCommonMixin); + } + + var scale = createScaleByModel(axisModel); + scale.setExtent(dataExtent[0], dataExtent[1]); + niceScaleExtent(scale, axisModel); + return scale; + } + /** + * Mixin common methods to axis model, + * + * Inlcude methods + * `getFormattedLabels() => Array.<string>` + * `getCategories() => Array.<string>` + * `getMin(origin: boolean) => number` + * `getMax(origin: boolean) => number` + * `getNeedCrossZero() => boolean` + */ + + function mixinAxisModelCommonMethods(Model) { + mixin(Model, AxisModelCommonMixin); + } + function createTextStyle$1(textStyleModel, opts) { + opts = opts || {}; + return createTextStyle(textStyleModel, null, null, opts.state !== 'normal'); + } + + var helper = /*#__PURE__*/Object.freeze({ + __proto__: null, + createList: createList, + getLayoutRect: getLayoutRect, + dataStack: dataStack$1, + createScale: createScale, + mixinAxisModelCommonMethods: mixinAxisModelCommonMethods, + getECData: getECData, + createTextStyle: createTextStyle$1, + createDimensions: createDimensions, + createSymbol: createSymbol, + enableHoverEmphasis: enableHoverEmphasis + }); + + var EPSILON$4 = 1e-8; + function isAroundEqual$1(a, b) { + return Math.abs(a - b) < EPSILON$4; + } + function contain$2(points, x, y) { + var w = 0; + var p = points[0]; + if (!p) { + return false; + } + for (var i = 1; i < points.length; i++) { + var p2 = points[i]; + w += windingLine(p[0], p[1], p2[0], p2[1], x, y); + p = p2; + } + var p0 = points[0]; + if (!isAroundEqual$1(p[0], p0[0]) || !isAroundEqual$1(p[1], p0[1])) { + w += windingLine(p[0], p[1], p0[0], p0[1], x, y); + } + return w !== 0; + } + + var TMP_TRANSFORM = []; + + function transformPoints(points, transform) { + for (var p = 0; p < points.length; p++) { + applyTransform(points[p], points[p], transform); + } + } + + function updateBBoxFromPoints(points, min$1, max$1, projection) { + for (var i = 0; i < points.length; i++) { + var p = points[i]; + + if (projection) { + // projection may return null point. + p = projection.project(p); + } + + if (p && isFinite(p[0]) && isFinite(p[1])) { + min(min$1, min$1, p); + max(max$1, max$1, p); + } + } + } + + function centroid(points) { + var signedArea = 0; + var cx = 0; + var cy = 0; + var len = points.length; + var x0 = points[len - 1][0]; + var y0 = points[len - 1][1]; // Polygon should been closed. + + for (var i = 0; i < len; i++) { + var x1 = points[i][0]; + var y1 = points[i][1]; + var a = x0 * y1 - x1 * y0; + signedArea += a; + cx += (x0 + x1) * a; + cy += (y0 + y1) * a; + x0 = x1; + y0 = y1; + } + + return signedArea ? [cx / signedArea / 3, cy / signedArea / 3, signedArea] : [points[0][0] || 0, points[0][1] || 0]; + } + + var Region = + /** @class */ + function () { + function Region(name) { + this.name = name; + } + + Region.prototype.setCenter = function (center) { + this._center = center; + }; + /** + * Get center point in data unit. That is, + * for GeoJSONRegion, the unit is lat/lng, + * for GeoSVGRegion, the unit is SVG local coord. + */ + + + Region.prototype.getCenter = function () { + var center = this._center; + + if (!center) { + // In most cases there are no need to calculate this center. + // So calculate only when called. + center = this._center = this.calcCenter(); + } + + return center; + }; + + return Region; + }(); + + var GeoJSONPolygonGeometry = + /** @class */ + function () { + function GeoJSONPolygonGeometry(exterior, interiors) { + this.type = 'polygon'; + this.exterior = exterior; + this.interiors = interiors; + } + + return GeoJSONPolygonGeometry; + }(); + + var GeoJSONLineStringGeometry = + /** @class */ + function () { + function GeoJSONLineStringGeometry(points) { + this.type = 'linestring'; + this.points = points; + } + + return GeoJSONLineStringGeometry; + }(); + + var GeoJSONRegion = + /** @class */ + function (_super) { + __extends(GeoJSONRegion, _super); + + function GeoJSONRegion(name, geometries, cp) { + var _this = _super.call(this, name) || this; + + _this.type = 'geoJSON'; + _this.geometries = geometries; + _this._center = cp && [cp[0], cp[1]]; + return _this; + } + + GeoJSONRegion.prototype.calcCenter = function () { + var geometries = this.geometries; + var largestGeo; + var largestGeoSize = 0; + + for (var i = 0; i < geometries.length; i++) { + var geo = geometries[i]; + var exterior = geo.exterior; // Simple trick to use points count instead of polygon area as region size. + // Ignore linestring + + var size = exterior && exterior.length; + + if (size > largestGeoSize) { + largestGeo = geo; + largestGeoSize = size; + } + } + + if (largestGeo) { + return centroid(largestGeo.exterior); + } // from bounding rect by default. + + + var rect = this.getBoundingRect(); + return [rect.x + rect.width / 2, rect.y + rect.height / 2]; + }; + + GeoJSONRegion.prototype.getBoundingRect = function (projection) { + var rect = this._rect; // Always recalculate if using projection. + + if (rect && !projection) { + return rect; + } + + var min = [Infinity, Infinity]; + var max = [-Infinity, -Infinity]; + var geometries = this.geometries; + each(geometries, function (geo) { + if (geo.type === 'polygon') { + // Doesn't consider hole + updateBBoxFromPoints(geo.exterior, min, max, projection); + } else { + each(geo.points, function (points) { + updateBBoxFromPoints(points, min, max, projection); + }); + } + }); // Normalie invalid bounding. + + if (!(isFinite(min[0]) && isFinite(min[1]) && isFinite(max[0]) && isFinite(max[1]))) { + min[0] = min[1] = max[0] = max[1] = 0; + } + + rect = new BoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]); + + if (!projection) { + this._rect = rect; + } + + return rect; + }; + + GeoJSONRegion.prototype.contain = function (coord) { + var rect = this.getBoundingRect(); + var geometries = this.geometries; + + if (!rect.contain(coord[0], coord[1])) { + return false; + } + + loopGeo: for (var i = 0, len = geometries.length; i < len; i++) { + var geo = geometries[i]; // Only support polygon. + + if (geo.type !== 'polygon') { + continue; + } + + var exterior = geo.exterior; + var interiors = geo.interiors; + + if (contain$2(exterior, coord[0], coord[1])) { + // Not in the region if point is in the hole. + for (var k = 0; k < (interiors ? interiors.length : 0); k++) { + if (contain$2(interiors[k], coord[0], coord[1])) { + continue loopGeo; + } + } + + return true; + } + } + + return false; + }; + /** + * Transform the raw coords to target bounding. + * @param x + * @param y + * @param width + * @param height + */ + + + GeoJSONRegion.prototype.transformTo = function (x, y, width, height) { + var rect = this.getBoundingRect(); + var aspect = rect.width / rect.height; + + if (!width) { + width = aspect * height; + } else if (!height) { + height = width / aspect; + } + + var target = new BoundingRect(x, y, width, height); + var transform = rect.calculateTransform(target); + var geometries = this.geometries; + + for (var i = 0; i < geometries.length; i++) { + var geo = geometries[i]; + + if (geo.type === 'polygon') { + transformPoints(geo.exterior, transform); + each(geo.interiors, function (interior) { + transformPoints(interior, transform); + }); + } else { + each(geo.points, function (points) { + transformPoints(points, transform); + }); + } + } + + rect = this._rect; + rect.copy(target); // Update center + + this._center = [rect.x + rect.width / 2, rect.y + rect.height / 2]; + }; + + GeoJSONRegion.prototype.cloneShallow = function (name) { + name == null && (name = this.name); + var newRegion = new GeoJSONRegion(name, this.geometries, this._center); + newRegion._rect = this._rect; + newRegion.transformTo = null; // Simply avoid to be called. + + return newRegion; + }; + + return GeoJSONRegion; + }(Region); + + var GeoSVGRegion = + /** @class */ + function (_super) { + __extends(GeoSVGRegion, _super); + + function GeoSVGRegion(name, elOnlyForCalculate) { + var _this = _super.call(this, name) || this; + + _this.type = 'geoSVG'; + _this._elOnlyForCalculate = elOnlyForCalculate; + return _this; + } + + GeoSVGRegion.prototype.calcCenter = function () { + var el = this._elOnlyForCalculate; + var rect = el.getBoundingRect(); + var center = [rect.x + rect.width / 2, rect.y + rect.height / 2]; + var mat = identity(TMP_TRANSFORM); + var target = el; + + while (target && !target.isGeoSVGGraphicRoot) { + mul$1(mat, target.getLocalTransform(), mat); + target = target.parent; + } + + invert(mat, mat); + applyTransform(center, center, mat); + return center; + }; + + return GeoSVGRegion; + }(Region); + + function decode(json) { + if (!json.UTF8Encoding) { + return json; + } + + var jsonCompressed = json; + var encodeScale = jsonCompressed.UTF8Scale; + + if (encodeScale == null) { + encodeScale = 1024; + } + + var features = jsonCompressed.features; + each(features, function (feature) { + var geometry = feature.geometry; + var encodeOffsets = geometry.encodeOffsets; + var coordinates = geometry.coordinates; // Geometry may be appeded manually in the script after json loaded. + // In this case this geometry is usually not encoded. + + if (!encodeOffsets) { + return; + } + + switch (geometry.type) { + case 'LineString': + geometry.coordinates = decodeRing(coordinates, encodeOffsets, encodeScale); + break; + + case 'Polygon': + decodeRings(coordinates, encodeOffsets, encodeScale); + break; + + case 'MultiLineString': + decodeRings(coordinates, encodeOffsets, encodeScale); + break; + + case 'MultiPolygon': + each(coordinates, function (rings, idx) { + return decodeRings(rings, encodeOffsets[idx], encodeScale); + }); + } + }); // Has been decoded + + jsonCompressed.UTF8Encoding = false; + return jsonCompressed; + } + + function decodeRings(rings, encodeOffsets, encodeScale) { + for (var c = 0; c < rings.length; c++) { + rings[c] = decodeRing(rings[c], encodeOffsets[c], encodeScale); + } + } + + function decodeRing(coordinate, encodeOffsets, encodeScale) { + var result = []; + var prevX = encodeOffsets[0]; + var prevY = encodeOffsets[1]; + + for (var i = 0; i < coordinate.length; i += 2) { + var x = coordinate.charCodeAt(i) - 64; + var y = coordinate.charCodeAt(i + 1) - 64; // ZigZag decoding + + x = x >> 1 ^ -(x & 1); + y = y >> 1 ^ -(y & 1); // Delta deocding + + x += prevX; + y += prevY; + prevX = x; + prevY = y; // Dequantize + + result.push([x / encodeScale, y / encodeScale]); + } + + return result; + } + + function parseGeoJSON(geoJson, nameProperty) { + geoJson = decode(geoJson); + return map(filter(geoJson.features, function (featureObj) { + // Output of mapshaper may have geometry null + return featureObj.geometry && featureObj.properties && featureObj.geometry.coordinates.length > 0; + }), function (featureObj) { + var properties = featureObj.properties; + var geo = featureObj.geometry; + var geometries = []; + + switch (geo.type) { + case 'Polygon': + var coordinates = geo.coordinates; // According to the GeoJSON specification. + // First must be exterior, and the rest are all interior(holes). + + geometries.push(new GeoJSONPolygonGeometry(coordinates[0], coordinates.slice(1))); + break; + + case 'MultiPolygon': + each(geo.coordinates, function (item) { + if (item[0]) { + geometries.push(new GeoJSONPolygonGeometry(item[0], item.slice(1))); + } + }); + break; + + case 'LineString': + geometries.push(new GeoJSONLineStringGeometry([geo.coordinates])); + break; + + case 'MultiLineString': + geometries.push(new GeoJSONLineStringGeometry(geo.coordinates)); + } + + var region = new GeoJSONRegion(properties[nameProperty || 'name'], geometries, properties.cp); + region.properties = properties; + return region; + }); + } + + var number = /*#__PURE__*/Object.freeze({ + __proto__: null, + linearMap: linearMap, + round: round, + asc: asc, + getPrecision: getPrecision, + getPrecisionSafe: getPrecisionSafe, + getPixelPrecision: getPixelPrecision, + getPercentWithPrecision: getPercentWithPrecision, + MAX_SAFE_INTEGER: MAX_SAFE_INTEGER, + remRadian: remRadian, + isRadianAroundZero: isRadianAroundZero, + parseDate: parseDate, + quantity: quantity, + quantityExponent: quantityExponent, + nice: nice, + quantile: quantile, + reformIntervals: reformIntervals, + isNumeric: isNumeric, + numericToNumber: numericToNumber + }); + + var time = /*#__PURE__*/Object.freeze({ + __proto__: null, + parse: parseDate, + format: format + }); + + var graphic$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + extendShape: extendShape, + extendPath: extendPath, + makePath: makePath, + makeImage: makeImage, + mergePath: mergePath$1, + resizePath: resizePath, + createIcon: createIcon, + updateProps: updateProps, + initProps: initProps, + getTransform: getTransform, + clipPointsByRect: clipPointsByRect, + clipRectByRect: clipRectByRect, + registerShape: registerShape, + getShapeClass: getShapeClass, + Group: Group, + Image: ZRImage, + Text: ZRText, + Circle: Circle, + Ellipse: Ellipse, + Sector: Sector, + Ring: Ring, + Polygon: Polygon, + Polyline: Polyline, + Rect: Rect, + Line: Line, + BezierCurve: BezierCurve, + Arc: Arc, + IncrementalDisplayable: IncrementalDisplayable, + CompoundPath: CompoundPath, + LinearGradient: LinearGradient, + RadialGradient: RadialGradient, + BoundingRect: BoundingRect + }); + + var format$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + addCommas: addCommas, + toCamelCase: toCamelCase, + normalizeCssArray: normalizeCssArray$1, + encodeHTML: encodeHTML, + formatTpl: formatTpl, + getTooltipMarker: getTooltipMarker, + formatTime: formatTime, + capitalFirst: capitalFirst, + truncateText: truncateText, + getTextRect: getTextRect + }); + + var util$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + map: map, + each: each, + indexOf: indexOf, + inherits: inherits, + reduce: reduce, + filter: filter, + bind: bind, + curry: curry, + isArray: isArray, + isString: isString, + isObject: isObject, + isFunction: isFunction, + extend: extend, + defaults: defaults, + clone: clone, + merge: merge + }); + + var inner$5 = makeInner(); + function createAxisLabels(axis) { + // Only ordinal scale support tick interval + return axis.type === 'category' ? makeCategoryLabels(axis) : makeRealNumberLabels(axis); + } + /** + * @param {module:echats/coord/Axis} axis + * @param {module:echarts/model/Model} tickModel For example, can be axisTick, splitLine, splitArea. + * @return {Object} { + * ticks: Array.<number> + * tickCategoryInterval: number + * } + */ + + function createAxisTicks(axis, tickModel) { + // Only ordinal scale support tick interval + return axis.type === 'category' ? makeCategoryTicks(axis, tickModel) : { + ticks: map(axis.scale.getTicks(), function (tick) { + return tick.value; + }) + }; + } + + function makeCategoryLabels(axis) { + var labelModel = axis.getLabelModel(); + var result = makeCategoryLabelsActually(axis, labelModel); + return !labelModel.get('show') || axis.scale.isBlank() ? { + labels: [], + labelCategoryInterval: result.labelCategoryInterval + } : result; + } + + function makeCategoryLabelsActually(axis, labelModel) { + var labelsCache = getListCache(axis, 'labels'); + var optionLabelInterval = getOptionCategoryInterval(labelModel); + var result = listCacheGet(labelsCache, optionLabelInterval); + + if (result) { + return result; + } + + var labels; + var numericLabelInterval; + + if (isFunction(optionLabelInterval)) { + labels = makeLabelsByCustomizedCategoryInterval(axis, optionLabelInterval); + } else { + numericLabelInterval = optionLabelInterval === 'auto' ? makeAutoCategoryInterval(axis) : optionLabelInterval; + labels = makeLabelsByNumericCategoryInterval(axis, numericLabelInterval); + } // Cache to avoid calling interval function repeatly. + + + return listCacheSet(labelsCache, optionLabelInterval, { + labels: labels, + labelCategoryInterval: numericLabelInterval + }); + } + + function makeCategoryTicks(axis, tickModel) { + var ticksCache = getListCache(axis, 'ticks'); + var optionTickInterval = getOptionCategoryInterval(tickModel); + var result = listCacheGet(ticksCache, optionTickInterval); + + if (result) { + return result; + } + + var ticks; + var tickCategoryInterval; // Optimize for the case that large category data and no label displayed, + // we should not return all ticks. + + if (!tickModel.get('show') || axis.scale.isBlank()) { + ticks = []; + } + + if (isFunction(optionTickInterval)) { + ticks = makeLabelsByCustomizedCategoryInterval(axis, optionTickInterval, true); + } // Always use label interval by default despite label show. Consider this + // scenario, Use multiple grid with the xAxis sync, and only one xAxis shows + // labels. `splitLine` and `axisTick` should be consistent in this case. + else if (optionTickInterval === 'auto') { + var labelsResult = makeCategoryLabelsActually(axis, axis.getLabelModel()); + tickCategoryInterval = labelsResult.labelCategoryInterval; + ticks = map(labelsResult.labels, function (labelItem) { + return labelItem.tickValue; + }); + } else { + tickCategoryInterval = optionTickInterval; + ticks = makeLabelsByNumericCategoryInterval(axis, tickCategoryInterval, true); + } // Cache to avoid calling interval function repeatly. + + + return listCacheSet(ticksCache, optionTickInterval, { + ticks: ticks, + tickCategoryInterval: tickCategoryInterval + }); + } + + function makeRealNumberLabels(axis) { + var ticks = axis.scale.getTicks(); + var labelFormatter = makeLabelFormatter(axis); + return { + labels: map(ticks, function (tick, idx) { + return { + level: tick.level, + formattedLabel: labelFormatter(tick, idx), + rawLabel: axis.scale.getLabel(tick), + tickValue: tick.value + }; + }) + }; + } + + function getListCache(axis, prop) { + // Because key can be funciton, and cache size always be small, we use array cache. + return inner$5(axis)[prop] || (inner$5(axis)[prop] = []); + } + + function listCacheGet(cache, key) { + for (var i = 0; i < cache.length; i++) { + if (cache[i].key === key) { + return cache[i].value; + } + } + } + + function listCacheSet(cache, key, value) { + cache.push({ + key: key, + value: value + }); + return value; + } + + function makeAutoCategoryInterval(axis) { + var result = inner$5(axis).autoInterval; + return result != null ? result : inner$5(axis).autoInterval = axis.calculateCategoryInterval(); + } + /** + * Calculate interval for category axis ticks and labels. + * To get precise result, at least one of `getRotate` and `isHorizontal` + * should be implemented in axis. + */ + + + function calculateCategoryInterval(axis) { + var params = fetchAutoCategoryIntervalCalculationParams(axis); + var labelFormatter = makeLabelFormatter(axis); + var rotation = (params.axisRotate - params.labelRotate) / 180 * Math.PI; + var ordinalScale = axis.scale; + var ordinalExtent = ordinalScale.getExtent(); // Providing this method is for optimization: + // avoid generating a long array by `getTicks` + // in large category data case. + + var tickCount = ordinalScale.count(); + + if (ordinalExtent[1] - ordinalExtent[0] < 1) { + return 0; + } + + var step = 1; // Simple optimization. Empirical value: tick count should less than 40. + + if (tickCount > 40) { + step = Math.max(1, Math.floor(tickCount / 40)); + } + + var tickValue = ordinalExtent[0]; + var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue); + var unitW = Math.abs(unitSpan * Math.cos(rotation)); + var unitH = Math.abs(unitSpan * Math.sin(rotation)); + var maxW = 0; + var maxH = 0; // Caution: Performance sensitive for large category data. + // Consider dataZoom, we should make appropriate step to avoid O(n) loop. + + for (; tickValue <= ordinalExtent[1]; tickValue += step) { + var width = 0; + var height = 0; // Not precise, do not consider align and vertical align + // and each distance from axis line yet. + + var rect = getBoundingRect(labelFormatter({ + value: tickValue + }), params.font, 'center', 'top'); // Magic number + + width = rect.width * 1.3; + height = rect.height * 1.3; // Min size, void long loop. + + maxW = Math.max(maxW, width, 7); + maxH = Math.max(maxH, height, 7); + } + + var dw = maxW / unitW; + var dh = maxH / unitH; // 0/0 is NaN, 1/0 is Infinity. + + isNaN(dw) && (dw = Infinity); + isNaN(dh) && (dh = Infinity); + var interval = Math.max(0, Math.floor(Math.min(dw, dh))); + var cache = inner$5(axis.model); + var axisExtent = axis.getExtent(); + var lastAutoInterval = cache.lastAutoInterval; + var lastTickCount = cache.lastTickCount; // Use cache to keep interval stable while moving zoom window, + // otherwise the calculated interval might jitter when the zoom + // window size is close to the interval-changing size. + // For example, if all of the axis labels are `a, b, c, d, e, f, g`. + // The jitter will cause that sometimes the displayed labels are + // `a, d, g` (interval: 2) sometimes `a, c, e`(interval: 1). + + if (lastAutoInterval != null && lastTickCount != null && Math.abs(lastAutoInterval - interval) <= 1 && Math.abs(lastTickCount - tickCount) <= 1 // Always choose the bigger one, otherwise the critical + // point is not the same when zooming in or zooming out. + && lastAutoInterval > interval // If the axis change is caused by chart resize, the cache should not + // be used. Otherwise some hiden labels might not be shown again. + && cache.axisExtent0 === axisExtent[0] && cache.axisExtent1 === axisExtent[1]) { + interval = lastAutoInterval; + } // Only update cache if cache not used, otherwise the + // changing of interval is too insensitive. + else { + cache.lastTickCount = tickCount; + cache.lastAutoInterval = interval; + cache.axisExtent0 = axisExtent[0]; + cache.axisExtent1 = axisExtent[1]; + } + + return interval; + } + + function fetchAutoCategoryIntervalCalculationParams(axis) { + var labelModel = axis.getLabelModel(); + return { + axisRotate: axis.getRotate ? axis.getRotate() : axis.isHorizontal && !axis.isHorizontal() ? 90 : 0, + labelRotate: labelModel.get('rotate') || 0, + font: labelModel.getFont() + }; + } + + function makeLabelsByNumericCategoryInterval(axis, categoryInterval, onlyTick) { + var labelFormatter = makeLabelFormatter(axis); + var ordinalScale = axis.scale; + var ordinalExtent = ordinalScale.getExtent(); + var labelModel = axis.getLabelModel(); + var result = []; // TODO: axisType: ordinalTime, pick the tick from each month/day/year/... + + var step = Math.max((categoryInterval || 0) + 1, 1); + var startTick = ordinalExtent[0]; + var tickCount = ordinalScale.count(); // Calculate start tick based on zero if possible to keep label consistent + // while zooming and moving while interval > 0. Otherwise the selection + // of displayable ticks and symbols probably keep changing. + // 3 is empirical value. + + if (startTick !== 0 && step > 1 && tickCount / step > 2) { + startTick = Math.round(Math.ceil(startTick / step) * step); + } // (1) Only add min max label here but leave overlap checking + // to render stage, which also ensure the returned list + // suitable for splitLine and splitArea rendering. + // (2) Scales except category always contain min max label so + // do not need to perform this process. + + + var showAllLabel = shouldShowAllLabels(axis); + var includeMinLabel = labelModel.get('showMinLabel') || showAllLabel; + var includeMaxLabel = labelModel.get('showMaxLabel') || showAllLabel; + + if (includeMinLabel && startTick !== ordinalExtent[0]) { + addItem(ordinalExtent[0]); + } // Optimize: avoid generating large array by `ordinalScale.getTicks()`. + + + var tickValue = startTick; + + for (; tickValue <= ordinalExtent[1]; tickValue += step) { + addItem(tickValue); + } + + if (includeMaxLabel && tickValue - step !== ordinalExtent[1]) { + addItem(ordinalExtent[1]); + } + + function addItem(tickValue) { + var tickObj = { + value: tickValue + }; + result.push(onlyTick ? tickValue : { + formattedLabel: labelFormatter(tickObj), + rawLabel: ordinalScale.getLabel(tickObj), + tickValue: tickValue + }); + } + + return result; + } + + function makeLabelsByCustomizedCategoryInterval(axis, categoryInterval, onlyTick) { + var ordinalScale = axis.scale; + var labelFormatter = makeLabelFormatter(axis); + var result = []; + each(ordinalScale.getTicks(), function (tick) { + var rawLabel = ordinalScale.getLabel(tick); + var tickValue = tick.value; + + if (categoryInterval(tick.value, rawLabel)) { + result.push(onlyTick ? tickValue : { + formattedLabel: labelFormatter(tick), + rawLabel: rawLabel, + tickValue: tickValue + }); + } + }); + return result; + } + + var NORMALIZED_EXTENT = [0, 1]; + /** + * Base class of Axis. + */ + + var Axis = + /** @class */ + function () { + function Axis(dim, scale, extent) { + this.onBand = false; + this.inverse = false; + this.dim = dim; + this.scale = scale; + this._extent = extent || [0, 0]; + } + /** + * If axis extent contain given coord + */ + + + Axis.prototype.contain = function (coord) { + var extent = this._extent; + var min = Math.min(extent[0], extent[1]); + var max = Math.max(extent[0], extent[1]); + return coord >= min && coord <= max; + }; + /** + * If axis extent contain given data + */ + + + Axis.prototype.containData = function (data) { + return this.scale.contain(data); + }; + /** + * Get coord extent. + */ + + + Axis.prototype.getExtent = function () { + return this._extent.slice(); + }; + /** + * Get precision used for formatting + */ + + + Axis.prototype.getPixelPrecision = function (dataExtent) { + return getPixelPrecision(dataExtent || this.scale.getExtent(), this._extent); + }; + /** + * Set coord extent + */ + + + Axis.prototype.setExtent = function (start, end) { + var extent = this._extent; + extent[0] = start; + extent[1] = end; + }; + /** + * Convert data to coord. Data is the rank if it has an ordinal scale + */ + + + Axis.prototype.dataToCoord = function (data, clamp) { + var extent = this._extent; + var scale = this.scale; + data = scale.normalize(data); + + if (this.onBand && scale.type === 'ordinal') { + extent = extent.slice(); + fixExtentWithBands(extent, scale.count()); + } + + return linearMap(data, NORMALIZED_EXTENT, extent, clamp); + }; + /** + * Convert coord to data. Data is the rank if it has an ordinal scale + */ + + + Axis.prototype.coordToData = function (coord, clamp) { + var extent = this._extent; + var scale = this.scale; + + if (this.onBand && scale.type === 'ordinal') { + extent = extent.slice(); + fixExtentWithBands(extent, scale.count()); + } + + var t = linearMap(coord, extent, NORMALIZED_EXTENT, clamp); + return this.scale.scale(t); + }; + /** + * Convert pixel point to data in axis + */ + + + Axis.prototype.pointToData = function (point, clamp) { + // Should be implemented in derived class if necessary. + return; + }; + /** + * Different from `zrUtil.map(axis.getTicks(), axis.dataToCoord, axis)`, + * `axis.getTicksCoords` considers `onBand`, which is used by + * `boundaryGap:true` of category axis and splitLine and splitArea. + * @param opt.tickModel default: axis.model.getModel('axisTick') + * @param opt.clamp If `true`, the first and the last + * tick must be at the axis end points. Otherwise, clip ticks + * that outside the axis extent. + */ + + + Axis.prototype.getTicksCoords = function (opt) { + opt = opt || {}; + var tickModel = opt.tickModel || this.getTickModel(); + var result = createAxisTicks(this, tickModel); + var ticks = result.ticks; + var ticksCoords = map(ticks, function (tickVal) { + return { + coord: this.dataToCoord(this.scale.type === 'ordinal' ? this.scale.getRawOrdinalNumber(tickVal) : tickVal), + tickValue: tickVal + }; + }, this); + var alignWithLabel = tickModel.get('alignWithLabel'); + fixOnBandTicksCoords(this, ticksCoords, alignWithLabel, opt.clamp); + return ticksCoords; + }; + + Axis.prototype.getMinorTicksCoords = function () { + if (this.scale.type === 'ordinal') { + // Category axis doesn't support minor ticks + return []; + } + + var minorTickModel = this.model.getModel('minorTick'); + var splitNumber = minorTickModel.get('splitNumber'); // Protection. + + if (!(splitNumber > 0 && splitNumber < 100)) { + splitNumber = 5; + } + + var minorTicks = this.scale.getMinorTicks(splitNumber); + var minorTicksCoords = map(minorTicks, function (minorTicksGroup) { + return map(minorTicksGroup, function (minorTick) { + return { + coord: this.dataToCoord(minorTick), + tickValue: minorTick + }; + }, this); + }, this); + return minorTicksCoords; + }; + + Axis.prototype.getViewLabels = function () { + return createAxisLabels(this).labels; + }; + + Axis.prototype.getLabelModel = function () { + return this.model.getModel('axisLabel'); + }; + /** + * Notice here we only get the default tick model. For splitLine + * or splitArea, we should pass the splitLineModel or splitAreaModel + * manually when calling `getTicksCoords`. + * In GL, this method may be overrided to: + * `axisModel.getModel('axisTick', grid3DModel.getModel('axisTick'));` + */ + + + Axis.prototype.getTickModel = function () { + return this.model.getModel('axisTick'); + }; + /** + * Get width of band + */ + + + Axis.prototype.getBandWidth = function () { + var axisExtent = this._extent; + var dataExtent = this.scale.getExtent(); + var len = dataExtent[1] - dataExtent[0] + (this.onBand ? 1 : 0); // Fix #2728, avoid NaN when only one data. + + len === 0 && (len = 1); + var size = Math.abs(axisExtent[1] - axisExtent[0]); + return Math.abs(size) / len; + }; + /** + * Only be called in category axis. + * Can be overrided, consider other axes like in 3D. + * @return Auto interval for cateogry axis tick and label + */ + + + Axis.prototype.calculateCategoryInterval = function () { + return calculateCategoryInterval(this); + }; + + return Axis; + }(); + + function fixExtentWithBands(extent, nTick) { + var size = extent[1] - extent[0]; + var len = nTick; + var margin = size / len / 2; + extent[0] += margin; + extent[1] -= margin; + } // If axis has labels [1, 2, 3, 4]. Bands on the axis are + // |---1---|---2---|---3---|---4---|. + // So the displayed ticks and splitLine/splitArea should between + // each data item, otherwise cause misleading (e.g., split tow bars + // of a single data item when there are two bar series). + // Also consider if tickCategoryInterval > 0 and onBand, ticks and + // splitLine/spliteArea should layout appropriately corresponding + // to displayed labels. (So we should not use `getBandWidth` in this + // case). + + + function fixOnBandTicksCoords(axis, ticksCoords, alignWithLabel, clamp) { + var ticksLen = ticksCoords.length; + + if (!axis.onBand || alignWithLabel || !ticksLen) { + return; + } + + var axisExtent = axis.getExtent(); + var last; + var diffSize; + + if (ticksLen === 1) { + ticksCoords[0].coord = axisExtent[0]; + last = ticksCoords[1] = { + coord: axisExtent[0] + }; + } else { + var crossLen = ticksCoords[ticksLen - 1].tickValue - ticksCoords[0].tickValue; + var shift_1 = (ticksCoords[ticksLen - 1].coord - ticksCoords[0].coord) / crossLen; + each(ticksCoords, function (ticksItem) { + ticksItem.coord -= shift_1 / 2; + }); + var dataExtent = axis.scale.getExtent(); + diffSize = 1 + dataExtent[1] - ticksCoords[ticksLen - 1].tickValue; + last = { + coord: ticksCoords[ticksLen - 1].coord + shift_1 * diffSize + }; + ticksCoords.push(last); + } + + var inverse = axisExtent[0] > axisExtent[1]; // Handling clamp. + + if (littleThan(ticksCoords[0].coord, axisExtent[0])) { + clamp ? ticksCoords[0].coord = axisExtent[0] : ticksCoords.shift(); + } + + if (clamp && littleThan(axisExtent[0], ticksCoords[0].coord)) { + ticksCoords.unshift({ + coord: axisExtent[0] + }); + } + + if (littleThan(axisExtent[1], last.coord)) { + clamp ? last.coord = axisExtent[1] : ticksCoords.pop(); + } + + if (clamp && littleThan(last.coord, axisExtent[1])) { + ticksCoords.push({ + coord: axisExtent[1] + }); + } + + function littleThan(a, b) { + // Avoid rounding error cause calculated tick coord different with extent. + // It may cause an extra unecessary tick added. + a = round(a); + b = round(b); + return inverse ? a > b : a < b; + } + } + + // Should use `ComponentModel.extend` or `class XXXX extend ComponentModel` to create class. + // Then use `registerComponentModel` in `install` parameter when `use` this extension. For example: + // class Bar3DModel extends ComponentModel {} + // export function install(registers) { regsiters.registerComponentModel(Bar3DModel); } + // echarts.use(install); + + function extendComponentModel(proto) { + var Model = ComponentModel.extend(proto); + ComponentModel.registerClass(Model); + return Model; + } + function extendComponentView(proto) { + var View = ComponentView.extend(proto); + ComponentView.registerClass(View); + return View; + } + function extendSeriesModel(proto) { + var Model = SeriesModel.extend(proto); + SeriesModel.registerClass(Model); + return Model; + } + function extendChartView(proto) { + var View = ChartView.extend(proto); + ChartView.registerClass(View); + return View; + } + + var PI2$6 = Math.PI * 2; + var CMD$3 = PathProxy.CMD; + var DEFAULT_SEARCH_SPACE = ['top', 'right', 'bottom', 'left']; + + function getCandidateAnchor(pos, distance, rect, outPt, outDir) { + var width = rect.width; + var height = rect.height; + + switch (pos) { + case 'top': + outPt.set(rect.x + width / 2, rect.y - distance); + outDir.set(0, -1); + break; + + case 'bottom': + outPt.set(rect.x + width / 2, rect.y + height + distance); + outDir.set(0, 1); + break; + + case 'left': + outPt.set(rect.x - distance, rect.y + height / 2); + outDir.set(-1, 0); + break; + + case 'right': + outPt.set(rect.x + width + distance, rect.y + height / 2); + outDir.set(1, 0); + break; + } + } + + function projectPointToArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y, out) { + x -= cx; + y -= cy; + var d = Math.sqrt(x * x + y * y); + x /= d; + y /= d; // Intersect point. + + var ox = x * r + cx; + var oy = y * r + cy; + + if (Math.abs(startAngle - endAngle) % PI2$6 < 1e-4) { + // Is a circle + out[0] = ox; + out[1] = oy; + return d - r; + } + + if (anticlockwise) { + var tmp = startAngle; + startAngle = normalizeRadian(endAngle); + endAngle = normalizeRadian(tmp); + } else { + startAngle = normalizeRadian(startAngle); + endAngle = normalizeRadian(endAngle); + } + + if (startAngle > endAngle) { + endAngle += PI2$6; + } + + var angle = Math.atan2(y, x); + + if (angle < 0) { + angle += PI2$6; + } + + if (angle >= startAngle && angle <= endAngle || angle + PI2$6 >= startAngle && angle + PI2$6 <= endAngle) { + // Project point is on the arc. + out[0] = ox; + out[1] = oy; + return d - r; + } + + var x1 = r * Math.cos(startAngle) + cx; + var y1 = r * Math.sin(startAngle) + cy; + var x2 = r * Math.cos(endAngle) + cx; + var y2 = r * Math.sin(endAngle) + cy; + var d1 = (x1 - x) * (x1 - x) + (y1 - y) * (y1 - y); + var d2 = (x2 - x) * (x2 - x) + (y2 - y) * (y2 - y); + + if (d1 < d2) { + out[0] = x1; + out[1] = y1; + return Math.sqrt(d1); + } else { + out[0] = x2; + out[1] = y2; + return Math.sqrt(d2); + } + } + + function projectPointToLine(x1, y1, x2, y2, x, y, out, limitToEnds) { + var dx = x - x1; + var dy = y - y1; + var dx1 = x2 - x1; + var dy1 = y2 - y1; + var lineLen = Math.sqrt(dx1 * dx1 + dy1 * dy1); + dx1 /= lineLen; + dy1 /= lineLen; // dot product + + var projectedLen = dx * dx1 + dy * dy1; + var t = projectedLen / lineLen; + + if (limitToEnds) { + t = Math.min(Math.max(t, 0), 1); + } + + t *= lineLen; + var ox = out[0] = x1 + t * dx1; + var oy = out[1] = y1 + t * dy1; + return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y)); + } + + function projectPointToRect(x1, y1, width, height, x, y, out) { + if (width < 0) { + x1 = x1 + width; + width = -width; + } + + if (height < 0) { + y1 = y1 + height; + height = -height; + } + + var x2 = x1 + width; + var y2 = y1 + height; + var ox = out[0] = Math.min(Math.max(x, x1), x2); + var oy = out[1] = Math.min(Math.max(y, y1), y2); + return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y)); + } + + var tmpPt = []; + + function nearestPointOnRect(pt, rect, out) { + var dist = projectPointToRect(rect.x, rect.y, rect.width, rect.height, pt.x, pt.y, tmpPt); + out.set(tmpPt[0], tmpPt[1]); + return dist; + } + /** + * Calculate min distance corresponding point. + * This method won't evaluate if point is in the path. + */ + + + function nearestPointOnPath(pt, path, out) { + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + var x1; + var y1; + var minDist = Infinity; + var data = path.data; + var x = pt.x; + var y = pt.y; + + for (var i = 0; i < data.length;) { + var cmd = data[i++]; + + if (i === 1) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + + var d = minDist; + + switch (cmd) { + case CMD$3.M: + // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点 + // 在 closePath 的时候使用 + x0 = data[i++]; + y0 = data[i++]; + xi = x0; + yi = y0; + break; + + case CMD$3.L: + d = projectPointToLine(xi, yi, data[i], data[i + 1], x, y, tmpPt, true); + xi = data[i++]; + yi = data[i++]; + break; + + case CMD$3.C: + d = cubicProjectPoint(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt); + xi = data[i++]; + yi = data[i++]; + break; + + case CMD$3.Q: + d = quadraticProjectPoint(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt); + xi = data[i++]; + yi = data[i++]; + break; + + case CMD$3.A: + // TODO Arc 判断的开销比较大 + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var theta = data[i++]; + var dTheta = data[i++]; // TODO Arc 旋转 + + i += 1; + var anticlockwise = !!(1 - data[i++]); + x1 = Math.cos(theta) * rx + cx; + y1 = Math.sin(theta) * ry + cy; // 不是直接使用 arc 命令 + + if (i <= 1) { + // 第一个命令起点还未定义 + x0 = x1; + y0 = y1; + } // zr 使用scale来模拟椭圆, 这里也对x做一定的缩放 + + + var _x = (x - cx) * ry / rx + cx; + + d = projectPointToArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y, tmpPt); + xi = Math.cos(theta + dTheta) * rx + cx; + yi = Math.sin(theta + dTheta) * ry + cy; + break; + + case CMD$3.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + d = projectPointToRect(x0, y0, width, height, x, y, tmpPt); + break; + + case CMD$3.Z: + d = projectPointToLine(xi, yi, x0, y0, x, y, tmpPt, true); + xi = x0; + yi = y0; + break; + } + + if (d < minDist) { + minDist = d; + out.set(tmpPt[0], tmpPt[1]); + } + } + + return minDist; + } // Temporal varible for intermediate usage. + + + var pt0 = new Point(); + var pt1 = new Point(); + var pt2 = new Point(); + var dir = new Point(); + var dir2 = new Point(); + /** + * Calculate a proper guide line based on the label position and graphic element definition + * @param label + * @param labelRect + * @param target + * @param targetRect + */ + + function updateLabelLinePoints(target, labelLineModel) { + if (!target) { + return; + } + + var labelLine = target.getTextGuideLine(); + var label = target.getTextContent(); // Needs to create text guide in each charts. + + if (!(label && labelLine)) { + return; + } + + var labelGuideConfig = target.textGuideLineConfig || {}; + var points = [[0, 0], [0, 0], [0, 0]]; + var searchSpace = labelGuideConfig.candidates || DEFAULT_SEARCH_SPACE; + var labelRect = label.getBoundingRect().clone(); + labelRect.applyTransform(label.getComputedTransform()); + var minDist = Infinity; + var anchorPoint = labelGuideConfig.anchor; + var targetTransform = target.getComputedTransform(); + var targetInversedTransform = targetTransform && invert([], targetTransform); + var len = labelLineModel.get('length2') || 0; + + if (anchorPoint) { + pt2.copy(anchorPoint); + } + + for (var i = 0; i < searchSpace.length; i++) { + var candidate = searchSpace[i]; + getCandidateAnchor(candidate, 0, labelRect, pt0, dir); + Point.scaleAndAdd(pt1, pt0, dir, len); // Transform to target coord space. + + pt1.transform(targetInversedTransform); // Note: getBoundingRect will ensure the `path` being created. + + var boundingRect = target.getBoundingRect(); + var dist = anchorPoint ? anchorPoint.distance(pt1) : target instanceof Path ? nearestPointOnPath(pt1, target.path, pt2) : nearestPointOnRect(pt1, boundingRect, pt2); // TODO pt2 is in the path + + if (dist < minDist) { + minDist = dist; // Transform back to global space. + + pt1.transform(targetTransform); + pt2.transform(targetTransform); + pt2.toArray(points[0]); + pt1.toArray(points[1]); + pt0.toArray(points[2]); + } + } + + limitTurnAngle(points, labelLineModel.get('minTurnAngle')); + labelLine.setShape({ + points: points + }); + } // Temporal variable for the limitTurnAngle function + + var tmpArr = []; + var tmpProjPoint = new Point(); + /** + * Reduce the line segment attached to the label to limit the turn angle between two segments. + * @param linePoints + * @param minTurnAngle Radian of minimum turn angle. 0 - 180 + */ + + function limitTurnAngle(linePoints, minTurnAngle) { + if (!(minTurnAngle <= 180 && minTurnAngle > 0)) { + return; + } + + minTurnAngle = minTurnAngle / 180 * Math.PI; // The line points can be + // /pt1----pt2 (label) + // / + // pt0/ + + pt0.fromArray(linePoints[0]); + pt1.fromArray(linePoints[1]); + pt2.fromArray(linePoints[2]); + Point.sub(dir, pt0, pt1); + Point.sub(dir2, pt2, pt1); + var len1 = dir.len(); + var len2 = dir2.len(); + + if (len1 < 1e-3 || len2 < 1e-3) { + return; + } + + dir.scale(1 / len1); + dir2.scale(1 / len2); + var angleCos = dir.dot(dir2); + var minTurnAngleCos = Math.cos(minTurnAngle); + + if (minTurnAngleCos < angleCos) { + // Smaller than minTurnAngle + // Calculate project point of pt0 on pt1-pt2 + var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false); + tmpProjPoint.fromArray(tmpArr); // Calculate new projected length with limited minTurnAngle and get the new connect point + + tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI - minTurnAngle)); // Limit the new calculated connect point between pt1 and pt2. + + var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y); + + if (isNaN(t)) { + return; + } + + if (t < 0) { + Point.copy(tmpProjPoint, pt1); + } else if (t > 1) { + Point.copy(tmpProjPoint, pt2); + } + + tmpProjPoint.toArray(linePoints[1]); + } + } + /** + * Limit the angle of line and the surface + * @param maxSurfaceAngle Radian of minimum turn angle. 0 - 180. 0 is same direction to normal. 180 is opposite + */ + + function limitSurfaceAngle(linePoints, surfaceNormal, maxSurfaceAngle) { + if (!(maxSurfaceAngle <= 180 && maxSurfaceAngle > 0)) { + return; + } + + maxSurfaceAngle = maxSurfaceAngle / 180 * Math.PI; + pt0.fromArray(linePoints[0]); + pt1.fromArray(linePoints[1]); + pt2.fromArray(linePoints[2]); + Point.sub(dir, pt1, pt0); + Point.sub(dir2, pt2, pt1); + var len1 = dir.len(); + var len2 = dir2.len(); + + if (len1 < 1e-3 || len2 < 1e-3) { + return; + } + + dir.scale(1 / len1); + dir2.scale(1 / len2); + var angleCos = dir.dot(surfaceNormal); + var maxSurfaceAngleCos = Math.cos(maxSurfaceAngle); + + if (angleCos < maxSurfaceAngleCos) { + // Calculate project point of pt0 on pt1-pt2 + var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false); + tmpProjPoint.fromArray(tmpArr); + var HALF_PI = Math.PI / 2; + var angle2 = Math.acos(dir2.dot(surfaceNormal)); + var newAngle = HALF_PI + angle2 - maxSurfaceAngle; + + if (newAngle >= HALF_PI) { + // parallel + Point.copy(tmpProjPoint, pt2); + } else { + // Calculate new projected length with limited minTurnAngle and get the new connect point + tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI / 2 - newAngle)); // Limit the new calculated connect point between pt1 and pt2. + + var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y); + + if (isNaN(t)) { + return; + } + + if (t < 0) { + Point.copy(tmpProjPoint, pt1); + } else if (t > 1) { + Point.copy(tmpProjPoint, pt2); + } + } + + tmpProjPoint.toArray(linePoints[1]); + } + } + + function setLabelLineState(labelLine, ignore, stateName, stateModel) { + var isNormal = stateName === 'normal'; + var stateObj = isNormal ? labelLine : labelLine.ensureState(stateName); // Make sure display. + + stateObj.ignore = ignore; // Set smooth + + var smooth = stateModel.get('smooth'); + + if (smooth && smooth === true) { + smooth = 0.3; + } + + stateObj.shape = stateObj.shape || {}; + + if (smooth > 0) { + stateObj.shape.smooth = smooth; + } + + var styleObj = stateModel.getModel('lineStyle').getLineStyle(); + isNormal ? labelLine.useStyle(styleObj) : stateObj.style = styleObj; + } + + function buildLabelLinePath(path, shape) { + var smooth = shape.smooth; + var points = shape.points; + + if (!points) { + return; + } + + path.moveTo(points[0][0], points[0][1]); + + if (smooth > 0 && points.length >= 3) { + var len1 = dist(points[0], points[1]); + var len2 = dist(points[1], points[2]); + + if (!len1 || !len2) { + path.lineTo(points[1][0], points[1][1]); + path.lineTo(points[2][0], points[2][1]); + return; + } + + var moveLen = Math.min(len1, len2) * smooth; + var midPoint0 = lerp([], points[1], points[0], moveLen / len1); + var midPoint2 = lerp([], points[1], points[2], moveLen / len2); + var midPoint1 = lerp([], midPoint0, midPoint2, 0.5); + path.bezierCurveTo(midPoint0[0], midPoint0[1], midPoint0[0], midPoint0[1], midPoint1[0], midPoint1[1]); + path.bezierCurveTo(midPoint2[0], midPoint2[1], midPoint2[0], midPoint2[1], points[2][0], points[2][1]); + } else { + for (var i = 1; i < points.length; i++) { + path.lineTo(points[i][0], points[i][1]); + } + } + } + /** + * Create a label line if necessary and set it's style. + */ + + + function setLabelLineStyle(targetEl, statesModels, defaultStyle) { + var labelLine = targetEl.getTextGuideLine(); + var label = targetEl.getTextContent(); + + if (!label) { + // Not show label line if there is no label. + if (labelLine) { + targetEl.removeTextGuideLine(); + } + + return; + } + + var normalModel = statesModels.normal; + var showNormal = normalModel.get('show'); + var labelIgnoreNormal = label.ignore; + + for (var i = 0; i < DISPLAY_STATES.length; i++) { + var stateName = DISPLAY_STATES[i]; + var stateModel = statesModels[stateName]; + var isNormal = stateName === 'normal'; + + if (stateModel) { + var stateShow = stateModel.get('show'); + var isLabelIgnored = isNormal ? labelIgnoreNormal : retrieve2(label.states[stateName] && label.states[stateName].ignore, labelIgnoreNormal); + + if (isLabelIgnored // Not show when label is not shown in this state. + || !retrieve2(stateShow, showNormal) // Use normal state by default if not set. + ) { + var stateObj = isNormal ? labelLine : labelLine && labelLine.states[stateName]; + + if (stateObj) { + stateObj.ignore = true; + } + + continue; + } // Create labelLine if not exists + + + if (!labelLine) { + labelLine = new Polyline(); + targetEl.setTextGuideLine(labelLine); // Reset state of normal because it's new created. + // NOTE: NORMAL should always been the first! + + if (!isNormal && (labelIgnoreNormal || !showNormal)) { + setLabelLineState(labelLine, true, 'normal', statesModels.normal); + } // Use same state proxy. + + + if (targetEl.stateProxy) { + labelLine.stateProxy = targetEl.stateProxy; + } + } + + setLabelLineState(labelLine, false, stateName, stateModel); + } + } + + if (labelLine) { + defaults(labelLine.style, defaultStyle); // Not fill. + + labelLine.style.fill = null; + var showAbove = normalModel.get('showAbove'); + var labelLineConfig = targetEl.textGuideLineConfig = targetEl.textGuideLineConfig || {}; + labelLineConfig.showAbove = showAbove || false; // Custom the buildPath. + + labelLine.buildPath = buildLabelLinePath; + } + } + function getLabelLineStatesModels(itemModel, labelLineName) { + labelLineName = labelLineName || 'labelLine'; + var statesModels = { + normal: itemModel.getModel(labelLineName) + }; + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + statesModels[stateName] = itemModel.getModel([stateName, labelLineName]); + } + + return statesModels; + } + + function prepareLayoutList(input) { + var list = []; + + for (var i = 0; i < input.length; i++) { + var rawItem = input[i]; + + if (rawItem.defaultAttr.ignore) { + continue; + } + + var label = rawItem.label; + var transform = label.getComputedTransform(); // NOTE: Get bounding rect after getComputedTransform, or label may not been updated by the host el. + + var localRect = label.getBoundingRect(); + var isAxisAligned = !transform || transform[1] < 1e-5 && transform[2] < 1e-5; + var minMargin = label.style.margin || 0; + var globalRect = localRect.clone(); + globalRect.applyTransform(transform); + globalRect.x -= minMargin / 2; + globalRect.y -= minMargin / 2; + globalRect.width += minMargin; + globalRect.height += minMargin; + var obb = isAxisAligned ? new OrientedBoundingRect(localRect, transform) : null; + list.push({ + label: label, + labelLine: rawItem.labelLine, + rect: globalRect, + localRect: localRect, + obb: obb, + priority: rawItem.priority, + defaultAttr: rawItem.defaultAttr, + layoutOption: rawItem.computedLayoutOption, + axisAligned: isAxisAligned, + transform: transform + }); + } + + return list; + } + + function shiftLayout(list, xyDim, sizeDim, minBound, maxBound, balanceShift) { + var len = list.length; + + if (len < 2) { + return; + } + + list.sort(function (a, b) { + return a.rect[xyDim] - b.rect[xyDim]; + }); + var lastPos = 0; + var delta; + var adjusted = false; + var totalShifts = 0; + + for (var i = 0; i < len; i++) { + var item = list[i]; + var rect = item.rect; + delta = rect[xyDim] - lastPos; + + if (delta < 0) { + // shiftForward(i, len, -delta); + rect[xyDim] -= delta; + item.label[xyDim] -= delta; + adjusted = true; + } + + var shift = Math.max(-delta, 0); + totalShifts += shift; + lastPos = rect[xyDim] + rect[sizeDim]; + } + + if (totalShifts > 0 && balanceShift) { + // Shift back to make the distribution more equally. + shiftList(-totalShifts / len, 0, len); + } // TODO bleedMargin? + + + var first = list[0]; + var last = list[len - 1]; + var minGap; + var maxGap; + updateMinMaxGap(); // If ends exceed two bounds, squeeze at most 80%, then take the gap of two bounds. + + minGap < 0 && squeezeGaps(-minGap, 0.8); + maxGap < 0 && squeezeGaps(maxGap, 0.8); + updateMinMaxGap(); + takeBoundsGap(minGap, maxGap, 1); + takeBoundsGap(maxGap, minGap, -1); // Handle bailout when there is not enough space. + + updateMinMaxGap(); + + if (minGap < 0) { + squeezeWhenBailout(-minGap); + } + + if (maxGap < 0) { + squeezeWhenBailout(maxGap); + } + + function updateMinMaxGap() { + minGap = first.rect[xyDim] - minBound; + maxGap = maxBound - last.rect[xyDim] - last.rect[sizeDim]; + } + + function takeBoundsGap(gapThisBound, gapOtherBound, moveDir) { + if (gapThisBound < 0) { + // Move from other gap if can. + var moveFromMaxGap = Math.min(gapOtherBound, -gapThisBound); + + if (moveFromMaxGap > 0) { + shiftList(moveFromMaxGap * moveDir, 0, len); + var remained = moveFromMaxGap + gapThisBound; + + if (remained < 0) { + squeezeGaps(-remained * moveDir, 1); + } + } else { + squeezeGaps(-gapThisBound * moveDir, 1); + } + } + } + + function shiftList(delta, start, end) { + if (delta !== 0) { + adjusted = true; + } + + for (var i = start; i < end; i++) { + var item = list[i]; + var rect = item.rect; + rect[xyDim] += delta; + item.label[xyDim] += delta; + } + } // Squeeze gaps if the labels exceed margin. + + + function squeezeGaps(delta, maxSqeezePercent) { + var gaps = []; + var totalGaps = 0; + + for (var i = 1; i < len; i++) { + var prevItemRect = list[i - 1].rect; + var gap = Math.max(list[i].rect[xyDim] - prevItemRect[xyDim] - prevItemRect[sizeDim], 0); + gaps.push(gap); + totalGaps += gap; + } + + if (!totalGaps) { + return; + } + + var squeezePercent = Math.min(Math.abs(delta) / totalGaps, maxSqeezePercent); + + if (delta > 0) { + for (var i = 0; i < len - 1; i++) { + // Distribute the shift delta to all gaps. + var movement = gaps[i] * squeezePercent; // Forward + + shiftList(movement, 0, i + 1); + } + } else { + // Backward + for (var i = len - 1; i > 0; i--) { + // Distribute the shift delta to all gaps. + var movement = gaps[i - 1] * squeezePercent; + shiftList(-movement, i, len); + } + } + } + /** + * Squeeze to allow overlap if there is no more space available. + * Let other overlapping strategy like hideOverlap do the job instead of keep exceeding the bounds. + */ + + + function squeezeWhenBailout(delta) { + var dir = delta < 0 ? -1 : 1; + delta = Math.abs(delta); + var moveForEachLabel = Math.ceil(delta / (len - 1)); + + for (var i = 0; i < len - 1; i++) { + if (dir > 0) { + // Forward + shiftList(moveForEachLabel, 0, i + 1); + } else { + // Backward + shiftList(-moveForEachLabel, len - i - 1, len); + } + + delta -= moveForEachLabel; + + if (delta <= 0) { + return; + } + } + } + + return adjusted; + } + /** + * Adjust labels on x direction to avoid overlap. + */ + + + function shiftLayoutOnX(list, leftBound, rightBound, // If average the shifts on all labels and add them to 0 + // TODO: Not sure if should enable it. + // Pros: The angle of lines will distribute more equally + // Cons: In some layout. It may not what user wanted. like in pie. the label of last sector is usually changed unexpectedly. + balanceShift) { + return shiftLayout(list, 'x', 'width', leftBound, rightBound, balanceShift); + } + /** + * Adjust labels on y direction to avoid overlap. + */ + + function shiftLayoutOnY(list, topBound, bottomBound, // If average the shifts on all labels and add them to 0 + balanceShift) { + return shiftLayout(list, 'y', 'height', topBound, bottomBound, balanceShift); + } + function hideOverlap(labelList) { + var displayedLabels = []; // TODO, render overflow visible first, put in the displayedLabels. + + labelList.sort(function (a, b) { + return b.priority - a.priority; + }); + var globalRect = new BoundingRect(0, 0, 0, 0); + + function hideEl(el) { + if (!el.ignore) { + // Show on emphasis. + var emphasisState = el.ensureState('emphasis'); + + if (emphasisState.ignore == null) { + emphasisState.ignore = false; + } + } + + el.ignore = true; + } + + for (var i = 0; i < labelList.length; i++) { + var labelItem = labelList[i]; + var isAxisAligned = labelItem.axisAligned; + var localRect = labelItem.localRect; + var transform = labelItem.transform; + var label = labelItem.label; + var labelLine = labelItem.labelLine; + globalRect.copy(labelItem.rect); // Add a threshold because layout may be aligned precisely. + + globalRect.width -= 0.1; + globalRect.height -= 0.1; + globalRect.x += 0.05; + globalRect.y += 0.05; + var obb = labelItem.obb; + var overlapped = false; + + for (var j = 0; j < displayedLabels.length; j++) { + var existsTextCfg = displayedLabels[j]; // Fast rejection. + + if (!globalRect.intersect(existsTextCfg.rect)) { + continue; + } + + if (isAxisAligned && existsTextCfg.axisAligned) { + // Is overlapped + overlapped = true; + break; + } + + if (!existsTextCfg.obb) { + // If self is not axis aligned. But other is. + existsTextCfg.obb = new OrientedBoundingRect(existsTextCfg.localRect, existsTextCfg.transform); + } + + if (!obb) { + // If self is axis aligned. But other is not. + obb = new OrientedBoundingRect(localRect, transform); + } + + if (obb.intersect(existsTextCfg.obb)) { + overlapped = true; + break; + } + } // TODO Callback to determine if this overlap should be handled? + + + if (overlapped) { + hideEl(label); + labelLine && hideEl(labelLine); + } else { + label.attr('ignore', labelItem.defaultAttr.ignore); + labelLine && labelLine.attr('ignore', labelItem.defaultAttr.labelGuideIgnore); + displayedLabels.push(labelItem); + } + } + } + + function cloneArr(points) { + if (points) { + var newPoints = []; + + for (var i = 0; i < points.length; i++) { + newPoints.push(points[i].slice()); + } + + return newPoints; + } + } + + function prepareLayoutCallbackParams(labelItem, hostEl) { + var label = labelItem.label; + var labelLine = hostEl && hostEl.getTextGuideLine(); + return { + dataIndex: labelItem.dataIndex, + dataType: labelItem.dataType, + seriesIndex: labelItem.seriesModel.seriesIndex, + text: labelItem.label.style.text, + rect: labelItem.hostRect, + labelRect: labelItem.rect, + // x: labelAttr.x, + // y: labelAttr.y, + align: label.style.align, + verticalAlign: label.style.verticalAlign, + labelLinePoints: cloneArr(labelLine && labelLine.shape.points) + }; + } + + var LABEL_OPTION_TO_STYLE_KEYS = ['align', 'verticalAlign', 'width', 'height', 'fontSize']; + var dummyTransformable = new Transformable(); + var labelLayoutInnerStore = makeInner(); + var labelLineAnimationStore = makeInner(); + + function extendWithKeys(target, source, keys) { + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + + if (source[key] != null) { + target[key] = source[key]; + } + } + } + + var LABEL_LAYOUT_PROPS = ['x', 'y', 'rotation']; + + var LabelManager = + /** @class */ + function () { + function LabelManager() { + this._labelList = []; + this._chartViewList = []; + } + + LabelManager.prototype.clearLabels = function () { + this._labelList = []; + this._chartViewList = []; + }; + /** + * Add label to manager + */ + + + LabelManager.prototype._addLabel = function (dataIndex, dataType, seriesModel, label, layoutOption) { + var labelStyle = label.style; + var hostEl = label.__hostTarget; + var textConfig = hostEl.textConfig || {}; // TODO: If label is in other state. + + var labelTransform = label.getComputedTransform(); + var labelRect = label.getBoundingRect().plain(); + BoundingRect.applyTransform(labelRect, labelRect, labelTransform); + + if (labelTransform) { + dummyTransformable.setLocalTransform(labelTransform); + } else { + // Identity transform. + dummyTransformable.x = dummyTransformable.y = dummyTransformable.rotation = dummyTransformable.originX = dummyTransformable.originY = 0; + dummyTransformable.scaleX = dummyTransformable.scaleY = 1; + } + + var host = label.__hostTarget; + var hostRect; + + if (host) { + hostRect = host.getBoundingRect().plain(); + var transform = host.getComputedTransform(); + BoundingRect.applyTransform(hostRect, hostRect, transform); + } + + var labelGuide = hostRect && host.getTextGuideLine(); + + this._labelList.push({ + label: label, + labelLine: labelGuide, + seriesModel: seriesModel, + dataIndex: dataIndex, + dataType: dataType, + layoutOption: layoutOption, + computedLayoutOption: null, + rect: labelRect, + hostRect: hostRect, + // Label with lower priority will be hidden when overlapped + // Use rect size as default priority + priority: hostRect ? hostRect.width * hostRect.height : 0, + // Save default label attributes. + // For restore if developers want get back to default value in callback. + defaultAttr: { + ignore: label.ignore, + labelGuideIgnore: labelGuide && labelGuide.ignore, + x: dummyTransformable.x, + y: dummyTransformable.y, + scaleX: dummyTransformable.scaleX, + scaleY: dummyTransformable.scaleY, + rotation: dummyTransformable.rotation, + style: { + x: labelStyle.x, + y: labelStyle.y, + align: labelStyle.align, + verticalAlign: labelStyle.verticalAlign, + width: labelStyle.width, + height: labelStyle.height, + fontSize: labelStyle.fontSize + }, + cursor: label.cursor, + attachedPos: textConfig.position, + attachedRot: textConfig.rotation + } + }); + }; + + LabelManager.prototype.addLabelsOfSeries = function (chartView) { + var _this = this; + + this._chartViewList.push(chartView); + + var seriesModel = chartView.__model; + var layoutOption = seriesModel.get('labelLayout'); + /** + * Ignore layouting if it's not specified anything. + */ + + if (!(isFunction(layoutOption) || keys(layoutOption).length)) { + return; + } + + chartView.group.traverse(function (child) { + if (child.ignore) { + return true; // Stop traverse descendants. + } // Only support label being hosted on graphic elements. + + + var textEl = child.getTextContent(); + var ecData = getECData(child); // Can only attach the text on the element with dataIndex + + if (textEl && !textEl.disableLabelLayout) { + _this._addLabel(ecData.dataIndex, ecData.dataType, seriesModel, textEl, layoutOption); + } + }); + }; + + LabelManager.prototype.updateLayoutConfig = function (api) { + var width = api.getWidth(); + var height = api.getHeight(); + + function createDragHandler(el, labelLineModel) { + return function () { + updateLabelLinePoints(el, labelLineModel); + }; + } + + for (var i = 0; i < this._labelList.length; i++) { + var labelItem = this._labelList[i]; + var label = labelItem.label; + var hostEl = label.__hostTarget; + var defaultLabelAttr = labelItem.defaultAttr; + var layoutOption = void 0; // TODO A global layout option? + + if (isFunction(labelItem.layoutOption)) { + layoutOption = labelItem.layoutOption(prepareLayoutCallbackParams(labelItem, hostEl)); + } else { + layoutOption = labelItem.layoutOption; + } + + layoutOption = layoutOption || {}; + labelItem.computedLayoutOption = layoutOption; + var degreeToRadian = Math.PI / 180; // TODO hostEl should always exists. + // Or label should not have parent because the x, y is all in global space. + + if (hostEl) { + hostEl.setTextConfig({ + // Force to set local false. + local: false, + // Ignore position and rotation config on the host el if x or y is changed. + position: layoutOption.x != null || layoutOption.y != null ? null : defaultLabelAttr.attachedPos, + // Ignore rotation config on the host el if rotation is changed. + rotation: layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.attachedRot, + offset: [layoutOption.dx || 0, layoutOption.dy || 0] + }); + } + + var needsUpdateLabelLine = false; + + if (layoutOption.x != null) { + // TODO width of chart view. + label.x = parsePercent$1(layoutOption.x, width); + label.setStyle('x', 0); // Ignore movement in style. TODO: origin. + + needsUpdateLabelLine = true; + } else { + label.x = defaultLabelAttr.x; + label.setStyle('x', defaultLabelAttr.style.x); + } + + if (layoutOption.y != null) { + // TODO height of chart view. + label.y = parsePercent$1(layoutOption.y, height); + label.setStyle('y', 0); // Ignore movement in style. + + needsUpdateLabelLine = true; + } else { + label.y = defaultLabelAttr.y; + label.setStyle('y', defaultLabelAttr.style.y); + } + + if (layoutOption.labelLinePoints) { + var guideLine = hostEl.getTextGuideLine(); + + if (guideLine) { + guideLine.setShape({ + points: layoutOption.labelLinePoints + }); // Not update + + needsUpdateLabelLine = false; + } + } + + var labelLayoutStore = labelLayoutInnerStore(label); + labelLayoutStore.needsUpdateLabelLine = needsUpdateLabelLine; + label.rotation = layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.rotation; + label.scaleX = defaultLabelAttr.scaleX; + label.scaleY = defaultLabelAttr.scaleY; + + for (var k = 0; k < LABEL_OPTION_TO_STYLE_KEYS.length; k++) { + var key = LABEL_OPTION_TO_STYLE_KEYS[k]; + label.setStyle(key, layoutOption[key] != null ? layoutOption[key] : defaultLabelAttr.style[key]); + } + + if (layoutOption.draggable) { + label.draggable = true; + label.cursor = 'move'; + + if (hostEl) { + var hostModel = labelItem.seriesModel; + + if (labelItem.dataIndex != null) { + var data = labelItem.seriesModel.getData(labelItem.dataType); + hostModel = data.getItemModel(labelItem.dataIndex); + } + + label.on('drag', createDragHandler(hostEl, hostModel.getModel('labelLine'))); + } + } else { + // TODO Other drag functions? + label.off('drag'); + label.cursor = defaultLabelAttr.cursor; + } + } + }; + + LabelManager.prototype.layout = function (api) { + var width = api.getWidth(); + var height = api.getHeight(); + var labelList = prepareLayoutList(this._labelList); + var labelsNeedsAdjustOnX = filter(labelList, function (item) { + return item.layoutOption.moveOverlap === 'shiftX'; + }); + var labelsNeedsAdjustOnY = filter(labelList, function (item) { + return item.layoutOption.moveOverlap === 'shiftY'; + }); + shiftLayoutOnX(labelsNeedsAdjustOnX, 0, width); + shiftLayoutOnY(labelsNeedsAdjustOnY, 0, height); + var labelsNeedsHideOverlap = filter(labelList, function (item) { + return item.layoutOption.hideOverlap; + }); + hideOverlap(labelsNeedsHideOverlap); + }; + /** + * Process all labels. Not only labels with layoutOption. + */ + + + LabelManager.prototype.processLabelsOverall = function () { + var _this = this; + + each(this._chartViewList, function (chartView) { + var seriesModel = chartView.__model; + var ignoreLabelLineUpdate = chartView.ignoreLabelLineUpdate; + var animationEnabled = seriesModel.isAnimationEnabled(); + chartView.group.traverse(function (child) { + if (child.ignore && !child.forceLabelAnimation) { + return true; // Stop traverse descendants. + } + + var needsUpdateLabelLine = !ignoreLabelLineUpdate; + var label = child.getTextContent(); + + if (!needsUpdateLabelLine && label) { + needsUpdateLabelLine = labelLayoutInnerStore(label).needsUpdateLabelLine; + } + + if (needsUpdateLabelLine) { + _this._updateLabelLine(child, seriesModel); + } + + if (animationEnabled) { + _this._animateLabels(child, seriesModel); + } + }); + }); + }; + + LabelManager.prototype._updateLabelLine = function (el, seriesModel) { + // Only support label being hosted on graphic elements. + var textEl = el.getTextContent(); // Update label line style. + + var ecData = getECData(el); + var dataIndex = ecData.dataIndex; // Only support labelLine on the labels represent data. + + if (textEl && dataIndex != null) { + var data = seriesModel.getData(ecData.dataType); + var itemModel = data.getItemModel(dataIndex); + var defaultStyle = {}; + var visualStyle = data.getItemVisual(dataIndex, 'style'); + var visualType = data.getVisual('drawType'); // Default to be same with main color + + defaultStyle.stroke = visualStyle[visualType]; + var labelLineModel = itemModel.getModel('labelLine'); + setLabelLineStyle(el, getLabelLineStatesModels(itemModel), defaultStyle); + updateLabelLinePoints(el, labelLineModel); + } + }; + + LabelManager.prototype._animateLabels = function (el, seriesModel) { + var textEl = el.getTextContent(); + var guideLine = el.getTextGuideLine(); // Animate + + if (textEl // `forceLabelAnimation` has the highest priority + && (el.forceLabelAnimation || !textEl.ignore && !textEl.invisible && !el.disableLabelAnimation && !isElementRemoved(el))) { + var layoutStore = labelLayoutInnerStore(textEl); + var oldLayout = layoutStore.oldLayout; + var ecData = getECData(el); + var dataIndex = ecData.dataIndex; + var newProps = { + x: textEl.x, + y: textEl.y, + rotation: textEl.rotation + }; + var data = seriesModel.getData(ecData.dataType); + + if (!oldLayout) { + textEl.attr(newProps); // Disable fade in animation if value animation is enabled. + + if (!labelInner(textEl).valueAnimation) { + var oldOpacity = retrieve2(textEl.style.opacity, 1); // Fade in animation + + textEl.style.opacity = 0; + initProps(textEl, { + style: { + opacity: oldOpacity + } + }, seriesModel, dataIndex); + } + } else { + textEl.attr(oldLayout); // Make sure the animation from is in the right status. + + var prevStates = el.prevStates; + + if (prevStates) { + if (indexOf(prevStates, 'select') >= 0) { + textEl.attr(layoutStore.oldLayoutSelect); + } + + if (indexOf(prevStates, 'emphasis') >= 0) { + textEl.attr(layoutStore.oldLayoutEmphasis); + } + } + + updateProps(textEl, newProps, seriesModel, dataIndex); + } + + layoutStore.oldLayout = newProps; + + if (textEl.states.select) { + var layoutSelect = layoutStore.oldLayoutSelect = {}; + extendWithKeys(layoutSelect, newProps, LABEL_LAYOUT_PROPS); + extendWithKeys(layoutSelect, textEl.states.select, LABEL_LAYOUT_PROPS); + } + + if (textEl.states.emphasis) { + var layoutEmphasis = layoutStore.oldLayoutEmphasis = {}; + extendWithKeys(layoutEmphasis, newProps, LABEL_LAYOUT_PROPS); + extendWithKeys(layoutEmphasis, textEl.states.emphasis, LABEL_LAYOUT_PROPS); + } + + animateLabelValue(textEl, dataIndex, data, seriesModel, seriesModel); + } + + if (guideLine && !guideLine.ignore && !guideLine.invisible) { + var layoutStore = labelLineAnimationStore(guideLine); + var oldLayout = layoutStore.oldLayout; + var newLayout = { + points: guideLine.shape.points + }; + + if (!oldLayout) { + guideLine.setShape(newLayout); + guideLine.style.strokePercent = 0; + initProps(guideLine, { + style: { + strokePercent: 1 + } + }, seriesModel); + } else { + guideLine.attr({ + shape: oldLayout + }); + updateProps(guideLine, { + shape: newLayout + }, seriesModel); + } + + layoutStore.oldLayout = newLayout; + } + }; + + return LabelManager; + }(); + + var getLabelManager = makeInner(); + function installLabelLayout(registers) { + registers.registerUpdateLifecycle('series:beforeupdate', function (ecModel, api, params) { + // TODO api provide an namespace that can save stuff per instance + var labelManager = getLabelManager(api).labelManager; + + if (!labelManager) { + labelManager = getLabelManager(api).labelManager = new LabelManager(); + } + + labelManager.clearLabels(); + }); + registers.registerUpdateLifecycle('series:layoutlabels', function (ecModel, api, params) { + var labelManager = getLabelManager(api).labelManager; + params.updatedSeries.forEach(function (series) { + labelManager.addLabelsOfSeries(api.getViewOfSeriesModel(series)); + }); + labelManager.updateLayoutConfig(api); + labelManager.layout(api); + labelManager.processLabelsOverall(); + }); + } + + var mathSin$4 = Math.sin; + var mathCos$4 = Math.cos; + var PI$4 = Math.PI; + var PI2$7 = Math.PI * 2; + var degree = 180 / PI$4; + var SVGPathRebuilder = (function () { + function SVGPathRebuilder() { + } + SVGPathRebuilder.prototype.reset = function (precision) { + this._start = true; + this._d = []; + this._str = ''; + this._p = Math.pow(10, precision || 4); + }; + SVGPathRebuilder.prototype.moveTo = function (x, y) { + this._add('M', x, y); + }; + SVGPathRebuilder.prototype.lineTo = function (x, y) { + this._add('L', x, y); + }; + SVGPathRebuilder.prototype.bezierCurveTo = function (x, y, x2, y2, x3, y3) { + this._add('C', x, y, x2, y2, x3, y3); + }; + SVGPathRebuilder.prototype.quadraticCurveTo = function (x, y, x2, y2) { + this._add('Q', x, y, x2, y2); + }; + SVGPathRebuilder.prototype.arc = function (cx, cy, r, startAngle, endAngle, anticlockwise) { + this.ellipse(cx, cy, r, r, 0, startAngle, endAngle, anticlockwise); + }; + SVGPathRebuilder.prototype.ellipse = function (cx, cy, rx, ry, psi, startAngle, endAngle, anticlockwise) { + var dTheta = endAngle - startAngle; + var clockwise = !anticlockwise; + var dThetaPositive = Math.abs(dTheta); + var isCircle = isAroundZero$1(dThetaPositive - PI2$7) + || (clockwise ? dTheta >= PI2$7 : -dTheta >= PI2$7); + var unifiedTheta = dTheta > 0 ? dTheta % PI2$7 : (dTheta % PI2$7 + PI2$7); + var large = false; + if (isCircle) { + large = true; + } + else if (isAroundZero$1(dThetaPositive)) { + large = false; + } + else { + large = (unifiedTheta >= PI$4) === !!clockwise; + } + var x0 = cx + rx * mathCos$4(startAngle); + var y0 = cy + ry * mathSin$4(startAngle); + if (this._start) { + this._add('M', x0, y0); + } + var xRot = Math.round(psi * degree); + if (isCircle) { + var p = 1 / this._p; + var dTheta_1 = (clockwise ? 1 : -1) * (PI2$7 - p); + this._add('A', rx, ry, xRot, 1, +clockwise, cx + rx * mathCos$4(startAngle + dTheta_1), cy + ry * mathSin$4(startAngle + dTheta_1)); + if (p > 1e-2) { + this._add('A', rx, ry, xRot, 0, +clockwise, x0, y0); + } + } + else { + var x = cx + rx * mathCos$4(endAngle); + var y = cy + ry * mathSin$4(endAngle); + this._add('A', rx, ry, xRot, +large, +clockwise, x, y); + } + }; + SVGPathRebuilder.prototype.rect = function (x, y, w, h) { + this._add('M', x, y); + this._add('l', w, 0); + this._add('l', 0, h); + this._add('l', -w, 0); + this._add('Z'); + }; + SVGPathRebuilder.prototype.closePath = function () { + if (this._d.length > 0) { + this._add('Z'); + } + }; + SVGPathRebuilder.prototype._add = function (cmd, a, b, c, d, e, f, g, h) { + var vals = []; + var p = this._p; + for (var i = 1; i < arguments.length; i++) { + var val = arguments[i]; + if (isNaN(val)) { + this._invalid = true; + return; + } + vals.push(Math.round(val * p) / p); + } + this._d.push(cmd + vals.join(' ')); + this._start = cmd === 'Z'; + }; + SVGPathRebuilder.prototype.generateStr = function () { + this._str = this._invalid ? '' : this._d.join(''); + this._d = []; + }; + SVGPathRebuilder.prototype.getStr = function () { + return this._str; + }; + return SVGPathRebuilder; + }()); + + var NONE = 'none'; + var mathRound$1 = Math.round; + function pathHasFill(style) { + var fill = style.fill; + return fill != null && fill !== NONE; + } + function pathHasStroke(style) { + var stroke = style.stroke; + return stroke != null && stroke !== NONE; + } + var strokeProps = ['lineCap', 'miterLimit', 'lineJoin']; + var svgStrokeProps = map(strokeProps, function (prop) { return "stroke-" + prop.toLowerCase(); }); + function mapStyleToAttrs(updateAttr, style, el, forceUpdate) { + var opacity = style.opacity == null ? 1 : style.opacity; + if (el instanceof ZRImage) { + updateAttr('opacity', opacity); + return; + } + if (pathHasFill(style)) { + var fill = normalizeColor(style.fill); + updateAttr('fill', fill.color); + var fillOpacity = style.fillOpacity != null + ? style.fillOpacity * fill.opacity * opacity + : fill.opacity * opacity; + if (forceUpdate || fillOpacity < 1) { + updateAttr('fill-opacity', fillOpacity); + } + } + else { + updateAttr('fill', NONE); + } + if (pathHasStroke(style)) { + var stroke = normalizeColor(style.stroke); + updateAttr('stroke', stroke.color); + var strokeScale = style.strokeNoScale + ? el.getLineScale() + : 1; + var strokeWidth = (strokeScale ? (style.lineWidth || 0) / strokeScale : 0); + var strokeOpacity = style.strokeOpacity != null + ? style.strokeOpacity * stroke.opacity * opacity + : stroke.opacity * opacity; + var strokeFirst = style.strokeFirst; + if (forceUpdate || strokeWidth !== 1) { + updateAttr('stroke-width', strokeWidth); + } + if (forceUpdate || strokeFirst) { + updateAttr('paint-order', strokeFirst ? 'stroke' : 'fill'); + } + if (forceUpdate || strokeOpacity < 1) { + updateAttr('stroke-opacity', strokeOpacity); + } + if (style.lineDash) { + var _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1]; + if (lineDash) { + lineDashOffset = mathRound$1(lineDashOffset || 0); + updateAttr('stroke-dasharray', lineDash.join(',')); + if (lineDashOffset || forceUpdate) { + updateAttr('stroke-dashoffset', lineDashOffset); + } + } + } + else if (forceUpdate) { + updateAttr('stroke-dasharray', NONE); + } + for (var i = 0; i < strokeProps.length; i++) { + var propName = strokeProps[i]; + if (forceUpdate || style[propName] !== DEFAULT_PATH_STYLE[propName]) { + var val = style[propName] || DEFAULT_PATH_STYLE[propName]; + val && updateAttr(svgStrokeProps[i], val); + } + } + } + else if (forceUpdate) { + updateAttr('stroke', NONE); + } + } + + var SVGNS = 'http://www.w3.org/2000/svg'; + var XLINKNS = 'http://www.w3.org/1999/xlink'; + var XMLNS = 'http://www.w3.org/2000/xmlns/'; + var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'; + function createElement(name) { + return document.createElementNS(SVGNS, name); + } + function createVNode(tag, key, attrs, children, text) { + return { + tag: tag, + attrs: attrs || {}, + children: children, + text: text, + key: key + }; + } + function createElementOpen(name, attrs) { + var attrsStr = []; + if (attrs) { + for (var key in attrs) { + var val = attrs[key]; + var part = key; + if (val === false) { + continue; + } + else if (val !== true && val != null) { + part += "=\"" + val + "\""; + } + attrsStr.push(part); + } + } + return "<" + name + " " + attrsStr.join(' ') + ">"; + } + function createElementClose(name) { + return "</" + name + ">"; + } + function vNodeToString(el, opts) { + opts = opts || {}; + var S = opts.newline ? '\n' : ''; + function convertElToString(el) { + var children = el.children, tag = el.tag, attrs = el.attrs; + return createElementOpen(tag, attrs) + + (el.text || '') + + (children ? "" + S + map(children, function (child) { return convertElToString(child); }).join(S) + S : '') + + createElementClose(tag); + } + return convertElToString(el); + } + function getCssString(selectorNodes, animationNodes, opts) { + opts = opts || {}; + var S = opts.newline ? '\n' : ''; + var bracketBegin = " {" + S; + var bracketEnd = S + "}"; + var selectors = map(keys(selectorNodes), function (className) { + return className + bracketBegin + map(keys(selectorNodes[className]), function (attrName) { + return attrName + ":" + selectorNodes[className][attrName] + ";"; + }).join(S) + bracketEnd; + }).join(S); + var animations = map(keys(animationNodes), function (animationName) { + return "@keyframes " + animationName + bracketBegin + map(keys(animationNodes[animationName]), function (percent) { + return percent + bracketBegin + map(keys(animationNodes[animationName][percent]), function (attrName) { + var val = animationNodes[animationName][percent][attrName]; + if (attrName === 'd') { + val = "path(\"" + val + "\")"; + } + return attrName + ":" + val + ";"; + }).join(S) + bracketEnd; + }).join(S) + bracketEnd; + }).join(S); + if (!selectors && !animations) { + return ''; + } + return ['<![CDATA[', selectors, animations, ']]>'].join(S); + } + function createBrushScope(zrId) { + return { + zrId: zrId, + shadowCache: {}, + patternCache: {}, + gradientCache: {}, + clipPathCache: {}, + defs: {}, + cssNodes: {}, + cssAnims: {}, + cssClassIdx: 0, + cssAnimIdx: 0, + shadowIdx: 0, + gradientIdx: 0, + patternIdx: 0, + clipPathIdx: 0 + }; + } + function createSVGVNode(width, height, children, useViewBox) { + return createVNode('svg', 'root', { + 'width': width, + 'height': height, + 'xmlns': SVGNS, + 'xmlns:xlink': XLINKNS, + 'version': '1.1', + 'baseProfile': 'full', + 'viewBox': useViewBox ? "0 0 " + width + " " + height : false + }, children); + } + + var EASING_MAP = { + cubicIn: '0.32,0,0.67,0', + cubicOut: '0.33,1,0.68,1', + cubicInOut: '0.65,0,0.35,1', + quadraticIn: '0.11,0,0.5,0', + quadraticOut: '0.5,1,0.89,1', + quadraticInOut: '0.45,0,0.55,1', + quarticIn: '0.5,0,0.75,0', + quarticOut: '0.25,1,0.5,1', + quarticInOut: '0.76,0,0.24,1', + quinticIn: '0.64,0,0.78,0', + quinticOut: '0.22,1,0.36,1', + quinticInOut: '0.83,0,0.17,1', + sinusoidalIn: '0.12,0,0.39,0', + sinusoidalOut: '0.61,1,0.88,1', + sinusoidalInOut: '0.37,0,0.63,1', + exponentialIn: '0.7,0,0.84,0', + exponentialOut: '0.16,1,0.3,1', + exponentialInOut: '0.87,0,0.13,1', + circularIn: '0.55,0,1,0.45', + circularOut: '0,0.55,0.45,1', + circularInOut: '0.85,0,0.15,1' + }; + var transformOriginKey = 'transform-origin'; + function buildPathString(el, kfShape, path) { + var shape = extend({}, el.shape); + extend(shape, kfShape); + el.buildPath(path, shape); + var svgPathBuilder = new SVGPathRebuilder(); + svgPathBuilder.reset(getPathPrecision(el)); + path.rebuildPath(svgPathBuilder, 1); + svgPathBuilder.generateStr(); + return svgPathBuilder.getStr(); + } + function setTransformOrigin(target, transform) { + var originX = transform.originX, originY = transform.originY; + if (originX || originY) { + target[transformOriginKey] = originX + "px " + originY + "px"; + } + } + var ANIMATE_STYLE_MAP = { + fill: 'fill', + opacity: 'opacity', + lineWidth: 'stroke-width', + lineDashOffset: 'stroke-dashoffset' + }; + function addAnimation(cssAnim, scope) { + var animationName = scope.zrId + '-ani-' + scope.cssAnimIdx++; + scope.cssAnims[animationName] = cssAnim; + return animationName; + } + function createCompoundPathCSSAnimation(el, attrs, scope) { + var paths = el.shape.paths; + var composedAnim = {}; + var cssAnimationCfg; + var cssAnimationName; + each(paths, function (path) { + var subScope = createBrushScope(scope.zrId); + subScope.animation = true; + createCSSAnimation(path, {}, subScope, true); + var cssAnims = subScope.cssAnims; + var cssNodes = subScope.cssNodes; + var animNames = keys(cssAnims); + var len = animNames.length; + if (!len) { + return; + } + cssAnimationName = animNames[len - 1]; + var lastAnim = cssAnims[cssAnimationName]; + for (var percent in lastAnim) { + var kf = lastAnim[percent]; + composedAnim[percent] = composedAnim[percent] || { d: '' }; + composedAnim[percent].d += kf.d || ''; + } + for (var className in cssNodes) { + var val = cssNodes[className].animation; + if (val.indexOf(cssAnimationName) >= 0) { + cssAnimationCfg = val; + } + } + }); + if (!cssAnimationCfg) { + return; + } + attrs.d = false; + var animationName = addAnimation(composedAnim, scope); + return cssAnimationCfg.replace(cssAnimationName, animationName); + } + function getEasingFunc(easing) { + return isString(easing) + ? EASING_MAP[easing] + ? "cubic-bezier(" + EASING_MAP[easing] + ")" + : createCubicEasingFunc(easing) ? easing : '' + : ''; + } + function createCSSAnimation(el, attrs, scope, onlyShape) { + var animators = el.animators; + var len = animators.length; + var cssAnimations = []; + if (el instanceof CompoundPath) { + var animationCfg = createCompoundPathCSSAnimation(el, attrs, scope); + if (animationCfg) { + cssAnimations.push(animationCfg); + } + else if (!len) { + return; + } + } + else if (!len) { + return; + } + var groupAnimators = {}; + for (var i = 0; i < len; i++) { + var animator = animators[i]; + var cfgArr = [animator.getMaxTime() / 1000 + 's']; + var easing = getEasingFunc(animator.getClip().easing); + var delay = animator.getDelay(); + if (easing) { + cfgArr.push(easing); + } + else { + cfgArr.push('linear'); + } + if (delay) { + cfgArr.push(delay / 1000 + 's'); + } + if (animator.getLoop()) { + cfgArr.push('infinite'); + } + var cfg = cfgArr.join(' '); + groupAnimators[cfg] = groupAnimators[cfg] || [cfg, []]; + groupAnimators[cfg][1].push(animator); + } + function createSingleCSSAnimation(groupAnimator) { + var animators = groupAnimator[1]; + var len = animators.length; + var transformKfs = {}; + var shapeKfs = {}; + var finalKfs = {}; + var animationTimingFunctionAttrName = 'animation-timing-function'; + function saveAnimatorTrackToCssKfs(animator, cssKfs, toCssAttrName) { + var tracks = animator.getTracks(); + var maxTime = animator.getMaxTime(); + for (var k = 0; k < tracks.length; k++) { + var track = tracks[k]; + if (track.needsAnimate()) { + var kfs = track.keyframes; + var attrName = track.propName; + toCssAttrName && (attrName = toCssAttrName(attrName)); + if (attrName) { + for (var i = 0; i < kfs.length; i++) { + var kf = kfs[i]; + var percent = Math.round(kf.time / maxTime * 100) + '%'; + var kfEasing = getEasingFunc(kf.easing); + var rawValue = kf.rawValue; + if (isString(rawValue) || isNumber(rawValue)) { + cssKfs[percent] = cssKfs[percent] || {}; + cssKfs[percent][attrName] = kf.rawValue; + if (kfEasing) { + cssKfs[percent][animationTimingFunctionAttrName] = kfEasing; + } + } + } + } + } + } + } + for (var i = 0; i < len; i++) { + var animator = animators[i]; + var targetProp = animator.targetName; + if (!targetProp) { + !onlyShape && saveAnimatorTrackToCssKfs(animator, transformKfs); + } + else if (targetProp === 'shape') { + saveAnimatorTrackToCssKfs(animator, shapeKfs); + } + } + for (var percent in transformKfs) { + var transform = {}; + copyTransform(transform, el); + extend(transform, transformKfs[percent]); + var str = getSRTTransformString(transform); + var timingFunction = transformKfs[percent][animationTimingFunctionAttrName]; + finalKfs[percent] = str ? { + transform: str + } : {}; + setTransformOrigin(finalKfs[percent], transform); + if (timingFunction) { + finalKfs[percent][animationTimingFunctionAttrName] = timingFunction; + } + } + var path; + var canAnimateShape = true; + for (var percent in shapeKfs) { + finalKfs[percent] = finalKfs[percent] || {}; + var isFirst = !path; + var timingFunction = shapeKfs[percent][animationTimingFunctionAttrName]; + if (isFirst) { + path = new PathProxy(); + } + var len_1 = path.len(); + path.reset(); + finalKfs[percent].d = buildPathString(el, shapeKfs[percent], path); + var newLen = path.len(); + if (!isFirst && len_1 !== newLen) { + canAnimateShape = false; + break; + } + if (timingFunction) { + finalKfs[percent][animationTimingFunctionAttrName] = timingFunction; + } + } + if (!canAnimateShape) { + for (var percent in finalKfs) { + delete finalKfs[percent].d; + } + } + if (!onlyShape) { + for (var i = 0; i < len; i++) { + var animator = animators[i]; + var targetProp = animator.targetName; + if (targetProp === 'style') { + saveAnimatorTrackToCssKfs(animator, finalKfs, function (propName) { return ANIMATE_STYLE_MAP[propName]; }); + } + } + } + var percents = keys(finalKfs); + var allTransformOriginSame = true; + var transformOrigin; + for (var i = 1; i < percents.length; i++) { + var p0 = percents[i - 1]; + var p1 = percents[i]; + if (finalKfs[p0][transformOriginKey] !== finalKfs[p1][transformOriginKey]) { + allTransformOriginSame = false; + break; + } + transformOrigin = finalKfs[p0][transformOriginKey]; + } + if (allTransformOriginSame && transformOrigin) { + for (var percent in finalKfs) { + if (finalKfs[percent][transformOriginKey]) { + delete finalKfs[percent][transformOriginKey]; + } + } + attrs[transformOriginKey] = transformOrigin; + } + if (filter(percents, function (percent) { return keys(finalKfs[percent]).length > 0; }).length) { + var animationName = addAnimation(finalKfs, scope); + return animationName + " " + groupAnimator[0] + " both"; + } + } + for (var key in groupAnimators) { + var animationCfg = createSingleCSSAnimation(groupAnimators[key]); + if (animationCfg) { + cssAnimations.push(animationCfg); + } + } + if (cssAnimations.length) { + var className = scope.zrId + '-cls-' + scope.cssClassIdx++; + scope.cssNodes['.' + className] = { + animation: cssAnimations.join(',') + }; + attrs["class"] = className; + } + } + + var round$2 = Math.round; + function isImageLike$1(val) { + return val && isString(val.src); + } + function isCanvasLike(val) { + return val && isFunction(val.toDataURL); + } + function setStyleAttrs(attrs, style, el, scope) { + mapStyleToAttrs(function (key, val) { + var isFillStroke = key === 'fill' || key === 'stroke'; + if (isFillStroke && isGradient(val)) { + setGradient(style, attrs, key, scope); + } + else if (isFillStroke && isPattern(val)) { + setPattern(el, attrs, key, scope); + } + else { + attrs[key] = val; + } + }, style, el, false); + setShadow(el, attrs, scope); + } + function noRotateScale(m) { + return isAroundZero$1(m[0] - 1) + && isAroundZero$1(m[1]) + && isAroundZero$1(m[2]) + && isAroundZero$1(m[3] - 1); + } + function noTranslate(m) { + return isAroundZero$1(m[4]) && isAroundZero$1(m[5]); + } + function setTransform(attrs, m, compress) { + if (m && !(noTranslate(m) && noRotateScale(m))) { + var mul = compress ? 10 : 1e4; + attrs.transform = noRotateScale(m) + ? "translate(" + round$2(m[4] * mul) / mul + " " + round$2(m[5] * mul) / mul + ")" : getMatrixStr(m); + } + } + function convertPolyShape(shape, attrs, mul) { + var points = shape.points; + var strArr = []; + for (var i = 0; i < points.length; i++) { + strArr.push(round$2(points[i][0] * mul) / mul); + strArr.push(round$2(points[i][1] * mul) / mul); + } + attrs.points = strArr.join(' '); + } + function validatePolyShape(shape) { + return !shape.smooth; + } + function createAttrsConvert(desc) { + var normalizedDesc = map(desc, function (item) { + return (typeof item === 'string' ? [item, item] : item); + }); + return function (shape, attrs, mul) { + for (var i = 0; i < normalizedDesc.length; i++) { + var item = normalizedDesc[i]; + var val = shape[item[0]]; + if (val != null) { + attrs[item[1]] = round$2(val * mul) / mul; + } + } + }; + } + var buitinShapesDef = { + circle: [createAttrsConvert(['cx', 'cy', 'r'])], + polyline: [convertPolyShape, validatePolyShape], + polygon: [convertPolyShape, validatePolyShape] + }; + function hasShapeAnimation(el) { + var animators = el.animators; + for (var i = 0; i < animators.length; i++) { + if (animators[i].targetName === 'shape') { + return true; + } + } + return false; + } + function brushSVGPath(el, scope) { + var style = el.style; + var shape = el.shape; + var builtinShpDef = buitinShapesDef[el.type]; + var attrs = {}; + var needsAnimate = scope.animation; + var svgElType = 'path'; + var strokePercent = el.style.strokePercent; + var precision = (scope.compress && getPathPrecision(el)) || 4; + if (builtinShpDef + && !scope.willUpdate + && !(builtinShpDef[1] && !builtinShpDef[1](shape)) + && !(needsAnimate && hasShapeAnimation(el)) + && !(strokePercent < 1)) { + svgElType = el.type; + var mul = Math.pow(10, precision); + builtinShpDef[0](shape, attrs, mul); + } + else { + if (!el.path) { + el.createPathProxy(); + } + var path = el.path; + if (el.shapeChanged()) { + path.beginPath(); + el.buildPath(path, el.shape); + el.pathUpdated(); + } + var pathVersion = path.getVersion(); + var elExt = el; + var svgPathBuilder = elExt.__svgPathBuilder; + if (elExt.__svgPathVersion !== pathVersion + || !svgPathBuilder + || strokePercent !== elExt.__svgPathStrokePercent) { + if (!svgPathBuilder) { + svgPathBuilder = elExt.__svgPathBuilder = new SVGPathRebuilder(); + } + svgPathBuilder.reset(precision); + path.rebuildPath(svgPathBuilder, strokePercent); + svgPathBuilder.generateStr(); + elExt.__svgPathVersion = pathVersion; + elExt.__svgPathStrokePercent = strokePercent; + } + attrs.d = svgPathBuilder.getStr(); + } + setTransform(attrs, el.transform); + setStyleAttrs(attrs, style, el, scope); + scope.animation && createCSSAnimation(el, attrs, scope); + return createVNode(svgElType, el.id + '', attrs); + } + function brushSVGImage(el, scope) { + var style = el.style; + var image = style.image; + if (image && !isString(image)) { + if (isImageLike$1(image)) { + image = image.src; + } + else if (isCanvasLike(image)) { + image = image.toDataURL(); + } + } + if (!image) { + return; + } + var x = style.x || 0; + var y = style.y || 0; + var dw = style.width; + var dh = style.height; + var attrs = { + href: image, + width: dw, + height: dh + }; + if (x) { + attrs.x = x; + } + if (y) { + attrs.y = y; + } + setTransform(attrs, el.transform); + setStyleAttrs(attrs, style, el, scope); + scope.animation && createCSSAnimation(el, attrs, scope); + return createVNode('image', el.id + '', attrs); + } + function brushSVGTSpan(el, scope) { + var style = el.style; + var text = style.text; + text != null && (text += ''); + if (!text || isNaN(style.x) || isNaN(style.y)) { + return; + } + var font = style.font || DEFAULT_FONT; + var x = style.x || 0; + var y = adjustTextY(style.y || 0, getLineHeight(font), style.textBaseline); + var textAlign = TEXT_ALIGN_TO_ANCHOR[style.textAlign] + || style.textAlign; + var attrs = { + 'dominant-baseline': 'central', + 'text-anchor': textAlign + }; + if (hasSeparateFont(style)) { + var separatedFontStr = ''; + var fontStyle = style.fontStyle; + var fontSize = parseFontSize(style.fontSize); + if (!parseFloat(fontSize)) { + return; + } + var fontFamily = style.fontFamily || DEFAULT_FONT_FAMILY; + var fontWeight = style.fontWeight; + separatedFontStr += "font-size:" + fontSize + ";font-family:" + fontFamily + ";"; + if (fontStyle && fontStyle !== 'normal') { + separatedFontStr += "font-style:" + fontStyle + ";"; + } + if (fontWeight && fontWeight !== 'normal') { + separatedFontStr += "font-weight:" + fontWeight + ";"; + } + attrs.style = separatedFontStr; + } + else { + attrs.style = "font: " + font; + } + if (text.match(/\s/)) { + attrs['xml:space'] = 'preserve'; + } + if (x) { + attrs.x = x; + } + if (y) { + attrs.y = y; + } + setTransform(attrs, el.transform); + setStyleAttrs(attrs, style, el, scope); + scope.animation && createCSSAnimation(el, attrs, scope); + return createVNode('text', el.id + '', attrs, undefined, text); + } + function brush$1(el, scope) { + if (el instanceof Path) { + return brushSVGPath(el, scope); + } + else if (el instanceof ZRImage) { + return brushSVGImage(el, scope); + } + else if (el instanceof TSpan) { + return brushSVGTSpan(el, scope); + } + } + function setShadow(el, attrs, scope) { + var style = el.style; + if (hasShadow(style)) { + var shadowKey = getShadowKey(el); + var shadowCache = scope.shadowCache; + var shadowId = shadowCache[shadowKey]; + if (!shadowId) { + var globalScale = el.getGlobalScale(); + var scaleX = globalScale[0]; + var scaleY = globalScale[1]; + if (!scaleX || !scaleY) { + return; + } + var offsetX = style.shadowOffsetX || 0; + var offsetY = style.shadowOffsetY || 0; + var blur_1 = style.shadowBlur; + var _a = normalizeColor(style.shadowColor), opacity = _a.opacity, color = _a.color; + var stdDx = blur_1 / 2 / scaleX; + var stdDy = blur_1 / 2 / scaleY; + var stdDeviation = stdDx + ' ' + stdDy; + shadowId = scope.zrId + '-s' + scope.shadowIdx++; + scope.defs[shadowId] = createVNode('filter', shadowId, { + 'id': shadowId, + 'x': '-100%', + 'y': '-100%', + 'width': '300%', + 'height': '300%' + }, [ + createVNode('feDropShadow', '', { + 'dx': offsetX / scaleX, + 'dy': offsetY / scaleY, + 'stdDeviation': stdDeviation, + 'flood-color': color, + 'flood-opacity': opacity + }) + ]); + shadowCache[shadowKey] = shadowId; + } + attrs.filter = getIdURL(shadowId); + } + } + function setGradient(style, attrs, target, scope) { + var val = style[target]; + var gradientTag; + var gradientAttrs = { + 'gradientUnits': val.global + ? 'userSpaceOnUse' + : 'objectBoundingBox' + }; + if (isLinearGradient(val)) { + gradientTag = 'linearGradient'; + gradientAttrs.x1 = val.x; + gradientAttrs.y1 = val.y; + gradientAttrs.x2 = val.x2; + gradientAttrs.y2 = val.y2; + } + else if (isRadialGradient(val)) { + gradientTag = 'radialGradient'; + gradientAttrs.cx = retrieve2(val.x, 0.5); + gradientAttrs.cy = retrieve2(val.y, 0.5); + gradientAttrs.r = retrieve2(val.r, 0.5); + } + else { + if ("development" !== 'production') { + logError('Illegal gradient type.'); + } + return; + } + var colors = val.colorStops; + var colorStops = []; + for (var i = 0, len = colors.length; i < len; ++i) { + var offset = round4(colors[i].offset) * 100 + '%'; + var stopColor = colors[i].color; + var _a = normalizeColor(stopColor), color = _a.color, opacity = _a.opacity; + var stopsAttrs = { + 'offset': offset + }; + stopsAttrs['stop-color'] = color; + if (opacity < 1) { + stopsAttrs['stop-opacity'] = opacity; + } + colorStops.push(createVNode('stop', i + '', stopsAttrs)); + } + var gradientVNode = createVNode(gradientTag, '', gradientAttrs, colorStops); + var gradientKey = vNodeToString(gradientVNode); + var gradientCache = scope.gradientCache; + var gradientId = gradientCache[gradientKey]; + if (!gradientId) { + gradientId = scope.zrId + '-g' + scope.gradientIdx++; + gradientCache[gradientKey] = gradientId; + gradientAttrs.id = gradientId; + scope.defs[gradientId] = createVNode(gradientTag, gradientId, gradientAttrs, colorStops); + } + attrs[target] = getIdURL(gradientId); + } + function setPattern(el, attrs, target, scope) { + var val = el.style[target]; + var patternAttrs = { + 'patternUnits': 'userSpaceOnUse' + }; + var child; + if (isImagePattern(val)) { + var imageWidth_1 = val.imageWidth; + var imageHeight_1 = val.imageHeight; + var imageSrc = void 0; + var patternImage = val.image; + if (isString(patternImage)) { + imageSrc = patternImage; + } + else if (isImageLike$1(patternImage)) { + imageSrc = patternImage.src; + } + else if (isCanvasLike(patternImage)) { + imageSrc = patternImage.toDataURL(); + } + if (typeof Image === 'undefined') { + var errMsg = 'Image width/height must been given explictly in svg-ssr renderer.'; + assert(imageWidth_1, errMsg); + assert(imageHeight_1, errMsg); + } + else if (imageWidth_1 == null || imageHeight_1 == null) { + var setSizeToVNode_1 = function (vNode, img) { + if (vNode) { + var svgEl = vNode.elm; + var width = (vNode.attrs.width = imageWidth_1 || img.width); + var height = (vNode.attrs.height = imageHeight_1 || img.height); + if (svgEl) { + svgEl.setAttribute('width', width); + svgEl.setAttribute('height', height); + } + } + }; + var createdImage = createOrUpdateImage(imageSrc, null, el, function (img) { + setSizeToVNode_1(patternVNode, img); + setSizeToVNode_1(child, img); + }); + if (createdImage && createdImage.width && createdImage.height) { + imageWidth_1 = imageWidth_1 || createdImage.width; + imageHeight_1 = imageHeight_1 || createdImage.height; + } + } + child = createVNode('image', 'img', { + href: imageSrc, + width: imageWidth_1, + height: imageHeight_1 + }); + patternAttrs.width = imageWidth_1; + patternAttrs.height = imageHeight_1; + } + else if (val.svgElement) { + child = clone(val.svgElement); + patternAttrs.width = val.svgWidth; + patternAttrs.height = val.svgHeight; + } + if (!child) { + return; + } + patternAttrs.patternTransform = getSRTTransformString(val); + var patternVNode = createVNode('pattern', '', patternAttrs, [child]); + var patternKey = vNodeToString(patternVNode); + var patternCache = scope.patternCache; + var patternId = patternCache[patternKey]; + if (!patternId) { + patternId = scope.zrId + '-p' + scope.patternIdx++; + patternCache[patternKey] = patternId; + patternAttrs.id = patternId; + patternVNode = scope.defs[patternId] = createVNode('pattern', patternId, patternAttrs, [child]); + } + attrs[target] = getIdURL(patternId); + } + function setClipPath(clipPath, attrs, scope) { + var clipPathCache = scope.clipPathCache, defs = scope.defs; + var clipPathId = clipPathCache[clipPath.id]; + if (!clipPathId) { + clipPathId = scope.zrId + '-c' + scope.clipPathIdx++; + var clipPathAttrs = { + id: clipPathId + }; + clipPathCache[clipPath.id] = clipPathId; + defs[clipPathId] = createVNode('clipPath', clipPathId, clipPathAttrs, [brushSVGPath(clipPath, scope)]); + } + attrs['clip-path'] = getIdURL(clipPathId); + } + + function createTextNode(text) { + return document.createTextNode(text); + } + function insertBefore(parentNode, newNode, referenceNode) { + parentNode.insertBefore(newNode, referenceNode); + } + function removeChild(node, child) { + node.removeChild(child); + } + function appendChild(node, child) { + node.appendChild(child); + } + function parentNode(node) { + return node.parentNode; + } + function nextSibling(node) { + return node.nextSibling; + } + function setTextContent(node, text) { + node.textContent = text; + } + + var colonChar = 58; + var xChar = 120; + var emptyNode = createVNode('', ''); + function isUndef(s) { + return s === undefined; + } + function isDef(s) { + return s !== undefined; + } + function createKeyToOldIdx(children, beginIdx, endIdx) { + var map = {}; + for (var i = beginIdx; i <= endIdx; ++i) { + var key = children[i].key; + if (key !== undefined) { + if ("development" !== 'production') { + if (map[key] != null) { + console.error("Duplicate key " + key); + } + } + map[key] = i; + } + } + return map; + } + function sameVnode(vnode1, vnode2) { + var isSameKey = vnode1.key === vnode2.key; + var isSameTag = vnode1.tag === vnode2.tag; + return isSameTag && isSameKey; + } + function createElm(vnode) { + var i; + var children = vnode.children; + var tag = vnode.tag; + if (isDef(tag)) { + var elm = (vnode.elm = createElement(tag)); + updateAttrs(emptyNode, vnode); + if (isArray(children)) { + for (i = 0; i < children.length; ++i) { + var ch = children[i]; + if (ch != null) { + appendChild(elm, createElm(ch)); + } + } + } + else if (isDef(vnode.text) && !isObject(vnode.text)) { + appendChild(elm, createTextNode(vnode.text)); + } + } + else { + vnode.elm = createTextNode(vnode.text); + } + return vnode.elm; + } + function addVnodes(parentElm, before, vnodes, startIdx, endIdx) { + for (; startIdx <= endIdx; ++startIdx) { + var ch = vnodes[startIdx]; + if (ch != null) { + insertBefore(parentElm, createElm(ch), before); + } + } + } + function removeVnodes(parentElm, vnodes, startIdx, endIdx) { + for (; startIdx <= endIdx; ++startIdx) { + var ch = vnodes[startIdx]; + if (ch != null) { + if (isDef(ch.tag)) { + var parent_1 = parentNode(ch.elm); + removeChild(parent_1, ch.elm); + } + else { + removeChild(parentElm, ch.elm); + } + } + } + } + function updateAttrs(oldVnode, vnode) { + var key; + var elm = vnode.elm; + var oldAttrs = oldVnode && oldVnode.attrs || {}; + var attrs = vnode.attrs || {}; + if (oldAttrs === attrs) { + return; + } + for (key in attrs) { + var cur = attrs[key]; + var old = oldAttrs[key]; + if (old !== cur) { + if (cur === true) { + elm.setAttribute(key, ''); + } + else if (cur === false) { + elm.removeAttribute(key); + } + else { + if (key.charCodeAt(0) !== xChar) { + elm.setAttribute(key, cur); + } + else if (key === 'xmlns:xlink' || key === 'xmlns') { + elm.setAttributeNS(XMLNS, key, cur); + } + else if (key.charCodeAt(3) === colonChar) { + elm.setAttributeNS(XML_NAMESPACE, key, cur); + } + else if (key.charCodeAt(5) === colonChar) { + elm.setAttributeNS(XLINKNS, key, cur); + } + else { + elm.setAttribute(key, cur); + } + } + } + } + for (key in oldAttrs) { + if (!(key in attrs)) { + elm.removeAttribute(key); + } + } + } + function updateChildren(parentElm, oldCh, newCh) { + var oldStartIdx = 0; + var newStartIdx = 0; + var oldEndIdx = oldCh.length - 1; + var oldStartVnode = oldCh[0]; + var oldEndVnode = oldCh[oldEndIdx]; + var newEndIdx = newCh.length - 1; + var newStartVnode = newCh[0]; + var newEndVnode = newCh[newEndIdx]; + var oldKeyToIdx; + var idxInOld; + var elmToMove; + var before; + while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) { + if (oldStartVnode == null) { + oldStartVnode = oldCh[++oldStartIdx]; + } + else if (oldEndVnode == null) { + oldEndVnode = oldCh[--oldEndIdx]; + } + else if (newStartVnode == null) { + newStartVnode = newCh[++newStartIdx]; + } + else if (newEndVnode == null) { + newEndVnode = newCh[--newEndIdx]; + } + else if (sameVnode(oldStartVnode, newStartVnode)) { + patchVnode(oldStartVnode, newStartVnode); + oldStartVnode = oldCh[++oldStartIdx]; + newStartVnode = newCh[++newStartIdx]; + } + else if (sameVnode(oldEndVnode, newEndVnode)) { + patchVnode(oldEndVnode, newEndVnode); + oldEndVnode = oldCh[--oldEndIdx]; + newEndVnode = newCh[--newEndIdx]; + } + else if (sameVnode(oldStartVnode, newEndVnode)) { + patchVnode(oldStartVnode, newEndVnode); + insertBefore(parentElm, oldStartVnode.elm, nextSibling(oldEndVnode.elm)); + oldStartVnode = oldCh[++oldStartIdx]; + newEndVnode = newCh[--newEndIdx]; + } + else if (sameVnode(oldEndVnode, newStartVnode)) { + patchVnode(oldEndVnode, newStartVnode); + insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm); + oldEndVnode = oldCh[--oldEndIdx]; + newStartVnode = newCh[++newStartIdx]; + } + else { + if (isUndef(oldKeyToIdx)) { + oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); + } + idxInOld = oldKeyToIdx[newStartVnode.key]; + if (isUndef(idxInOld)) { + insertBefore(parentElm, createElm(newStartVnode), oldStartVnode.elm); + } + else { + elmToMove = oldCh[idxInOld]; + if (elmToMove.tag !== newStartVnode.tag) { + insertBefore(parentElm, createElm(newStartVnode), oldStartVnode.elm); + } + else { + patchVnode(elmToMove, newStartVnode); + oldCh[idxInOld] = undefined; + insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm); + } + } + newStartVnode = newCh[++newStartIdx]; + } + } + if (oldStartIdx <= oldEndIdx || newStartIdx <= newEndIdx) { + if (oldStartIdx > oldEndIdx) { + before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm; + addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx); + } + else { + removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx); + } + } + } + function patchVnode(oldVnode, vnode) { + var elm = (vnode.elm = oldVnode.elm); + var oldCh = oldVnode.children; + var ch = vnode.children; + if (oldVnode === vnode) { + return; + } + updateAttrs(oldVnode, vnode); + if (isUndef(vnode.text)) { + if (isDef(oldCh) && isDef(ch)) { + if (oldCh !== ch) { + updateChildren(elm, oldCh, ch); + } + } + else if (isDef(ch)) { + if (isDef(oldVnode.text)) { + setTextContent(elm, ''); + } + addVnodes(elm, null, ch, 0, ch.length - 1); + } + else if (isDef(oldCh)) { + removeVnodes(elm, oldCh, 0, oldCh.length - 1); + } + else if (isDef(oldVnode.text)) { + setTextContent(elm, ''); + } + } + else if (oldVnode.text !== vnode.text) { + if (isDef(oldCh)) { + removeVnodes(elm, oldCh, 0, oldCh.length - 1); + } + setTextContent(elm, vnode.text); + } + } + function patch(oldVnode, vnode) { + if (sameVnode(oldVnode, vnode)) { + patchVnode(oldVnode, vnode); + } + else { + var elm = oldVnode.elm; + var parent_2 = parentNode(elm); + createElm(vnode); + if (parent_2 !== null) { + insertBefore(parent_2, vnode.elm, nextSibling(elm)); + removeVnodes(parent_2, [oldVnode], 0, 0); + } + } + return vnode; + } + + var svgId = 0; + var SVGPainter = (function () { + function SVGPainter(root, storage, opts) { + this.type = 'svg'; + this.refreshHover = createMethodNotSupport('refreshHover'); + this.configLayer = createMethodNotSupport('configLayer'); + this.storage = storage; + this._opts = opts = extend({}, opts); + this.root = root; + this._id = 'zr' + svgId++; + this._oldVNode = createSVGVNode(opts.width, opts.height); + if (root && !opts.ssr) { + var viewport = this._viewport = document.createElement('div'); + viewport.style.cssText = 'position:relative;overflow:hidden'; + var svgDom = this._svgDom = this._oldVNode.elm = createElement('svg'); + updateAttrs(null, this._oldVNode); + viewport.appendChild(svgDom); + root.appendChild(viewport); + } + this.resize(opts.width, opts.height); + } + SVGPainter.prototype.getType = function () { + return this.type; + }; + SVGPainter.prototype.getViewportRoot = function () { + return this._viewport; + }; + SVGPainter.prototype.getViewportRootOffset = function () { + var viewportRoot = this.getViewportRoot(); + if (viewportRoot) { + return { + offsetLeft: viewportRoot.offsetLeft || 0, + offsetTop: viewportRoot.offsetTop || 0 + }; + } + }; + SVGPainter.prototype.getSvgDom = function () { + return this._svgDom; + }; + SVGPainter.prototype.refresh = function () { + if (this.root) { + var vnode = this.renderToVNode({ + willUpdate: true + }); + vnode.attrs.style = 'position:absolute;left:0;top:0;user-select:none'; + patch(this._oldVNode, vnode); + this._oldVNode = vnode; + } + }; + SVGPainter.prototype.renderOneToVNode = function (el) { + return brush$1(el, createBrushScope(this._id)); + }; + SVGPainter.prototype.renderToVNode = function (opts) { + opts = opts || {}; + var list = this.storage.getDisplayList(true); + var bgColor = this._backgroundColor; + var width = this._width; + var height = this._height; + var scope = createBrushScope(this._id); + scope.animation = opts.animation; + scope.willUpdate = opts.willUpdate; + scope.compress = opts.compress; + var children = []; + if (bgColor && bgColor !== 'none') { + var _a = normalizeColor(bgColor), color = _a.color, opacity = _a.opacity; + this._bgVNode = createVNode('rect', 'bg', { + width: width, + height: height, + x: '0', + y: '0', + id: '0', + fill: color, + 'fill-opacity': opacity + }); + children.push(this._bgVNode); + } + else { + this._bgVNode = null; + } + var mainVNode = !opts.compress + ? (this._mainVNode = createVNode('g', 'main', {}, [])) : null; + this._paintList(list, scope, mainVNode ? mainVNode.children : children); + mainVNode && children.push(mainVNode); + var defs = map(keys(scope.defs), function (id) { return scope.defs[id]; }); + if (defs.length) { + children.push(createVNode('defs', 'defs', {}, defs)); + } + if (opts.animation) { + var animationCssStr = getCssString(scope.cssNodes, scope.cssAnims, { newline: true }); + if (animationCssStr) { + var styleNode = createVNode('style', 'stl', {}, [], animationCssStr); + children.push(styleNode); + } + } + return createSVGVNode(width, height, children, opts.useViewBox); + }; + SVGPainter.prototype.renderToString = function (opts) { + opts = opts || {}; + return vNodeToString(this.renderToVNode({ + animation: retrieve2(opts.cssAnimation, true), + willUpdate: false, + compress: true, + useViewBox: retrieve2(opts.useViewBox, true) + }), { newline: true }); + }; + SVGPainter.prototype.setBackgroundColor = function (backgroundColor) { + this._backgroundColor = backgroundColor; + var bgVNode = this._bgVNode; + if (bgVNode && bgVNode.elm) { + var _a = normalizeColor(backgroundColor), color = _a.color, opacity = _a.opacity; + bgVNode.elm.setAttribute('fill', color); + if (opacity < 1) { + bgVNode.elm.setAttribute('fill-opacity', opacity); + } + } + }; + SVGPainter.prototype.getSvgRoot = function () { + return this._mainVNode && this._mainVNode.elm; + }; + SVGPainter.prototype._paintList = function (list, scope, out) { + var listLen = list.length; + var clipPathsGroupsStack = []; + var clipPathsGroupsStackDepth = 0; + var currentClipPathGroup; + var prevClipPaths; + var clipGroupNodeIdx = 0; + for (var i = 0; i < listLen; i++) { + var displayable = list[i]; + if (!displayable.invisible) { + var clipPaths = displayable.__clipPaths; + var len = clipPaths && clipPaths.length || 0; + var prevLen = prevClipPaths && prevClipPaths.length || 0; + var lca = void 0; + for (lca = Math.max(len - 1, prevLen - 1); lca >= 0; lca--) { + if (clipPaths && prevClipPaths + && clipPaths[lca] === prevClipPaths[lca]) { + break; + } + } + for (var i_1 = prevLen - 1; i_1 > lca; i_1--) { + clipPathsGroupsStackDepth--; + currentClipPathGroup = clipPathsGroupsStack[clipPathsGroupsStackDepth - 1]; + } + for (var i_2 = lca + 1; i_2 < len; i_2++) { + var groupAttrs = {}; + setClipPath(clipPaths[i_2], groupAttrs, scope); + var g = createVNode('g', 'clip-g-' + clipGroupNodeIdx++, groupAttrs, []); + (currentClipPathGroup ? currentClipPathGroup.children : out).push(g); + clipPathsGroupsStack[clipPathsGroupsStackDepth++] = g; + currentClipPathGroup = g; + } + prevClipPaths = clipPaths; + var ret = brush$1(displayable, scope); + if (ret) { + (currentClipPathGroup ? currentClipPathGroup.children : out).push(ret); + } + } + } + }; + SVGPainter.prototype.resize = function (width, height) { + var opts = this._opts; + var root = this.root; + var viewport = this._viewport; + width != null && (opts.width = width); + height != null && (opts.height = height); + if (root && viewport) { + viewport.style.display = 'none'; + width = getSize(root, 0, opts); + height = getSize(root, 1, opts); + viewport.style.display = ''; + } + if (this._width !== width || this._height !== height) { + this._width = width; + this._height = height; + if (viewport) { + var viewportStyle = viewport.style; + viewportStyle.width = width + 'px'; + viewportStyle.height = height + 'px'; + } + var svgDom = this._svgDom; + if (svgDom) { + svgDom.setAttribute('width', width); + svgDom.setAttribute('height', height); + } + } + }; + SVGPainter.prototype.getWidth = function () { + return this._width; + }; + SVGPainter.prototype.getHeight = function () { + return this._height; + }; + SVGPainter.prototype.dispose = function () { + if (this.root) { + this.root.innerHTML = ''; + } + this._svgDom = + this._viewport = + this.storage = + this._oldVNode = + this._bgVNode = + this._mainVNode = null; + }; + SVGPainter.prototype.clear = function () { + if (this._svgDom) { + this._svgDom.innerHTML = null; + } + this._oldVNode = null; + }; + SVGPainter.prototype.toDataURL = function (base64) { + var str = encodeURIComponent(this.renderToString()); + var prefix = 'data:image/svg+xml;'; + if (base64) { + str = encodeBase64(str); + return str && prefix + 'base64,' + str; + } + return prefix + 'charset=UTF-8,' + str; + }; + return SVGPainter; + }()); + function createMethodNotSupport(method) { + return function () { + if ("development" !== 'production') { + logError('In SVG mode painter not support method "' + method + '"'); + } + }; + } + + function install(registers) { + registers.registerPainter('svg', SVGPainter); + } + + function createDom(id, painter, dpr) { + var newDom = platformApi.createCanvas(); + var width = painter.getWidth(); + var height = painter.getHeight(); + var newDomStyle = newDom.style; + if (newDomStyle) { + newDomStyle.position = 'absolute'; + newDomStyle.left = '0'; + newDomStyle.top = '0'; + newDomStyle.width = width + 'px'; + newDomStyle.height = height + 'px'; + newDom.setAttribute('data-zr-dom-id', id); + } + newDom.width = width * dpr; + newDom.height = height * dpr; + return newDom; + } + var Layer = (function (_super) { + __extends(Layer, _super); + function Layer(id, painter, dpr) { + var _this = _super.call(this) || this; + _this.motionBlur = false; + _this.lastFrameAlpha = 0.7; + _this.dpr = 1; + _this.virtual = false; + _this.config = {}; + _this.incremental = false; + _this.zlevel = 0; + _this.maxRepaintRectCount = 5; + _this.__dirty = true; + _this.__firstTimePaint = true; + _this.__used = false; + _this.__drawIndex = 0; + _this.__startIndex = 0; + _this.__endIndex = 0; + _this.__prevStartIndex = null; + _this.__prevEndIndex = null; + var dom; + dpr = dpr || devicePixelRatio; + if (typeof id === 'string') { + dom = createDom(id, painter, dpr); + } + else if (isObject(id)) { + dom = id; + id = dom.id; + } + _this.id = id; + _this.dom = dom; + var domStyle = dom.style; + if (domStyle) { + disableUserSelect(dom); + dom.onselectstart = function () { return false; }; + domStyle.padding = '0'; + domStyle.margin = '0'; + domStyle.borderWidth = '0'; + } + _this.painter = painter; + _this.dpr = dpr; + return _this; + } + Layer.prototype.getElementCount = function () { + return this.__endIndex - this.__startIndex; + }; + Layer.prototype.afterBrush = function () { + this.__prevStartIndex = this.__startIndex; + this.__prevEndIndex = this.__endIndex; + }; + Layer.prototype.initContext = function () { + this.ctx = this.dom.getContext('2d'); + this.ctx.dpr = this.dpr; + }; + Layer.prototype.setUnpainted = function () { + this.__firstTimePaint = true; + }; + Layer.prototype.createBackBuffer = function () { + var dpr = this.dpr; + this.domBack = createDom('back-' + this.id, this.painter, dpr); + this.ctxBack = this.domBack.getContext('2d'); + if (dpr !== 1) { + this.ctxBack.scale(dpr, dpr); + } + }; + Layer.prototype.createRepaintRects = function (displayList, prevList, viewWidth, viewHeight) { + if (this.__firstTimePaint) { + this.__firstTimePaint = false; + return null; + } + var mergedRepaintRects = []; + var maxRepaintRectCount = this.maxRepaintRectCount; + var full = false; + var pendingRect = new BoundingRect(0, 0, 0, 0); + function addRectToMergePool(rect) { + if (!rect.isFinite() || rect.isZero()) { + return; + } + if (mergedRepaintRects.length === 0) { + var boundingRect = new BoundingRect(0, 0, 0, 0); + boundingRect.copy(rect); + mergedRepaintRects.push(boundingRect); + } + else { + var isMerged = false; + var minDeltaArea = Infinity; + var bestRectToMergeIdx = 0; + for (var i = 0; i < mergedRepaintRects.length; ++i) { + var mergedRect = mergedRepaintRects[i]; + if (mergedRect.intersect(rect)) { + var pendingRect_1 = new BoundingRect(0, 0, 0, 0); + pendingRect_1.copy(mergedRect); + pendingRect_1.union(rect); + mergedRepaintRects[i] = pendingRect_1; + isMerged = true; + break; + } + else if (full) { + pendingRect.copy(rect); + pendingRect.union(mergedRect); + var aArea = rect.width * rect.height; + var bArea = mergedRect.width * mergedRect.height; + var pendingArea = pendingRect.width * pendingRect.height; + var deltaArea = pendingArea - aArea - bArea; + if (deltaArea < minDeltaArea) { + minDeltaArea = deltaArea; + bestRectToMergeIdx = i; + } + } + } + if (full) { + mergedRepaintRects[bestRectToMergeIdx].union(rect); + isMerged = true; + } + if (!isMerged) { + var boundingRect = new BoundingRect(0, 0, 0, 0); + boundingRect.copy(rect); + mergedRepaintRects.push(boundingRect); + } + if (!full) { + full = mergedRepaintRects.length >= maxRepaintRectCount; + } + } + } + for (var i = this.__startIndex; i < this.__endIndex; ++i) { + var el = displayList[i]; + if (el) { + var shouldPaint = el.shouldBePainted(viewWidth, viewHeight, true, true); + var prevRect = el.__isRendered && ((el.__dirty & REDRAW_BIT) || !shouldPaint) + ? el.getPrevPaintRect() + : null; + if (prevRect) { + addRectToMergePool(prevRect); + } + var curRect = shouldPaint && ((el.__dirty & REDRAW_BIT) || !el.__isRendered) + ? el.getPaintRect() + : null; + if (curRect) { + addRectToMergePool(curRect); + } + } + } + for (var i = this.__prevStartIndex; i < this.__prevEndIndex; ++i) { + var el = prevList[i]; + var shouldPaint = el.shouldBePainted(viewWidth, viewHeight, true, true); + if (el && (!shouldPaint || !el.__zr) && el.__isRendered) { + var prevRect = el.getPrevPaintRect(); + if (prevRect) { + addRectToMergePool(prevRect); + } + } + } + var hasIntersections; + do { + hasIntersections = false; + for (var i = 0; i < mergedRepaintRects.length;) { + if (mergedRepaintRects[i].isZero()) { + mergedRepaintRects.splice(i, 1); + continue; + } + for (var j = i + 1; j < mergedRepaintRects.length;) { + if (mergedRepaintRects[i].intersect(mergedRepaintRects[j])) { + hasIntersections = true; + mergedRepaintRects[i].union(mergedRepaintRects[j]); + mergedRepaintRects.splice(j, 1); + } + else { + j++; + } + } + i++; + } + } while (hasIntersections); + this._paintRects = mergedRepaintRects; + return mergedRepaintRects; + }; + Layer.prototype.debugGetPaintRects = function () { + return (this._paintRects || []).slice(); + }; + Layer.prototype.resize = function (width, height) { + var dpr = this.dpr; + var dom = this.dom; + var domStyle = dom.style; + var domBack = this.domBack; + if (domStyle) { + domStyle.width = width + 'px'; + domStyle.height = height + 'px'; + } + dom.width = width * dpr; + dom.height = height * dpr; + if (domBack) { + domBack.width = width * dpr; + domBack.height = height * dpr; + if (dpr !== 1) { + this.ctxBack.scale(dpr, dpr); + } + } + }; + Layer.prototype.clear = function (clearAll, clearColor, repaintRects) { + var dom = this.dom; + var ctx = this.ctx; + var width = dom.width; + var height = dom.height; + clearColor = clearColor || this.clearColor; + var haveMotionBLur = this.motionBlur && !clearAll; + var lastFrameAlpha = this.lastFrameAlpha; + var dpr = this.dpr; + var self = this; + if (haveMotionBLur) { + if (!this.domBack) { + this.createBackBuffer(); + } + this.ctxBack.globalCompositeOperation = 'copy'; + this.ctxBack.drawImage(dom, 0, 0, width / dpr, height / dpr); + } + var domBack = this.domBack; + function doClear(x, y, width, height) { + ctx.clearRect(x, y, width, height); + if (clearColor && clearColor !== 'transparent') { + var clearColorGradientOrPattern = void 0; + if (isGradientObject(clearColor)) { + clearColorGradientOrPattern = clearColor.__canvasGradient + || getCanvasGradient(ctx, clearColor, { + x: 0, + y: 0, + width: width, + height: height + }); + clearColor.__canvasGradient = clearColorGradientOrPattern; + } + else if (isImagePatternObject(clearColor)) { + clearColorGradientOrPattern = createCanvasPattern(ctx, clearColor, { + dirty: function () { + self.setUnpainted(); + self.__painter.refresh(); + } + }); + } + ctx.save(); + ctx.fillStyle = clearColorGradientOrPattern || clearColor; + ctx.fillRect(x, y, width, height); + ctx.restore(); + } + if (haveMotionBLur) { + ctx.save(); + ctx.globalAlpha = lastFrameAlpha; + ctx.drawImage(domBack, x, y, width, height); + ctx.restore(); + } + } + if (!repaintRects || haveMotionBLur) { + doClear(0, 0, width, height); + } + else if (repaintRects.length) { + each(repaintRects, function (rect) { + doClear(rect.x * dpr, rect.y * dpr, rect.width * dpr, rect.height * dpr); + }); + } + }; + return Layer; + }(Eventful)); + + var HOVER_LAYER_ZLEVEL = 1e5; + var CANVAS_ZLEVEL = 314159; + var EL_AFTER_INCREMENTAL_INC = 0.01; + var INCREMENTAL_INC = 0.001; + function isLayerValid(layer) { + if (!layer) { + return false; + } + if (layer.__builtin__) { + return true; + } + if (typeof (layer.resize) !== 'function' + || typeof (layer.refresh) !== 'function') { + return false; + } + return true; + } + function createRoot(width, height) { + var domRoot = document.createElement('div'); + domRoot.style.cssText = [ + 'position:relative', + 'width:' + width + 'px', + 'height:' + height + 'px', + 'padding:0', + 'margin:0', + 'border-width:0' + ].join(';') + ';'; + return domRoot; + } + var CanvasPainter = (function () { + function CanvasPainter(root, storage, opts, id) { + this.type = 'canvas'; + this._zlevelList = []; + this._prevDisplayList = []; + this._layers = {}; + this._layerConfig = {}; + this._needsManuallyCompositing = false; + this.type = 'canvas'; + var singleCanvas = !root.nodeName + || root.nodeName.toUpperCase() === 'CANVAS'; + this._opts = opts = extend({}, opts || {}); + this.dpr = opts.devicePixelRatio || devicePixelRatio; + this._singleCanvas = singleCanvas; + this.root = root; + var rootStyle = root.style; + if (rootStyle) { + disableUserSelect(root); + root.innerHTML = ''; + } + this.storage = storage; + var zlevelList = this._zlevelList; + this._prevDisplayList = []; + var layers = this._layers; + if (!singleCanvas) { + this._width = getSize(root, 0, opts); + this._height = getSize(root, 1, opts); + var domRoot = this._domRoot = createRoot(this._width, this._height); + root.appendChild(domRoot); + } + else { + var rootCanvas = root; + var width = rootCanvas.width; + var height = rootCanvas.height; + if (opts.width != null) { + width = opts.width; + } + if (opts.height != null) { + height = opts.height; + } + this.dpr = opts.devicePixelRatio || 1; + rootCanvas.width = width * this.dpr; + rootCanvas.height = height * this.dpr; + this._width = width; + this._height = height; + var mainLayer = new Layer(rootCanvas, this, this.dpr); + mainLayer.__builtin__ = true; + mainLayer.initContext(); + layers[CANVAS_ZLEVEL] = mainLayer; + mainLayer.zlevel = CANVAS_ZLEVEL; + zlevelList.push(CANVAS_ZLEVEL); + this._domRoot = root; + } + } + CanvasPainter.prototype.getType = function () { + return 'canvas'; + }; + CanvasPainter.prototype.isSingleCanvas = function () { + return this._singleCanvas; + }; + CanvasPainter.prototype.getViewportRoot = function () { + return this._domRoot; + }; + CanvasPainter.prototype.getViewportRootOffset = function () { + var viewportRoot = this.getViewportRoot(); + if (viewportRoot) { + return { + offsetLeft: viewportRoot.offsetLeft || 0, + offsetTop: viewportRoot.offsetTop || 0 + }; + } + }; + CanvasPainter.prototype.refresh = function (paintAll) { + var list = this.storage.getDisplayList(true); + var prevList = this._prevDisplayList; + var zlevelList = this._zlevelList; + this._redrawId = Math.random(); + this._paintList(list, prevList, paintAll, this._redrawId); + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (!layer.__builtin__ && layer.refresh) { + var clearColor = i === 0 ? this._backgroundColor : null; + layer.refresh(clearColor); + } + } + if (this._opts.useDirtyRect) { + this._prevDisplayList = list.slice(); + } + return this; + }; + CanvasPainter.prototype.refreshHover = function () { + this._paintHoverList(this.storage.getDisplayList(false)); + }; + CanvasPainter.prototype._paintHoverList = function (list) { + var len = list.length; + var hoverLayer = this._hoverlayer; + hoverLayer && hoverLayer.clear(); + if (!len) { + return; + } + var scope = { + inHover: true, + viewWidth: this._width, + viewHeight: this._height + }; + var ctx; + for (var i = 0; i < len; i++) { + var el = list[i]; + if (el.__inHover) { + if (!hoverLayer) { + hoverLayer = this._hoverlayer = this.getLayer(HOVER_LAYER_ZLEVEL); + } + if (!ctx) { + ctx = hoverLayer.ctx; + ctx.save(); + } + brush(ctx, el, scope, i === len - 1); + } + } + if (ctx) { + ctx.restore(); + } + }; + CanvasPainter.prototype.getHoverLayer = function () { + return this.getLayer(HOVER_LAYER_ZLEVEL); + }; + CanvasPainter.prototype.paintOne = function (ctx, el) { + brushSingle(ctx, el); + }; + CanvasPainter.prototype._paintList = function (list, prevList, paintAll, redrawId) { + if (this._redrawId !== redrawId) { + return; + } + paintAll = paintAll || false; + this._updateLayerStatus(list); + var _a = this._doPaintList(list, prevList, paintAll), finished = _a.finished, needsRefreshHover = _a.needsRefreshHover; + if (this._needsManuallyCompositing) { + this._compositeManually(); + } + if (needsRefreshHover) { + this._paintHoverList(list); + } + if (!finished) { + var self_1 = this; + requestAnimationFrame$1(function () { + self_1._paintList(list, prevList, paintAll, redrawId); + }); + } + else { + this.eachLayer(function (layer) { + layer.afterBrush && layer.afterBrush(); + }); + } + }; + CanvasPainter.prototype._compositeManually = function () { + var ctx = this.getLayer(CANVAS_ZLEVEL).ctx; + var width = this._domRoot.width; + var height = this._domRoot.height; + ctx.clearRect(0, 0, width, height); + this.eachBuiltinLayer(function (layer) { + if (layer.virtual) { + ctx.drawImage(layer.dom, 0, 0, width, height); + } + }); + }; + CanvasPainter.prototype._doPaintList = function (list, prevList, paintAll) { + var _this = this; + var layerList = []; + var useDirtyRect = this._opts.useDirtyRect; + for (var zi = 0; zi < this._zlevelList.length; zi++) { + var zlevel = this._zlevelList[zi]; + var layer = this._layers[zlevel]; + if (layer.__builtin__ + && layer !== this._hoverlayer + && (layer.__dirty || paintAll)) { + layerList.push(layer); + } + } + var finished = true; + var needsRefreshHover = false; + var _loop_1 = function (k) { + var layer = layerList[k]; + var ctx = layer.ctx; + var repaintRects = useDirtyRect + && layer.createRepaintRects(list, prevList, this_1._width, this_1._height); + var start = paintAll ? layer.__startIndex : layer.__drawIndex; + var useTimer = !paintAll && layer.incremental && Date.now; + var startTime = useTimer && Date.now(); + var clearColor = layer.zlevel === this_1._zlevelList[0] + ? this_1._backgroundColor : null; + if (layer.__startIndex === layer.__endIndex) { + layer.clear(false, clearColor, repaintRects); + } + else if (start === layer.__startIndex) { + var firstEl = list[start]; + if (!firstEl.incremental || !firstEl.notClear || paintAll) { + layer.clear(false, clearColor, repaintRects); + } + } + if (start === -1) { + console.error('For some unknown reason. drawIndex is -1'); + start = layer.__startIndex; + } + var i; + var repaint = function (repaintRect) { + var scope = { + inHover: false, + allClipped: false, + prevEl: null, + viewWidth: _this._width, + viewHeight: _this._height + }; + for (i = start; i < layer.__endIndex; i++) { + var el = list[i]; + if (el.__inHover) { + needsRefreshHover = true; + } + _this._doPaintEl(el, layer, useDirtyRect, repaintRect, scope, i === layer.__endIndex - 1); + if (useTimer) { + var dTime = Date.now() - startTime; + if (dTime > 15) { + break; + } + } + } + if (scope.prevElClipPaths) { + ctx.restore(); + } + }; + if (repaintRects) { + if (repaintRects.length === 0) { + i = layer.__endIndex; + } + else { + var dpr = this_1.dpr; + for (var r = 0; r < repaintRects.length; ++r) { + var rect = repaintRects[r]; + ctx.save(); + ctx.beginPath(); + ctx.rect(rect.x * dpr, rect.y * dpr, rect.width * dpr, rect.height * dpr); + ctx.clip(); + repaint(rect); + ctx.restore(); + } + } + } + else { + ctx.save(); + repaint(); + ctx.restore(); + } + layer.__drawIndex = i; + if (layer.__drawIndex < layer.__endIndex) { + finished = false; + } + }; + var this_1 = this; + for (var k = 0; k < layerList.length; k++) { + _loop_1(k); + } + if (env.wxa) { + each(this._layers, function (layer) { + if (layer && layer.ctx && layer.ctx.draw) { + layer.ctx.draw(); + } + }); + } + return { + finished: finished, + needsRefreshHover: needsRefreshHover + }; + }; + CanvasPainter.prototype._doPaintEl = function (el, currentLayer, useDirtyRect, repaintRect, scope, isLast) { + var ctx = currentLayer.ctx; + if (useDirtyRect) { + var paintRect = el.getPaintRect(); + if (!repaintRect || paintRect && paintRect.intersect(repaintRect)) { + brush(ctx, el, scope, isLast); + el.setPrevPaintRect(paintRect); + } + } + else { + brush(ctx, el, scope, isLast); + } + }; + CanvasPainter.prototype.getLayer = function (zlevel, virtual) { + if (this._singleCanvas && !this._needsManuallyCompositing) { + zlevel = CANVAS_ZLEVEL; + } + var layer = this._layers[zlevel]; + if (!layer) { + layer = new Layer('zr_' + zlevel, this, this.dpr); + layer.zlevel = zlevel; + layer.__builtin__ = true; + if (this._layerConfig[zlevel]) { + merge(layer, this._layerConfig[zlevel], true); + } + else if (this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC]) { + merge(layer, this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC], true); + } + if (virtual) { + layer.virtual = virtual; + } + this.insertLayer(zlevel, layer); + layer.initContext(); + } + return layer; + }; + CanvasPainter.prototype.insertLayer = function (zlevel, layer) { + var layersMap = this._layers; + var zlevelList = this._zlevelList; + var len = zlevelList.length; + var domRoot = this._domRoot; + var prevLayer = null; + var i = -1; + if (layersMap[zlevel]) { + if ("development" !== 'production') { + logError('ZLevel ' + zlevel + ' has been used already'); + } + return; + } + if (!isLayerValid(layer)) { + if ("development" !== 'production') { + logError('Layer of zlevel ' + zlevel + ' is not valid'); + } + return; + } + if (len > 0 && zlevel > zlevelList[0]) { + for (i = 0; i < len - 1; i++) { + if (zlevelList[i] < zlevel + && zlevelList[i + 1] > zlevel) { + break; + } + } + prevLayer = layersMap[zlevelList[i]]; + } + zlevelList.splice(i + 1, 0, zlevel); + layersMap[zlevel] = layer; + if (!layer.virtual) { + if (prevLayer) { + var prevDom = prevLayer.dom; + if (prevDom.nextSibling) { + domRoot.insertBefore(layer.dom, prevDom.nextSibling); + } + else { + domRoot.appendChild(layer.dom); + } + } + else { + if (domRoot.firstChild) { + domRoot.insertBefore(layer.dom, domRoot.firstChild); + } + else { + domRoot.appendChild(layer.dom); + } + } + } + layer.__painter = this; + }; + CanvasPainter.prototype.eachLayer = function (cb, context) { + var zlevelList = this._zlevelList; + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + cb.call(context, this._layers[z], z); + } + }; + CanvasPainter.prototype.eachBuiltinLayer = function (cb, context) { + var zlevelList = this._zlevelList; + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (layer.__builtin__) { + cb.call(context, layer, z); + } + } + }; + CanvasPainter.prototype.eachOtherLayer = function (cb, context) { + var zlevelList = this._zlevelList; + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (!layer.__builtin__) { + cb.call(context, layer, z); + } + } + }; + CanvasPainter.prototype.getLayers = function () { + return this._layers; + }; + CanvasPainter.prototype._updateLayerStatus = function (list) { + this.eachBuiltinLayer(function (layer, z) { + layer.__dirty = layer.__used = false; + }); + function updatePrevLayer(idx) { + if (prevLayer) { + if (prevLayer.__endIndex !== idx) { + prevLayer.__dirty = true; + } + prevLayer.__endIndex = idx; + } + } + if (this._singleCanvas) { + for (var i_1 = 1; i_1 < list.length; i_1++) { + var el = list[i_1]; + if (el.zlevel !== list[i_1 - 1].zlevel || el.incremental) { + this._needsManuallyCompositing = true; + break; + } + } + } + var prevLayer = null; + var incrementalLayerCount = 0; + var prevZlevel; + var i; + for (i = 0; i < list.length; i++) { + var el = list[i]; + var zlevel = el.zlevel; + var layer = void 0; + if (prevZlevel !== zlevel) { + prevZlevel = zlevel; + incrementalLayerCount = 0; + } + if (el.incremental) { + layer = this.getLayer(zlevel + INCREMENTAL_INC, this._needsManuallyCompositing); + layer.incremental = true; + incrementalLayerCount = 1; + } + else { + layer = this.getLayer(zlevel + (incrementalLayerCount > 0 ? EL_AFTER_INCREMENTAL_INC : 0), this._needsManuallyCompositing); + } + if (!layer.__builtin__) { + logError('ZLevel ' + zlevel + ' has been used by unkown layer ' + layer.id); + } + if (layer !== prevLayer) { + layer.__used = true; + if (layer.__startIndex !== i) { + layer.__dirty = true; + } + layer.__startIndex = i; + if (!layer.incremental) { + layer.__drawIndex = i; + } + else { + layer.__drawIndex = -1; + } + updatePrevLayer(i); + prevLayer = layer; + } + if ((el.__dirty & REDRAW_BIT) && !el.__inHover) { + layer.__dirty = true; + if (layer.incremental && layer.__drawIndex < 0) { + layer.__drawIndex = i; + } + } + } + updatePrevLayer(i); + this.eachBuiltinLayer(function (layer, z) { + if (!layer.__used && layer.getElementCount() > 0) { + layer.__dirty = true; + layer.__startIndex = layer.__endIndex = layer.__drawIndex = 0; + } + if (layer.__dirty && layer.__drawIndex < 0) { + layer.__drawIndex = layer.__startIndex; + } + }); + }; + CanvasPainter.prototype.clear = function () { + this.eachBuiltinLayer(this._clearLayer); + return this; + }; + CanvasPainter.prototype._clearLayer = function (layer) { + layer.clear(); + }; + CanvasPainter.prototype.setBackgroundColor = function (backgroundColor) { + this._backgroundColor = backgroundColor; + each(this._layers, function (layer) { + layer.setUnpainted(); + }); + }; + CanvasPainter.prototype.configLayer = function (zlevel, config) { + if (config) { + var layerConfig = this._layerConfig; + if (!layerConfig[zlevel]) { + layerConfig[zlevel] = config; + } + else { + merge(layerConfig[zlevel], config, true); + } + for (var i = 0; i < this._zlevelList.length; i++) { + var _zlevel = this._zlevelList[i]; + if (_zlevel === zlevel || _zlevel === zlevel + EL_AFTER_INCREMENTAL_INC) { + var layer = this._layers[_zlevel]; + merge(layer, layerConfig[zlevel], true); + } + } + } + }; + CanvasPainter.prototype.delLayer = function (zlevel) { + var layers = this._layers; + var zlevelList = this._zlevelList; + var layer = layers[zlevel]; + if (!layer) { + return; + } + layer.dom.parentNode.removeChild(layer.dom); + delete layers[zlevel]; + zlevelList.splice(indexOf(zlevelList, zlevel), 1); + }; + CanvasPainter.prototype.resize = function (width, height) { + if (!this._domRoot.style) { + if (width == null || height == null) { + return; + } + this._width = width; + this._height = height; + this.getLayer(CANVAS_ZLEVEL).resize(width, height); + } + else { + var domRoot = this._domRoot; + domRoot.style.display = 'none'; + var opts = this._opts; + var root = this.root; + width != null && (opts.width = width); + height != null && (opts.height = height); + width = getSize(root, 0, opts); + height = getSize(root, 1, opts); + domRoot.style.display = ''; + if (this._width !== width || height !== this._height) { + domRoot.style.width = width + 'px'; + domRoot.style.height = height + 'px'; + for (var id in this._layers) { + if (this._layers.hasOwnProperty(id)) { + this._layers[id].resize(width, height); + } + } + this.refresh(true); + } + this._width = width; + this._height = height; + } + return this; + }; + CanvasPainter.prototype.clearLayer = function (zlevel) { + var layer = this._layers[zlevel]; + if (layer) { + layer.clear(); + } + }; + CanvasPainter.prototype.dispose = function () { + this.root.innerHTML = ''; + this.root = + this.storage = + this._domRoot = + this._layers = null; + }; + CanvasPainter.prototype.getRenderedCanvas = function (opts) { + opts = opts || {}; + if (this._singleCanvas && !this._compositeManually) { + return this._layers[CANVAS_ZLEVEL].dom; + } + var imageLayer = new Layer('image', this, opts.pixelRatio || this.dpr); + imageLayer.initContext(); + imageLayer.clear(false, opts.backgroundColor || this._backgroundColor); + var ctx = imageLayer.ctx; + if (opts.pixelRatio <= this.dpr) { + this.refresh(); + var width_1 = imageLayer.dom.width; + var height_1 = imageLayer.dom.height; + this.eachLayer(function (layer) { + if (layer.__builtin__) { + ctx.drawImage(layer.dom, 0, 0, width_1, height_1); + } + else if (layer.renderToCanvas) { + ctx.save(); + layer.renderToCanvas(ctx); + ctx.restore(); + } + }); + } + else { + var scope = { + inHover: false, + viewWidth: this._width, + viewHeight: this._height + }; + var displayList = this.storage.getDisplayList(true); + for (var i = 0, len = displayList.length; i < len; i++) { + var el = displayList[i]; + brush(ctx, el, scope, i === len - 1); + } + } + return imageLayer.dom; + }; + CanvasPainter.prototype.getWidth = function () { + return this._width; + }; + CanvasPainter.prototype.getHeight = function () { + return this._height; + }; + return CanvasPainter; + }()); + + function install$1(registers) { + registers.registerPainter('canvas', CanvasPainter); + } + + var LineSeriesModel = + /** @class */ + function (_super) { + __extends(LineSeriesModel, _super); + + function LineSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LineSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } + + LineSeriesModel.prototype.getInitialData = function (option) { + if ("development" !== 'production') { + var coordSys = option.coordinateSystem; + + if (coordSys !== 'polar' && coordSys !== 'cartesian2d') { + throw new Error('Line not support coordinateSystem besides cartesian and polar'); + } + } + + return createSeriesData(null, this, { + useEncodeDefaulter: true + }); + }; + + LineSeriesModel.prototype.getLegendIcon = function (opt) { + var group = new Group(); + var line = createSymbol('line', 0, opt.itemHeight / 2, opt.itemWidth, 0, opt.lineStyle.stroke, false); + group.add(line); + line.setStyle(opt.lineStyle); + var visualType = this.getData().getVisual('symbol'); + var visualRotate = this.getData().getVisual('symbolRotate'); + var symbolType = visualType === 'none' ? 'circle' : visualType; // Symbol size is 80% when there is a line + + var size = opt.itemHeight * 0.8; + var symbol = createSymbol(symbolType, (opt.itemWidth - size) / 2, (opt.itemHeight - size) / 2, size, size, opt.itemStyle.fill); + group.add(symbol); + symbol.setStyle(opt.itemStyle); + var symbolRotate = opt.iconRotate === 'inherit' ? visualRotate : opt.iconRotate || 0; + symbol.rotation = symbolRotate * Math.PI / 180; + symbol.setOrigin([opt.itemWidth / 2, opt.itemHeight / 2]); + + if (symbolType.indexOf('empty') > -1) { + symbol.style.stroke = symbol.style.fill; + symbol.style.fill = '#fff'; + symbol.style.lineWidth = 2; + } + + return group; + }; + + LineSeriesModel.type = 'series.line'; + LineSeriesModel.dependencies = ['grid', 'polar']; + LineSeriesModel.defaultOption = { + // zlevel: 0, + z: 3, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + clip: true, + label: { + position: 'top' + }, + // itemStyle: { + // }, + endLabel: { + show: false, + valueAnimation: true, + distance: 8 + }, + lineStyle: { + width: 2, + type: 'solid' + }, + emphasis: { + scale: true + }, + // areaStyle: { + // origin of areaStyle. Valid values: + // `'auto'/null/undefined`: from axisLine to data + // `'start'`: from min to data + // `'end'`: from data to max + // origin: 'auto' + // }, + // false, 'start', 'end', 'middle' + step: false, + // Disabled if step is true + smooth: false, + smoothMonotone: null, + symbol: 'emptyCircle', + symbolSize: 4, + symbolRotate: null, + showSymbol: true, + // `false`: follow the label interval strategy. + // `true`: show all symbols. + // `'auto'`: If possible, show all symbols, otherwise + // follow the label interval strategy. + showAllSymbol: 'auto', + // Whether to connect break point. + connectNulls: false, + // Sampling for large data. Can be: 'average', 'max', 'min', 'sum', 'lttb'. + sampling: 'none', + animationEasing: 'linear', + // Disable progressive + progressive: 0, + hoverLayerThreshold: Infinity, + universalTransition: { + divideShape: 'clone' + }, + triggerLineEvent: false + }; + return LineSeriesModel; + }(SeriesModel); + + /** + * @return label string. Not null/undefined + */ + + function getDefaultLabel(data, dataIndex) { + var labelDims = data.mapDimensionsAll('defaultedLabel'); + var len = labelDims.length; // Simple optimization (in lots of cases, label dims length is 1) + + if (len === 1) { + var rawVal = retrieveRawValue(data, dataIndex, labelDims[0]); + return rawVal != null ? rawVal + '' : null; + } else if (len) { + var vals = []; + + for (var i = 0; i < labelDims.length; i++) { + vals.push(retrieveRawValue(data, dataIndex, labelDims[i])); + } + + return vals.join(' '); + } + } + function getDefaultInterpolatedLabel(data, interpolatedValue) { + var labelDims = data.mapDimensionsAll('defaultedLabel'); + + if (!isArray(interpolatedValue)) { + return interpolatedValue + ''; + } + + var vals = []; + + for (var i = 0; i < labelDims.length; i++) { + var dimIndex = data.getDimensionIndex(labelDims[i]); + + if (dimIndex >= 0) { + vals.push(interpolatedValue[dimIndex]); + } + } + + return vals.join(' '); + } + + var Symbol = + /** @class */ + function (_super) { + __extends(Symbol, _super); + + function Symbol(data, idx, seriesScope, opts) { + var _this = _super.call(this) || this; + + _this.updateData(data, idx, seriesScope, opts); + + return _this; + } + + Symbol.prototype._createSymbol = function (symbolType, data, idx, symbolSize, keepAspect) { + // Remove paths created before + this.removeAll(); // let symbolPath = createSymbol( + // symbolType, -0.5, -0.5, 1, 1, color + // ); + // If width/height are set too small (e.g., set to 1) on ios10 + // and macOS Sierra, a circle stroke become a rect, no matter what + // the scale is set. So we set width/height as 2. See #4150. + + var symbolPath = createSymbol(symbolType, -1, -1, 2, 2, null, keepAspect); + symbolPath.attr({ + z2: 100, + culling: true, + scaleX: symbolSize[0] / 2, + scaleY: symbolSize[1] / 2 + }); // Rewrite drift method + + symbolPath.drift = driftSymbol; + this._symbolType = symbolType; + this.add(symbolPath); + }; + /** + * Stop animation + * @param {boolean} toLastFrame + */ + + + Symbol.prototype.stopSymbolAnimation = function (toLastFrame) { + this.childAt(0).stopAnimation(null, toLastFrame); + }; + + Symbol.prototype.getSymbolType = function () { + return this._symbolType; + }; + /** + * FIXME: + * Caution: This method breaks the encapsulation of this module, + * but it indeed brings convenience. So do not use the method + * unless you detailedly know all the implements of `Symbol`, + * especially animation. + * + * Get symbol path element. + */ + + + Symbol.prototype.getSymbolPath = function () { + return this.childAt(0); + }; + /** + * Highlight symbol + */ + + + Symbol.prototype.highlight = function () { + enterEmphasis(this.childAt(0)); + }; + /** + * Downplay symbol + */ + + + Symbol.prototype.downplay = function () { + leaveEmphasis(this.childAt(0)); + }; + /** + * @param {number} zlevel + * @param {number} z + */ + + + Symbol.prototype.setZ = function (zlevel, z) { + var symbolPath = this.childAt(0); + symbolPath.zlevel = zlevel; + symbolPath.z = z; + }; + + Symbol.prototype.setDraggable = function (draggable, hasCursorOption) { + var symbolPath = this.childAt(0); + symbolPath.draggable = draggable; + symbolPath.cursor = !hasCursorOption && draggable ? 'move' : symbolPath.cursor; + }; + /** + * Update symbol properties + */ + + + Symbol.prototype.updateData = function (data, idx, seriesScope, opts) { + this.silent = false; + var symbolType = data.getItemVisual(idx, 'symbol') || 'circle'; + var seriesModel = data.hostModel; + var symbolSize = Symbol.getSymbolSize(data, idx); + var isInit = symbolType !== this._symbolType; + var disableAnimation = opts && opts.disableAnimation; + + if (isInit) { + var keepAspect = data.getItemVisual(idx, 'symbolKeepAspect'); + + this._createSymbol(symbolType, data, idx, symbolSize, keepAspect); + } else { + var symbolPath = this.childAt(0); + symbolPath.silent = false; + var target = { + scaleX: symbolSize[0] / 2, + scaleY: symbolSize[1] / 2 + }; + disableAnimation ? symbolPath.attr(target) : updateProps(symbolPath, target, seriesModel, idx); + saveOldStyle(symbolPath); + } + + this._updateCommon(data, idx, symbolSize, seriesScope, opts); + + if (isInit) { + var symbolPath = this.childAt(0); + + if (!disableAnimation) { + var target = { + scaleX: this._sizeX, + scaleY: this._sizeY, + style: { + // Always fadeIn. Because it has fadeOut animation when symbol is removed.. + opacity: symbolPath.style.opacity + } + }; + symbolPath.scaleX = symbolPath.scaleY = 0; + symbolPath.style.opacity = 0; + initProps(symbolPath, target, seriesModel, idx); + } + } + + if (disableAnimation) { + // Must stop leave transition manually if don't call initProps or updateProps. + this.childAt(0).stopAnimation('leave'); + } + }; + + Symbol.prototype._updateCommon = function (data, idx, symbolSize, seriesScope, opts) { + var symbolPath = this.childAt(0); + var seriesModel = data.hostModel; + var emphasisItemStyle; + var blurItemStyle; + var selectItemStyle; + var focus; + var blurScope; + var emphasisDisabled; + var labelStatesModels; + var hoverScale; + var cursorStyle; + + if (seriesScope) { + emphasisItemStyle = seriesScope.emphasisItemStyle; + blurItemStyle = seriesScope.blurItemStyle; + selectItemStyle = seriesScope.selectItemStyle; + focus = seriesScope.focus; + blurScope = seriesScope.blurScope; + labelStatesModels = seriesScope.labelStatesModels; + hoverScale = seriesScope.hoverScale; + cursorStyle = seriesScope.cursorStyle; + emphasisDisabled = seriesScope.emphasisDisabled; + } + + if (!seriesScope || data.hasItemOption) { + var itemModel = seriesScope && seriesScope.itemModel ? seriesScope.itemModel : data.getItemModel(idx); + var emphasisModel = itemModel.getModel('emphasis'); + emphasisItemStyle = emphasisModel.getModel('itemStyle').getItemStyle(); + selectItemStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle(); + blurItemStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle(); + focus = emphasisModel.get('focus'); + blurScope = emphasisModel.get('blurScope'); + emphasisDisabled = emphasisModel.get('disabled'); + labelStatesModels = getLabelStatesModels(itemModel); + hoverScale = emphasisModel.getShallow('scale'); + cursorStyle = itemModel.getShallow('cursor'); + } + + var symbolRotate = data.getItemVisual(idx, 'symbolRotate'); + symbolPath.attr('rotation', (symbolRotate || 0) * Math.PI / 180 || 0); + var symbolOffset = normalizeSymbolOffset(data.getItemVisual(idx, 'symbolOffset'), symbolSize); + + if (symbolOffset) { + symbolPath.x = symbolOffset[0]; + symbolPath.y = symbolOffset[1]; + } + + cursorStyle && symbolPath.attr('cursor', cursorStyle); + var symbolStyle = data.getItemVisual(idx, 'style'); + var visualColor = symbolStyle.fill; + + if (symbolPath instanceof ZRImage) { + var pathStyle = symbolPath.style; + symbolPath.useStyle(extend({ + // TODO other properties like x, y ? + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, symbolStyle)); + } else { + if (symbolPath.__isEmptyBrush) { + // fill and stroke will be swapped if it's empty. + // So we cloned a new style to avoid it affecting the original style in visual storage. + // TODO Better implementation. No empty logic! + symbolPath.useStyle(extend({}, symbolStyle)); + } else { + symbolPath.useStyle(symbolStyle); + } // Disable decal because symbol scale will been applied on the decal. + + + symbolPath.style.decal = null; + symbolPath.setColor(visualColor, opts && opts.symbolInnerColor); + symbolPath.style.strokeNoScale = true; + } + + var liftZ = data.getItemVisual(idx, 'liftZ'); + var z2Origin = this._z2; + + if (liftZ != null) { + if (z2Origin == null) { + this._z2 = symbolPath.z2; + symbolPath.z2 += liftZ; + } + } else if (z2Origin != null) { + symbolPath.z2 = z2Origin; + this._z2 = null; + } + + var useNameLabel = opts && opts.useNameLabel; + setLabelStyle(symbolPath, labelStatesModels, { + labelFetcher: seriesModel, + labelDataIndex: idx, + defaultText: getLabelDefaultText, + inheritColor: visualColor, + defaultOpacity: symbolStyle.opacity + }); // Do not execute util needed. + + function getLabelDefaultText(idx) { + return useNameLabel ? data.getName(idx) : getDefaultLabel(data, idx); + } + + this._sizeX = symbolSize[0] / 2; + this._sizeY = symbolSize[1] / 2; + var emphasisState = symbolPath.ensureState('emphasis'); + emphasisState.style = emphasisItemStyle; + symbolPath.ensureState('select').style = selectItemStyle; + symbolPath.ensureState('blur').style = blurItemStyle; + + if (hoverScale) { + var scaleRatio = Math.max(isNumber(hoverScale) ? hoverScale : 1.1, 3 / this._sizeY); + emphasisState.scaleX = this._sizeX * scaleRatio; + emphasisState.scaleY = this._sizeY * scaleRatio; + } + + this.setSymbolScale(1); + toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled); + }; + + Symbol.prototype.setSymbolScale = function (scale) { + this.scaleX = this.scaleY = scale; + }; + + Symbol.prototype.fadeOut = function (cb, seriesModel, opt) { + var symbolPath = this.childAt(0); + var dataIndex = getECData(this).dataIndex; + var animationOpt = opt && opt.animation; // Avoid mistaken hover when fading out + + this.silent = symbolPath.silent = true; // Not show text when animating + + if (opt && opt.fadeLabel) { + var textContent = symbolPath.getTextContent(); + + if (textContent) { + removeElement(textContent, { + style: { + opacity: 0 + } + }, seriesModel, { + dataIndex: dataIndex, + removeOpt: animationOpt, + cb: function () { + symbolPath.removeTextContent(); + } + }); + } + } else { + symbolPath.removeTextContent(); + } + + removeElement(symbolPath, { + style: { + opacity: 0 + }, + scaleX: 0, + scaleY: 0 + }, seriesModel, { + dataIndex: dataIndex, + cb: cb, + removeOpt: animationOpt + }); + }; + + Symbol.getSymbolSize = function (data, idx) { + return normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + }; + + return Symbol; + }(Group); + + function driftSymbol(dx, dy) { + this.parent.drift(dx, dy); + } + + function symbolNeedsDraw(data, point, idx, opt) { + return point && !isNaN(point[0]) && !isNaN(point[1]) && !(opt.isIgnore && opt.isIgnore(idx)) // We do not set clipShape on group, because it will cut part of + // the symbol element shape. We use the same clip shape here as + // the line clip. + && !(opt.clipShape && !opt.clipShape.contain(point[0], point[1])) && data.getItemVisual(idx, 'symbol') !== 'none'; + } + + function normalizeUpdateOpt(opt) { + if (opt != null && !isObject(opt)) { + opt = { + isIgnore: opt + }; + } + + return opt || {}; + } + + function makeSeriesScope(data) { + var seriesModel = data.hostModel; + var emphasisModel = seriesModel.getModel('emphasis'); + return { + emphasisItemStyle: emphasisModel.getModel('itemStyle').getItemStyle(), + blurItemStyle: seriesModel.getModel(['blur', 'itemStyle']).getItemStyle(), + selectItemStyle: seriesModel.getModel(['select', 'itemStyle']).getItemStyle(), + focus: emphasisModel.get('focus'), + blurScope: emphasisModel.get('blurScope'), + emphasisDisabled: emphasisModel.get('disabled'), + hoverScale: emphasisModel.get('scale'), + labelStatesModels: getLabelStatesModels(seriesModel), + cursorStyle: seriesModel.get('cursor') + }; + } + + var SymbolDraw = + /** @class */ + function () { + function SymbolDraw(SymbolCtor) { + this.group = new Group(); + this._SymbolCtor = SymbolCtor || Symbol; + } + /** + * Update symbols draw by new data + */ + + + SymbolDraw.prototype.updateData = function (data, opt) { + // Remove progressive els. + this._progressiveEls = null; + opt = normalizeUpdateOpt(opt); + var group = this.group; + var seriesModel = data.hostModel; + var oldData = this._data; + var SymbolCtor = this._SymbolCtor; + var disableAnimation = opt.disableAnimation; + var seriesScope = makeSeriesScope(data); + var symbolUpdateOpt = { + disableAnimation: disableAnimation + }; + + var getSymbolPoint = opt.getSymbolPoint || function (idx) { + return data.getItemLayout(idx); + }; // There is no oldLineData only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + + + if (!oldData) { + group.removeAll(); + } + + data.diff(oldData).add(function (newIdx) { + var point = getSymbolPoint(newIdx); + + if (symbolNeedsDraw(data, point, newIdx, opt)) { + var symbolEl = new SymbolCtor(data, newIdx, seriesScope, symbolUpdateOpt); + symbolEl.setPosition(point); + data.setItemGraphicEl(newIdx, symbolEl); + group.add(symbolEl); + } + }).update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + var point = getSymbolPoint(newIdx); + + if (!symbolNeedsDraw(data, point, newIdx, opt)) { + group.remove(symbolEl); + return; + } + + var newSymbolType = data.getItemVisual(newIdx, 'symbol') || 'circle'; + var oldSymbolType = symbolEl && symbolEl.getSymbolType && symbolEl.getSymbolType(); + + if (!symbolEl // Create a new if symbol type changed. + || oldSymbolType && oldSymbolType !== newSymbolType) { + group.remove(symbolEl); + symbolEl = new SymbolCtor(data, newIdx, seriesScope, symbolUpdateOpt); + symbolEl.setPosition(point); + } else { + symbolEl.updateData(data, newIdx, seriesScope, symbolUpdateOpt); + var target = { + x: point[0], + y: point[1] + }; + disableAnimation ? symbolEl.attr(target) : updateProps(symbolEl, target, seriesModel); + } // Add back + + + group.add(symbolEl); + data.setItemGraphicEl(newIdx, symbolEl); + }).remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && el.fadeOut(function () { + group.remove(el); + }, seriesModel); + }).execute(); + this._getSymbolPoint = getSymbolPoint; + this._data = data; + }; + + SymbolDraw.prototype.updateLayout = function () { + var _this = this; + + var data = this._data; + + if (data) { + // Not use animation + data.eachItemGraphicEl(function (el, idx) { + var point = _this._getSymbolPoint(idx); + + el.setPosition(point); + el.markRedraw(); + }); + } + }; + + SymbolDraw.prototype.incrementalPrepareUpdate = function (data) { + this._seriesScope = makeSeriesScope(data); + this._data = null; + this.group.removeAll(); + }; + /** + * Update symbols draw by new data + */ + + SymbolDraw.prototype.incrementalUpdate = function (taskParams, data, opt) { + // Clear + this._progressiveEls = []; + opt = normalizeUpdateOpt(opt); + + function updateIncrementalAndHover(el) { + if (!el.isGroup) { + el.incremental = true; + el.ensureState('emphasis').hoverLayer = true; + } + } + + for (var idx = taskParams.start; idx < taskParams.end; idx++) { + var point = data.getItemLayout(idx); + + if (symbolNeedsDraw(data, point, idx, opt)) { + var el = new this._SymbolCtor(data, idx, this._seriesScope); + el.traverse(updateIncrementalAndHover); + el.setPosition(point); + this.group.add(el); + data.setItemGraphicEl(idx, el); + + this._progressiveEls.push(el); + } + } + }; + + SymbolDraw.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + SymbolDraw.prototype.remove = function (enableAnimation) { + var group = this.group; + var data = this._data; // Incremental model do not have this._data. + + if (data && enableAnimation) { + data.eachItemGraphicEl(function (el) { + el.fadeOut(function () { + group.remove(el); + }, data.hostModel); + }); + } else { + group.removeAll(); + } + }; + return SymbolDraw; + }(); + + function prepareDataCoordInfo(coordSys, data, valueOrigin) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var valueStart = getValueStart(valueAxis, valueOrigin); + var baseAxisDim = baseAxis.dim; + var valueAxisDim = valueAxis.dim; + var valueDim = data.mapDimension(valueAxisDim); + var baseDim = data.mapDimension(baseAxisDim); + var baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0; + var dims = map(coordSys.dimensions, function (coordDim) { + return data.mapDimension(coordDim); + }); + var stacked = false; + var stackResultDim = data.getCalculationInfo('stackResultDimension'); + + if (isDimensionStacked(data, dims[0] + /*, dims[1]*/ + )) { + // jshint ignore:line + stacked = true; + dims[0] = stackResultDim; + } + + if (isDimensionStacked(data, dims[1] + /*, dims[0]*/ + )) { + // jshint ignore:line + stacked = true; + dims[1] = stackResultDim; + } + + return { + dataDimsForPoint: dims, + valueStart: valueStart, + valueAxisDim: valueAxisDim, + baseAxisDim: baseAxisDim, + stacked: !!stacked, + valueDim: valueDim, + baseDim: baseDim, + baseDataOffset: baseDataOffset, + stackedOverDimension: data.getCalculationInfo('stackedOverDimension') + }; + } + + function getValueStart(valueAxis, valueOrigin) { + var valueStart = 0; + var extent = valueAxis.scale.getExtent(); + + if (valueOrigin === 'start') { + valueStart = extent[0]; + } else if (valueOrigin === 'end') { + valueStart = extent[1]; + } // If origin is specified as a number, use it as + // valueStart directly + else if (isNumber(valueOrigin) && !isNaN(valueOrigin)) { + valueStart = valueOrigin; + } // auto + else { + // Both positive + if (extent[0] > 0) { + valueStart = extent[0]; + } // Both negative + else if (extent[1] < 0) { + valueStart = extent[1]; + } // If is one positive, and one negative, onZero shall be true + + } + + return valueStart; + } + + function getStackedOnPoint(dataCoordInfo, coordSys, data, idx) { + var value = NaN; + + if (dataCoordInfo.stacked) { + value = data.get(data.getCalculationInfo('stackedOverDimension'), idx); + } + + if (isNaN(value)) { + value = dataCoordInfo.valueStart; + } + + var baseDataOffset = dataCoordInfo.baseDataOffset; + var stackedData = []; + stackedData[baseDataOffset] = data.get(dataCoordInfo.baseDim, idx); + stackedData[1 - baseDataOffset] = value; + return coordSys.dataToPoint(stackedData); + } + + function diffData(oldData, newData) { + var diffResult = []; + newData.diff(oldData).add(function (idx) { + diffResult.push({ + cmd: '+', + idx: idx + }); + }).update(function (newIdx, oldIdx) { + diffResult.push({ + cmd: '=', + idx: oldIdx, + idx1: newIdx + }); + }).remove(function (idx) { + diffResult.push({ + cmd: '-', + idx: idx + }); + }).execute(); + return diffResult; + } + + function lineAnimationDiff(oldData, newData, oldStackedOnPoints, newStackedOnPoints, oldCoordSys, newCoordSys, oldValueOrigin, newValueOrigin) { + var diff = diffData(oldData, newData); // let newIdList = newData.mapArray(newData.getId); + // let oldIdList = oldData.mapArray(oldData.getId); + // convertToIntId(newIdList, oldIdList); + // // FIXME One data ? + // diff = arrayDiff(oldIdList, newIdList); + + var currPoints = []; + var nextPoints = []; // Points for stacking base line + + var currStackedPoints = []; + var nextStackedPoints = []; + var status = []; + var sortedIndices = []; + var rawIndices = []; + var newDataOldCoordInfo = prepareDataCoordInfo(oldCoordSys, newData, oldValueOrigin); // const oldDataNewCoordInfo = prepareDataCoordInfo(newCoordSys, oldData, newValueOrigin); + + var oldPoints = oldData.getLayout('points') || []; + var newPoints = newData.getLayout('points') || []; + + for (var i = 0; i < diff.length; i++) { + var diffItem = diff[i]; + var pointAdded = true; + var oldIdx2 = void 0; + var newIdx2 = void 0; // FIXME, animation is not so perfect when dataZoom window moves fast + // Which is in case remvoing or add more than one data in the tail or head + + switch (diffItem.cmd) { + case '=': + oldIdx2 = diffItem.idx * 2; + newIdx2 = diffItem.idx1 * 2; + var currentX = oldPoints[oldIdx2]; + var currentY = oldPoints[oldIdx2 + 1]; + var nextX = newPoints[newIdx2]; + var nextY = newPoints[newIdx2 + 1]; // If previous data is NaN, use next point directly + + if (isNaN(currentX) || isNaN(currentY)) { + currentX = nextX; + currentY = nextY; + } + + currPoints.push(currentX, currentY); + nextPoints.push(nextX, nextY); + currStackedPoints.push(oldStackedOnPoints[oldIdx2], oldStackedOnPoints[oldIdx2 + 1]); + nextStackedPoints.push(newStackedOnPoints[newIdx2], newStackedOnPoints[newIdx2 + 1]); + rawIndices.push(newData.getRawIndex(diffItem.idx1)); + break; + + case '+': + var newIdx = diffItem.idx; + var newDataDimsForPoint = newDataOldCoordInfo.dataDimsForPoint; + var oldPt = oldCoordSys.dataToPoint([newData.get(newDataDimsForPoint[0], newIdx), newData.get(newDataDimsForPoint[1], newIdx)]); + newIdx2 = newIdx * 2; + currPoints.push(oldPt[0], oldPt[1]); + nextPoints.push(newPoints[newIdx2], newPoints[newIdx2 + 1]); + var stackedOnPoint = getStackedOnPoint(newDataOldCoordInfo, oldCoordSys, newData, newIdx); + currStackedPoints.push(stackedOnPoint[0], stackedOnPoint[1]); + nextStackedPoints.push(newStackedOnPoints[newIdx2], newStackedOnPoints[newIdx2 + 1]); + rawIndices.push(newData.getRawIndex(newIdx)); + break; + + case '-': + pointAdded = false; + } // Original indices + + + if (pointAdded) { + status.push(diffItem); + sortedIndices.push(sortedIndices.length); + } + } // Diff result may be crossed if all items are changed + // Sort by data index + + + sortedIndices.sort(function (a, b) { + return rawIndices[a] - rawIndices[b]; + }); + var len = currPoints.length; + var sortedCurrPoints = createFloat32Array(len); + var sortedNextPoints = createFloat32Array(len); + var sortedCurrStackedPoints = createFloat32Array(len); + var sortedNextStackedPoints = createFloat32Array(len); + var sortedStatus = []; + + for (var i = 0; i < sortedIndices.length; i++) { + var idx = sortedIndices[i]; + var i2 = i * 2; + var idx2 = idx * 2; + sortedCurrPoints[i2] = currPoints[idx2]; + sortedCurrPoints[i2 + 1] = currPoints[idx2 + 1]; + sortedNextPoints[i2] = nextPoints[idx2]; + sortedNextPoints[i2 + 1] = nextPoints[idx2 + 1]; + sortedCurrStackedPoints[i2] = currStackedPoints[idx2]; + sortedCurrStackedPoints[i2 + 1] = currStackedPoints[idx2 + 1]; + sortedNextStackedPoints[i2] = nextStackedPoints[idx2]; + sortedNextStackedPoints[i2 + 1] = nextStackedPoints[idx2 + 1]; + sortedStatus[i] = status[idx]; + } + + return { + current: sortedCurrPoints, + next: sortedNextPoints, + stackedOnCurrent: sortedCurrStackedPoints, + stackedOnNext: sortedNextStackedPoints, + status: sortedStatus + }; + } + + var mathMin$5 = Math.min; + var mathMax$5 = Math.max; + + function isPointNull(x, y) { + return isNaN(x) || isNaN(y); + } + /** + * Draw smoothed line in non-monotone, in may cause undesired curve in extreme + * situations. This should be used when points are non-monotone neither in x or + * y dimension. + */ + + + function drawSegment(ctx, points, start, segLen, allLen, dir, smooth, smoothMonotone, connectNulls) { + var prevX; + var prevY; + var cpx0; + var cpy0; + var cpx1; + var cpy1; + var idx = start; + var k = 0; + + for (; k < segLen; k++) { + var x = points[idx * 2]; + var y = points[idx * 2 + 1]; + + if (idx >= allLen || idx < 0) { + break; + } + + if (isPointNull(x, y)) { + if (connectNulls) { + idx += dir; + continue; + } + + break; + } + + if (idx === start) { + ctx[dir > 0 ? 'moveTo' : 'lineTo'](x, y); + cpx0 = x; + cpy0 = y; + } else { + var dx = x - prevX; + var dy = y - prevY; // Ignore tiny segment. + + if (dx * dx + dy * dy < 0.5) { + idx += dir; + continue; + } + + if (smooth > 0) { + var nextIdx = idx + dir; + var nextX = points[nextIdx * 2]; + var nextY = points[nextIdx * 2 + 1]; // Ignore duplicate point + + while (nextX === x && nextY === y && k < segLen) { + k++; + nextIdx += dir; + idx += dir; + nextX = points[nextIdx * 2]; + nextY = points[nextIdx * 2 + 1]; + x = points[idx * 2]; + y = points[idx * 2 + 1]; + dx = x - prevX; + dy = y - prevY; + } + + var tmpK = k + 1; + + if (connectNulls) { + // Find next point not null + while (isPointNull(nextX, nextY) && tmpK < segLen) { + tmpK++; + nextIdx += dir; + nextX = points[nextIdx * 2]; + nextY = points[nextIdx * 2 + 1]; + } + } + + var ratioNextSeg = 0.5; + var vx = 0; + var vy = 0; + var nextCpx0 = void 0; + var nextCpy0 = void 0; // Is last point + + if (tmpK >= segLen || isPointNull(nextX, nextY)) { + cpx1 = x; + cpy1 = y; + } else { + vx = nextX - prevX; + vy = nextY - prevY; + var dx0 = x - prevX; + var dx1 = nextX - x; + var dy0 = y - prevY; + var dy1 = nextY - y; + var lenPrevSeg = void 0; + var lenNextSeg = void 0; + + if (smoothMonotone === 'x') { + lenPrevSeg = Math.abs(dx0); + lenNextSeg = Math.abs(dx1); + var dir_1 = vx > 0 ? 1 : -1; + cpx1 = x - dir_1 * lenPrevSeg * smooth; + cpy1 = y; + nextCpx0 = x + dir_1 * lenNextSeg * smooth; + nextCpy0 = y; + } else if (smoothMonotone === 'y') { + lenPrevSeg = Math.abs(dy0); + lenNextSeg = Math.abs(dy1); + var dir_2 = vy > 0 ? 1 : -1; + cpx1 = x; + cpy1 = y - dir_2 * lenPrevSeg * smooth; + nextCpx0 = x; + nextCpy0 = y + dir_2 * lenNextSeg * smooth; + } else { + lenPrevSeg = Math.sqrt(dx0 * dx0 + dy0 * dy0); + lenNextSeg = Math.sqrt(dx1 * dx1 + dy1 * dy1); // Use ratio of seg length + + ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg); + cpx1 = x - vx * smooth * (1 - ratioNextSeg); + cpy1 = y - vy * smooth * (1 - ratioNextSeg); // cp0 of next segment + + nextCpx0 = x + vx * smooth * ratioNextSeg; + nextCpy0 = y + vy * smooth * ratioNextSeg; // Smooth constraint between point and next point. + // Avoid exceeding extreme after smoothing. + + nextCpx0 = mathMin$5(nextCpx0, mathMax$5(nextX, x)); + nextCpy0 = mathMin$5(nextCpy0, mathMax$5(nextY, y)); + nextCpx0 = mathMax$5(nextCpx0, mathMin$5(nextX, x)); + nextCpy0 = mathMax$5(nextCpy0, mathMin$5(nextY, y)); // Reclaculate cp1 based on the adjusted cp0 of next seg. + + vx = nextCpx0 - x; + vy = nextCpy0 - y; + cpx1 = x - vx * lenPrevSeg / lenNextSeg; + cpy1 = y - vy * lenPrevSeg / lenNextSeg; // Smooth constraint between point and prev point. + // Avoid exceeding extreme after smoothing. + + cpx1 = mathMin$5(cpx1, mathMax$5(prevX, x)); + cpy1 = mathMin$5(cpy1, mathMax$5(prevY, y)); + cpx1 = mathMax$5(cpx1, mathMin$5(prevX, x)); + cpy1 = mathMax$5(cpy1, mathMin$5(prevY, y)); // Adjust next cp0 again. + + vx = x - cpx1; + vy = y - cpy1; + nextCpx0 = x + vx * lenNextSeg / lenPrevSeg; + nextCpy0 = y + vy * lenNextSeg / lenPrevSeg; + } + } + + ctx.bezierCurveTo(cpx0, cpy0, cpx1, cpy1, x, y); + cpx0 = nextCpx0; + cpy0 = nextCpy0; + } else { + ctx.lineTo(x, y); + } + } + + prevX = x; + prevY = y; + idx += dir; + } + + return k; + } + + var ECPolylineShape = + /** @class */ + function () { + function ECPolylineShape() { + this.smooth = 0; + this.smoothConstraint = true; + } + + return ECPolylineShape; + }(); + + var ECPolyline = + /** @class */ + function (_super) { + __extends(ECPolyline, _super); + + function ECPolyline(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'ec-polyline'; + return _this; + } + + ECPolyline.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + + ECPolyline.prototype.getDefaultShape = function () { + return new ECPolylineShape(); + }; + + ECPolyline.prototype.buildPath = function (ctx, shape) { + var points = shape.points; + var i = 0; + var len = points.length / 2; // const result = getBoundingBox(points, shape.smoothConstraint); + + if (shape.connectNulls) { + // Must remove first and last null values avoid draw error in polygon + for (; len > 0; len--) { + if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) { + break; + } + } + + for (; i < len; i++) { + if (!isPointNull(points[i * 2], points[i * 2 + 1])) { + break; + } + } + } + + while (i < len) { + i += drawSegment(ctx, points, i, len, len, 1, shape.smooth, shape.smoothMonotone, shape.connectNulls) + 1; + } + }; + + ECPolyline.prototype.getPointOn = function (xOrY, dim) { + if (!this.path) { + this.createPathProxy(); + this.buildPath(this.path, this.shape); + } + + var path = this.path; + var data = path.data; + var CMD = PathProxy.CMD; + var x0; + var y0; + var isDimX = dim === 'x'; + var roots = []; + + for (var i = 0; i < data.length;) { + var cmd = data[i++]; + var x = void 0; + var y = void 0; + var x2 = void 0; + var y2 = void 0; + var x3 = void 0; + var y3 = void 0; + var t = void 0; + + switch (cmd) { + case CMD.M: + x0 = data[i++]; + y0 = data[i++]; + break; + + case CMD.L: + x = data[i++]; + y = data[i++]; + t = isDimX ? (xOrY - x0) / (x - x0) : (xOrY - y0) / (y - y0); + + if (t <= 1 && t >= 0) { + var val = isDimX ? (y - y0) * t + y0 : (x - x0) * t + x0; + return isDimX ? [xOrY, val] : [val, xOrY]; + } + + x0 = x; + y0 = y; + break; + + case CMD.C: + x = data[i++]; + y = data[i++]; + x2 = data[i++]; + y2 = data[i++]; + x3 = data[i++]; + y3 = data[i++]; + var nRoot = isDimX ? cubicRootAt(x0, x, x2, x3, xOrY, roots) : cubicRootAt(y0, y, y2, y3, xOrY, roots); + + if (nRoot > 0) { + for (var i_1 = 0; i_1 < nRoot; i_1++) { + var t_1 = roots[i_1]; + + if (t_1 <= 1 && t_1 >= 0) { + var val = isDimX ? cubicAt(y0, y, y2, y3, t_1) : cubicAt(x0, x, x2, x3, t_1); + return isDimX ? [xOrY, val] : [val, xOrY]; + } + } + } + + x0 = x3; + y0 = y3; + break; + } + } + }; + + return ECPolyline; + }(Path); + + var ECPolygonShape = + /** @class */ + function (_super) { + __extends(ECPolygonShape, _super); + + function ECPolygonShape() { + return _super !== null && _super.apply(this, arguments) || this; + } + + return ECPolygonShape; + }(ECPolylineShape); + + var ECPolygon = + /** @class */ + function (_super) { + __extends(ECPolygon, _super); + + function ECPolygon(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'ec-polygon'; + return _this; + } + + ECPolygon.prototype.getDefaultShape = function () { + return new ECPolygonShape(); + }; + + ECPolygon.prototype.buildPath = function (ctx, shape) { + var points = shape.points; + var stackedOnPoints = shape.stackedOnPoints; + var i = 0; + var len = points.length / 2; + var smoothMonotone = shape.smoothMonotone; + + if (shape.connectNulls) { + // Must remove first and last null values avoid draw error in polygon + for (; len > 0; len--) { + if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) { + break; + } + } + + for (; i < len; i++) { + if (!isPointNull(points[i * 2], points[i * 2 + 1])) { + break; + } + } + } + + while (i < len) { + var k = drawSegment(ctx, points, i, len, len, 1, shape.smooth, smoothMonotone, shape.connectNulls); + drawSegment(ctx, stackedOnPoints, i + k - 1, k, len, -1, shape.stackedOnSmooth, smoothMonotone, shape.connectNulls); + i += k + 1; + ctx.closePath(); + } + }; + + return ECPolygon; + }(Path); + + function createGridClipPath(cartesian, hasAnimation, seriesModel, done, during) { + var rect = cartesian.getArea(); + var x = rect.x; + var y = rect.y; + var width = rect.width; + var height = rect.height; + var lineWidth = seriesModel.get(['lineStyle', 'width']) || 2; // Expand the clip path a bit to avoid the border is clipped and looks thinner + + x -= lineWidth / 2; + y -= lineWidth / 2; + width += lineWidth; + height += lineWidth; // fix: https://github.com/apache/incubator-echarts/issues/11369 + + x = Math.floor(x); + width = Math.round(width); + var clipPath = new Rect({ + shape: { + x: x, + y: y, + width: width, + height: height + } + }); + + if (hasAnimation) { + var baseAxis = cartesian.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var isAxisInversed = baseAxis.inverse; + + if (isHorizontal) { + if (isAxisInversed) { + clipPath.shape.x += width; + } + + clipPath.shape.width = 0; + } else { + if (!isAxisInversed) { + clipPath.shape.y += height; + } + + clipPath.shape.height = 0; + } + + var duringCb = isFunction(during) ? function (percent) { + during(percent, clipPath); + } : null; + initProps(clipPath, { + shape: { + width: width, + height: height, + x: x, + y: y + } + }, seriesModel, null, done, duringCb); + } + + return clipPath; + } + + function createPolarClipPath(polar, hasAnimation, seriesModel) { + var sectorArea = polar.getArea(); // Avoid float number rounding error for symbol on the edge of axis extent. + + var r0 = round(sectorArea.r0, 1); + var r = round(sectorArea.r, 1); + var clipPath = new Sector({ + shape: { + cx: round(polar.cx, 1), + cy: round(polar.cy, 1), + r0: r0, + r: r, + startAngle: sectorArea.startAngle, + endAngle: sectorArea.endAngle, + clockwise: sectorArea.clockwise + } + }); + + if (hasAnimation) { + var isRadial = polar.getBaseAxis().dim === 'angle'; + + if (isRadial) { + clipPath.shape.endAngle = sectorArea.startAngle; + } else { + clipPath.shape.r = r0; + } + + initProps(clipPath, { + shape: { + endAngle: sectorArea.endAngle, + r: r + } + }, seriesModel); + } + + return clipPath; + } + + function createClipPath(coordSys, hasAnimation, seriesModel, done, during) { + if (!coordSys) { + return null; + } else if (coordSys.type === 'polar') { + return createPolarClipPath(coordSys, hasAnimation, seriesModel); + } else if (coordSys.type === 'cartesian2d') { + return createGridClipPath(coordSys, hasAnimation, seriesModel, done, during); + } + + return null; + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + function isCoordinateSystemType(coordSys, type) { + return coordSys.type === type; + } + + function isPointsSame(points1, points2) { + if (points1.length !== points2.length) { + return; + } + + for (var i = 0; i < points1.length; i++) { + if (points1[i] !== points2[i]) { + return; + } + } + + return true; + } + + function bboxFromPoints(points) { + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + + for (var i = 0; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + + if (!isNaN(x)) { + minX = Math.min(x, minX); + maxX = Math.max(x, maxX); + } + + if (!isNaN(y)) { + minY = Math.min(y, minY); + maxY = Math.max(y, maxY); + } + } + + return [[minX, minY], [maxX, maxY]]; + } + + function getBoundingDiff(points1, points2) { + var _a = bboxFromPoints(points1), + min1 = _a[0], + max1 = _a[1]; + + var _b = bboxFromPoints(points2), + min2 = _b[0], + max2 = _b[1]; // Get a max value from each corner of two boundings. + + + return Math.max(Math.abs(min1[0] - min2[0]), Math.abs(min1[1] - min2[1]), Math.abs(max1[0] - max2[0]), Math.abs(max1[1] - max2[1])); + } + + function getSmooth(smooth) { + return isNumber(smooth) ? smooth : smooth ? 0.5 : 0; + } + + function getStackedOnPoints(coordSys, data, dataCoordInfo) { + if (!dataCoordInfo.valueDim) { + return []; + } + + var len = data.count(); + var points = createFloat32Array(len * 2); + + for (var idx = 0; idx < len; idx++) { + var pt = getStackedOnPoint(dataCoordInfo, coordSys, data, idx); + points[idx * 2] = pt[0]; + points[idx * 2 + 1] = pt[1]; + } + + return points; + } + + function turnPointsIntoStep(points, coordSys, stepTurnAt, connectNulls) { + var baseAxis = coordSys.getBaseAxis(); + var baseIndex = baseAxis.dim === 'x' || baseAxis.dim === 'radius' ? 0 : 1; + var stepPoints = []; + var i = 0; + var stepPt = []; + var pt = []; + var nextPt = []; + var filteredPoints = []; + + if (connectNulls) { + for (i = 0; i < points.length; i += 2) { + if (!isNaN(points[i]) && !isNaN(points[i + 1])) { + filteredPoints.push(points[i], points[i + 1]); + } + } + + points = filteredPoints; + } + + for (i = 0; i < points.length - 2; i += 2) { + nextPt[0] = points[i + 2]; + nextPt[1] = points[i + 3]; + pt[0] = points[i]; + pt[1] = points[i + 1]; + stepPoints.push(pt[0], pt[1]); + + switch (stepTurnAt) { + case 'end': + stepPt[baseIndex] = nextPt[baseIndex]; + stepPt[1 - baseIndex] = pt[1 - baseIndex]; + stepPoints.push(stepPt[0], stepPt[1]); + break; + + case 'middle': + var middle = (pt[baseIndex] + nextPt[baseIndex]) / 2; + var stepPt2 = []; + stepPt[baseIndex] = stepPt2[baseIndex] = middle; + stepPt[1 - baseIndex] = pt[1 - baseIndex]; + stepPt2[1 - baseIndex] = nextPt[1 - baseIndex]; + stepPoints.push(stepPt[0], stepPt[1]); + stepPoints.push(stepPt2[0], stepPt2[1]); + break; + + default: + // default is start + stepPt[baseIndex] = pt[baseIndex]; + stepPt[1 - baseIndex] = nextPt[1 - baseIndex]; + stepPoints.push(stepPt[0], stepPt[1]); + } + } // Last points + + + stepPoints.push(points[i++], points[i++]); + return stepPoints; + } + /** + * Clip color stops to edge. Avoid creating too large gradients. + * Which may lead to blurry when GPU acceleration is enabled. See #15680 + * + * The stops has been sorted from small to large. + */ + + + function clipColorStops(colorStops, maxSize) { + var newColorStops = []; + var len = colorStops.length; // coord will always < 0 in prevOutOfRangeColorStop. + + var prevOutOfRangeColorStop; + var prevInRangeColorStop; + + function lerpStop(stop0, stop1, clippedCoord) { + var coord0 = stop0.coord; + var p = (clippedCoord - coord0) / (stop1.coord - coord0); + var color = lerp$1(p, [stop0.color, stop1.color]); + return { + coord: clippedCoord, + color: color + }; + } + + for (var i = 0; i < len; i++) { + var stop_1 = colorStops[i]; + var coord = stop_1.coord; + + if (coord < 0) { + prevOutOfRangeColorStop = stop_1; + } else if (coord > maxSize) { + if (prevInRangeColorStop) { + newColorStops.push(lerpStop(prevInRangeColorStop, stop_1, maxSize)); + } else if (prevOutOfRangeColorStop) { + // If there are two stops and coord range is between these two stops + newColorStops.push(lerpStop(prevOutOfRangeColorStop, stop_1, 0), lerpStop(prevOutOfRangeColorStop, stop_1, maxSize)); + } // All following stop will be out of range. So just ignore them. + + + break; + } else { + if (prevOutOfRangeColorStop) { + newColorStops.push(lerpStop(prevOutOfRangeColorStop, stop_1, 0)); // Reset + + prevOutOfRangeColorStop = null; + } + + newColorStops.push(stop_1); + prevInRangeColorStop = stop_1; + } + } + + return newColorStops; + } + + function getVisualGradient(data, coordSys, api) { + var visualMetaList = data.getVisual('visualMeta'); + + if (!visualMetaList || !visualMetaList.length || !data.count()) { + // When data.count() is 0, gradient range can not be calculated. + return; + } + + if (coordSys.type !== 'cartesian2d') { + if ("development" !== 'production') { + console.warn('Visual map on line style is only supported on cartesian2d.'); + } + + return; + } + + var coordDim; + var visualMeta; + + for (var i = visualMetaList.length - 1; i >= 0; i--) { + var dimInfo = data.getDimensionInfo(visualMetaList[i].dimension); + coordDim = dimInfo && dimInfo.coordDim; // Can only be x or y + + if (coordDim === 'x' || coordDim === 'y') { + visualMeta = visualMetaList[i]; + break; + } + } + + if (!visualMeta) { + if ("development" !== 'production') { + console.warn('Visual map on line style only support x or y dimension.'); + } + + return; + } // If the area to be rendered is bigger than area defined by LinearGradient, + // the canvas spec prescribes that the color of the first stop and the last + // stop should be used. But if two stops are added at offset 0, in effect + // browsers use the color of the second stop to render area outside + // LinearGradient. So we can only infinitesimally extend area defined in + // LinearGradient to render `outerColors`. + + + var axis = coordSys.getAxis(coordDim); // dataToCoord mapping may not be linear, but must be monotonic. + + var colorStops = map(visualMeta.stops, function (stop) { + // offset will be calculated later. + return { + coord: axis.toGlobalCoord(axis.dataToCoord(stop.value)), + color: stop.color + }; + }); + var stopLen = colorStops.length; + var outerColors = visualMeta.outerColors.slice(); + + if (stopLen && colorStops[0].coord > colorStops[stopLen - 1].coord) { + colorStops.reverse(); + outerColors.reverse(); + } + + var colorStopsInRange = clipColorStops(colorStops, coordDim === 'x' ? api.getWidth() : api.getHeight()); + var inRangeStopLen = colorStopsInRange.length; + + if (!inRangeStopLen && stopLen) { + // All stops are out of range. All will be the same color. + return colorStops[0].coord < 0 ? outerColors[1] ? outerColors[1] : colorStops[stopLen - 1].color : outerColors[0] ? outerColors[0] : colorStops[0].color; + } + + var tinyExtent = 10; // Arbitrary value: 10px + + var minCoord = colorStopsInRange[0].coord - tinyExtent; + var maxCoord = colorStopsInRange[inRangeStopLen - 1].coord + tinyExtent; + var coordSpan = maxCoord - minCoord; + + if (coordSpan < 1e-3) { + return 'transparent'; + } + + each(colorStopsInRange, function (stop) { + stop.offset = (stop.coord - minCoord) / coordSpan; + }); + colorStopsInRange.push({ + // NOTE: inRangeStopLen may still be 0 if stoplen is zero. + offset: inRangeStopLen ? colorStopsInRange[inRangeStopLen - 1].offset : 0.5, + color: outerColors[1] || 'transparent' + }); + colorStopsInRange.unshift({ + offset: inRangeStopLen ? colorStopsInRange[0].offset : 0.5, + color: outerColors[0] || 'transparent' + }); + var gradient = new LinearGradient(0, 0, 0, 0, colorStopsInRange, true); + gradient[coordDim] = minCoord; + gradient[coordDim + '2'] = maxCoord; + return gradient; + } + + function getIsIgnoreFunc(seriesModel, data, coordSys) { + var showAllSymbol = seriesModel.get('showAllSymbol'); + var isAuto = showAllSymbol === 'auto'; + + if (showAllSymbol && !isAuto) { + return; + } + + var categoryAxis = coordSys.getAxesByScale('ordinal')[0]; + + if (!categoryAxis) { + return; + } // Note that category label interval strategy might bring some weird effect + // in some scenario: users may wonder why some of the symbols are not + // displayed. So we show all symbols as possible as we can. + + + if (isAuto // Simplify the logic, do not determine label overlap here. + && canShowAllSymbolForCategory(categoryAxis, data)) { + return; + } // Otherwise follow the label interval strategy on category axis. + + + var categoryDataDim = data.mapDimension(categoryAxis.dim); + var labelMap = {}; + each(categoryAxis.getViewLabels(), function (labelItem) { + var ordinalNumber = categoryAxis.scale.getRawOrdinalNumber(labelItem.tickValue); + labelMap[ordinalNumber] = 1; + }); + return function (dataIndex) { + return !labelMap.hasOwnProperty(data.get(categoryDataDim, dataIndex)); + }; + } + + function canShowAllSymbolForCategory(categoryAxis, data) { + // In mose cases, line is monotonous on category axis, and the label size + // is close with each other. So we check the symbol size and some of the + // label size alone with the category axis to estimate whether all symbol + // can be shown without overlap. + var axisExtent = categoryAxis.getExtent(); + var availSize = Math.abs(axisExtent[1] - axisExtent[0]) / categoryAxis.scale.count(); + isNaN(availSize) && (availSize = 0); // 0/0 is NaN. + // Sampling some points, max 5. + + var dataLen = data.count(); + var step = Math.max(1, Math.round(dataLen / 5)); + + for (var dataIndex = 0; dataIndex < dataLen; dataIndex += step) { + if (Symbol.getSymbolSize(data, dataIndex // Only for cartesian, where `isHorizontal` exists. + )[categoryAxis.isHorizontal() ? 1 : 0] // Empirical number + * 1.5 > availSize) { + return false; + } + } + + return true; + } + + function isPointNull$1(x, y) { + return isNaN(x) || isNaN(y); + } + + function getLastIndexNotNull(points) { + var len = points.length / 2; + + for (; len > 0; len--) { + if (!isPointNull$1(points[len * 2 - 2], points[len * 2 - 1])) { + break; + } + } + + return len - 1; + } + + function getPointAtIndex(points, idx) { + return [points[idx * 2], points[idx * 2 + 1]]; + } + + function getIndexRange(points, xOrY, dim) { + var len = points.length / 2; + var dimIdx = dim === 'x' ? 0 : 1; + var a; + var b; + var prevIndex = 0; + var nextIndex = -1; + + for (var i = 0; i < len; i++) { + b = points[i * 2 + dimIdx]; + + if (isNaN(b) || isNaN(points[i * 2 + 1 - dimIdx])) { + continue; + } + + if (i === 0) { + a = b; + continue; + } + + if (a <= xOrY && b >= xOrY || a >= xOrY && b <= xOrY) { + nextIndex = i; + break; + } + + prevIndex = i; + a = b; + } + + return { + range: [prevIndex, nextIndex], + t: (xOrY - a) / (b - a) + }; + } + + function anyStateShowEndLabel(seriesModel) { + if (seriesModel.get(['endLabel', 'show'])) { + return true; + } + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + if (seriesModel.get([SPECIAL_STATES[i], 'endLabel', 'show'])) { + return true; + } + } + + return false; + } + + function createLineClipPath(lineView, coordSys, hasAnimation, seriesModel) { + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + var endLabelModel_1 = seriesModel.getModel('endLabel'); + var valueAnimation_1 = endLabelModel_1.get('valueAnimation'); + var data_1 = seriesModel.getData(); + var labelAnimationRecord_1 = { + lastFrameIndex: 0 + }; + var during = anyStateShowEndLabel(seriesModel) ? function (percent, clipRect) { + lineView._endLabelOnDuring(percent, clipRect, data_1, labelAnimationRecord_1, valueAnimation_1, endLabelModel_1, coordSys); + } : null; + var isHorizontal = coordSys.getBaseAxis().isHorizontal(); + var clipPath = createGridClipPath(coordSys, hasAnimation, seriesModel, function () { + var endLabel = lineView._endLabel; + + if (endLabel && hasAnimation) { + if (labelAnimationRecord_1.originalX != null) { + endLabel.attr({ + x: labelAnimationRecord_1.originalX, + y: labelAnimationRecord_1.originalY + }); + } + } + }, during); // Expand clip shape to avoid clipping when line value exceeds axis + + if (!seriesModel.get('clip', true)) { + var rectShape = clipPath.shape; + var expandSize = Math.max(rectShape.width, rectShape.height); + + if (isHorizontal) { + rectShape.y -= expandSize; + rectShape.height += expandSize * 2; + } else { + rectShape.x -= expandSize; + rectShape.width += expandSize * 2; + } + } // Set to the final frame. To make sure label layout is right. + + + if (during) { + during(1, clipPath); + } + + return clipPath; + } else { + if ("development" !== 'production') { + if (seriesModel.get(['endLabel', 'show'])) { + console.warn('endLabel is not supported for lines in polar systems.'); + } + } + + return createPolarClipPath(coordSys, hasAnimation, seriesModel); + } + } + + function getEndLabelStateSpecified(endLabelModel, coordSys) { + var baseAxis = coordSys.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var isBaseInversed = baseAxis.inverse; + var align = isHorizontal ? isBaseInversed ? 'right' : 'left' : 'center'; + var verticalAlign = isHorizontal ? 'middle' : isBaseInversed ? 'top' : 'bottom'; + return { + normal: { + align: endLabelModel.get('align') || align, + verticalAlign: endLabelModel.get('verticalAlign') || verticalAlign + } + }; + } + + var LineView = + /** @class */ + function (_super) { + __extends(LineView, _super); + + function LineView() { + return _super !== null && _super.apply(this, arguments) || this; + } + + LineView.prototype.init = function () { + var lineGroup = new Group(); + var symbolDraw = new SymbolDraw(); + this.group.add(symbolDraw.group); + this._symbolDraw = symbolDraw; + this._lineGroup = lineGroup; + }; + + LineView.prototype.render = function (seriesModel, ecModel, api) { + var _this = this; + + var coordSys = seriesModel.coordinateSystem; + var group = this.group; + var data = seriesModel.getData(); + var lineStyleModel = seriesModel.getModel('lineStyle'); + var areaStyleModel = seriesModel.getModel('areaStyle'); + var points = data.getLayout('points') || []; + var isCoordSysPolar = coordSys.type === 'polar'; + var prevCoordSys = this._coordSys; + var symbolDraw = this._symbolDraw; + var polyline = this._polyline; + var polygon = this._polygon; + var lineGroup = this._lineGroup; + var hasAnimation = seriesModel.get('animation'); + var isAreaChart = !areaStyleModel.isEmpty(); + var valueOrigin = areaStyleModel.get('origin'); + var dataCoordInfo = prepareDataCoordInfo(coordSys, data, valueOrigin); + var stackedOnPoints = isAreaChart && getStackedOnPoints(coordSys, data, dataCoordInfo); + var showSymbol = seriesModel.get('showSymbol'); + var connectNulls = seriesModel.get('connectNulls'); + var isIgnoreFunc = showSymbol && !isCoordSysPolar && getIsIgnoreFunc(seriesModel, data, coordSys); // Remove temporary symbols + + var oldData = this._data; + oldData && oldData.eachItemGraphicEl(function (el, idx) { + if (el.__temp) { + group.remove(el); + oldData.setItemGraphicEl(idx, null); + } + }); // Remove previous created symbols if showSymbol changed to false + + if (!showSymbol) { + symbolDraw.remove(); + } + + group.add(lineGroup); // FIXME step not support polar + + var step = !isCoordSysPolar ? seriesModel.get('step') : false; + var clipShapeForSymbol; + + if (coordSys && coordSys.getArea && seriesModel.get('clip', true)) { + clipShapeForSymbol = coordSys.getArea(); // Avoid float number rounding error for symbol on the edge of axis extent. + // See #7913 and `test/dataZoom-clip.html`. + + if (clipShapeForSymbol.width != null) { + clipShapeForSymbol.x -= 0.1; + clipShapeForSymbol.y -= 0.1; + clipShapeForSymbol.width += 0.2; + clipShapeForSymbol.height += 0.2; + } else if (clipShapeForSymbol.r0) { + clipShapeForSymbol.r0 -= 0.5; + clipShapeForSymbol.r += 0.5; + } + } + + this._clipShapeForSymbol = clipShapeForSymbol; + var visualColor = getVisualGradient(data, coordSys, api) || data.getVisual('style')[data.getVisual('drawType')]; // Initialization animation or coordinate system changed + + if (!(polyline && prevCoordSys.type === coordSys.type && step === this._step)) { + showSymbol && symbolDraw.updateData(data, { + isIgnore: isIgnoreFunc, + clipShape: clipShapeForSymbol, + disableAnimation: true, + getSymbolPoint: function (idx) { + return [points[idx * 2], points[idx * 2 + 1]]; + } + }); + hasAnimation && this._initSymbolLabelAnimation(data, coordSys, clipShapeForSymbol); + + if (step) { + // TODO If stacked series is not step + points = turnPointsIntoStep(points, coordSys, step, connectNulls); + + if (stackedOnPoints) { + stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step, connectNulls); + } + } + + polyline = this._newPolyline(points); + + if (isAreaChart) { + polygon = this._newPolygon(points, stackedOnPoints); + } // If areaStyle is removed + else if (polygon) { + lineGroup.remove(polygon); + polygon = this._polygon = null; + } // NOTE: Must update _endLabel before setClipPath. + + + if (!isCoordSysPolar) { + this._initOrUpdateEndLabel(seriesModel, coordSys, convertToColorString(visualColor)); + } + + lineGroup.setClipPath(createLineClipPath(this, coordSys, true, seriesModel)); + } else { + if (isAreaChart && !polygon) { + // If areaStyle is added + polygon = this._newPolygon(points, stackedOnPoints); + } else if (polygon && !isAreaChart) { + // If areaStyle is removed + lineGroup.remove(polygon); + polygon = this._polygon = null; + } // NOTE: Must update _endLabel before setClipPath. + + + if (!isCoordSysPolar) { + this._initOrUpdateEndLabel(seriesModel, coordSys, convertToColorString(visualColor)); + } // Update clipPath + + + var oldClipPath = lineGroup.getClipPath(); + + if (oldClipPath) { + var newClipPath = createLineClipPath(this, coordSys, false, seriesModel); + initProps(oldClipPath, { + shape: newClipPath.shape + }, seriesModel); + } else { + lineGroup.setClipPath(createLineClipPath(this, coordSys, true, seriesModel)); + } // Always update, or it is wrong in the case turning on legend + // because points are not changed + + + showSymbol && symbolDraw.updateData(data, { + isIgnore: isIgnoreFunc, + clipShape: clipShapeForSymbol, + disableAnimation: true, + getSymbolPoint: function (idx) { + return [points[idx * 2], points[idx * 2 + 1]]; + } + }); // In the case data zoom triggerred refreshing frequently + // Data may not change if line has a category axis. So it should animate nothing + + if (!isPointsSame(this._stackedOnPoints, stackedOnPoints) || !isPointsSame(this._points, points)) { + if (hasAnimation) { + this._doUpdateAnimation(data, stackedOnPoints, coordSys, api, step, valueOrigin, connectNulls); + } else { + // Not do it in update with animation + if (step) { + // TODO If stacked series is not step + points = turnPointsIntoStep(points, coordSys, step, connectNulls); + + if (stackedOnPoints) { + stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step, connectNulls); + } + } + + polyline.setShape({ + points: points + }); + polygon && polygon.setShape({ + points: points, + stackedOnPoints: stackedOnPoints + }); + } + } + } + + var emphasisModel = seriesModel.getModel('emphasis'); + var focus = emphasisModel.get('focus'); + var blurScope = emphasisModel.get('blurScope'); + var emphasisDisabled = emphasisModel.get('disabled'); + polyline.useStyle(defaults( // Use color in lineStyle first + lineStyleModel.getLineStyle(), { + fill: 'none', + stroke: visualColor, + lineJoin: 'bevel' + })); + setStatesStylesFromModel(polyline, seriesModel, 'lineStyle'); + + if (polyline.style.lineWidth > 0 && seriesModel.get(['emphasis', 'lineStyle', 'width']) === 'bolder') { + var emphasisLineStyle = polyline.getState('emphasis').style; + emphasisLineStyle.lineWidth = +polyline.style.lineWidth + 1; + } // Needs seriesIndex for focus + + + getECData(polyline).seriesIndex = seriesModel.seriesIndex; + toggleHoverEmphasis(polyline, focus, blurScope, emphasisDisabled); + var smooth = getSmooth(seriesModel.get('smooth')); + var smoothMonotone = seriesModel.get('smoothMonotone'); + polyline.setShape({ + smooth: smooth, + smoothMonotone: smoothMonotone, + connectNulls: connectNulls + }); + + if (polygon) { + var stackedOnSeries = data.getCalculationInfo('stackedOnSeries'); + var stackedOnSmooth = 0; + polygon.useStyle(defaults(areaStyleModel.getAreaStyle(), { + fill: visualColor, + opacity: 0.7, + lineJoin: 'bevel', + decal: data.getVisual('style').decal + })); + + if (stackedOnSeries) { + stackedOnSmooth = getSmooth(stackedOnSeries.get('smooth')); + } + + polygon.setShape({ + smooth: smooth, + stackedOnSmooth: stackedOnSmooth, + smoothMonotone: smoothMonotone, + connectNulls: connectNulls + }); + setStatesStylesFromModel(polygon, seriesModel, 'areaStyle'); // Needs seriesIndex for focus + + getECData(polygon).seriesIndex = seriesModel.seriesIndex; + toggleHoverEmphasis(polygon, focus, blurScope, emphasisDisabled); + } + + var changePolyState = function (toState) { + _this._changePolyState(toState); + }; + + data.eachItemGraphicEl(function (el) { + // Switch polyline / polygon state if element changed its state. + el && (el.onHoverStateChange = changePolyState); + }); + this._polyline.onHoverStateChange = changePolyState; + this._data = data; // Save the coordinate system for transition animation when data changed + + this._coordSys = coordSys; + this._stackedOnPoints = stackedOnPoints; + this._points = points; + this._step = step; + this._valueOrigin = valueOrigin; + + if (seriesModel.get('triggerLineEvent')) { + this.packEventData(seriesModel, polyline); + polygon && this.packEventData(seriesModel, polygon); + } + }; + + LineView.prototype.packEventData = function (seriesModel, el) { + getECData(el).eventData = { + componentType: 'series', + componentSubType: 'line', + componentIndex: seriesModel.componentIndex, + seriesIndex: seriesModel.seriesIndex, + seriesName: seriesModel.name, + seriesType: 'line' + }; + }; + + LineView.prototype.highlight = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + + this._changePolyState('emphasis'); + + if (!(dataIndex instanceof Array) && dataIndex != null && dataIndex >= 0) { + var points = data.getLayout('points'); + var symbol = data.getItemGraphicEl(dataIndex); + + if (!symbol) { + // Create a temporary symbol if it is not exists + var x = points[dataIndex * 2]; + var y = points[dataIndex * 2 + 1]; + + if (isNaN(x) || isNaN(y)) { + // Null data + return; + } // fix #11360: should't draw symbol outside clipShapeForSymbol + + + if (this._clipShapeForSymbol && !this._clipShapeForSymbol.contain(x, y)) { + return; + } + + var zlevel = seriesModel.get('zlevel'); + var z = seriesModel.get('z'); + symbol = new Symbol(data, dataIndex); + symbol.x = x; + symbol.y = y; + symbol.setZ(zlevel, z); // ensure label text of the temporary symbol is in front of line and area polygon + + var symbolLabel = symbol.getSymbolPath().getTextContent(); + + if (symbolLabel) { + symbolLabel.zlevel = zlevel; + symbolLabel.z = z; + symbolLabel.z2 = this._polyline.z2 + 1; + } + + symbol.__temp = true; + data.setItemGraphicEl(dataIndex, symbol); // Stop scale animation + + symbol.stopSymbolAnimation(true); + this.group.add(symbol); + } + + symbol.highlight(); + } else { + // Highlight whole series + ChartView.prototype.highlight.call(this, seriesModel, ecModel, api, payload); + } + }; + + LineView.prototype.downplay = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + + this._changePolyState('normal'); + + if (dataIndex != null && dataIndex >= 0) { + var symbol = data.getItemGraphicEl(dataIndex); + + if (symbol) { + if (symbol.__temp) { + data.setItemGraphicEl(dataIndex, null); + this.group.remove(symbol); + } else { + symbol.downplay(); + } + } + } else { + // FIXME + // can not downplay completely. + // Downplay whole series + ChartView.prototype.downplay.call(this, seriesModel, ecModel, api, payload); + } + }; + + LineView.prototype._changePolyState = function (toState) { + var polygon = this._polygon; + setStatesFlag(this._polyline, toState); + polygon && setStatesFlag(polygon, toState); + }; + + LineView.prototype._newPolyline = function (points) { + var polyline = this._polyline; // Remove previous created polyline + + if (polyline) { + this._lineGroup.remove(polyline); + } + + polyline = new ECPolyline({ + shape: { + points: points + }, + segmentIgnoreThreshold: 2, + z2: 10 + }); + + this._lineGroup.add(polyline); + + this._polyline = polyline; + return polyline; + }; + + LineView.prototype._newPolygon = function (points, stackedOnPoints) { + var polygon = this._polygon; // Remove previous created polygon + + if (polygon) { + this._lineGroup.remove(polygon); + } + + polygon = new ECPolygon({ + shape: { + points: points, + stackedOnPoints: stackedOnPoints + }, + segmentIgnoreThreshold: 2 + }); + + this._lineGroup.add(polygon); + + this._polygon = polygon; + return polygon; + }; + + LineView.prototype._initSymbolLabelAnimation = function (data, coordSys, clipShape) { + var isHorizontalOrRadial; + var isCoordSysPolar; + var baseAxis = coordSys.getBaseAxis(); + var isAxisInverse = baseAxis.inverse; + + if (coordSys.type === 'cartesian2d') { + isHorizontalOrRadial = baseAxis.isHorizontal(); + isCoordSysPolar = false; + } else if (coordSys.type === 'polar') { + isHorizontalOrRadial = baseAxis.dim === 'angle'; + isCoordSysPolar = true; + } + + var seriesModel = data.hostModel; + var seriesDuration = seriesModel.get('animationDuration'); + + if (isFunction(seriesDuration)) { + seriesDuration = seriesDuration(null); + } + + var seriesDalay = seriesModel.get('animationDelay') || 0; + var seriesDalayValue = isFunction(seriesDalay) ? seriesDalay(null) : seriesDalay; + data.eachItemGraphicEl(function (symbol, idx) { + var el = symbol; + + if (el) { + var point = [symbol.x, symbol.y]; + var start = void 0; + var end = void 0; + var current = void 0; + + if (clipShape) { + if (isCoordSysPolar) { + var polarClip = clipShape; + var coord = coordSys.pointToCoord(point); + + if (isHorizontalOrRadial) { + start = polarClip.startAngle; + end = polarClip.endAngle; + current = -coord[1] / 180 * Math.PI; + } else { + start = polarClip.r0; + end = polarClip.r; + current = coord[0]; + } + } else { + var gridClip = clipShape; + + if (isHorizontalOrRadial) { + start = gridClip.x; + end = gridClip.x + gridClip.width; + current = symbol.x; + } else { + start = gridClip.y + gridClip.height; + end = gridClip.y; + current = symbol.y; + } + } + } + + var ratio = end === start ? 0 : (current - start) / (end - start); + + if (isAxisInverse) { + ratio = 1 - ratio; + } + + var delay = isFunction(seriesDalay) ? seriesDalay(idx) : seriesDuration * ratio + seriesDalayValue; + var symbolPath = el.getSymbolPath(); + var text = symbolPath.getTextContent(); + el.attr({ + scaleX: 0, + scaleY: 0 + }); + el.animateTo({ + scaleX: 1, + scaleY: 1 + }, { + duration: 200, + setToFinal: true, + delay: delay + }); + + if (text) { + text.animateFrom({ + style: { + opacity: 0 + } + }, { + duration: 300, + delay: delay + }); + } + + symbolPath.disableLabelAnimation = true; + } + }); + }; + + LineView.prototype._initOrUpdateEndLabel = function (seriesModel, coordSys, inheritColor) { + var endLabelModel = seriesModel.getModel('endLabel'); + + if (anyStateShowEndLabel(seriesModel)) { + var data_2 = seriesModel.getData(); + var polyline = this._polyline; // series may be filtered. + + var points = data_2.getLayout('points'); + + if (!points) { + polyline.removeTextContent(); + this._endLabel = null; + return; + } + + var endLabel = this._endLabel; + + if (!endLabel) { + endLabel = this._endLabel = new ZRText({ + z2: 200 // should be higher than item symbol + + }); + endLabel.ignoreClip = true; + polyline.setTextContent(this._endLabel); + polyline.disableLabelAnimation = true; + } // Find last non-NaN data to display data + + + var dataIndex = getLastIndexNotNull(points); + + if (dataIndex >= 0) { + setLabelStyle(polyline, getLabelStatesModels(seriesModel, 'endLabel'), { + inheritColor: inheritColor, + labelFetcher: seriesModel, + labelDataIndex: dataIndex, + defaultText: function (dataIndex, opt, interpolatedValue) { + return interpolatedValue != null ? getDefaultInterpolatedLabel(data_2, interpolatedValue) : getDefaultLabel(data_2, dataIndex); + }, + enableTextSetter: true + }, getEndLabelStateSpecified(endLabelModel, coordSys)); + polyline.textConfig.position = null; + } + } else if (this._endLabel) { + this._polyline.removeTextContent(); + + this._endLabel = null; + } + }; + + LineView.prototype._endLabelOnDuring = function (percent, clipRect, data, animationRecord, valueAnimation, endLabelModel, coordSys) { + var endLabel = this._endLabel; + var polyline = this._polyline; + + if (endLabel) { + // NOTE: Don't remove percent < 1. percent === 1 means the first frame during render. + // The label is not prepared at this time. + if (percent < 1 && animationRecord.originalX == null) { + animationRecord.originalX = endLabel.x; + animationRecord.originalY = endLabel.y; + } + + var points = data.getLayout('points'); + var seriesModel = data.hostModel; + var connectNulls = seriesModel.get('connectNulls'); + var precision = endLabelModel.get('precision'); + var distance = endLabelModel.get('distance') || 0; + var baseAxis = coordSys.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var isBaseInversed = baseAxis.inverse; + var clipShape = clipRect.shape; + var xOrY = isBaseInversed ? isHorizontal ? clipShape.x : clipShape.y + clipShape.height : isHorizontal ? clipShape.x + clipShape.width : clipShape.y; + var distanceX = (isHorizontal ? distance : 0) * (isBaseInversed ? -1 : 1); + var distanceY = (isHorizontal ? 0 : -distance) * (isBaseInversed ? -1 : 1); + var dim = isHorizontal ? 'x' : 'y'; + var dataIndexRange = getIndexRange(points, xOrY, dim); + var indices = dataIndexRange.range; + var diff = indices[1] - indices[0]; + var value = void 0; + + if (diff >= 1) { + // diff > 1 && connectNulls, which is on the null data. + if (diff > 1 && !connectNulls) { + var pt = getPointAtIndex(points, indices[0]); + endLabel.attr({ + x: pt[0] + distanceX, + y: pt[1] + distanceY + }); + valueAnimation && (value = seriesModel.getRawValue(indices[0])); + } else { + var pt = polyline.getPointOn(xOrY, dim); + pt && endLabel.attr({ + x: pt[0] + distanceX, + y: pt[1] + distanceY + }); + var startValue = seriesModel.getRawValue(indices[0]); + var endValue = seriesModel.getRawValue(indices[1]); + valueAnimation && (value = interpolateRawValues(data, precision, startValue, endValue, dataIndexRange.t)); + } + + animationRecord.lastFrameIndex = indices[0]; + } else { + // If diff <= 0, which is the range is not found(Include NaN) + // Choose the first point or last point. + var idx = percent === 1 || animationRecord.lastFrameIndex > 0 ? indices[0] : 0; + var pt = getPointAtIndex(points, idx); + valueAnimation && (value = seriesModel.getRawValue(idx)); + endLabel.attr({ + x: pt[0] + distanceX, + y: pt[1] + distanceY + }); + } + + if (valueAnimation) { + labelInner(endLabel).setLabelText(value); + } + } + }; + /** + * @private + */ + // FIXME Two value axis + + + LineView.prototype._doUpdateAnimation = function (data, stackedOnPoints, coordSys, api, step, valueOrigin, connectNulls) { + var polyline = this._polyline; + var polygon = this._polygon; + var seriesModel = data.hostModel; + var diff = lineAnimationDiff(this._data, data, this._stackedOnPoints, stackedOnPoints, this._coordSys, coordSys, this._valueOrigin); + var current = diff.current; + var stackedOnCurrent = diff.stackedOnCurrent; + var next = diff.next; + var stackedOnNext = diff.stackedOnNext; + + if (step) { + // TODO If stacked series is not step + current = turnPointsIntoStep(diff.current, coordSys, step, connectNulls); + stackedOnCurrent = turnPointsIntoStep(diff.stackedOnCurrent, coordSys, step, connectNulls); + next = turnPointsIntoStep(diff.next, coordSys, step, connectNulls); + stackedOnNext = turnPointsIntoStep(diff.stackedOnNext, coordSys, step, connectNulls); + } // Don't apply animation if diff is large. + // For better result and avoid memory explosion problems like + // https://github.com/apache/incubator-echarts/issues/12229 + + + if (getBoundingDiff(current, next) > 3000 || polygon && getBoundingDiff(stackedOnCurrent, stackedOnNext) > 3000) { + polyline.stopAnimation(); + polyline.setShape({ + points: next + }); + + if (polygon) { + polygon.stopAnimation(); + polygon.setShape({ + points: next, + stackedOnPoints: stackedOnNext + }); + } + + return; + } + + polyline.shape.__points = diff.current; + polyline.shape.points = current; + var target = { + shape: { + points: next + } + }; // Also animate the original points. + // If points reference is changed when turning into step line. + + if (diff.current !== current) { + target.shape.__points = diff.next; + } // Stop previous animation. + + + polyline.stopAnimation(); + updateProps(polyline, target, seriesModel); + + if (polygon) { + polygon.setShape({ + // Reuse the points with polyline. + points: current, + stackedOnPoints: stackedOnCurrent + }); + polygon.stopAnimation(); + updateProps(polygon, { + shape: { + stackedOnPoints: stackedOnNext + } + }, seriesModel); // If use attr directly in updateProps. + + if (polyline.shape.points !== polygon.shape.points) { + polygon.shape.points = polyline.shape.points; + } + } + + var updatedDataInfo = []; + var diffStatus = diff.status; + + for (var i = 0; i < diffStatus.length; i++) { + var cmd = diffStatus[i].cmd; + + if (cmd === '=') { + var el = data.getItemGraphicEl(diffStatus[i].idx1); + + if (el) { + updatedDataInfo.push({ + el: el, + ptIdx: i // Index of points + + }); + } + } + } + + if (polyline.animators && polyline.animators.length) { + polyline.animators[0].during(function () { + polygon && polygon.dirtyShape(); + var points = polyline.shape.__points; + + for (var i = 0; i < updatedDataInfo.length; i++) { + var el = updatedDataInfo[i].el; + var offset = updatedDataInfo[i].ptIdx * 2; + el.x = points[offset]; + el.y = points[offset + 1]; + el.markRedraw(); + } + }); + } + }; + + LineView.prototype.remove = function (ecModel) { + var group = this.group; + var oldData = this._data; + + this._lineGroup.removeAll(); + + this._symbolDraw.remove(true); // Remove temporary created elements when highlighting + + + oldData && oldData.eachItemGraphicEl(function (el, idx) { + if (el.__temp) { + group.remove(el); + oldData.setItemGraphicEl(idx, null); + } + }); + this._polyline = this._polygon = this._coordSys = this._points = this._stackedOnPoints = this._endLabel = this._data = null; + }; + + LineView.type = 'line'; + return LineView; + }(ChartView); + + function pointsLayout(seriesType, forceStoreInTypedArray) { + return { + seriesType: seriesType, + plan: createRenderPlanner(), + reset: function (seriesModel) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + var pipelineContext = seriesModel.pipelineContext; + var useTypedArray = forceStoreInTypedArray || pipelineContext.large; + + if (!coordSys) { + return; + } + + var dims = map(coordSys.dimensions, function (dim) { + return data.mapDimension(dim); + }).slice(0, 2); + var dimLen = dims.length; + var stackResultDim = data.getCalculationInfo('stackResultDimension'); + + if (isDimensionStacked(data, dims[0])) { + dims[0] = stackResultDim; + } + + if (isDimensionStacked(data, dims[1])) { + dims[1] = stackResultDim; + } + + var store = data.getStore(); + var dimIdx0 = data.getDimensionIndex(dims[0]); + var dimIdx1 = data.getDimensionIndex(dims[1]); + return dimLen && { + progress: function (params, data) { + var segCount = params.end - params.start; + var points = useTypedArray && createFloat32Array(segCount * dimLen); + var tmpIn = []; + var tmpOut = []; + + for (var i = params.start, offset = 0; i < params.end; i++) { + var point = void 0; + + if (dimLen === 1) { + var x = store.get(dimIdx0, i); // NOTE: Make sure the second parameter is null to use default strategy. + + point = coordSys.dataToPoint(x, null, tmpOut); + } else { + tmpIn[0] = store.get(dimIdx0, i); + tmpIn[1] = store.get(dimIdx1, i); // Let coordinate system to handle the NaN data. + + point = coordSys.dataToPoint(tmpIn, null, tmpOut); + } + + if (useTypedArray) { + points[offset++] = point[0]; + points[offset++] = point[1]; + } else { + data.setItemLayout(i, point.slice()); + } + } + + useTypedArray && data.setLayout('points', points); + } + }; + } + }; + } + + var samplers = { + average: function (frame) { + var sum = 0; + var count = 0; + + for (var i = 0; i < frame.length; i++) { + if (!isNaN(frame[i])) { + sum += frame[i]; + count++; + } + } // Return NaN if count is 0 + + + return count === 0 ? NaN : sum / count; + }, + sum: function (frame) { + var sum = 0; + + for (var i = 0; i < frame.length; i++) { + // Ignore NaN + sum += frame[i] || 0; + } + + return sum; + }, + max: function (frame) { + var max = -Infinity; + + for (var i = 0; i < frame.length; i++) { + frame[i] > max && (max = frame[i]); + } // NaN will cause illegal axis extent. + + + return isFinite(max) ? max : NaN; + }, + min: function (frame) { + var min = Infinity; + + for (var i = 0; i < frame.length; i++) { + frame[i] < min && (min = frame[i]); + } // NaN will cause illegal axis extent. + + + return isFinite(min) ? min : NaN; + }, + // TODO + // Median + nearest: function (frame) { + return frame[0]; + } + }; + + var indexSampler = function (frame) { + return Math.round(frame.length / 2); + }; + + function dataSample(seriesType) { + return { + seriesType: seriesType, + // FIXME:TS never used, so comment it + // modifyOutputEnd: true, + reset: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var sampling = seriesModel.get('sampling'); + var coordSys = seriesModel.coordinateSystem; + var count = data.count(); // Only cartesian2d support down sampling. Disable it when there is few data. + + if (count > 10 && coordSys.type === 'cartesian2d' && sampling) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var extent = baseAxis.getExtent(); + var dpr = api.getDevicePixelRatio(); // Coordinste system has been resized + + var size = Math.abs(extent[1] - extent[0]) * (dpr || 1); + var rate = Math.round(count / size); + + if (isFinite(rate) && rate > 1) { + if (sampling === 'lttb') { + seriesModel.setData(data.lttbDownSample(data.mapDimension(valueAxis.dim), 1 / rate)); + } + + var sampler = void 0; + + if (isString(sampling)) { + sampler = samplers[sampling]; + } else if (isFunction(sampling)) { + sampler = sampling; + } + + if (sampler) { + // Only support sample the first dim mapped from value axis. + seriesModel.setData(data.downSample(data.mapDimension(valueAxis.dim), 1 / rate, sampler, indexSampler)); + } + } + } + } + }; + } + + function install$2(registers) { + registers.registerChartView(LineView); + registers.registerSeriesModel(LineSeriesModel); + registers.registerLayout(pointsLayout('line', true)); + registers.registerVisual({ + seriesType: 'line', + reset: function (seriesModel) { + var data = seriesModel.getData(); // Visual coding for legend + + var lineStyle = seriesModel.getModel('lineStyle').getLineStyle(); + + if (lineStyle && !lineStyle.stroke) { + // Fill in visual should be palette color if + // has color callback + lineStyle.stroke = data.getVisual('style').fill; + } + + data.setVisual('legendLineStyle', lineStyle); + } + }); // Down sample after filter + + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, dataSample('line')); + } + + var BaseBarSeriesModel = + /** @class */ + function (_super) { + __extends(BaseBarSeriesModel, _super); + + function BaseBarSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BaseBarSeriesModel.type; + return _this; + } + + BaseBarSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this, { + useEncodeDefaulter: true + }); + }; + + BaseBarSeriesModel.prototype.getMarkerPosition = function (value) { + var coordSys = this.coordinateSystem; + + if (coordSys && coordSys.clampData) { + // PENDING if clamp ? + var pt = coordSys.dataToPoint(coordSys.clampData(value)); + var data = this.getData(); + var offset = data.getLayout('offset'); + var size = data.getLayout('size'); + var offsetIndex = coordSys.getBaseAxis().isHorizontal() ? 0 : 1; + pt[offsetIndex] += offset + size / 2; + return pt; + } + + return [NaN, NaN]; + }; + + BaseBarSeriesModel.type = 'series.__base_bar__'; + BaseBarSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + // stack: null + // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + barMinHeight: 0, + barMinAngle: 0, + // cursor: null, + large: false, + largeThreshold: 400, + progressive: 3e3, + progressiveChunkMode: 'mod' + }; + return BaseBarSeriesModel; + }(SeriesModel); + + SeriesModel.registerClass(BaseBarSeriesModel); + + var BarSeriesModel = + /** @class */ + function (_super) { + __extends(BarSeriesModel, _super); + + function BarSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BarSeriesModel.type; + return _this; + } + + BarSeriesModel.prototype.getInitialData = function () { + return createSeriesData(null, this, { + useEncodeDefaulter: true, + createInvertedIndices: !!this.get('realtimeSort', true) || null + }); + }; + /** + * @override + */ + + + BarSeriesModel.prototype.getProgressive = function () { + // Do not support progressive in normal mode. + return this.get('large') ? this.get('progressive') : false; + }; + /** + * @override + */ + + + BarSeriesModel.prototype.getProgressiveThreshold = function () { + // Do not support progressive in normal mode. + var progressiveThreshold = this.get('progressiveThreshold'); + var largeThreshold = this.get('largeThreshold'); + + if (largeThreshold > progressiveThreshold) { + progressiveThreshold = largeThreshold; + } + + return progressiveThreshold; + }; + + BarSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) { + return selectors.rect(data.getItemLayout(dataIndex)); + }; + + BarSeriesModel.type = 'series.bar'; + BarSeriesModel.dependencies = ['grid', 'polar']; + BarSeriesModel.defaultOption = inheritDefaultOption(BaseBarSeriesModel.defaultOption, { + // If clipped + // Only available on cartesian2d + clip: true, + roundCap: false, + showBackground: false, + backgroundStyle: { + color: 'rgba(180, 180, 180, 0.2)', + borderColor: null, + borderWidth: 0, + borderType: 'solid', + borderRadius: 0, + shadowBlur: 0, + shadowColor: null, + shadowOffsetX: 0, + shadowOffsetY: 0, + opacity: 1 + }, + select: { + itemStyle: { + borderColor: '#212121' + } + }, + realtimeSort: false + }); + return BarSeriesModel; + }(BaseBarSeriesModel); + + /** + * Sausage: similar to sector, but have half circle on both sides + */ + + var SausageShape = + /** @class */ + function () { + function SausageShape() { + this.cx = 0; + this.cy = 0; + this.r0 = 0; + this.r = 0; + this.startAngle = 0; + this.endAngle = Math.PI * 2; + this.clockwise = true; + } + + return SausageShape; + }(); + + var SausagePath = + /** @class */ + function (_super) { + __extends(SausagePath, _super); + + function SausagePath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'sausage'; + return _this; + } + + SausagePath.prototype.getDefaultShape = function () { + return new SausageShape(); + }; + + SausagePath.prototype.buildPath = function (ctx, shape) { + var cx = shape.cx; + var cy = shape.cy; + var r0 = Math.max(shape.r0 || 0, 0); + var r = Math.max(shape.r, 0); + var dr = (r - r0) * 0.5; + var rCenter = r0 + dr; + var startAngle = shape.startAngle; + var endAngle = shape.endAngle; + var clockwise = shape.clockwise; + var PI2 = Math.PI * 2; + var lessThanCircle = clockwise ? endAngle - startAngle < PI2 : startAngle - endAngle < PI2; + + if (!lessThanCircle) { + // Normalize angles + startAngle = endAngle - (clockwise ? PI2 : -PI2); + } + + var unitStartX = Math.cos(startAngle); + var unitStartY = Math.sin(startAngle); + var unitEndX = Math.cos(endAngle); + var unitEndY = Math.sin(endAngle); + + if (lessThanCircle) { + ctx.moveTo(unitStartX * r0 + cx, unitStartY * r0 + cy); + ctx.arc(unitStartX * rCenter + cx, unitStartY * rCenter + cy, dr, -Math.PI + startAngle, startAngle, !clockwise); + } else { + ctx.moveTo(unitStartX * r + cx, unitStartY * r + cy); + } + + ctx.arc(cx, cy, r, startAngle, endAngle, !clockwise); + ctx.arc(unitEndX * rCenter + cx, unitEndY * rCenter + cy, dr, endAngle - Math.PI * 2, endAngle - Math.PI, !clockwise); + + if (r0 !== 0) { + ctx.arc(cx, cy, r0, endAngle, startAngle, clockwise); + } // ctx.closePath(); + + }; + + return SausagePath; + }(Path); + + function createSectorCalculateTextPosition(positionMapping, opts) { + opts = opts || {}; + var isRoundCap = opts.isRoundCap; + return function (out, opts, boundingRect) { + var textPosition = opts.position; + + if (!textPosition || textPosition instanceof Array) { + return calculateTextPosition(out, opts, boundingRect); + } + + var mappedSectorPosition = positionMapping(textPosition); + var distance = opts.distance != null ? opts.distance : 5; + var sector = this.shape; + var cx = sector.cx; + var cy = sector.cy; + var r = sector.r; + var r0 = sector.r0; + var middleR = (r + r0) / 2; + var startAngle = sector.startAngle; + var endAngle = sector.endAngle; + var middleAngle = (startAngle + endAngle) / 2; + var extraDist = isRoundCap ? Math.abs(r - r0) / 2 : 0; + var mathCos = Math.cos; + var mathSin = Math.sin; // base position: top-left + + var x = cx + r * mathCos(startAngle); + var y = cy + r * mathSin(startAngle); + var textAlign = 'left'; + var textVerticalAlign = 'top'; + + switch (mappedSectorPosition) { + case 'startArc': + x = cx + (r0 - distance) * mathCos(middleAngle); + y = cy + (r0 - distance) * mathSin(middleAngle); + textAlign = 'center'; + textVerticalAlign = 'top'; + break; + + case 'insideStartArc': + x = cx + (r0 + distance) * mathCos(middleAngle); + y = cy + (r0 + distance) * mathSin(middleAngle); + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + + case 'startAngle': + x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, distance + extraDist, false); + y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, distance + extraDist, false); + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + + case 'insideStartAngle': + x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, -distance + extraDist, false); + y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, -distance + extraDist, false); + textAlign = 'left'; + textVerticalAlign = 'middle'; + break; + + case 'middle': + x = cx + middleR * mathCos(middleAngle); + y = cy + middleR * mathSin(middleAngle); + textAlign = 'center'; + textVerticalAlign = 'middle'; + break; + + case 'endArc': + x = cx + (r + distance) * mathCos(middleAngle); + y = cy + (r + distance) * mathSin(middleAngle); + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + + case 'insideEndArc': + x = cx + (r - distance) * mathCos(middleAngle); + y = cy + (r - distance) * mathSin(middleAngle); + textAlign = 'center'; + textVerticalAlign = 'top'; + break; + + case 'endAngle': + x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, distance + extraDist, true); + y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, distance + extraDist, true); + textAlign = 'left'; + textVerticalAlign = 'middle'; + break; + + case 'insideEndAngle': + x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, -distance + extraDist, true); + y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, -distance + extraDist, true); + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + + default: + return calculateTextPosition(out, opts, boundingRect); + } + + out = out || {}; + out.x = x; + out.y = y; + out.align = textAlign; + out.verticalAlign = textVerticalAlign; + return out; + }; + } + function setSectorTextRotation(sector, textPosition, positionMapping, rotateType) { + if (isNumber(rotateType)) { + // user-set rotation + sector.setTextConfig({ + rotation: rotateType + }); + return; + } else if (isArray(textPosition)) { + // user-set position, use 0 as auto rotation + sector.setTextConfig({ + rotation: 0 + }); + return; + } + + var shape = sector.shape; + var startAngle = shape.clockwise ? shape.startAngle : shape.endAngle; + var endAngle = shape.clockwise ? shape.endAngle : shape.startAngle; + var middleAngle = (startAngle + endAngle) / 2; + var anchorAngle; + var mappedSectorPosition = positionMapping(textPosition); + + switch (mappedSectorPosition) { + case 'startArc': + case 'insideStartArc': + case 'middle': + case 'insideEndArc': + case 'endArc': + anchorAngle = middleAngle; + break; + + case 'startAngle': + case 'insideStartAngle': + anchorAngle = startAngle; + break; + + case 'endAngle': + case 'insideEndAngle': + anchorAngle = endAngle; + break; + + default: + sector.setTextConfig({ + rotation: 0 + }); + return; + } + + var rotate = Math.PI * 1.5 - anchorAngle; + /** + * TODO: labels with rotate > Math.PI / 2 should be rotate another + * half round flipped to increase readability. However, only middle + * position supports this for now, because in other positions, the + * anchor point is not at the center of the text, so the positions + * after rotating is not as expected. + */ + + if (mappedSectorPosition === 'middle' && rotate > Math.PI / 2 && rotate < Math.PI * 1.5) { + rotate -= Math.PI; + } + + sector.setTextConfig({ + rotation: rotate + }); + } + + function adjustAngleDistanceX(angle, distance, isEnd) { + return distance * Math.sin(angle) * (isEnd ? -1 : 1); + } + + function adjustAngleDistanceY(angle, distance, isEnd) { + return distance * Math.cos(angle) * (isEnd ? 1 : -1); + } + + var mathMax$6 = Math.max; + var mathMin$6 = Math.min; + + function getClipArea(coord, data) { + var coordSysClipArea = coord.getArea && coord.getArea(); + + if (isCoordinateSystemType(coord, 'cartesian2d')) { + var baseAxis = coord.getBaseAxis(); // When boundaryGap is false or using time axis. bar may exceed the grid. + // We should not clip this part. + // See test/bar2.html + + if (baseAxis.type !== 'category' || !baseAxis.onBand) { + var expandWidth = data.getLayout('bandWidth'); + + if (baseAxis.isHorizontal()) { + coordSysClipArea.x -= expandWidth; + coordSysClipArea.width += expandWidth * 2; + } else { + coordSysClipArea.y -= expandWidth; + coordSysClipArea.height += expandWidth * 2; + } + } + } + + return coordSysClipArea; + } + + var BarView = + /** @class */ + function (_super) { + __extends(BarView, _super); + + function BarView() { + var _this = _super.call(this) || this; + + _this.type = BarView.type; + _this._isFirstFrame = true; + return _this; + } + + BarView.prototype.render = function (seriesModel, ecModel, api, payload) { + this._model = seriesModel; + + this._removeOnRenderedListener(api); + + this._updateDrawMode(seriesModel); + + var coordinateSystemType = seriesModel.get('coordinateSystem'); + + if (coordinateSystemType === 'cartesian2d' || coordinateSystemType === 'polar') { + // Clear previously rendered progressive elements. + this._progressiveEls = null; + this._isLargeDraw ? this._renderLarge(seriesModel, ecModel, api) : this._renderNormal(seriesModel, ecModel, api, payload); + } else if ("development" !== 'production') { + warn('Only cartesian2d and polar supported for bar.'); + } + }; + + BarView.prototype.incrementalPrepareRender = function (seriesModel) { + this._clear(); + + this._updateDrawMode(seriesModel); // incremental also need to clip, otherwise might be overlow. + // But must not set clip in each frame, otherwise all of the children will be marked redraw. + + + this._updateLargeClip(seriesModel); + }; + + BarView.prototype.incrementalRender = function (params, seriesModel) { + // Reset + this._progressiveEls = []; // Do not support progressive in normal mode. + + this._incrementalRenderLarge(params, seriesModel); + }; + + BarView.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + BarView.prototype._updateDrawMode = function (seriesModel) { + var isLargeDraw = seriesModel.pipelineContext.large; + + if (this._isLargeDraw == null || isLargeDraw !== this._isLargeDraw) { + this._isLargeDraw = isLargeDraw; + + this._clear(); + } + }; + + BarView.prototype._renderNormal = function (seriesModel, ecModel, api, payload) { + var group = this.group; + var data = seriesModel.getData(); + var oldData = this._data; + var coord = seriesModel.coordinateSystem; + var baseAxis = coord.getBaseAxis(); + var isHorizontalOrRadial; + + if (coord.type === 'cartesian2d') { + isHorizontalOrRadial = baseAxis.isHorizontal(); + } else if (coord.type === 'polar') { + isHorizontalOrRadial = baseAxis.dim === 'angle'; + } + + var animationModel = seriesModel.isAnimationEnabled() ? seriesModel : null; + var realtimeSortCfg = shouldRealtimeSort(seriesModel, coord); + + if (realtimeSortCfg) { + this._enableRealtimeSort(realtimeSortCfg, data, api); + } + + var needsClip = seriesModel.get('clip', true) || realtimeSortCfg; + var coordSysClipArea = getClipArea(coord, data); // If there is clipPath created in large mode. Remove it. + + group.removeClipPath(); // We don't use clipPath in normal mode because we needs a perfect animation + // And don't want the label are clipped. + + var roundCap = seriesModel.get('roundCap', true); + var drawBackground = seriesModel.get('showBackground', true); + var backgroundModel = seriesModel.getModel('backgroundStyle'); + var barBorderRadius = backgroundModel.get('borderRadius') || 0; + var bgEls = []; + var oldBgEls = this._backgroundEls; + var isInitSort = payload && payload.isInitSort; + var isChangeOrder = payload && payload.type === 'changeAxisOrder'; + + function createBackground(dataIndex) { + var bgLayout = getLayout[coord.type](data, dataIndex); + var bgEl = createBackgroundEl(coord, isHorizontalOrRadial, bgLayout); + bgEl.useStyle(backgroundModel.getItemStyle()); // Only cartesian2d support borderRadius. + + if (coord.type === 'cartesian2d') { + bgEl.setShape('r', barBorderRadius); + } + + bgEls[dataIndex] = bgEl; + return bgEl; + } + data.diff(oldData).add(function (dataIndex) { + var itemModel = data.getItemModel(dataIndex); + var layout = getLayout[coord.type](data, dataIndex, itemModel); + + if (drawBackground) { + createBackground(dataIndex); + } // If dataZoom in filteMode: 'empty', the baseValue can be set as NaN in "axisProxy". + + + if (!data.hasValue(dataIndex) || !isValidLayout[coord.type](layout)) { + return; + } + + var isClipped = false; + + if (needsClip) { + // Clip will modify the layout params. + // And return a boolean to determine if the shape are fully clipped. + isClipped = clip[coord.type](coordSysClipArea, layout); + } + + var el = elementCreator[coord.type](seriesModel, data, dataIndex, layout, isHorizontalOrRadial, animationModel, baseAxis.model, false, roundCap); + + if (realtimeSortCfg) { + /** + * Force label animation because even if the element is + * ignored because it's clipped, it may not be clipped after + * changing order. Then, if not using forceLabelAnimation, + * the label animation was never started, in which case, + * the label will be the final value and doesn't have label + * animation. + */ + el.forceLabelAnimation = true; + } + + updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, coord.type === 'polar'); + + if (isInitSort) { + el.attr({ + shape: layout + }); + } else if (realtimeSortCfg) { + updateRealtimeAnimation(realtimeSortCfg, animationModel, el, layout, dataIndex, isHorizontalOrRadial, false, false); + } else { + initProps(el, { + shape: layout + }, seriesModel, dataIndex); + } + + data.setItemGraphicEl(dataIndex, el); + group.add(el); + el.ignore = isClipped; + }).update(function (newIndex, oldIndex) { + var itemModel = data.getItemModel(newIndex); + var layout = getLayout[coord.type](data, newIndex, itemModel); + + if (drawBackground) { + var bgEl = void 0; + + if (oldBgEls.length === 0) { + bgEl = createBackground(oldIndex); + } else { + bgEl = oldBgEls[oldIndex]; + bgEl.useStyle(backgroundModel.getItemStyle()); // Only cartesian2d support borderRadius. + + if (coord.type === 'cartesian2d') { + bgEl.setShape('r', barBorderRadius); + } + + bgEls[newIndex] = bgEl; + } + + var bgLayout = getLayout[coord.type](data, newIndex); + var shape = createBackgroundShape(isHorizontalOrRadial, bgLayout, coord); + updateProps(bgEl, { + shape: shape + }, animationModel, newIndex); + } + + var el = oldData.getItemGraphicEl(oldIndex); + + if (!data.hasValue(newIndex) || !isValidLayout[coord.type](layout)) { + group.remove(el); + return; + } + + var isClipped = false; + + if (needsClip) { + isClipped = clip[coord.type](coordSysClipArea, layout); + + if (isClipped) { + group.remove(el); + } + } + + if (!el) { + el = elementCreator[coord.type](seriesModel, data, newIndex, layout, isHorizontalOrRadial, animationModel, baseAxis.model, !!el, roundCap); + } else { + saveOldStyle(el); + } + + if (realtimeSortCfg) { + el.forceLabelAnimation = true; + } + + if (isChangeOrder) { + var textEl = el.getTextContent(); + + if (textEl) { + var labelInnerStore = labelInner(textEl); + + if (labelInnerStore.prevValue != null) { + /** + * Set preValue to be value so that no new label + * should be started, otherwise, it will take a full + * `animationDurationUpdate` time to finish the + * animation, which is not expected. + */ + labelInnerStore.prevValue = labelInnerStore.value; + } + } + } // Not change anything if only order changed. + // Especially not change label. + else { + updateStyle(el, data, newIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, coord.type === 'polar'); + } + + if (isInitSort) { + el.attr({ + shape: layout + }); + } else if (realtimeSortCfg) { + updateRealtimeAnimation(realtimeSortCfg, animationModel, el, layout, newIndex, isHorizontalOrRadial, true, isChangeOrder); + } else { + updateProps(el, { + shape: layout + }, seriesModel, newIndex, null); + } + + data.setItemGraphicEl(newIndex, el); + el.ignore = isClipped; + group.add(el); + }).remove(function (dataIndex) { + var el = oldData.getItemGraphicEl(dataIndex); + el && removeElementWithFadeOut(el, seriesModel, dataIndex); + }).execute(); + var bgGroup = this._backgroundGroup || (this._backgroundGroup = new Group()); + bgGroup.removeAll(); + + for (var i = 0; i < bgEls.length; ++i) { + bgGroup.add(bgEls[i]); + } + + group.add(bgGroup); + this._backgroundEls = bgEls; + this._data = data; + }; + + BarView.prototype._renderLarge = function (seriesModel, ecModel, api) { + this._clear(); + + createLarge(seriesModel, this.group); + + this._updateLargeClip(seriesModel); + }; + + BarView.prototype._incrementalRenderLarge = function (params, seriesModel) { + this._removeBackground(); + + createLarge(seriesModel, this.group, this._progressiveEls, true); + }; + + BarView.prototype._updateLargeClip = function (seriesModel) { + // Use clipPath in large mode. + var clipPath = seriesModel.get('clip', true) && createClipPath(seriesModel.coordinateSystem, false, seriesModel); + var group = this.group; + + if (clipPath) { + group.setClipPath(clipPath); + } else { + group.removeClipPath(); + } + }; + + BarView.prototype._enableRealtimeSort = function (realtimeSortCfg, data, api) { + var _this = this; // If no data in the first frame, wait for data to initSort + + + if (!data.count()) { + return; + } + + var baseAxis = realtimeSortCfg.baseAxis; + + if (this._isFirstFrame) { + this._dispatchInitSort(data, realtimeSortCfg, api); + + this._isFirstFrame = false; + } else { + var orderMapping_1 = function (idx) { + var el = data.getItemGraphicEl(idx); + var shape = el && el.shape; + return shape && // The result should be consistent with the initial sort by data value. + // Do not support the case that both positive and negative exist. + Math.abs(baseAxis.isHorizontal() ? shape.height : shape.width) // If data is NaN, shape.xxx may be NaN, so use || 0 here in case + || 0; + }; + + this._onRendered = function () { + _this._updateSortWithinSameData(data, orderMapping_1, baseAxis, api); + }; + + api.getZr().on('rendered', this._onRendered); + } + }; + + BarView.prototype._dataSort = function (data, baseAxis, orderMapping) { + var info = []; + data.each(data.mapDimension(baseAxis.dim), function (ordinalNumber, dataIdx) { + var mappedValue = orderMapping(dataIdx); + mappedValue = mappedValue == null ? NaN : mappedValue; + info.push({ + dataIndex: dataIdx, + mappedValue: mappedValue, + ordinalNumber: ordinalNumber + }); + }); + info.sort(function (a, b) { + // If NaN, it will be treated as min val. + return b.mappedValue - a.mappedValue; + }); + return { + ordinalNumbers: map(info, function (item) { + return item.ordinalNumber; + }) + }; + }; + + BarView.prototype._isOrderChangedWithinSameData = function (data, orderMapping, baseAxis) { + var scale = baseAxis.scale; + var ordinalDataDim = data.mapDimension(baseAxis.dim); + var lastValue = Number.MAX_VALUE; + + for (var tickNum = 0, len = scale.getOrdinalMeta().categories.length; tickNum < len; ++tickNum) { + var rawIdx = data.rawIndexOf(ordinalDataDim, scale.getRawOrdinalNumber(tickNum)); + var value = rawIdx < 0 // If some tick have no bar, the tick will be treated as min. + ? Number.MIN_VALUE // PENDING: if dataZoom on baseAxis exits, is it a performance issue? + : orderMapping(data.indexOfRawIndex(rawIdx)); + + if (value > lastValue) { + return true; + } + + lastValue = value; + } + + return false; + }; + /* + * Consider the case when A and B changed order, whose representing + * bars are both out of sight, we don't wish to trigger reorder action + * as long as the order in the view doesn't change. + */ + + + BarView.prototype._isOrderDifferentInView = function (orderInfo, baseAxis) { + var scale = baseAxis.scale; + var extent = scale.getExtent(); + var tickNum = Math.max(0, extent[0]); + var tickMax = Math.min(extent[1], scale.getOrdinalMeta().categories.length - 1); + + for (; tickNum <= tickMax; ++tickNum) { + if (orderInfo.ordinalNumbers[tickNum] !== scale.getRawOrdinalNumber(tickNum)) { + return true; + } + } + }; + + BarView.prototype._updateSortWithinSameData = function (data, orderMapping, baseAxis, api) { + if (!this._isOrderChangedWithinSameData(data, orderMapping, baseAxis)) { + return; + } + + var sortInfo = this._dataSort(data, baseAxis, orderMapping); + + if (this._isOrderDifferentInView(sortInfo, baseAxis)) { + this._removeOnRenderedListener(api); + + api.dispatchAction({ + type: 'changeAxisOrder', + componentType: baseAxis.dim + 'Axis', + axisId: baseAxis.index, + sortInfo: sortInfo + }); + } + }; + + BarView.prototype._dispatchInitSort = function (data, realtimeSortCfg, api) { + var baseAxis = realtimeSortCfg.baseAxis; + + var sortResult = this._dataSort(data, baseAxis, function (dataIdx) { + return data.get(data.mapDimension(realtimeSortCfg.otherAxis.dim), dataIdx); + }); + + api.dispatchAction({ + type: 'changeAxisOrder', + componentType: baseAxis.dim + 'Axis', + isInitSort: true, + axisId: baseAxis.index, + sortInfo: sortResult + }); + }; + + BarView.prototype.remove = function (ecModel, api) { + this._clear(this._model); + + this._removeOnRenderedListener(api); + }; + + BarView.prototype.dispose = function (ecModel, api) { + this._removeOnRenderedListener(api); + }; + + BarView.prototype._removeOnRenderedListener = function (api) { + if (this._onRendered) { + api.getZr().off('rendered', this._onRendered); + this._onRendered = null; + } + }; + + BarView.prototype._clear = function (model) { + var group = this.group; + var data = this._data; + + if (model && model.isAnimationEnabled() && data && !this._isLargeDraw) { + this._removeBackground(); + + this._backgroundEls = []; + data.eachItemGraphicEl(function (el) { + removeElementWithFadeOut(el, model, getECData(el).dataIndex); + }); + } else { + group.removeAll(); + } + + this._data = null; + this._isFirstFrame = true; + }; + + BarView.prototype._removeBackground = function () { + this.group.remove(this._backgroundGroup); + this._backgroundGroup = null; + }; + + BarView.type = 'bar'; + return BarView; + }(ChartView); + + var clip = { + cartesian2d: function (coordSysBoundingRect, layout) { + var signWidth = layout.width < 0 ? -1 : 1; + var signHeight = layout.height < 0 ? -1 : 1; // Needs positive width and height + + if (signWidth < 0) { + layout.x += layout.width; + layout.width = -layout.width; + } + + if (signHeight < 0) { + layout.y += layout.height; + layout.height = -layout.height; + } + + var coordSysX2 = coordSysBoundingRect.x + coordSysBoundingRect.width; + var coordSysY2 = coordSysBoundingRect.y + coordSysBoundingRect.height; + var x = mathMax$6(layout.x, coordSysBoundingRect.x); + var x2 = mathMin$6(layout.x + layout.width, coordSysX2); + var y = mathMax$6(layout.y, coordSysBoundingRect.y); + var y2 = mathMin$6(layout.y + layout.height, coordSysY2); + var xClipped = x2 < x; + var yClipped = y2 < y; // When xClipped or yClipped, the element will be marked as `ignore`. + // But we should also place the element at the edge of the coord sys bounding rect. + // Beause if data changed and the bar show again, its transition animaiton + // will begin at this place. + + layout.x = xClipped && x > coordSysX2 ? x2 : x; + layout.y = yClipped && y > coordSysY2 ? y2 : y; + layout.width = xClipped ? 0 : x2 - x; + layout.height = yClipped ? 0 : y2 - y; // Reverse back + + if (signWidth < 0) { + layout.x += layout.width; + layout.width = -layout.width; + } + + if (signHeight < 0) { + layout.y += layout.height; + layout.height = -layout.height; + } + + return xClipped || yClipped; + }, + polar: function (coordSysClipArea, layout) { + var signR = layout.r0 <= layout.r ? 1 : -1; // Make sure r is larger than r0 + + if (signR < 0) { + var tmp = layout.r; + layout.r = layout.r0; + layout.r0 = tmp; + } + + var r = mathMin$6(layout.r, coordSysClipArea.r); + var r0 = mathMax$6(layout.r0, coordSysClipArea.r0); + layout.r = r; + layout.r0 = r0; + var clipped = r - r0 < 0; // Reverse back + + if (signR < 0) { + var tmp = layout.r; + layout.r = layout.r0; + layout.r0 = tmp; + } + + return clipped; + } + }; + var elementCreator = { + cartesian2d: function (seriesModel, data, newIndex, layout, isHorizontal, animationModel, axisModel, isUpdate, roundCap) { + var rect = new Rect({ + shape: extend({}, layout), + z2: 1 + }); + rect.__dataIndex = newIndex; + rect.name = 'item'; + + if (animationModel) { + var rectShape = rect.shape; + var animateProperty = isHorizontal ? 'height' : 'width'; + rectShape[animateProperty] = 0; + } + + return rect; + }, + polar: function (seriesModel, data, newIndex, layout, isRadial, animationModel, axisModel, isUpdate, roundCap) { + var ShapeClass = !isRadial && roundCap ? SausagePath : Sector; + var sector = new ShapeClass({ + shape: layout, + z2: 1 + }); + sector.name = 'item'; + var positionMap = createPolarPositionMapping(isRadial); + sector.calculateTextPosition = createSectorCalculateTextPosition(positionMap, { + isRoundCap: ShapeClass === SausagePath + }); // Animation + + if (animationModel) { + var sectorShape = sector.shape; + var animateProperty = isRadial ? 'r' : 'endAngle'; + var animateTarget = {}; + sectorShape[animateProperty] = isRadial ? 0 : layout.startAngle; + animateTarget[animateProperty] = layout[animateProperty]; + (isUpdate ? updateProps : initProps)(sector, { + shape: animateTarget // __value: typeof dataValue === 'string' ? parseInt(dataValue, 10) : dataValue + + }, animationModel); + } + + return sector; + } + }; + + function shouldRealtimeSort(seriesModel, coordSys) { + var realtimeSortOption = seriesModel.get('realtimeSort', true); + var baseAxis = coordSys.getBaseAxis(); + + if ("development" !== 'production') { + if (realtimeSortOption) { + if (baseAxis.type !== 'category') { + warn('`realtimeSort` will not work because this bar series is not based on a category axis.'); + } + + if (coordSys.type !== 'cartesian2d') { + warn('`realtimeSort` will not work because this bar series is not on cartesian2d.'); + } + } + } + + if (realtimeSortOption && baseAxis.type === 'category' && coordSys.type === 'cartesian2d') { + return { + baseAxis: baseAxis, + otherAxis: coordSys.getOtherAxis(baseAxis) + }; + } + } + + function updateRealtimeAnimation(realtimeSortCfg, seriesAnimationModel, el, layout, newIndex, isHorizontal, isUpdate, isChangeOrder) { + var seriesTarget; + var axisTarget; + + if (isHorizontal) { + axisTarget = { + x: layout.x, + width: layout.width + }; + seriesTarget = { + y: layout.y, + height: layout.height + }; + } else { + axisTarget = { + y: layout.y, + height: layout.height + }; + seriesTarget = { + x: layout.x, + width: layout.width + }; + } + + if (!isChangeOrder) { + // Keep the original growth animation if only axis order changed. + // Not start a new animation. + (isUpdate ? updateProps : initProps)(el, { + shape: seriesTarget + }, seriesAnimationModel, newIndex, null); + } + + var axisAnimationModel = seriesAnimationModel ? realtimeSortCfg.baseAxis.model : null; + (isUpdate ? updateProps : initProps)(el, { + shape: axisTarget + }, axisAnimationModel, newIndex); + } + + function checkPropertiesNotValid(obj, props) { + for (var i = 0; i < props.length; i++) { + if (!isFinite(obj[props[i]])) { + return true; + } + } + + return false; + } + + var rectPropties = ['x', 'y', 'width', 'height']; + var polarPropties = ['cx', 'cy', 'r', 'startAngle', 'endAngle']; + var isValidLayout = { + cartesian2d: function (layout) { + return !checkPropertiesNotValid(layout, rectPropties); + }, + polar: function (layout) { + return !checkPropertiesNotValid(layout, polarPropties); + } + }; + var getLayout = { + // itemModel is only used to get borderWidth, which is not needed + // when calculating bar background layout. + cartesian2d: function (data, dataIndex, itemModel) { + var layout = data.getItemLayout(dataIndex); + var fixedLineWidth = itemModel ? getLineWidth(itemModel, layout) : 0; // fix layout with lineWidth + + var signX = layout.width > 0 ? 1 : -1; + var signY = layout.height > 0 ? 1 : -1; + return { + x: layout.x + signX * fixedLineWidth / 2, + y: layout.y + signY * fixedLineWidth / 2, + width: layout.width - signX * fixedLineWidth, + height: layout.height - signY * fixedLineWidth + }; + }, + polar: function (data, dataIndex, itemModel) { + var layout = data.getItemLayout(dataIndex); + return { + cx: layout.cx, + cy: layout.cy, + r0: layout.r0, + r: layout.r, + startAngle: layout.startAngle, + endAngle: layout.endAngle, + clockwise: layout.clockwise + }; + } + }; + + function isZeroOnPolar(layout) { + return layout.startAngle != null && layout.endAngle != null && layout.startAngle === layout.endAngle; + } + + function createPolarPositionMapping(isRadial) { + return function (isRadial) { + var arcOrAngle = isRadial ? 'Arc' : 'Angle'; + return function (position) { + switch (position) { + case 'start': + case 'insideStart': + case 'end': + case 'insideEnd': + return position + arcOrAngle; + + default: + return position; + } + }; + }(isRadial); + } + + function updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, isPolar) { + var style = data.getItemVisual(dataIndex, 'style'); + + if (!isPolar) { + el.setShape('r', itemModel.get(['itemStyle', 'borderRadius']) || 0); + } + + el.useStyle(style); + var cursorStyle = itemModel.getShallow('cursor'); + cursorStyle && el.attr('cursor', cursorStyle); + var labelPositionOutside = isPolar ? isHorizontalOrRadial ? layout.r >= layout.r0 ? 'endArc' : 'startArc' : layout.endAngle >= layout.startAngle ? 'endAngle' : 'startAngle' : isHorizontalOrRadial ? layout.height >= 0 ? 'bottom' : 'top' : layout.width >= 0 ? 'right' : 'left'; + var labelStatesModels = getLabelStatesModels(itemModel); + setLabelStyle(el, labelStatesModels, { + labelFetcher: seriesModel, + labelDataIndex: dataIndex, + defaultText: getDefaultLabel(seriesModel.getData(), dataIndex), + inheritColor: style.fill, + defaultOpacity: style.opacity, + defaultOutsidePosition: labelPositionOutside + }); + var label = el.getTextContent(); + + if (isPolar && label) { + var position = itemModel.get(['label', 'position']); + el.textConfig.inside = position === 'middle' ? true : null; + setSectorTextRotation(el, position === 'outside' ? labelPositionOutside : position, createPolarPositionMapping(isHorizontalOrRadial), itemModel.get(['label', 'rotate'])); + } + + setLabelValueAnimation(label, labelStatesModels, seriesModel.getRawValue(dataIndex), function (value) { + return getDefaultInterpolatedLabel(data, value); + }); + var emphasisModel = itemModel.getModel(['emphasis']); + toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + setStatesStylesFromModel(el, itemModel); + + if (isZeroOnPolar(layout)) { + el.style.fill = 'none'; + el.style.stroke = 'none'; + each(el.states, function (state) { + if (state.style) { + state.style.fill = state.style.stroke = 'none'; + } + }); + } + } // In case width or height are too small. + + + function getLineWidth(itemModel, rawLayout) { + // Has no border. + var borderColor = itemModel.get(['itemStyle', 'borderColor']); + + if (!borderColor || borderColor === 'none') { + return 0; + } + + var lineWidth = itemModel.get(['itemStyle', 'borderWidth']) || 0; // width or height may be NaN for empty data + + var width = isNaN(rawLayout.width) ? Number.MAX_VALUE : Math.abs(rawLayout.width); + var height = isNaN(rawLayout.height) ? Number.MAX_VALUE : Math.abs(rawLayout.height); + return Math.min(lineWidth, width, height); + } + + var LagePathShape = + /** @class */ + function () { + function LagePathShape() {} + + return LagePathShape; + }(); + + var LargePath = + /** @class */ + function (_super) { + __extends(LargePath, _super); + + function LargePath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'largeBar'; + return _this; + } + + LargePath.prototype.getDefaultShape = function () { + return new LagePathShape(); + }; + + LargePath.prototype.buildPath = function (ctx, shape) { + // Drawing lines is more efficient than drawing + // a whole line or drawing rects. + var points = shape.points; + var baseDimIdx = this.baseDimIdx; + var valueDimIdx = 1 - this.baseDimIdx; + var startPoint = []; + var size = []; + var barWidth = this.barWidth; + + for (var i = 0; i < points.length; i += 3) { + size[baseDimIdx] = barWidth; + size[valueDimIdx] = points[i + 2]; + startPoint[baseDimIdx] = points[i + baseDimIdx]; + startPoint[valueDimIdx] = points[i + valueDimIdx]; + ctx.rect(startPoint[0], startPoint[1], size[0], size[1]); + } + }; + + return LargePath; + }(Path); + + function createLarge(seriesModel, group, progressiveEls, incremental) { + // TODO support polar + var data = seriesModel.getData(); + var baseDimIdx = data.getLayout('valueAxisHorizontal') ? 1 : 0; + var largeDataIndices = data.getLayout('largeDataIndices'); + var barWidth = data.getLayout('size'); + var backgroundModel = seriesModel.getModel('backgroundStyle'); + var bgPoints = data.getLayout('largeBackgroundPoints'); + + if (bgPoints) { + var bgEl = new LargePath({ + shape: { + points: bgPoints + }, + incremental: !!incremental, + silent: true, + z2: 0 + }); + bgEl.baseDimIdx = baseDimIdx; + bgEl.largeDataIndices = largeDataIndices; + bgEl.barWidth = barWidth; + bgEl.useStyle(backgroundModel.getItemStyle()); + group.add(bgEl); + progressiveEls && progressiveEls.push(bgEl); + } + + var el = new LargePath({ + shape: { + points: data.getLayout('largePoints') + }, + incremental: !!incremental, + z2: 1 + }); + el.baseDimIdx = baseDimIdx; + el.largeDataIndices = largeDataIndices; + el.barWidth = barWidth; + group.add(el); + el.useStyle(data.getVisual('style')); // Enable tooltip and user mouse/touch event handlers. + + getECData(el).seriesIndex = seriesModel.seriesIndex; + + if (!seriesModel.get('silent')) { + el.on('mousedown', largePathUpdateDataIndex); + el.on('mousemove', largePathUpdateDataIndex); + } + + progressiveEls && progressiveEls.push(el); + } // Use throttle to avoid frequently traverse to find dataIndex. + + + var largePathUpdateDataIndex = throttle(function (event) { + var largePath = this; + var dataIndex = largePathFindDataIndex(largePath, event.offsetX, event.offsetY); + getECData(largePath).dataIndex = dataIndex >= 0 ? dataIndex : null; + }, 30, false); + + function largePathFindDataIndex(largePath, x, y) { + var baseDimIdx = largePath.baseDimIdx; + var valueDimIdx = 1 - baseDimIdx; + var points = largePath.shape.points; + var largeDataIndices = largePath.largeDataIndices; + var startPoint = []; + var size = []; + var barWidth = largePath.barWidth; + + for (var i = 0, len = points.length / 3; i < len; i++) { + var ii = i * 3; + size[baseDimIdx] = barWidth; + size[valueDimIdx] = points[ii + 2]; + startPoint[baseDimIdx] = points[ii + baseDimIdx]; + startPoint[valueDimIdx] = points[ii + valueDimIdx]; + + if (size[valueDimIdx] < 0) { + startPoint[valueDimIdx] += size[valueDimIdx]; + size[valueDimIdx] = -size[valueDimIdx]; + } + + if (x >= startPoint[0] && x <= startPoint[0] + size[0] && y >= startPoint[1] && y <= startPoint[1] + size[1]) { + return largeDataIndices[i]; + } + } + + return -1; + } + + function createBackgroundShape(isHorizontalOrRadial, layout, coord) { + if (isCoordinateSystemType(coord, 'cartesian2d')) { + var rectShape = layout; + var coordLayout = coord.getArea(); + return { + x: isHorizontalOrRadial ? rectShape.x : coordLayout.x, + y: isHorizontalOrRadial ? coordLayout.y : rectShape.y, + width: isHorizontalOrRadial ? rectShape.width : coordLayout.width, + height: isHorizontalOrRadial ? coordLayout.height : rectShape.height + }; + } else { + var coordLayout = coord.getArea(); + var sectorShape = layout; + return { + cx: coordLayout.cx, + cy: coordLayout.cy, + r0: isHorizontalOrRadial ? coordLayout.r0 : sectorShape.r0, + r: isHorizontalOrRadial ? coordLayout.r : sectorShape.r, + startAngle: isHorizontalOrRadial ? sectorShape.startAngle : 0, + endAngle: isHorizontalOrRadial ? sectorShape.endAngle : Math.PI * 2 + }; + } + } + + function createBackgroundEl(coord, isHorizontalOrRadial, layout) { + var ElementClz = coord.type === 'polar' ? Sector : Rect; + return new ElementClz({ + shape: createBackgroundShape(isHorizontalOrRadial, layout, coord), + silent: true, + z2: 0 + }); + } + + function install$3(registers) { + registers.registerChartView(BarView); + registers.registerSeriesModel(BarSeriesModel); + registers.registerLayout(registers.PRIORITY.VISUAL.LAYOUT, curry(layout, 'bar')); // Do layout after other overall layout, which can preapre some informations. + + registers.registerLayout(registers.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, createProgressiveLayout('bar')); // Down sample after filter + + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, dataSample('bar')); + /** + * @payload + * @property {string} [componentType=series] + * @property {number} [dx] + * @property {number} [dy] + * @property {number} [zoom] + * @property {number} [originX] + * @property {number} [originY] + */ + + registers.registerAction({ + type: 'changeAxisOrder', + event: 'changeAxisOrder', + update: 'update' + }, function (payload, ecModel) { + var componentType = payload.componentType || 'series'; + ecModel.eachComponent({ + mainType: componentType, + query: payload + }, function (componentModel) { + if (payload.sortInfo) { + componentModel.axis.setCategorySortInfo(payload.sortInfo); + } + }); + }); + } + + var PI2$8 = Math.PI * 2; + var RADIAN = Math.PI / 180; + + function getViewRect(seriesModel, api) { + return getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + } + + function getBasicPieLayout(seriesModel, api) { + var viewRect = getViewRect(seriesModel, api); + var center = seriesModel.get('center'); + var radius = seriesModel.get('radius'); + + if (!isArray(radius)) { + radius = [0, radius]; + } + + if (!isArray(center)) { + center = [center, center]; + } + + var width = parsePercent$1(viewRect.width, api.getWidth()); + var height = parsePercent$1(viewRect.height, api.getHeight()); + var size = Math.min(width, height); + var cx = parsePercent$1(center[0], width) + viewRect.x; + var cy = parsePercent$1(center[1], height) + viewRect.y; + var r0 = parsePercent$1(radius[0], size / 2); + var r = parsePercent$1(radius[1], size / 2); + return { + cx: cx, + cy: cy, + r0: r0, + r: r + }; + } + function pieLayout(seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var viewRect = getViewRect(seriesModel, api); + + var _a = getBasicPieLayout(seriesModel, api), + cx = _a.cx, + cy = _a.cy, + r = _a.r, + r0 = _a.r0; + + var startAngle = -seriesModel.get('startAngle') * RADIAN; + var minAngle = seriesModel.get('minAngle') * RADIAN; + var validDataCount = 0; + data.each(valueDim, function (value) { + !isNaN(value) && validDataCount++; + }); + var sum = data.getSum(valueDim); // Sum may be 0 + + var unitRadian = Math.PI / (sum || validDataCount) * 2; + var clockwise = seriesModel.get('clockwise'); + var roseType = seriesModel.get('roseType'); + var stillShowZeroSum = seriesModel.get('stillShowZeroSum'); // [0...max] + + var extent = data.getDataExtent(valueDim); + extent[0] = 0; // In the case some sector angle is smaller than minAngle + + var restAngle = PI2$8; + var valueSumLargerThanMinAngle = 0; + var currentAngle = startAngle; + var dir = clockwise ? 1 : -1; + data.setLayout({ + viewRect: viewRect, + r: r + }); + data.each(valueDim, function (value, idx) { + var angle; + + if (isNaN(value)) { + data.setItemLayout(idx, { + angle: NaN, + startAngle: NaN, + endAngle: NaN, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: r0, + r: roseType ? NaN : r + }); + return; + } // FIXME 兼容 2.0 但是 roseType 是 area 的时候才是这样? + + + if (roseType !== 'area') { + angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian; + } else { + angle = PI2$8 / validDataCount; + } + + if (angle < minAngle) { + angle = minAngle; + restAngle -= minAngle; + } else { + valueSumLargerThanMinAngle += value; + } + + var endAngle = currentAngle + dir * angle; + data.setItemLayout(idx, { + angle: angle, + startAngle: currentAngle, + endAngle: endAngle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: r0, + r: roseType ? linearMap(value, extent, [r0, r]) : r + }); + currentAngle = endAngle; + }); // Some sector is constrained by minAngle + // Rest sectors needs recalculate angle + + if (restAngle < PI2$8 && validDataCount) { + // Average the angle if rest angle is not enough after all angles is + // Constrained by minAngle + if (restAngle <= 1e-3) { + var angle_1 = PI2$8 / validDataCount; + data.each(valueDim, function (value, idx) { + if (!isNaN(value)) { + var layout_1 = data.getItemLayout(idx); + layout_1.angle = angle_1; + layout_1.startAngle = startAngle + dir * idx * angle_1; + layout_1.endAngle = startAngle + dir * (idx + 1) * angle_1; + } + }); + } else { + unitRadian = restAngle / valueSumLargerThanMinAngle; + currentAngle = startAngle; + data.each(valueDim, function (value, idx) { + if (!isNaN(value)) { + var layout_2 = data.getItemLayout(idx); + var angle = layout_2.angle === minAngle ? minAngle : value * unitRadian; + layout_2.startAngle = currentAngle; + layout_2.endAngle = currentAngle + dir * angle; + currentAngle += dir * angle; + } + }); + } + } + }); + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + function dataFilter(seriesType) { + return { + seriesType: seriesType, + reset: function (seriesModel, ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + + if (!legendModels || !legendModels.length) { + return; + } + + var data = seriesModel.getData(); + data.filterSelf(function (idx) { + var name = data.getName(idx); // If in any legend component the status is not selected. + + for (var i = 0; i < legendModels.length; i++) { + // @ts-ignore FIXME: LegendModel + if (!legendModels[i].isSelected(name)) { + return false; + } + } + + return true; + }); + } + }; + } + + var RADIAN$1 = Math.PI / 180; + + function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight, viewLeft, viewTop, farthestX) { + if (list.length < 2) { + return; + } + + function recalculateXOnSemiToAlignOnEllipseCurve(semi) { + var rB = semi.rB; + var rB2 = rB * rB; + + for (var i = 0; i < semi.list.length; i++) { + var item = semi.list[i]; + var dy = Math.abs(item.label.y - cy); // horizontal r is always same with original r because x is not changed. + + var rA = r + item.len; + var rA2 = rA * rA; // Use ellipse implicit function to calculate x + + var dx = Math.sqrt((1 - Math.abs(dy * dy / rB2)) * rA2); + var newX = cx + (dx + item.len2) * dir; + var deltaX = newX - item.label.x; + var newTargetWidth = item.targetTextWidth - deltaX * dir; // text x is changed, so need to recalculate width. + + constrainTextWidth(item, newTargetWidth, true); + item.label.x = newX; + } + } // Adjust X based on the shifted y. Make tight labels aligned on an ellipse curve. + + + function recalculateX(items) { + // Extremes of + var topSemi = { + list: [], + maxY: 0 + }; + var bottomSemi = { + list: [], + maxY: 0 + }; + + for (var i = 0; i < items.length; i++) { + if (items[i].labelAlignTo !== 'none') { + continue; + } + + var item = items[i]; + var semi = item.label.y > cy ? bottomSemi : topSemi; + var dy = Math.abs(item.label.y - cy); + + if (dy >= semi.maxY) { + var dx = item.label.x - cx - item.len2 * dir; // horizontal r is always same with original r because x is not changed. + + var rA = r + item.len; // Canculate rB based on the topest / bottemest label. + + var rB = Math.abs(dx) < rA ? Math.sqrt(dy * dy / (1 - dx * dx / rA / rA)) : rA; + semi.rB = rB; + semi.maxY = dy; + } + + semi.list.push(item); + } + + recalculateXOnSemiToAlignOnEllipseCurve(topSemi); + recalculateXOnSemiToAlignOnEllipseCurve(bottomSemi); + } + + var len = list.length; + + for (var i = 0; i < len; i++) { + if (list[i].position === 'outer' && list[i].labelAlignTo === 'labelLine') { + var dx = list[i].label.x - farthestX; + list[i].linePoints[1][0] += dx; + list[i].label.x = farthestX; + } + } + + if (shiftLayoutOnY(list, viewTop, viewTop + viewHeight)) { + recalculateX(list); + } + } + + function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop) { + var leftList = []; + var rightList = []; + var leftmostX = Number.MAX_VALUE; + var rightmostX = -Number.MAX_VALUE; + + for (var i = 0; i < labelLayoutList.length; i++) { + var label = labelLayoutList[i].label; + + if (isPositionCenter(labelLayoutList[i])) { + continue; + } + + if (label.x < cx) { + leftmostX = Math.min(leftmostX, label.x); + leftList.push(labelLayoutList[i]); + } else { + rightmostX = Math.max(rightmostX, label.x); + rightList.push(labelLayoutList[i]); + } + } + + for (var i = 0; i < labelLayoutList.length; i++) { + var layout = labelLayoutList[i]; + + if (!isPositionCenter(layout) && layout.linePoints) { + if (layout.labelStyleWidth != null) { + continue; + } + + var label = layout.label; + var linePoints = layout.linePoints; + var targetTextWidth = void 0; + + if (layout.labelAlignTo === 'edge') { + if (label.x < cx) { + targetTextWidth = linePoints[2][0] - layout.labelDistance - viewLeft - layout.edgeDistance; + } else { + targetTextWidth = viewLeft + viewWidth - layout.edgeDistance - linePoints[2][0] - layout.labelDistance; + } + } else if (layout.labelAlignTo === 'labelLine') { + if (label.x < cx) { + targetTextWidth = leftmostX - viewLeft - layout.bleedMargin; + } else { + targetTextWidth = viewLeft + viewWidth - rightmostX - layout.bleedMargin; + } + } else { + if (label.x < cx) { + targetTextWidth = label.x - viewLeft - layout.bleedMargin; + } else { + targetTextWidth = viewLeft + viewWidth - label.x - layout.bleedMargin; + } + } + + layout.targetTextWidth = targetTextWidth; + constrainTextWidth(layout, targetTextWidth); + } + } + + adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight, viewLeft, viewTop, rightmostX); + adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight, viewLeft, viewTop, leftmostX); + + for (var i = 0; i < labelLayoutList.length; i++) { + var layout = labelLayoutList[i]; + + if (!isPositionCenter(layout) && layout.linePoints) { + var label = layout.label; + var linePoints = layout.linePoints; + var isAlignToEdge = layout.labelAlignTo === 'edge'; + var padding = label.style.padding; + var paddingH = padding ? padding[1] + padding[3] : 0; // textRect.width already contains paddingH if bgColor is set + + var extraPaddingH = label.style.backgroundColor ? 0 : paddingH; + var realTextWidth = layout.rect.width + extraPaddingH; + var dist = linePoints[1][0] - linePoints[2][0]; + + if (isAlignToEdge) { + if (label.x < cx) { + linePoints[2][0] = viewLeft + layout.edgeDistance + realTextWidth + layout.labelDistance; + } else { + linePoints[2][0] = viewLeft + viewWidth - layout.edgeDistance - realTextWidth - layout.labelDistance; + } + } else { + if (label.x < cx) { + linePoints[2][0] = label.x + layout.labelDistance; + } else { + linePoints[2][0] = label.x - layout.labelDistance; + } + + linePoints[1][0] = linePoints[2][0] + dist; + } + + linePoints[1][1] = linePoints[2][1] = label.y; + } + } + } + /** + * Set max width of each label, and then wrap each label to the max width. + * + * @param layout label layout + * @param availableWidth max width for the label to display + * @param forceRecalculate recaculate the text layout even if the current width + * is smaller than `availableWidth`. This is useful when the text was previously + * wrapped by calling `constrainTextWidth` but now `availableWidth` changed, in + * which case, previous wrapping should be redo. + */ + + + function constrainTextWidth(layout, availableWidth, forceRecalculate) { + if (forceRecalculate === void 0) { + forceRecalculate = false; + } + + if (layout.labelStyleWidth != null) { + // User-defined style.width has the highest priority. + return; + } + + var label = layout.label; + var style = label.style; + var textRect = layout.rect; + var bgColor = style.backgroundColor; + var padding = style.padding; + var paddingH = padding ? padding[1] + padding[3] : 0; + var overflow = style.overflow; // textRect.width already contains paddingH if bgColor is set + + var oldOuterWidth = textRect.width + (bgColor ? 0 : paddingH); + + if (availableWidth < oldOuterWidth || forceRecalculate) { + var oldHeight = textRect.height; + + if (overflow && overflow.match('break')) { + // Temporarily set background to be null to calculate + // the bounding box without backgroud. + label.setStyle('backgroundColor', null); // Set constraining width + + label.setStyle('width', availableWidth - paddingH); // This is the real bounding box of the text without padding + + var innerRect = label.getBoundingRect(); + label.setStyle('width', Math.ceil(innerRect.width)); + label.setStyle('backgroundColor', bgColor); + } else { + var availableInnerWidth = availableWidth - paddingH; + var newWidth = availableWidth < oldOuterWidth // Current text is too wide, use `availableWidth` as max width. + ? availableInnerWidth : // Current available width is enough, but the text may have + // already been wrapped with a smaller available width. + forceRecalculate ? availableInnerWidth > layout.unconstrainedWidth // Current available is larger than text width, + // so don't constrain width (otherwise it may have + // empty space in the background). + ? null // Current available is smaller than text width, so + // use the current available width as constraining + // width. + : availableInnerWidth : // Current available width is enough, so no need to + // constrain. + null; + label.setStyle('width', newWidth); + } + + var newRect = label.getBoundingRect(); + textRect.width = newRect.width; + var margin = (label.style.margin || 0) + 2.1; + textRect.height = newRect.height + margin; + textRect.y -= (textRect.height - oldHeight) / 2; + } + } + + function isPositionCenter(sectorShape) { + // Not change x for center label + return sectorShape.position === 'center'; + } + + function pieLabelLayout(seriesModel) { + var data = seriesModel.getData(); + var labelLayoutList = []; + var cx; + var cy; + var hasLabelRotate = false; + var minShowLabelRadian = (seriesModel.get('minShowLabelAngle') || 0) * RADIAN$1; + var viewRect = data.getLayout('viewRect'); + var r = data.getLayout('r'); + var viewWidth = viewRect.width; + var viewLeft = viewRect.x; + var viewTop = viewRect.y; + var viewHeight = viewRect.height; + + function setNotShow(el) { + el.ignore = true; + } + + function isLabelShown(label) { + if (!label.ignore) { + return true; + } + + for (var key in label.states) { + if (label.states[key].ignore === false) { + return true; + } + } + + return false; + } + + data.each(function (idx) { + var sector = data.getItemGraphicEl(idx); + var sectorShape = sector.shape; + var label = sector.getTextContent(); + var labelLine = sector.getTextGuideLine(); + var itemModel = data.getItemModel(idx); + var labelModel = itemModel.getModel('label'); // Use position in normal or emphasis + + var labelPosition = labelModel.get('position') || itemModel.get(['emphasis', 'label', 'position']); + var labelDistance = labelModel.get('distanceToLabelLine'); + var labelAlignTo = labelModel.get('alignTo'); + var edgeDistance = parsePercent$1(labelModel.get('edgeDistance'), viewWidth); + var bleedMargin = labelModel.get('bleedMargin'); + var labelLineModel = itemModel.getModel('labelLine'); + var labelLineLen = labelLineModel.get('length'); + labelLineLen = parsePercent$1(labelLineLen, viewWidth); + var labelLineLen2 = labelLineModel.get('length2'); + labelLineLen2 = parsePercent$1(labelLineLen2, viewWidth); + + if (Math.abs(sectorShape.endAngle - sectorShape.startAngle) < minShowLabelRadian) { + each(label.states, setNotShow); + label.ignore = true; + return; + } + + if (!isLabelShown(label)) { + return; + } + + var midAngle = (sectorShape.startAngle + sectorShape.endAngle) / 2; + var nx = Math.cos(midAngle); + var ny = Math.sin(midAngle); + var textX; + var textY; + var linePoints; + var textAlign; + cx = sectorShape.cx; + cy = sectorShape.cy; + var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner'; + + if (labelPosition === 'center') { + textX = sectorShape.cx; + textY = sectorShape.cy; + textAlign = 'center'; + } else { + var x1 = (isLabelInside ? (sectorShape.r + sectorShape.r0) / 2 * nx : sectorShape.r * nx) + cx; + var y1 = (isLabelInside ? (sectorShape.r + sectorShape.r0) / 2 * ny : sectorShape.r * ny) + cy; + textX = x1 + nx * 3; + textY = y1 + ny * 3; + + if (!isLabelInside) { + // For roseType + var x2 = x1 + nx * (labelLineLen + r - sectorShape.r); + var y2 = y1 + ny * (labelLineLen + r - sectorShape.r); + var x3 = x2 + (nx < 0 ? -1 : 1) * labelLineLen2; + var y3 = y2; + + if (labelAlignTo === 'edge') { + // Adjust textX because text align of edge is opposite + textX = nx < 0 ? viewLeft + edgeDistance : viewLeft + viewWidth - edgeDistance; + } else { + textX = x3 + (nx < 0 ? -labelDistance : labelDistance); + } + + textY = y3; + linePoints = [[x1, y1], [x2, y2], [x3, y3]]; + } + + textAlign = isLabelInside ? 'center' : labelAlignTo === 'edge' ? nx > 0 ? 'right' : 'left' : nx > 0 ? 'left' : 'right'; + } + + var PI = Math.PI; + var labelRotate = 0; + var rotate = labelModel.get('rotate'); + + if (isNumber(rotate)) { + labelRotate = rotate * (PI / 180); + } else if (labelPosition === 'center') { + labelRotate = 0; + } else if (rotate === 'radial' || rotate === true) { + var radialAngle = nx < 0 ? -midAngle + PI : -midAngle; + labelRotate = radialAngle; + } else if (rotate === 'tangential' && labelPosition !== 'outside' && labelPosition !== 'outer') { + var rad = Math.atan2(nx, ny); + + if (rad < 0) { + rad = PI * 2 + rad; + } + + var isDown = ny > 0; + + if (isDown) { + rad = PI + rad; + } + + labelRotate = rad - PI; + } + + hasLabelRotate = !!labelRotate; + label.x = textX; + label.y = textY; + label.rotation = labelRotate; + label.setStyle({ + verticalAlign: 'middle' + }); // Not sectorShape the inside label + + if (!isLabelInside) { + var textRect = label.getBoundingRect().clone(); + textRect.applyTransform(label.getComputedTransform()); // Text has a default 1px stroke. Exclude this. + + var margin = (label.style.margin || 0) + 2.1; + textRect.y -= margin / 2; + textRect.height += margin; + labelLayoutList.push({ + label: label, + labelLine: labelLine, + position: labelPosition, + len: labelLineLen, + len2: labelLineLen2, + minTurnAngle: labelLineModel.get('minTurnAngle'), + maxSurfaceAngle: labelLineModel.get('maxSurfaceAngle'), + surfaceNormal: new Point(nx, ny), + linePoints: linePoints, + textAlign: textAlign, + labelDistance: labelDistance, + labelAlignTo: labelAlignTo, + edgeDistance: edgeDistance, + bleedMargin: bleedMargin, + rect: textRect, + unconstrainedWidth: textRect.width, + labelStyleWidth: label.style.width + }); + } else { + label.setStyle({ + align: textAlign + }); + var selectState = label.states.select; + + if (selectState) { + selectState.x += label.x; + selectState.y += label.y; + } + } + + sector.setTextConfig({ + inside: isLabelInside + }); + }); + + if (!hasLabelRotate && seriesModel.get('avoidLabelOverlap')) { + avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop); + } + + for (var i = 0; i < labelLayoutList.length; i++) { + var layout = labelLayoutList[i]; + var label = layout.label; + var labelLine = layout.labelLine; + var notShowLabel = isNaN(label.x) || isNaN(label.y); + + if (label) { + label.setStyle({ + align: layout.textAlign + }); + + if (notShowLabel) { + each(label.states, setNotShow); + label.ignore = true; + } + + var selectState = label.states.select; + + if (selectState) { + selectState.x += label.x; + selectState.y += label.y; + } + } + + if (labelLine) { + var linePoints = layout.linePoints; + + if (notShowLabel || !linePoints) { + each(labelLine.states, setNotShow); + labelLine.ignore = true; + } else { + limitTurnAngle(linePoints, layout.minTurnAngle); + limitSurfaceAngle(linePoints, layout.surfaceNormal, layout.maxSurfaceAngle); + labelLine.setShape({ + points: linePoints + }); // Set the anchor to the midpoint of sector + + label.__hostTarget.textGuideLineConfig = { + anchor: new Point(linePoints[0][0], linePoints[0][1]) + }; + } + } + } + } + + function getSectorCornerRadius(model, shape, zeroIfNull) { + var cornerRadius = model.get('borderRadius'); + + if (cornerRadius == null) { + return zeroIfNull ? { + cornerRadius: 0 + } : null; + } + + if (!isArray(cornerRadius)) { + cornerRadius = [cornerRadius, cornerRadius, cornerRadius, cornerRadius]; + } + + var dr = Math.abs(shape.r || 0 - shape.r0 || 0); + return { + cornerRadius: map(cornerRadius, function (cr) { + return parsePercent(cr, dr); + }) + }; + } + + /** + * Piece of pie including Sector, Label, LabelLine + */ + + var PiePiece = + /** @class */ + function (_super) { + __extends(PiePiece, _super); + + function PiePiece(data, idx, startAngle) { + var _this = _super.call(this) || this; + + _this.z2 = 2; + var text = new ZRText(); + + _this.setTextContent(text); + + _this.updateData(data, idx, startAngle, true); + + return _this; + } + + PiePiece.prototype.updateData = function (data, idx, startAngle, firstCreate) { + var sector = this; + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var emphasisModel = itemModel.getModel('emphasis'); + var layout = data.getItemLayout(idx); // cornerRadius & innerCornerRadius doesn't exist in the item layout. Use `0` if null value is specified. + // see `setItemLayout` in `pieLayout.ts`. + + var sectorShape = extend(getSectorCornerRadius(itemModel.getModel('itemStyle'), layout, true), layout); // Ignore NaN data. + + if (isNaN(sectorShape.startAngle)) { + // Use NaN shape to avoid drawing shape. + sector.setShape(sectorShape); + return; + } + + if (firstCreate) { + sector.setShape(sectorShape); + var animationType = seriesModel.getShallow('animationType'); + + if (seriesModel.ecModel.ssr) { + // Use scale animation in SSR mode(opacity?) + // Because CSS SVG animation doesn't support very customized shape animation. + initProps(sector, { + scaleX: 0, + scaleY: 0 + }, seriesModel, { + dataIndex: idx, + isFrom: true + }); + sector.originX = sectorShape.cx; + sector.originY = sectorShape.cy; + } else if (animationType === 'scale') { + sector.shape.r = layout.r0; + initProps(sector, { + shape: { + r: layout.r + } + }, seriesModel, idx); + } // Expansion + else { + if (startAngle != null) { + sector.setShape({ + startAngle: startAngle, + endAngle: startAngle + }); + initProps(sector, { + shape: { + startAngle: layout.startAngle, + endAngle: layout.endAngle + } + }, seriesModel, idx); + } else { + sector.shape.endAngle = layout.startAngle; + updateProps(sector, { + shape: { + endAngle: layout.endAngle + } + }, seriesModel, idx); + } + } + } else { + saveOldStyle(sector); // Transition animation from the old shape + + updateProps(sector, { + shape: sectorShape + }, seriesModel, idx); + } + + sector.useStyle(data.getItemVisual(idx, 'style')); + setStatesStylesFromModel(sector, itemModel); + var midAngle = (layout.startAngle + layout.endAngle) / 2; + var offset = seriesModel.get('selectedOffset'); + var dx = Math.cos(midAngle) * offset; + var dy = Math.sin(midAngle) * offset; + var cursorStyle = itemModel.getShallow('cursor'); + cursorStyle && sector.attr('cursor', cursorStyle); + + this._updateLabel(seriesModel, data, idx); + + sector.ensureState('emphasis').shape = extend({ + r: layout.r + (emphasisModel.get('scale') ? emphasisModel.get('scaleSize') || 0 : 0) + }, getSectorCornerRadius(emphasisModel.getModel('itemStyle'), layout)); + extend(sector.ensureState('select'), { + x: dx, + y: dy, + shape: getSectorCornerRadius(itemModel.getModel(['select', 'itemStyle']), layout) + }); + extend(sector.ensureState('blur'), { + shape: getSectorCornerRadius(itemModel.getModel(['blur', 'itemStyle']), layout) + }); + var labelLine = sector.getTextGuideLine(); + var labelText = sector.getTextContent(); + labelLine && extend(labelLine.ensureState('select'), { + x: dx, + y: dy + }); // TODO: needs dx, dy in zrender? + + extend(labelText.ensureState('select'), { + x: dx, + y: dy + }); + toggleHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }; + + PiePiece.prototype._updateLabel = function (seriesModel, data, idx) { + var sector = this; + var itemModel = data.getItemModel(idx); + var labelLineModel = itemModel.getModel('labelLine'); + var style = data.getItemVisual(idx, 'style'); + var visualColor = style && style.fill; + var visualOpacity = style && style.opacity; + setLabelStyle(sector, getLabelStatesModels(itemModel), { + labelFetcher: data.hostModel, + labelDataIndex: idx, + inheritColor: visualColor, + defaultOpacity: visualOpacity, + defaultText: seriesModel.getFormattedLabel(idx, 'normal') || data.getName(idx) + }); + var labelText = sector.getTextContent(); // Set textConfig on sector. + + sector.setTextConfig({ + // reset position, rotation + position: null, + rotation: null + }); // Make sure update style on labelText after setLabelStyle. + // Because setLabelStyle will replace a new style on it. + + labelText.attr({ + z2: 10 + }); + var labelPosition = seriesModel.get(['label', 'position']); + + if (labelPosition !== 'outside' && labelPosition !== 'outer') { + sector.removeTextGuideLine(); + } else { + var polyline = this.getTextGuideLine(); + + if (!polyline) { + polyline = new Polyline(); + this.setTextGuideLine(polyline); + } // Default use item visual color + + + setLabelLineStyle(this, getLabelLineStatesModels(itemModel), { + stroke: visualColor, + opacity: retrieve3(labelLineModel.get(['lineStyle', 'opacity']), visualOpacity, 1) + }); + } + }; + + return PiePiece; + }(Sector); // Pie view + + + var PieView = + /** @class */ + function (_super) { + __extends(PieView, _super); + + function PieView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.ignoreLabelLineUpdate = true; + return _this; + } + + PieView.prototype.render = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var oldData = this._data; + var group = this.group; + var startAngle; // First render + + if (!oldData && data.count() > 0) { + var shape = data.getItemLayout(0); + + for (var s = 1; isNaN(shape && shape.startAngle) && s < data.count(); ++s) { + shape = data.getItemLayout(s); + } + + if (shape) { + startAngle = shape.startAngle; + } + } // remove empty-circle if it exists + + + if (this._emptyCircleSector) { + group.remove(this._emptyCircleSector); + } // when all data are filtered, show lightgray empty circle + + + if (data.count() === 0 && seriesModel.get('showEmptyCircle')) { + var sector = new Sector({ + shape: getBasicPieLayout(seriesModel, api) + }); + sector.useStyle(seriesModel.getModel('emptyCircleStyle').getItemStyle()); + this._emptyCircleSector = sector; + group.add(sector); + } + + data.diff(oldData).add(function (idx) { + var piePiece = new PiePiece(data, idx, startAngle); + data.setItemGraphicEl(idx, piePiece); + group.add(piePiece); + }).update(function (newIdx, oldIdx) { + var piePiece = oldData.getItemGraphicEl(oldIdx); + piePiece.updateData(data, newIdx, startAngle); + piePiece.off('click'); + group.add(piePiece); + data.setItemGraphicEl(newIdx, piePiece); + }).remove(function (idx) { + var piePiece = oldData.getItemGraphicEl(idx); + removeElementWithFadeOut(piePiece, seriesModel, idx); + }).execute(); + pieLabelLayout(seriesModel); // Always use initial animation. + + if (seriesModel.get('animationTypeUpdate') !== 'expansion') { + this._data = data; + } + }; + + PieView.prototype.dispose = function () {}; + + PieView.prototype.containPoint = function (point, seriesModel) { + var data = seriesModel.getData(); + var itemLayout = data.getItemLayout(0); + + if (itemLayout) { + var dx = point[0] - itemLayout.cx; + var dy = point[1] - itemLayout.cy; + var radius = Math.sqrt(dx * dx + dy * dy); + return radius <= itemLayout.r && radius >= itemLayout.r0; + } + }; + + PieView.type = 'pie'; + return PieView; + }(ChartView); + + /** + * [Usage]: + * (1) + * createListSimply(seriesModel, ['value']); + * (2) + * createListSimply(seriesModel, { + * coordDimensions: ['value'], + * dimensionsCount: 5 + * }); + */ + + function createSeriesDataSimply(seriesModel, opt, nameList) { + opt = isArray(opt) && { + coordDimensions: opt + } || extend({ + encodeDefine: seriesModel.getEncode() + }, opt); + var source = seriesModel.getSource(); + var dimensions = prepareSeriesDataSchema(source, opt).dimensions; + var list = new SeriesData(dimensions, seriesModel); + list.initData(source, nameList); + return list; + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + + /** + * LegendVisualProvider is an bridge that pick encoded color from data and + * provide to the legend component. + */ + var LegendVisualProvider = + /** @class */ + function () { + function LegendVisualProvider( // Function to get data after filtered. It stores all the encoding info + getDataWithEncodedVisual, // Function to get raw data before filtered. + getRawData) { + this._getDataWithEncodedVisual = getDataWithEncodedVisual; + this._getRawData = getRawData; + } + + LegendVisualProvider.prototype.getAllNames = function () { + var rawData = this._getRawData(); // We find the name from the raw data. In case it's filtered by the legend component. + // Normally, the name can be found in rawData, but can't be found in filtered data will display as gray. + + + return rawData.mapArray(rawData.getName); + }; + + LegendVisualProvider.prototype.containName = function (name) { + var rawData = this._getRawData(); + + return rawData.indexOfName(name) >= 0; + }; + + LegendVisualProvider.prototype.indexOfName = function (name) { + // Only get data when necessary. + // Because LegendVisualProvider constructor may be new in the stage that data is not prepared yet. + // Invoking Series#getData immediately will throw an error. + var dataWithEncodedVisual = this._getDataWithEncodedVisual(); + + return dataWithEncodedVisual.indexOfName(name); + }; + + LegendVisualProvider.prototype.getItemVisual = function (dataIndex, key) { + // Get encoded visual properties from final filtered data. + var dataWithEncodedVisual = this._getDataWithEncodedVisual(); + + return dataWithEncodedVisual.getItemVisual(dataIndex, key); + }; + + return LegendVisualProvider; + }(); + + var PieSeriesModel = + /** @class */ + function (_super) { + __extends(PieSeriesModel, _super); + + function PieSeriesModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @overwrite + */ + + + PieSeriesModel.prototype.init = function (option) { + _super.prototype.init.apply(this, arguments); // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + + + this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this)); + + this._defaultLabelLine(option); + }; + /** + * @overwrite + */ + + + PieSeriesModel.prototype.mergeOption = function () { + _super.prototype.mergeOption.apply(this, arguments); + }; + /** + * @overwrite + */ + + + PieSeriesModel.prototype.getInitialData = function () { + return createSeriesDataSimply(this, { + coordDimensions: ['value'], + encodeDefaulter: curry(makeSeriesEncodeForNameBased, this) + }); + }; + /** + * @overwrite + */ + + + PieSeriesModel.prototype.getDataParams = function (dataIndex) { + var data = this.getData(); + + var params = _super.prototype.getDataParams.call(this, dataIndex); // FIXME toFixed? + + + var valueList = []; + data.each(data.mapDimension('value'), function (value) { + valueList.push(value); + }); + params.percent = getPercentWithPrecision(valueList, dataIndex, data.hostModel.get('percentPrecision')); + params.$vars.push('percent'); + return params; + }; + + PieSeriesModel.prototype._defaultLabelLine = function (option) { + // Extend labelLine emphasis + defaultEmphasis(option, 'labelLine', ['show']); + var labelLineNormalOpt = option.labelLine; + var labelLineEmphasisOpt = option.emphasis.labelLine; // Not show label line if `label.normal.show = false` + + labelLineNormalOpt.show = labelLineNormalOpt.show && option.label.show; + labelLineEmphasisOpt.show = labelLineEmphasisOpt.show && option.emphasis.label.show; + }; + + PieSeriesModel.type = 'series.pie'; + PieSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + legendHoverLink: true, + colorBy: 'data', + // 默认全局居中 + center: ['50%', '50%'], + radius: [0, '75%'], + // 默认顺时针 + clockwise: true, + startAngle: 90, + // 最小角度改为0 + minAngle: 0, + // If the angle of a sector less than `minShowLabelAngle`, + // the label will not be displayed. + minShowLabelAngle: 0, + // 选中时扇区偏移量 + selectedOffset: 10, + // 选择模式,默认关闭,可选single,multiple + // selectedMode: false, + // 南丁格尔玫瑰图模式,'radius'(半径) | 'area'(面积) + // roseType: null, + percentPrecision: 2, + // If still show when all data zero. + stillShowZeroSum: true, + // cursor: null, + left: 0, + top: 0, + right: 0, + bottom: 0, + width: null, + height: null, + label: { + // color: 'inherit', + // If rotate around circle + rotate: 0, + show: true, + overflow: 'truncate', + // 'outer', 'inside', 'center' + position: 'outer', + // 'none', 'labelLine', 'edge'. Works only when position is 'outer' + alignTo: 'none', + // Closest distance between label and chart edge. + // Works only position is 'outer' and alignTo is 'edge'. + edgeDistance: '25%', + // Works only position is 'outer' and alignTo is not 'edge'. + bleedMargin: 10, + // Distance between text and label line. + distanceToLabelLine: 5 // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // 默认使用全局文本样式,详见TEXTSTYLE + // distance: 当position为inner时有效,为label位置到圆心的距离与圆半径(环状图为内外半径和)的比例系数 + + }, + // Enabled when label.normal.position is 'outer' + labelLine: { + show: true, + // 引导线两段中的第一段长度 + length: 15, + // 引导线两段中的第二段长度 + length2: 15, + smooth: false, + minTurnAngle: 90, + maxSurfaceAngle: 90, + lineStyle: { + // color: 各异, + width: 1, + type: 'solid' + } + }, + itemStyle: { + borderWidth: 1, + borderJoin: 'round' + }, + showEmptyCircle: true, + emptyCircleStyle: { + color: 'lightgray', + opacity: 1 + }, + labelLayout: { + // Hide the overlapped label. + hideOverlap: true + }, + emphasis: { + scale: true, + scaleSize: 5 + }, + // If use strategy to avoid label overlapping + avoidLabelOverlap: true, + // Animation type. Valid values: expansion, scale + animationType: 'expansion', + animationDuration: 1000, + // Animation type when update. Valid values: transition, expansion + animationTypeUpdate: 'transition', + animationEasingUpdate: 'cubicInOut', + animationDurationUpdate: 500, + animationEasing: 'cubicInOut' + }; + return PieSeriesModel; + }(SeriesModel); + + function negativeDataFilter(seriesType) { + return { + seriesType: seriesType, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + data.filterSelf(function (idx) { + // handle negative value condition + var valueDim = data.mapDimension('value'); + var curValue = data.get(valueDim, idx); + + if (isNumber(curValue) && !isNaN(curValue) && curValue < 0) { + return false; + } + + return true; + }); + } + }; + } + + function install$4(registers) { + registers.registerChartView(PieView); + registers.registerSeriesModel(PieSeriesModel); + createLegacyDataSelectAction('pie', registers.registerAction); + registers.registerLayout(curry(pieLayout, 'pie')); + registers.registerProcessor(dataFilter('pie')); + registers.registerProcessor(negativeDataFilter('pie')); + } + + var ScatterSeriesModel = + /** @class */ + function (_super) { + __extends(ScatterSeriesModel, _super); + + function ScatterSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ScatterSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } + + ScatterSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this, { + useEncodeDefaulter: true + }); + }; + + ScatterSeriesModel.prototype.getProgressive = function () { + var progressive = this.option.progressive; + + if (progressive == null) { + // PENDING + return this.option.large ? 5e3 : this.get('progressive'); + } + + return progressive; + }; + + ScatterSeriesModel.prototype.getProgressiveThreshold = function () { + var progressiveThreshold = this.option.progressiveThreshold; + + if (progressiveThreshold == null) { + // PENDING + return this.option.large ? 1e4 : this.get('progressiveThreshold'); + } + + return progressiveThreshold; + }; + + ScatterSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) { + return selectors.point(data.getItemLayout(dataIndex)); + }; + + ScatterSeriesModel.prototype.getZLevelKey = function () { + // Each progressive series has individual key. + return this.getData().count() > this.getProgressiveThreshold() ? this.id : ''; + }; + + ScatterSeriesModel.type = 'series.scatter'; + ScatterSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar']; + ScatterSeriesModel.defaultOption = { + coordinateSystem: 'cartesian2d', + // zlevel: 0, + z: 2, + legendHoverLink: true, + symbolSize: 10, + // symbolRotate: null, // 图形旋转控制 + large: false, + // Available when large is true + largeThreshold: 2000, + // cursor: null, + itemStyle: { + opacity: 0.8 // color: 各异 + + }, + emphasis: { + scale: true + }, + // If clip the overflow graphics + // Works on cartesian / polar series + clip: true, + select: { + itemStyle: { + borderColor: '#212121' + } + }, + universalTransition: { + divideShape: 'clone' + } // progressive: null + + }; + return ScatterSeriesModel; + }(SeriesModel); + + var BOOST_SIZE_THRESHOLD = 4; + + var LargeSymbolPathShape = + /** @class */ + function () { + function LargeSymbolPathShape() {} + + return LargeSymbolPathShape; + }(); + + var LargeSymbolPath = + /** @class */ + function (_super) { + __extends(LargeSymbolPath, _super); + + function LargeSymbolPath(opts) { + var _this = _super.call(this, opts) || this; + + _this._off = 0; + _this.hoverDataIdx = -1; + return _this; + } + + LargeSymbolPath.prototype.getDefaultShape = function () { + return new LargeSymbolPathShape(); + }; + + LargeSymbolPath.prototype.reset = function () { + this.notClear = false; + this._off = 0; + }; + + LargeSymbolPath.prototype.buildPath = function (path, shape) { + var points = shape.points; + var size = shape.size; + var symbolProxy = this.symbolProxy; + var symbolProxyShape = symbolProxy.shape; + var ctx = path.getContext ? path.getContext() : path; + var canBoost = ctx && size[0] < BOOST_SIZE_THRESHOLD; + var softClipShape = this.softClipShape; + var i; // Do draw in afterBrush. + + if (canBoost) { + this._ctx = ctx; + return; + } + + this._ctx = null; + + for (i = this._off; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + + if (isNaN(x) || isNaN(y)) { + continue; + } + + if (softClipShape && !softClipShape.contain(x, y)) { + continue; + } + + symbolProxyShape.x = x - size[0] / 2; + symbolProxyShape.y = y - size[1] / 2; + symbolProxyShape.width = size[0]; + symbolProxyShape.height = size[1]; + symbolProxy.buildPath(path, symbolProxyShape, true); + } + + if (this.incremental) { + this._off = i; + this.notClear = true; + } + }; + + LargeSymbolPath.prototype.afterBrush = function () { + var shape = this.shape; + var points = shape.points; + var size = shape.size; + var ctx = this._ctx; + var softClipShape = this.softClipShape; + var i; + + if (!ctx) { + return; + } // PENDING If style or other canvas status changed? + + + for (i = this._off; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + + if (isNaN(x) || isNaN(y)) { + continue; + } + + if (softClipShape && !softClipShape.contain(x, y)) { + continue; + } // fillRect is faster than building a rect path and draw. + // And it support light globalCompositeOperation. + + + ctx.fillRect(x - size[0] / 2, y - size[1] / 2, size[0], size[1]); + } + + if (this.incremental) { + this._off = i; + this.notClear = true; + } + }; + + LargeSymbolPath.prototype.findDataIndex = function (x, y) { + // TODO ??? + // Consider transform + var shape = this.shape; + var points = shape.points; + var size = shape.size; + var w = Math.max(size[0], 4); + var h = Math.max(size[1], 4); // Not consider transform + // Treat each element as a rect + // top down traverse + + for (var idx = points.length / 2 - 1; idx >= 0; idx--) { + var i = idx * 2; + var x0 = points[i] - w / 2; + var y0 = points[i + 1] - h / 2; + + if (x >= x0 && y >= y0 && x <= x0 + w && y <= y0 + h) { + return idx; + } + } + + return -1; + }; + + LargeSymbolPath.prototype.contain = function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + x = localPos[0]; + y = localPos[1]; + + if (rect.contain(x, y)) { + // Cache found data index. + var dataIdx = this.hoverDataIdx = this.findDataIndex(x, y); + return dataIdx >= 0; + } + + this.hoverDataIdx = -1; + return false; + }; + + LargeSymbolPath.prototype.getBoundingRect = function () { + // Ignore stroke for large symbol draw. + var rect = this._rect; + + if (!rect) { + var shape = this.shape; + var points = shape.points; + var size = shape.size; + var w = size[0]; + var h = size[1]; + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + + for (var i = 0; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + minX = Math.min(x, minX); + maxX = Math.max(x, maxX); + minY = Math.min(y, minY); + maxY = Math.max(y, maxY); + } + + rect = this._rect = new BoundingRect(minX - w / 2, minY - h / 2, maxX - minX + w, maxY - minY + h); + } + + return rect; + }; + + return LargeSymbolPath; + }(Path); + + var LargeSymbolDraw = + /** @class */ + function () { + function LargeSymbolDraw() { + this.group = new Group(); + } + /** + * Update symbols draw by new data + */ + + + LargeSymbolDraw.prototype.updateData = function (data, opt) { + this._clear(); + + var symbolEl = this._create(); + + symbolEl.setShape({ + points: data.getLayout('points') + }); + + this._setCommon(symbolEl, data, opt); + }; + + LargeSymbolDraw.prototype.updateLayout = function (data) { + var points = data.getLayout('points'); + this.group.eachChild(function (child) { + if (child.startIndex != null) { + var len = (child.endIndex - child.startIndex) * 2; + var byteOffset = child.startIndex * 4 * 2; + points = new Float32Array(points.buffer, byteOffset, len); + } + + child.setShape('points', points); // Reset draw cursor. + + child.reset(); + }); + }; + + LargeSymbolDraw.prototype.incrementalPrepareUpdate = function (data) { + this._clear(); + }; + + LargeSymbolDraw.prototype.incrementalUpdate = function (taskParams, data, opt) { + var lastAdded = this._newAdded[0]; + var points = data.getLayout('points'); + var oldPoints = lastAdded && lastAdded.shape.points; // Merging the exists. Each element has 1e4 points. + // Consider the performance balance between too much elements and too much points in one shape(may affect hover optimization) + + if (oldPoints && oldPoints.length < 2e4) { + var oldLen = oldPoints.length; + var newPoints = new Float32Array(oldLen + points.length); // Concat two array + + newPoints.set(oldPoints); + newPoints.set(points, oldLen); // Update endIndex + + lastAdded.endIndex = taskParams.end; + lastAdded.setShape({ + points: newPoints + }); + } else { + // Clear + this._newAdded = []; + + var symbolEl = this._create(); + + symbolEl.startIndex = taskParams.start; + symbolEl.endIndex = taskParams.end; + symbolEl.incremental = true; + symbolEl.setShape({ + points: points + }); + + this._setCommon(symbolEl, data, opt); + } + }; + + LargeSymbolDraw.prototype.eachRendered = function (cb) { + this._newAdded[0] && cb(this._newAdded[0]); + }; + + LargeSymbolDraw.prototype._create = function () { + var symbolEl = new LargeSymbolPath({ + cursor: 'default' + }); + this.group.add(symbolEl); + + this._newAdded.push(symbolEl); + + return symbolEl; + }; + + LargeSymbolDraw.prototype._setCommon = function (symbolEl, data, opt) { + var hostModel = data.hostModel; + opt = opt || {}; + var size = data.getVisual('symbolSize'); + symbolEl.setShape('size', size instanceof Array ? size : [size, size]); + symbolEl.softClipShape = opt.clipShape || null; // Create symbolProxy to build path for each data + + symbolEl.symbolProxy = createSymbol(data.getVisual('symbol'), 0, 0, 0, 0); // Use symbolProxy setColor method + + symbolEl.setColor = symbolEl.symbolProxy.setColor; + var extrudeShadow = symbolEl.shape.size[0] < BOOST_SIZE_THRESHOLD; + symbolEl.useStyle( // Draw shadow when doing fillRect is extremely slow. + hostModel.getModel('itemStyle').getItemStyle(extrudeShadow ? ['color', 'shadowBlur', 'shadowColor'] : ['color'])); + var globalStyle = data.getVisual('style'); + var visualColor = globalStyle && globalStyle.fill; + + if (visualColor) { + symbolEl.setColor(visualColor); + } + + var ecData = getECData(symbolEl); // Enable tooltip + // PENDING May have performance issue when path is extremely large + + ecData.seriesIndex = hostModel.seriesIndex; + symbolEl.on('mousemove', function (e) { + ecData.dataIndex = null; + var dataIndex = symbolEl.hoverDataIdx; + + if (dataIndex >= 0) { + // Provide dataIndex for tooltip + ecData.dataIndex = dataIndex + (symbolEl.startIndex || 0); + } + }); + }; + + LargeSymbolDraw.prototype.remove = function () { + this._clear(); + }; + + LargeSymbolDraw.prototype._clear = function () { + this._newAdded = []; + this.group.removeAll(); + }; + + return LargeSymbolDraw; + }(); + + var ScatterView = + /** @class */ + function (_super) { + __extends(ScatterView, _super); + + function ScatterView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ScatterView.type; + return _this; + } + + ScatterView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var symbolDraw = this._updateSymbolDraw(data, seriesModel); + + symbolDraw.updateData(data, { + // TODO + // If this parameter should be a shape or a bounding volume + // shape will be more general. + // But bounding volume like bounding rect will be much faster in the contain calculation + clipShape: this._getClipShape(seriesModel) + }); + this._finished = true; + }; + + ScatterView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var symbolDraw = this._updateSymbolDraw(data, seriesModel); + + symbolDraw.incrementalPrepareUpdate(data); + this._finished = false; + }; + + ScatterView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) { + this._symbolDraw.incrementalUpdate(taskParams, seriesModel.getData(), { + clipShape: this._getClipShape(seriesModel) + }); + + this._finished = taskParams.end === seriesModel.getData().count(); + }; + + ScatterView.prototype.updateTransform = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); // Must mark group dirty and make sure the incremental layer will be cleared + // PENDING + + this.group.dirty(); + + if (!this._finished || data.count() > 1e4) { + return { + update: true + }; + } else { + var res = pointsLayout('').reset(seriesModel, ecModel, api); + + if (res.progress) { + res.progress({ + start: 0, + end: data.count(), + count: data.count() + }, data); + } + + this._symbolDraw.updateLayout(data); + } + }; + + ScatterView.prototype.eachRendered = function (cb) { + this._symbolDraw && this._symbolDraw.eachRendered(cb); + }; + + ScatterView.prototype._getClipShape = function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var clipArea = coordSys && coordSys.getArea && coordSys.getArea(); + return seriesModel.get('clip', true) ? clipArea : null; + }; + + ScatterView.prototype._updateSymbolDraw = function (data, seriesModel) { + var symbolDraw = this._symbolDraw; + var pipelineContext = seriesModel.pipelineContext; + var isLargeDraw = pipelineContext.large; + + if (!symbolDraw || isLargeDraw !== this._isLargeDraw) { + symbolDraw && symbolDraw.remove(); + symbolDraw = this._symbolDraw = isLargeDraw ? new LargeSymbolDraw() : new SymbolDraw(); + this._isLargeDraw = isLargeDraw; + this.group.removeAll(); + } + + this.group.add(symbolDraw.group); + return symbolDraw; + }; + + ScatterView.prototype.remove = function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(true); + this._symbolDraw = null; + }; + + ScatterView.prototype.dispose = function () {}; + + ScatterView.type = 'scatter'; + return ScatterView; + }(ChartView); + + var GridModel = + /** @class */ + function (_super) { + __extends(GridModel, _super); + + function GridModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + + GridModel.type = 'grid'; + GridModel.dependencies = ['xAxis', 'yAxis']; + GridModel.layoutMode = 'box'; + GridModel.defaultOption = { + show: false, + // zlevel: 0, + z: 0, + left: '10%', + top: 60, + right: '10%', + bottom: 70, + // If grid size contain label + containLabel: false, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + backgroundColor: 'rgba(0,0,0,0)', + borderWidth: 1, + borderColor: '#ccc' + }; + return GridModel; + }(ComponentModel); + + var CartesianAxisModel = + /** @class */ + function (_super) { + __extends(CartesianAxisModel, _super); + + function CartesianAxisModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + + CartesianAxisModel.prototype.getCoordSysModel = function () { + return this.getReferringComponents('grid', SINGLE_REFERRING).models[0]; + }; + + CartesianAxisModel.type = 'cartesian2dAxis'; + return CartesianAxisModel; + }(ComponentModel); + mixin(CartesianAxisModel, AxisModelCommonMixin); + + var defaultOption = { + show: true, + // zlevel: 0, + z: 0, + // Inverse the axis. + inverse: false, + // Axis name displayed. + name: '', + // 'start' | 'middle' | 'end' + nameLocation: 'end', + // By degree. By default auto rotate by nameLocation. + nameRotate: null, + nameTruncate: { + maxWidth: null, + ellipsis: '...', + placeholder: '.' + }, + // Use global text style by default. + nameTextStyle: {}, + // The gap between axisName and axisLine. + nameGap: 15, + // Default `false` to support tooltip. + silent: false, + // Default `false` to avoid legacy user event listener fail. + triggerEvent: false, + tooltip: { + show: false + }, + axisPointer: {}, + axisLine: { + show: true, + onZero: true, + onZeroAxisIndex: null, + lineStyle: { + color: '#6E7079', + width: 1, + type: 'solid' + }, + // The arrow at both ends the the axis. + symbol: ['none', 'none'], + symbolSize: [10, 15] + }, + axisTick: { + show: true, + // Whether axisTick is inside the grid or outside the grid. + inside: false, + // The length of axisTick. + length: 5, + lineStyle: { + width: 1 + } + }, + axisLabel: { + show: true, + // Whether axisLabel is inside the grid or outside the grid. + inside: false, + rotate: 0, + // true | false | null/undefined (auto) + showMinLabel: null, + // true | false | null/undefined (auto) + showMaxLabel: null, + margin: 8, + // formatter: null, + fontSize: 12 + }, + splitLine: { + show: true, + lineStyle: { + color: ['#E0E6F1'], + width: 1, + type: 'solid' + } + }, + splitArea: { + show: false, + areaStyle: { + color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)'] + } + } + }; + var categoryAxis = merge({ + // The gap at both ends of the axis. For categoryAxis, boolean. + boundaryGap: true, + // Set false to faster category collection. + deduplication: null, + // splitArea: { + // show: false + // }, + splitLine: { + show: false + }, + axisTick: { + // If tick is align with label when boundaryGap is true + alignWithLabel: false, + interval: 'auto' + }, + axisLabel: { + interval: 'auto' + } + }, defaultOption); + var valueAxis = merge({ + boundaryGap: [0, 0], + axisLine: { + // Not shown when other axis is categoryAxis in cartesian + show: 'auto' + }, + axisTick: { + // Not shown when other axis is categoryAxis in cartesian + show: 'auto' + }, + // TODO + // min/max: [30, datamin, 60] or [20, datamin] or [datamin, 60] + splitNumber: 5, + minorTick: { + // Minor tick, not available for cateogry axis. + show: false, + // Split number of minor ticks. The value should be in range of (0, 100) + splitNumber: 5, + // Lenght of minor tick + length: 3, + // Line style + lineStyle: {// Default to be same with axisTick + } + }, + minorSplitLine: { + show: false, + lineStyle: { + color: '#F4F7FD', + width: 1 + } + } + }, defaultOption); + var timeAxis = merge({ + splitNumber: 6, + axisLabel: { + // To eliminate labels that are not nice + showMinLabel: false, + showMaxLabel: false, + rich: { + primary: { + fontWeight: 'bold' + } + } + }, + splitLine: { + show: false + } + }, valueAxis); + var logAxis = defaults({ + logBase: 10 + }, valueAxis); + var axisDefault = { + category: categoryAxis, + value: valueAxis, + time: timeAxis, + log: logAxis + }; + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + var AXIS_TYPES = { + value: 1, + category: 1, + time: 1, + log: 1 + }; + + /** + * Generate sub axis model class + * @param axisName 'x' 'y' 'radius' 'angle' 'parallel' ... + */ + + function axisModelCreator(registers, axisName, BaseAxisModelClass, extraDefaultOption) { + each(AXIS_TYPES, function (v, axisType) { + var defaultOption = merge(merge({}, axisDefault[axisType], true), extraDefaultOption, true); + + var AxisModel = + /** @class */ + function (_super) { + __extends(AxisModel, _super); + + function AxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = axisName + 'Axis.' + axisType; + return _this; + } + + AxisModel.prototype.mergeDefaultAndTheme = function (option, ecModel) { + var layoutMode = fetchLayoutMode(this); + var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; + var themeModel = ecModel.getTheme(); + merge(option, themeModel.get(axisType + 'Axis')); + merge(option, this.getDefaultOption()); + option.type = getAxisType(option); + + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }; + + AxisModel.prototype.optionUpdated = function () { + var thisOption = this.option; + + if (thisOption.type === 'category') { + this.__ordinalMeta = OrdinalMeta.createByAxisModel(this); + } + }; + /** + * Should not be called before all of 'getInitailData' finished. + * Because categories are collected during initializing data. + */ + + + AxisModel.prototype.getCategories = function (rawData) { + var option = this.option; // FIXME + // warning if called before all of 'getInitailData' finished. + + if (option.type === 'category') { + if (rawData) { + return option.data; + } + + return this.__ordinalMeta.categories; + } + }; + + AxisModel.prototype.getOrdinalMeta = function () { + return this.__ordinalMeta; + }; + + AxisModel.type = axisName + 'Axis.' + axisType; + AxisModel.defaultOption = defaultOption; + return AxisModel; + }(BaseAxisModelClass); + + registers.registerComponentModel(AxisModel); + }); + registers.registerSubTypeDefaulter(axisName + 'Axis', getAxisType); + } + + function getAxisType(option) { + // Default axis with data is category axis + return option.type || (option.data ? 'category' : 'value'); + } + + var Cartesian = + /** @class */ + function () { + function Cartesian(name) { + this.type = 'cartesian'; + this._dimList = []; + this._axes = {}; + this.name = name || ''; + } + + Cartesian.prototype.getAxis = function (dim) { + return this._axes[dim]; + }; + + Cartesian.prototype.getAxes = function () { + return map(this._dimList, function (dim) { + return this._axes[dim]; + }, this); + }; + + Cartesian.prototype.getAxesByScale = function (scaleType) { + scaleType = scaleType.toLowerCase(); + return filter(this.getAxes(), function (axis) { + return axis.scale.type === scaleType; + }); + }; + + Cartesian.prototype.addAxis = function (axis) { + var dim = axis.dim; + this._axes[dim] = axis; + + this._dimList.push(dim); + }; + + return Cartesian; + }(); + + var cartesian2DDimensions = ['x', 'y']; + + function canCalculateAffineTransform(scale) { + return scale.type === 'interval' || scale.type === 'time'; + } + + var Cartesian2D = + /** @class */ + function (_super) { + __extends(Cartesian2D, _super); + + function Cartesian2D() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'cartesian2d'; + _this.dimensions = cartesian2DDimensions; + return _this; + } + /** + * Calculate an affine transform matrix if two axes are time or value. + * It's mainly for accelartion on the large time series data. + */ + + + Cartesian2D.prototype.calcAffineTransform = function () { + this._transform = this._invTransform = null; + var xAxisScale = this.getAxis('x').scale; + var yAxisScale = this.getAxis('y').scale; + + if (!canCalculateAffineTransform(xAxisScale) || !canCalculateAffineTransform(yAxisScale)) { + return; + } + + var xScaleExtent = xAxisScale.getExtent(); + var yScaleExtent = yAxisScale.getExtent(); + var start = this.dataToPoint([xScaleExtent[0], yScaleExtent[0]]); + var end = this.dataToPoint([xScaleExtent[1], yScaleExtent[1]]); + var xScaleSpan = xScaleExtent[1] - xScaleExtent[0]; + var yScaleSpan = yScaleExtent[1] - yScaleExtent[0]; + + if (!xScaleSpan || !yScaleSpan) { + return; + } // Accelerate data to point calculation on the special large time series data. + + + var scaleX = (end[0] - start[0]) / xScaleSpan; + var scaleY = (end[1] - start[1]) / yScaleSpan; + var translateX = start[0] - xScaleExtent[0] * scaleX; + var translateY = start[1] - yScaleExtent[0] * scaleY; + var m = this._transform = [scaleX, 0, 0, scaleY, translateX, translateY]; + this._invTransform = invert([], m); + }; + /** + * Base axis will be used on stacking. + */ + + + Cartesian2D.prototype.getBaseAxis = function () { + return this.getAxesByScale('ordinal')[0] || this.getAxesByScale('time')[0] || this.getAxis('x'); + }; + + Cartesian2D.prototype.containPoint = function (point) { + var axisX = this.getAxis('x'); + var axisY = this.getAxis('y'); + return axisX.contain(axisX.toLocalCoord(point[0])) && axisY.contain(axisY.toLocalCoord(point[1])); + }; + + Cartesian2D.prototype.containData = function (data) { + return this.getAxis('x').containData(data[0]) && this.getAxis('y').containData(data[1]); + }; + + Cartesian2D.prototype.containZone = function (data1, data2) { + var zoneDiag1 = this.dataToPoint(data1); + var zoneDiag2 = this.dataToPoint(data2); + var area = this.getArea(); + var zone = new BoundingRect(zoneDiag1[0], zoneDiag1[1], zoneDiag2[0] - zoneDiag1[0], zoneDiag2[1] - zoneDiag1[1]); + return area.intersect(zone); + }; + + Cartesian2D.prototype.dataToPoint = function (data, clamp, out) { + out = out || []; + var xVal = data[0]; + var yVal = data[1]; // Fast path + + if (this._transform // It's supported that if data is like `[Inifity, 123]`, where only Y pixel calculated. + && xVal != null && isFinite(xVal) && yVal != null && isFinite(yVal)) { + return applyTransform(out, data, this._transform); + } + + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + out[0] = xAxis.toGlobalCoord(xAxis.dataToCoord(xVal, clamp)); + out[1] = yAxis.toGlobalCoord(yAxis.dataToCoord(yVal, clamp)); + return out; + }; + + Cartesian2D.prototype.clampData = function (data, out) { + var xScale = this.getAxis('x').scale; + var yScale = this.getAxis('y').scale; + var xAxisExtent = xScale.getExtent(); + var yAxisExtent = yScale.getExtent(); + var x = xScale.parse(data[0]); + var y = yScale.parse(data[1]); + out = out || []; + out[0] = Math.min(Math.max(Math.min(xAxisExtent[0], xAxisExtent[1]), x), Math.max(xAxisExtent[0], xAxisExtent[1])); + out[1] = Math.min(Math.max(Math.min(yAxisExtent[0], yAxisExtent[1]), y), Math.max(yAxisExtent[0], yAxisExtent[1])); + return out; + }; + + Cartesian2D.prototype.pointToData = function (point, clamp) { + var out = []; + + if (this._invTransform) { + return applyTransform(out, point, this._invTransform); + } + + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + out[0] = xAxis.coordToData(xAxis.toLocalCoord(point[0]), clamp); + out[1] = yAxis.coordToData(yAxis.toLocalCoord(point[1]), clamp); + return out; + }; + + Cartesian2D.prototype.getOtherAxis = function (axis) { + return this.getAxis(axis.dim === 'x' ? 'y' : 'x'); + }; + /** + * Get rect area of cartesian. + * Area will have a contain function to determine if a point is in the coordinate system. + */ + + + Cartesian2D.prototype.getArea = function () { + var xExtent = this.getAxis('x').getGlobalExtent(); + var yExtent = this.getAxis('y').getGlobalExtent(); + var x = Math.min(xExtent[0], xExtent[1]); + var y = Math.min(yExtent[0], yExtent[1]); + var width = Math.max(xExtent[0], xExtent[1]) - x; + var height = Math.max(yExtent[0], yExtent[1]) - y; + return new BoundingRect(x, y, width, height); + }; + + return Cartesian2D; + }(Cartesian); + + var Axis2D = + /** @class */ + function (_super) { + __extends(Axis2D, _super); + + function Axis2D(dim, scale, coordExtent, axisType, position) { + var _this = _super.call(this, dim, scale, coordExtent) || this; + /** + * Index of axis, can be used as key + * Injected outside. + */ + + + _this.index = 0; + _this.type = axisType || 'value'; + _this.position = position || 'bottom'; + return _this; + } + + Axis2D.prototype.isHorizontal = function () { + var position = this.position; + return position === 'top' || position === 'bottom'; + }; + /** + * Each item cooresponds to this.getExtent(), which + * means globalExtent[0] may greater than globalExtent[1], + * unless `asc` is input. + * + * @param {boolean} [asc] + * @return {Array.<number>} + */ + + + Axis2D.prototype.getGlobalExtent = function (asc) { + var ret = this.getExtent(); + ret[0] = this.toGlobalCoord(ret[0]); + ret[1] = this.toGlobalCoord(ret[1]); + asc && ret[0] > ret[1] && ret.reverse(); + return ret; + }; + + Axis2D.prototype.pointToData = function (point, clamp) { + return this.coordToData(this.toLocalCoord(point[this.dim === 'x' ? 0 : 1]), clamp); + }; + /** + * Set ordinalSortInfo + * @param info new OrdinalSortInfo + */ + + + Axis2D.prototype.setCategorySortInfo = function (info) { + if (this.type !== 'category') { + return false; + } + + this.model.option.categorySortInfo = info; + this.scale.setSortInfo(info); + }; + + return Axis2D; + }(Axis); + + /** + * Can only be called after coordinate system creation stage. + * (Can be called before coordinate system update stage). + */ + + function layout$1(gridModel, axisModel, opt) { + opt = opt || {}; + var grid = gridModel.coordinateSystem; + var axis = axisModel.axis; + var layout = {}; + var otherAxisOnZeroOf = axis.getAxesOnZeroOf()[0]; + var rawAxisPosition = axis.position; + var axisPosition = otherAxisOnZeroOf ? 'onZero' : rawAxisPosition; + var axisDim = axis.dim; + var rect = grid.getRect(); + var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height]; + var idx = { + left: 0, + right: 1, + top: 0, + bottom: 1, + onZero: 2 + }; + var axisOffset = axisModel.get('offset') || 0; + var posBound = axisDim === 'x' ? [rectBound[2] - axisOffset, rectBound[3] + axisOffset] : [rectBound[0] - axisOffset, rectBound[1] + axisOffset]; + + if (otherAxisOnZeroOf) { + var onZeroCoord = otherAxisOnZeroOf.toGlobalCoord(otherAxisOnZeroOf.dataToCoord(0)); + posBound[idx.onZero] = Math.max(Math.min(onZeroCoord, posBound[1]), posBound[0]); + } // Axis position + + + layout.position = [axisDim === 'y' ? posBound[idx[axisPosition]] : rectBound[0], axisDim === 'x' ? posBound[idx[axisPosition]] : rectBound[3]]; // Axis rotation + + layout.rotation = Math.PI / 2 * (axisDim === 'x' ? 0 : 1); // Tick and label direction, x y is axisDim + + var dirMap = { + top: -1, + bottom: 1, + left: -1, + right: 1 + }; + layout.labelDirection = layout.tickDirection = layout.nameDirection = dirMap[rawAxisPosition]; + layout.labelOffset = otherAxisOnZeroOf ? posBound[idx[rawAxisPosition]] - posBound[idx.onZero] : 0; + + if (axisModel.get(['axisTick', 'inside'])) { + layout.tickDirection = -layout.tickDirection; + } + + if (retrieve(opt.labelInside, axisModel.get(['axisLabel', 'inside']))) { + layout.labelDirection = -layout.labelDirection; + } // Special label rotation + + + var labelRotate = axisModel.get(['axisLabel', 'rotate']); + layout.labelRotate = axisPosition === 'top' ? -labelRotate : labelRotate; // Over splitLine and splitArea + + layout.z2 = 1; + return layout; + } + function isCartesian2DSeries(seriesModel) { + return seriesModel.get('coordinateSystem') === 'cartesian2d'; + } + function findAxisModels(seriesModel) { + var axisModelMap = { + xAxisModel: null, + yAxisModel: null + }; + each(axisModelMap, function (v, key) { + var axisType = key.replace(/Model$/, ''); + var axisModel = seriesModel.getReferringComponents(axisType, SINGLE_REFERRING).models[0]; + + if ("development" !== 'production') { + if (!axisModel) { + throw new Error(axisType + ' "' + retrieve3(seriesModel.get(axisType + 'Index'), seriesModel.get(axisType + 'Id'), 0) + '" not found'); + } + } + + axisModelMap[key] = axisModel; + }); + return axisModelMap; + } + + var mathLog$1 = Math.log; + function alignScaleTicks(scale, axisModel, alignToScale) { + var intervalScaleProto = IntervalScale.prototype; // NOTE: There is a precondition for log scale here: + // In log scale we store _interval and _extent of exponent value. + // So if we use the method of InternalScale to set/get these data. + // It process the exponent value, which is linear and what we want here. + + var alignToTicks = intervalScaleProto.getTicks.call(alignToScale); + var alignToNicedTicks = intervalScaleProto.getTicks.call(alignToScale, true); + var alignToSplitNumber = alignToTicks.length - 1; + var alignToInterval = intervalScaleProto.getInterval.call(alignToScale); + var scaleExtent = getScaleExtent(scale, axisModel); + var rawExtent = scaleExtent.extent; + var isMinFixed = scaleExtent.fixMin; + var isMaxFixed = scaleExtent.fixMax; + + if (scale.type === 'log') { + var logBase = mathLog$1(scale.base); + rawExtent = [mathLog$1(rawExtent[0]) / logBase, mathLog$1(rawExtent[1]) / logBase]; + } + + scale.setExtent(rawExtent[0], rawExtent[1]); + scale.calcNiceExtent({ + splitNumber: alignToSplitNumber, + fixMin: isMinFixed, + fixMax: isMaxFixed + }); + var extent = intervalScaleProto.getExtent.call(scale); // Need to update the rawExtent. + // Because value in rawExtent may be not parsed. e.g. 'dataMin', 'dataMax' + + if (isMinFixed) { + rawExtent[0] = extent[0]; + } + + if (isMaxFixed) { + rawExtent[1] = extent[1]; + } + + var interval = intervalScaleProto.getInterval.call(scale); + var min = rawExtent[0]; + var max = rawExtent[1]; + + if (isMinFixed && isMaxFixed) { + // User set min, max, divide to get new interval + interval = (max - min) / alignToSplitNumber; + } else if (isMinFixed) { + max = rawExtent[0] + interval * alignToSplitNumber; // User set min, expand extent on the other side + + while (max < rawExtent[1] && isFinite(max) && isFinite(rawExtent[1])) { + interval = increaseInterval(interval); + max = rawExtent[0] + interval * alignToSplitNumber; + } + } else if (isMaxFixed) { + // User set max, expand extent on the other side + min = rawExtent[1] - interval * alignToSplitNumber; + + while (min > rawExtent[0] && isFinite(min) && isFinite(rawExtent[0])) { + interval = increaseInterval(interval); + min = rawExtent[1] - interval * alignToSplitNumber; + } + } else { + var nicedSplitNumber = scale.getTicks().length - 1; + + if (nicedSplitNumber > alignToSplitNumber) { + interval = increaseInterval(interval); + } + + var range = interval * alignToSplitNumber; + max = Math.ceil(rawExtent[1] / interval) * interval; + min = round(max - range); // Not change the result that crossing zero. + + if (min < 0 && rawExtent[0] >= 0) { + min = 0; + max = round(range); + } else if (max > 0 && rawExtent[1] <= 0) { + max = 0; + min = -round(range); + } + } // Adjust min, max based on the extent of alignTo. When min or max is set in alignTo scale + + + var t0 = (alignToTicks[0].value - alignToNicedTicks[0].value) / alignToInterval; + var t1 = (alignToTicks[alignToSplitNumber].value - alignToNicedTicks[alignToSplitNumber].value) / alignToInterval; // NOTE: Must in setExtent -> setInterval -> setNiceExtent order. + + intervalScaleProto.setExtent.call(scale, min + interval * t0, max + interval * t1); + intervalScaleProto.setInterval.call(scale, interval); + + if (t0 || t1) { + intervalScaleProto.setNiceExtent.call(scale, min + interval, max - interval); + } + + if ("development" !== 'production') { + var ticks = intervalScaleProto.getTicks.call(scale); + + if (ticks[1] && (!isValueNice(interval) || getPrecisionSafe(ticks[1].value) > getPrecisionSafe(interval))) { + warn( // eslint-disable-next-line + "The ticks may be not readable when set min: " + axisModel.get('min') + ", max: " + axisModel.get('max') + " and alignTicks: true"); + } + } + } + + var Grid = + /** @class */ + function () { + function Grid(gridModel, ecModel, api) { + // FIXME:TS where used (different from registered type 'cartesian2d')? + this.type = 'grid'; + this._coordsMap = {}; + this._coordsList = []; + this._axesMap = {}; + this._axesList = []; + this.axisPointerEnabled = true; + this.dimensions = cartesian2DDimensions; + + this._initCartesian(gridModel, ecModel, api); + + this.model = gridModel; + } + + Grid.prototype.getRect = function () { + return this._rect; + }; + + Grid.prototype.update = function (ecModel, api) { + var axesMap = this._axesMap; + + this._updateScale(ecModel, this.model); + + function updateAxisTicks(axes) { + var alignTo; // Axis is added in order of axisIndex. + + var axesIndices = keys(axes); + var len = axesIndices.length; + + if (!len) { + return; + } + + var axisNeedsAlign = []; // Process once and calculate the ticks for those don't use alignTicks. + + for (var i = len - 1; i >= 0; i--) { + var idx = +axesIndices[i]; // Convert to number. + + var axis = axes[idx]; + var model = axis.model; + var scale = axis.scale; + + if ( // Only value and log axis without interval support alignTicks. + isIntervalOrLogScale(scale) && model.get('alignTicks') && model.get('interval') == null) { + axisNeedsAlign.push(axis); + } else { + niceScaleExtent(scale, model); + + if (isIntervalOrLogScale(scale)) { + // Can only align to interval or log axis. + alignTo = axis; + } + } + } + // PENDING. Should we find the axis that both set interval, min, max and align to this one? + + if (axisNeedsAlign.length) { + if (!alignTo) { + alignTo = axisNeedsAlign.pop(); + niceScaleExtent(alignTo.scale, alignTo.model); + } + + each(axisNeedsAlign, function (axis) { + alignScaleTicks(axis.scale, axis.model, alignTo.scale); + }); + } + } + + updateAxisTicks(axesMap.x); + updateAxisTicks(axesMap.y); // Key: axisDim_axisIndex, value: boolean, whether onZero target. + + var onZeroRecords = {}; + each(axesMap.x, function (xAxis) { + fixAxisOnZero(axesMap, 'y', xAxis, onZeroRecords); + }); + each(axesMap.y, function (yAxis) { + fixAxisOnZero(axesMap, 'x', yAxis, onZeroRecords); + }); // Resize again if containLabel is enabled + // FIXME It may cause getting wrong grid size in data processing stage + + this.resize(this.model, api); + }; + /** + * Resize the grid + */ + + + Grid.prototype.resize = function (gridModel, api, ignoreContainLabel) { + var boxLayoutParams = gridModel.getBoxLayoutParams(); + var isContainLabel = !ignoreContainLabel && gridModel.get('containLabel'); + var gridRect = getLayoutRect(boxLayoutParams, { + width: api.getWidth(), + height: api.getHeight() + }); + this._rect = gridRect; + var axesList = this._axesList; + adjustAxes(); // Minus label size + + if (isContainLabel) { + each(axesList, function (axis) { + if (!axis.model.get(['axisLabel', 'inside'])) { + var labelUnionRect = estimateLabelUnionRect(axis); + + if (labelUnionRect) { + var dim = axis.isHorizontal() ? 'height' : 'width'; + var margin = axis.model.get(['axisLabel', 'margin']); + gridRect[dim] -= labelUnionRect[dim] + margin; + + if (axis.position === 'top') { + gridRect.y += labelUnionRect.height + margin; + } else if (axis.position === 'left') { + gridRect.x += labelUnionRect.width + margin; + } + } + } + }); + adjustAxes(); + } + + each(this._coordsList, function (coord) { + // Calculate affine matrix to accelerate the data to point transform. + // If all the axes scales are time or value. + coord.calcAffineTransform(); + }); + + function adjustAxes() { + each(axesList, function (axis) { + var isHorizontal = axis.isHorizontal(); + var extent = isHorizontal ? [0, gridRect.width] : [0, gridRect.height]; + var idx = axis.inverse ? 1 : 0; + axis.setExtent(extent[idx], extent[1 - idx]); + updateAxisTransform(axis, isHorizontal ? gridRect.x : gridRect.y); + }); + } + }; + + Grid.prototype.getAxis = function (dim, axisIndex) { + var axesMapOnDim = this._axesMap[dim]; + + if (axesMapOnDim != null) { + return axesMapOnDim[axisIndex || 0]; + } + }; + + Grid.prototype.getAxes = function () { + return this._axesList.slice(); + }; + + Grid.prototype.getCartesian = function (xAxisIndex, yAxisIndex) { + if (xAxisIndex != null && yAxisIndex != null) { + var key = 'x' + xAxisIndex + 'y' + yAxisIndex; + return this._coordsMap[key]; + } + + if (isObject(xAxisIndex)) { + yAxisIndex = xAxisIndex.yAxisIndex; + xAxisIndex = xAxisIndex.xAxisIndex; + } + + for (var i = 0, coordList = this._coordsList; i < coordList.length; i++) { + if (coordList[i].getAxis('x').index === xAxisIndex || coordList[i].getAxis('y').index === yAxisIndex) { + return coordList[i]; + } + } + }; + + Grid.prototype.getCartesians = function () { + return this._coordsList.slice(); + }; + /** + * @implements + */ + + + Grid.prototype.convertToPixel = function (ecModel, finder, value) { + var target = this._findConvertTarget(finder); + + return target.cartesian ? target.cartesian.dataToPoint(value) : target.axis ? target.axis.toGlobalCoord(target.axis.dataToCoord(value)) : null; + }; + /** + * @implements + */ + + + Grid.prototype.convertFromPixel = function (ecModel, finder, value) { + var target = this._findConvertTarget(finder); + + return target.cartesian ? target.cartesian.pointToData(value) : target.axis ? target.axis.coordToData(target.axis.toLocalCoord(value)) : null; + }; + + Grid.prototype._findConvertTarget = function (finder) { + var seriesModel = finder.seriesModel; + var xAxisModel = finder.xAxisModel || seriesModel && seriesModel.getReferringComponents('xAxis', SINGLE_REFERRING).models[0]; + var yAxisModel = finder.yAxisModel || seriesModel && seriesModel.getReferringComponents('yAxis', SINGLE_REFERRING).models[0]; + var gridModel = finder.gridModel; + var coordsList = this._coordsList; + var cartesian; + var axis; + + if (seriesModel) { + cartesian = seriesModel.coordinateSystem; + indexOf(coordsList, cartesian) < 0 && (cartesian = null); + } else if (xAxisModel && yAxisModel) { + cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); + } else if (xAxisModel) { + axis = this.getAxis('x', xAxisModel.componentIndex); + } else if (yAxisModel) { + axis = this.getAxis('y', yAxisModel.componentIndex); + } // Lowest priority. + else if (gridModel) { + var grid = gridModel.coordinateSystem; + + if (grid === this) { + cartesian = this._coordsList[0]; + } + } + + return { + cartesian: cartesian, + axis: axis + }; + }; + /** + * @implements + */ + + + Grid.prototype.containPoint = function (point) { + var coord = this._coordsList[0]; + + if (coord) { + return coord.containPoint(point); + } + }; + /** + * Initialize cartesian coordinate systems + */ + + + Grid.prototype._initCartesian = function (gridModel, ecModel, api) { + var _this = this; + + var grid = this; + var axisPositionUsed = { + left: false, + right: false, + top: false, + bottom: false + }; + var axesMap = { + x: {}, + y: {} + }; + var axesCount = { + x: 0, + y: 0 + }; /// Create axis + + ecModel.eachComponent('xAxis', createAxisCreator('x'), this); + ecModel.eachComponent('yAxis', createAxisCreator('y'), this); + + if (!axesCount.x || !axesCount.y) { + // Roll back when there no either x or y axis + this._axesMap = {}; + this._axesList = []; + return; + } + + this._axesMap = axesMap; /// Create cartesian2d + + each(axesMap.x, function (xAxis, xAxisIndex) { + each(axesMap.y, function (yAxis, yAxisIndex) { + var key = 'x' + xAxisIndex + 'y' + yAxisIndex; + var cartesian = new Cartesian2D(key); + cartesian.master = _this; + cartesian.model = gridModel; + _this._coordsMap[key] = cartesian; + + _this._coordsList.push(cartesian); + + cartesian.addAxis(xAxis); + cartesian.addAxis(yAxis); + }); + }); + + function createAxisCreator(dimName) { + return function (axisModel, idx) { + if (!isAxisUsedInTheGrid(axisModel, gridModel)) { + return; + } + + var axisPosition = axisModel.get('position'); + + if (dimName === 'x') { + // Fix position + if (axisPosition !== 'top' && axisPosition !== 'bottom') { + // Default bottom of X + axisPosition = axisPositionUsed.bottom ? 'top' : 'bottom'; + } + } else { + // Fix position + if (axisPosition !== 'left' && axisPosition !== 'right') { + // Default left of Y + axisPosition = axisPositionUsed.left ? 'right' : 'left'; + } + } + + axisPositionUsed[axisPosition] = true; + var axis = new Axis2D(dimName, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisPosition); + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); // Inject axis into axisModel + + axisModel.axis = axis; // Inject axisModel into axis + + axis.model = axisModel; // Inject grid info axis + + axis.grid = grid; // Index of axis, can be used as key + + axis.index = idx; + + grid._axesList.push(axis); + + axesMap[dimName][idx] = axis; + axesCount[dimName]++; + }; + } + }; + /** + * Update cartesian properties from series. + */ + + + Grid.prototype._updateScale = function (ecModel, gridModel) { + // Reset scale + each(this._axesList, function (axis) { + axis.scale.setExtent(Infinity, -Infinity); + + if (axis.type === 'category') { + var categorySortInfo = axis.model.get('categorySortInfo'); + axis.scale.setSortInfo(categorySortInfo); + } + }); + ecModel.eachSeries(function (seriesModel) { + if (isCartesian2DSeries(seriesModel)) { + var axesModelMap = findAxisModels(seriesModel); + var xAxisModel = axesModelMap.xAxisModel; + var yAxisModel = axesModelMap.yAxisModel; + + if (!isAxisUsedInTheGrid(xAxisModel, gridModel) || !isAxisUsedInTheGrid(yAxisModel, gridModel)) { + return; + } + + var cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); + var data = seriesModel.getData(); + var xAxis = cartesian.getAxis('x'); + var yAxis = cartesian.getAxis('y'); + unionExtent(data, xAxis); + unionExtent(data, yAxis); + } + }, this); + + function unionExtent(data, axis) { + each(getDataDimensionsOnAxis(data, axis.dim), function (dim) { + axis.scale.unionExtentFromData(data, dim); + }); + } + }; + /** + * @param dim 'x' or 'y' or 'auto' or null/undefined + */ + + + Grid.prototype.getTooltipAxes = function (dim) { + var baseAxes = []; + var otherAxes = []; + each(this.getCartesians(), function (cartesian) { + var baseAxis = dim != null && dim !== 'auto' ? cartesian.getAxis(dim) : cartesian.getBaseAxis(); + var otherAxis = cartesian.getOtherAxis(baseAxis); + indexOf(baseAxes, baseAxis) < 0 && baseAxes.push(baseAxis); + indexOf(otherAxes, otherAxis) < 0 && otherAxes.push(otherAxis); + }); + return { + baseAxes: baseAxes, + otherAxes: otherAxes + }; + }; + + Grid.create = function (ecModel, api) { + var grids = []; + ecModel.eachComponent('grid', function (gridModel, idx) { + var grid = new Grid(gridModel, ecModel, api); + grid.name = 'grid_' + idx; // dataSampling requires axis extent, so resize + // should be performed in create stage. + + grid.resize(gridModel, api, true); + gridModel.coordinateSystem = grid; + grids.push(grid); + }); // Inject the coordinateSystems into seriesModel + + ecModel.eachSeries(function (seriesModel) { + if (!isCartesian2DSeries(seriesModel)) { + return; + } + + var axesModelMap = findAxisModels(seriesModel); + var xAxisModel = axesModelMap.xAxisModel; + var yAxisModel = axesModelMap.yAxisModel; + var gridModel = xAxisModel.getCoordSysModel(); + + if ("development" !== 'production') { + if (!gridModel) { + throw new Error('Grid "' + retrieve3(xAxisModel.get('gridIndex'), xAxisModel.get('gridId'), 0) + '" not found'); + } + + if (xAxisModel.getCoordSysModel() !== yAxisModel.getCoordSysModel()) { + throw new Error('xAxis and yAxis must use the same grid'); + } + } + + var grid = gridModel.coordinateSystem; + seriesModel.coordinateSystem = grid.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); + }); + return grids; + }; // For deciding which dimensions to use when creating list data + + + Grid.dimensions = cartesian2DDimensions; + return Grid; + }(); + /** + * Check if the axis is used in the specified grid. + */ + + + function isAxisUsedInTheGrid(axisModel, gridModel) { + return axisModel.getCoordSysModel() === gridModel; + } + + function fixAxisOnZero(axesMap, otherAxisDim, axis, // Key: see `getOnZeroRecordKey` + onZeroRecords) { + axis.getAxesOnZeroOf = function () { + // TODO: onZero of multiple axes. + return otherAxisOnZeroOf ? [otherAxisOnZeroOf] : []; + }; // onZero can not be enabled in these two situations: + // 1. When any other axis is a category axis. + // 2. When no axis is cross 0 point. + + + var otherAxes = axesMap[otherAxisDim]; + var otherAxisOnZeroOf; + var axisModel = axis.model; + var onZero = axisModel.get(['axisLine', 'onZero']); + var onZeroAxisIndex = axisModel.get(['axisLine', 'onZeroAxisIndex']); + + if (!onZero) { + return; + } // If target axis is specified. + + + if (onZeroAxisIndex != null) { + if (canOnZeroToAxis(otherAxes[onZeroAxisIndex])) { + otherAxisOnZeroOf = otherAxes[onZeroAxisIndex]; + } + } else { + // Find the first available other axis. + for (var idx in otherAxes) { + if (otherAxes.hasOwnProperty(idx) && canOnZeroToAxis(otherAxes[idx]) // Consider that two Y axes on one value axis, + // if both onZero, the two Y axes overlap. + && !onZeroRecords[getOnZeroRecordKey(otherAxes[idx])]) { + otherAxisOnZeroOf = otherAxes[idx]; + break; + } + } + } + + if (otherAxisOnZeroOf) { + onZeroRecords[getOnZeroRecordKey(otherAxisOnZeroOf)] = true; + } + + function getOnZeroRecordKey(axis) { + return axis.dim + '_' + axis.index; + } + } + + function canOnZeroToAxis(axis) { + return axis && axis.type !== 'category' && axis.type !== 'time' && ifAxisCrossZero(axis); + } + + function updateAxisTransform(axis, coordBase) { + var axisExtent = axis.getExtent(); + var axisExtentSum = axisExtent[0] + axisExtent[1]; // Fast transform + + axis.toGlobalCoord = axis.dim === 'x' ? function (coord) { + return coord + coordBase; + } : function (coord) { + return axisExtentSum - coord + coordBase; + }; + axis.toLocalCoord = axis.dim === 'x' ? function (coord) { + return coord - coordBase; + } : function (coord) { + return axisExtentSum - coord + coordBase; + }; + } + + var PI$5 = Math.PI; + /** + * A final axis is translated and rotated from a "standard axis". + * So opt.position and opt.rotation is required. + * + * A standard axis is and axis from [0, 0] to [0, axisExtent[1]], + * for example: (0, 0) ------------> (0, 50) + * + * nameDirection or tickDirection or labelDirection is 1 means tick + * or label is below the standard axis, whereas is -1 means above + * the standard axis. labelOffset means offset between label and axis, + * which is useful when 'onZero', where axisLabel is in the grid and + * label in outside grid. + * + * Tips: like always, + * positive rotation represents anticlockwise, and negative rotation + * represents clockwise. + * The direction of position coordinate is the same as the direction + * of screen coordinate. + * + * Do not need to consider axis 'inverse', which is auto processed by + * axis extent. + */ + + var AxisBuilder = + /** @class */ + function () { + function AxisBuilder(axisModel, opt) { + this.group = new Group(); + this.opt = opt; + this.axisModel = axisModel; // Default value + + defaults(opt, { + labelOffset: 0, + nameDirection: 1, + tickDirection: 1, + labelDirection: 1, + silent: true, + handleAutoShown: function () { + return true; + } + }); // FIXME Not use a seperate text group? + + var transformGroup = new Group({ + x: opt.position[0], + y: opt.position[1], + rotation: opt.rotation + }); // this.group.add(transformGroup); + // this._transformGroup = transformGroup; + + transformGroup.updateTransform(); + this._transformGroup = transformGroup; + } + + AxisBuilder.prototype.hasBuilder = function (name) { + return !!builders[name]; + }; + + AxisBuilder.prototype.add = function (name) { + builders[name](this.opt, this.axisModel, this.group, this._transformGroup); + }; + + AxisBuilder.prototype.getGroup = function () { + return this.group; + }; + + AxisBuilder.innerTextLayout = function (axisRotation, textRotation, direction) { + var rotationDiff = remRadian(textRotation - axisRotation); + var textAlign; + var textVerticalAlign; + + if (isRadianAroundZero(rotationDiff)) { + // Label is parallel with axis line. + textVerticalAlign = direction > 0 ? 'top' : 'bottom'; + textAlign = 'center'; + } else if (isRadianAroundZero(rotationDiff - PI$5)) { + // Label is inverse parallel with axis line. + textVerticalAlign = direction > 0 ? 'bottom' : 'top'; + textAlign = 'center'; + } else { + textVerticalAlign = 'middle'; + + if (rotationDiff > 0 && rotationDiff < PI$5) { + textAlign = direction > 0 ? 'right' : 'left'; + } else { + textAlign = direction > 0 ? 'left' : 'right'; + } + } + + return { + rotation: rotationDiff, + textAlign: textAlign, + textVerticalAlign: textVerticalAlign + }; + }; + + AxisBuilder.makeAxisEventDataBase = function (axisModel) { + var eventData = { + componentType: axisModel.mainType, + componentIndex: axisModel.componentIndex + }; + eventData[axisModel.mainType + 'Index'] = axisModel.componentIndex; + return eventData; + }; + + AxisBuilder.isLabelSilent = function (axisModel) { + var tooltipOpt = axisModel.get('tooltip'); + return axisModel.get('silent') // Consider mouse cursor, add these restrictions. + || !(axisModel.get('triggerEvent') || tooltipOpt && tooltipOpt.show); + }; + + return AxisBuilder; + }(); + var builders = { + axisLine: function (opt, axisModel, group, transformGroup) { + var shown = axisModel.get(['axisLine', 'show']); + + if (shown === 'auto' && opt.handleAutoShown) { + shown = opt.handleAutoShown('axisLine'); + } + + if (!shown) { + return; + } + + var extent = axisModel.axis.getExtent(); + var matrix = transformGroup.transform; + var pt1 = [extent[0], 0]; + var pt2 = [extent[1], 0]; + + if (matrix) { + applyTransform(pt1, pt1, matrix); + applyTransform(pt2, pt2, matrix); + } + + var lineStyle = extend({ + lineCap: 'round' + }, axisModel.getModel(['axisLine', 'lineStyle']).getLineStyle()); + var line = new Line({ + // Id for animation + subPixelOptimize: true, + shape: { + x1: pt1[0], + y1: pt1[1], + x2: pt2[0], + y2: pt2[1] + }, + style: lineStyle, + strokeContainThreshold: opt.strokeContainThreshold || 5, + silent: true, + z2: 1 + }); + line.anid = 'line'; + group.add(line); + var arrows = axisModel.get(['axisLine', 'symbol']); + + if (arrows != null) { + var arrowSize = axisModel.get(['axisLine', 'symbolSize']); + + if (isString(arrows)) { + // Use the same arrow for start and end point + arrows = [arrows, arrows]; + } + + if (isString(arrowSize) || isNumber(arrowSize)) { + // Use the same size for width and height + arrowSize = [arrowSize, arrowSize]; + } + + var arrowOffset = normalizeSymbolOffset(axisModel.get(['axisLine', 'symbolOffset']) || 0, arrowSize); + var symbolWidth_1 = arrowSize[0]; + var symbolHeight_1 = arrowSize[1]; + each([{ + rotate: opt.rotation + Math.PI / 2, + offset: arrowOffset[0], + r: 0 + }, { + rotate: opt.rotation - Math.PI / 2, + offset: arrowOffset[1], + r: Math.sqrt((pt1[0] - pt2[0]) * (pt1[0] - pt2[0]) + (pt1[1] - pt2[1]) * (pt1[1] - pt2[1])) + }], function (point, index) { + if (arrows[index] !== 'none' && arrows[index] != null) { + var symbol = createSymbol(arrows[index], -symbolWidth_1 / 2, -symbolHeight_1 / 2, symbolWidth_1, symbolHeight_1, lineStyle.stroke, true); // Calculate arrow position with offset + + var r = point.r + point.offset; + symbol.attr({ + rotation: point.rotate, + x: pt1[0] + r * Math.cos(opt.rotation), + y: pt1[1] - r * Math.sin(opt.rotation), + silent: true, + z2: 11 + }); + group.add(symbol); + } + }); + } + }, + axisTickLabel: function (opt, axisModel, group, transformGroup) { + var ticksEls = buildAxisMajorTicks(group, transformGroup, axisModel, opt); + var labelEls = buildAxisLabel(group, transformGroup, axisModel, opt); + fixMinMaxLabelShow(axisModel, labelEls, ticksEls); + buildAxisMinorTicks(group, transformGroup, axisModel, opt.tickDirection); // This bit fixes the label overlap issue for the time chart. + // See https://github.com/apache/echarts/issues/14266 for more. + + if (axisModel.get(['axisLabel', 'hideOverlap'])) { + var labelList = prepareLayoutList(map(labelEls, function (label) { + return { + label: label, + priority: label.z2, + defaultAttr: { + ignore: label.ignore + } + }; + })); + hideOverlap(labelList); + } + }, + axisName: function (opt, axisModel, group, transformGroup) { + var name = retrieve(opt.axisName, axisModel.get('name')); + + if (!name) { + return; + } + + var nameLocation = axisModel.get('nameLocation'); + var nameDirection = opt.nameDirection; + var textStyleModel = axisModel.getModel('nameTextStyle'); + var gap = axisModel.get('nameGap') || 0; + var extent = axisModel.axis.getExtent(); + var gapSignal = extent[0] > extent[1] ? -1 : 1; + var pos = [nameLocation === 'start' ? extent[0] - gapSignal * gap : nameLocation === 'end' ? extent[1] + gapSignal * gap : (extent[0] + extent[1]) / 2, // Reuse labelOffset. + isNameLocationCenter(nameLocation) ? opt.labelOffset + nameDirection * gap : 0]; + var labelLayout; + var nameRotation = axisModel.get('nameRotate'); + + if (nameRotation != null) { + nameRotation = nameRotation * PI$5 / 180; // To radian. + } + + var axisNameAvailableWidth; + + if (isNameLocationCenter(nameLocation)) { + labelLayout = AxisBuilder.innerTextLayout(opt.rotation, nameRotation != null ? nameRotation : opt.rotation, // Adapt to axis. + nameDirection); + } else { + labelLayout = endTextLayout(opt.rotation, nameLocation, nameRotation || 0, extent); + axisNameAvailableWidth = opt.axisNameAvailableWidth; + + if (axisNameAvailableWidth != null) { + axisNameAvailableWidth = Math.abs(axisNameAvailableWidth / Math.sin(labelLayout.rotation)); + !isFinite(axisNameAvailableWidth) && (axisNameAvailableWidth = null); + } + } + + var textFont = textStyleModel.getFont(); + var truncateOpt = axisModel.get('nameTruncate', true) || {}; + var ellipsis = truncateOpt.ellipsis; + var maxWidth = retrieve(opt.nameTruncateMaxWidth, truncateOpt.maxWidth, axisNameAvailableWidth); + var textEl = new ZRText({ + x: pos[0], + y: pos[1], + rotation: labelLayout.rotation, + silent: AxisBuilder.isLabelSilent(axisModel), + style: createTextStyle(textStyleModel, { + text: name, + font: textFont, + overflow: 'truncate', + width: maxWidth, + ellipsis: ellipsis, + fill: textStyleModel.getTextColor() || axisModel.get(['axisLine', 'lineStyle', 'color']), + align: textStyleModel.get('align') || labelLayout.textAlign, + verticalAlign: textStyleModel.get('verticalAlign') || labelLayout.textVerticalAlign + }), + z2: 1 + }); + setTooltipConfig({ + el: textEl, + componentModel: axisModel, + itemName: name + }); + textEl.__fullText = name; // Id for animation + + textEl.anid = 'name'; + + if (axisModel.get('triggerEvent')) { + var eventData = AxisBuilder.makeAxisEventDataBase(axisModel); + eventData.targetType = 'axisName'; + eventData.name = name; + getECData(textEl).eventData = eventData; + } // FIXME + + + transformGroup.add(textEl); + textEl.updateTransform(); + group.add(textEl); + textEl.decomposeTransform(); + } + }; + + function endTextLayout(rotation, textPosition, textRotate, extent) { + var rotationDiff = remRadian(textRotate - rotation); + var textAlign; + var textVerticalAlign; + var inverse = extent[0] > extent[1]; + var onLeft = textPosition === 'start' && !inverse || textPosition !== 'start' && inverse; + + if (isRadianAroundZero(rotationDiff - PI$5 / 2)) { + textVerticalAlign = onLeft ? 'bottom' : 'top'; + textAlign = 'center'; + } else if (isRadianAroundZero(rotationDiff - PI$5 * 1.5)) { + textVerticalAlign = onLeft ? 'top' : 'bottom'; + textAlign = 'center'; + } else { + textVerticalAlign = 'middle'; + + if (rotationDiff < PI$5 * 1.5 && rotationDiff > PI$5 / 2) { + textAlign = onLeft ? 'left' : 'right'; + } else { + textAlign = onLeft ? 'right' : 'left'; + } + } + + return { + rotation: rotationDiff, + textAlign: textAlign, + textVerticalAlign: textVerticalAlign + }; + } + + function fixMinMaxLabelShow(axisModel, labelEls, tickEls) { + if (shouldShowAllLabels(axisModel.axis)) { + return; + } // If min or max are user set, we need to check + // If the tick on min(max) are overlap on their neighbour tick + // If they are overlapped, we need to hide the min(max) tick label + + + var showMinLabel = axisModel.get(['axisLabel', 'showMinLabel']); + var showMaxLabel = axisModel.get(['axisLabel', 'showMaxLabel']); // FIXME + // Have not consider onBand yet, where tick els is more than label els. + + labelEls = labelEls || []; + tickEls = tickEls || []; + var firstLabel = labelEls[0]; + var nextLabel = labelEls[1]; + var lastLabel = labelEls[labelEls.length - 1]; + var prevLabel = labelEls[labelEls.length - 2]; + var firstTick = tickEls[0]; + var nextTick = tickEls[1]; + var lastTick = tickEls[tickEls.length - 1]; + var prevTick = tickEls[tickEls.length - 2]; + + if (showMinLabel === false) { + ignoreEl(firstLabel); + ignoreEl(firstTick); + } else if (isTwoLabelOverlapped(firstLabel, nextLabel)) { + if (showMinLabel) { + ignoreEl(nextLabel); + ignoreEl(nextTick); + } else { + ignoreEl(firstLabel); + ignoreEl(firstTick); + } + } + + if (showMaxLabel === false) { + ignoreEl(lastLabel); + ignoreEl(lastTick); + } else if (isTwoLabelOverlapped(prevLabel, lastLabel)) { + if (showMaxLabel) { + ignoreEl(prevLabel); + ignoreEl(prevTick); + } else { + ignoreEl(lastLabel); + ignoreEl(lastTick); + } + } + } + + function ignoreEl(el) { + el && (el.ignore = true); + } + + function isTwoLabelOverlapped(current, next) { + // current and next has the same rotation. + var firstRect = current && current.getBoundingRect().clone(); + var nextRect = next && next.getBoundingRect().clone(); + + if (!firstRect || !nextRect) { + return; + } // When checking intersect of two rotated labels, we use mRotationBack + // to avoid that boundingRect is enlarge when using `boundingRect.applyTransform`. + + + var mRotationBack = identity([]); + rotate(mRotationBack, mRotationBack, -current.rotation); + firstRect.applyTransform(mul$1([], mRotationBack, current.getLocalTransform())); + nextRect.applyTransform(mul$1([], mRotationBack, next.getLocalTransform())); + return firstRect.intersect(nextRect); + } + + function isNameLocationCenter(nameLocation) { + return nameLocation === 'middle' || nameLocation === 'center'; + } + + function createTicks(ticksCoords, tickTransform, tickEndCoord, tickLineStyle, anidPrefix) { + var tickEls = []; + var pt1 = []; + var pt2 = []; + + for (var i = 0; i < ticksCoords.length; i++) { + var tickCoord = ticksCoords[i].coord; + pt1[0] = tickCoord; + pt1[1] = 0; + pt2[0] = tickCoord; + pt2[1] = tickEndCoord; + + if (tickTransform) { + applyTransform(pt1, pt1, tickTransform); + applyTransform(pt2, pt2, tickTransform); + } // Tick line, Not use group transform to have better line draw + + + var tickEl = new Line({ + subPixelOptimize: true, + shape: { + x1: pt1[0], + y1: pt1[1], + x2: pt2[0], + y2: pt2[1] + }, + style: tickLineStyle, + z2: 2, + autoBatch: true, + silent: true + }); + tickEl.anid = anidPrefix + '_' + ticksCoords[i].tickValue; + tickEls.push(tickEl); + } + + return tickEls; + } + + function buildAxisMajorTicks(group, transformGroup, axisModel, opt) { + var axis = axisModel.axis; + var tickModel = axisModel.getModel('axisTick'); + var shown = tickModel.get('show'); + + if (shown === 'auto' && opt.handleAutoShown) { + shown = opt.handleAutoShown('axisTick'); + } + + if (!shown || axis.scale.isBlank()) { + return; + } + + var lineStyleModel = tickModel.getModel('lineStyle'); + var tickEndCoord = opt.tickDirection * tickModel.get('length'); + var ticksCoords = axis.getTicksCoords(); + var ticksEls = createTicks(ticksCoords, transformGroup.transform, tickEndCoord, defaults(lineStyleModel.getLineStyle(), { + stroke: axisModel.get(['axisLine', 'lineStyle', 'color']) + }), 'ticks'); + + for (var i = 0; i < ticksEls.length; i++) { + group.add(ticksEls[i]); + } + + return ticksEls; + } + + function buildAxisMinorTicks(group, transformGroup, axisModel, tickDirection) { + var axis = axisModel.axis; + var minorTickModel = axisModel.getModel('minorTick'); + + if (!minorTickModel.get('show') || axis.scale.isBlank()) { + return; + } + + var minorTicksCoords = axis.getMinorTicksCoords(); + + if (!minorTicksCoords.length) { + return; + } + + var lineStyleModel = minorTickModel.getModel('lineStyle'); + var tickEndCoord = tickDirection * minorTickModel.get('length'); + var minorTickLineStyle = defaults(lineStyleModel.getLineStyle(), defaults(axisModel.getModel('axisTick').getLineStyle(), { + stroke: axisModel.get(['axisLine', 'lineStyle', 'color']) + })); + + for (var i = 0; i < minorTicksCoords.length; i++) { + var minorTicksEls = createTicks(minorTicksCoords[i], transformGroup.transform, tickEndCoord, minorTickLineStyle, 'minorticks_' + i); + + for (var k = 0; k < minorTicksEls.length; k++) { + group.add(minorTicksEls[k]); + } + } + } + + function buildAxisLabel(group, transformGroup, axisModel, opt) { + var axis = axisModel.axis; + var show = retrieve(opt.axisLabelShow, axisModel.get(['axisLabel', 'show'])); + + if (!show || axis.scale.isBlank()) { + return; + } + + var labelModel = axisModel.getModel('axisLabel'); + var labelMargin = labelModel.get('margin'); + var labels = axis.getViewLabels(); // Special label rotate. + + var labelRotation = (retrieve(opt.labelRotate, labelModel.get('rotate')) || 0) * PI$5 / 180; + var labelLayout = AxisBuilder.innerTextLayout(opt.rotation, labelRotation, opt.labelDirection); + var rawCategoryData = axisModel.getCategories && axisModel.getCategories(true); + var labelEls = []; + var silent = AxisBuilder.isLabelSilent(axisModel); + var triggerEvent = axisModel.get('triggerEvent'); + each(labels, function (labelItem, index) { + var tickValue = axis.scale.type === 'ordinal' ? axis.scale.getRawOrdinalNumber(labelItem.tickValue) : labelItem.tickValue; + var formattedLabel = labelItem.formattedLabel; + var rawLabel = labelItem.rawLabel; + var itemLabelModel = labelModel; + + if (rawCategoryData && rawCategoryData[tickValue]) { + var rawCategoryItem = rawCategoryData[tickValue]; + + if (isObject(rawCategoryItem) && rawCategoryItem.textStyle) { + itemLabelModel = new Model(rawCategoryItem.textStyle, labelModel, axisModel.ecModel); + } + } + + var textColor = itemLabelModel.getTextColor() || axisModel.get(['axisLine', 'lineStyle', 'color']); + var tickCoord = axis.dataToCoord(tickValue); + var textEl = new ZRText({ + x: tickCoord, + y: opt.labelOffset + opt.labelDirection * labelMargin, + rotation: labelLayout.rotation, + silent: silent, + z2: 10 + (labelItem.level || 0), + style: createTextStyle(itemLabelModel, { + text: formattedLabel, + align: itemLabelModel.getShallow('align', true) || labelLayout.textAlign, + verticalAlign: itemLabelModel.getShallow('verticalAlign', true) || itemLabelModel.getShallow('baseline', true) || labelLayout.textVerticalAlign, + fill: isFunction(textColor) ? textColor( // (1) In category axis with data zoom, tick is not the original + // index of axis.data. So tick should not be exposed to user + // in category axis. + // (2) Compatible with previous version, which always use formatted label as + // input. But in interval scale the formatted label is like '223,445', which + // maked user repalce ','. So we modify it to return original val but remain + // it as 'string' to avoid error in replacing. + axis.type === 'category' ? rawLabel : axis.type === 'value' ? tickValue + '' : tickValue, index) : textColor + }) + }); + textEl.anid = 'label_' + tickValue; // Pack data for mouse event + + if (triggerEvent) { + var eventData = AxisBuilder.makeAxisEventDataBase(axisModel); + eventData.targetType = 'axisLabel'; + eventData.value = rawLabel; + eventData.tickIndex = index; + + if (axis.type === 'category') { + eventData.dataIndex = tickValue; + } + + getECData(textEl).eventData = eventData; + } // FIXME + + + transformGroup.add(textEl); + textEl.updateTransform(); + labelEls.push(textEl); + group.add(textEl); + textEl.decomposeTransform(); + }); + return labelEls; + } + + // allAxesInfo should be updated when setOption performed. + + function collect(ecModel, api) { + var result = { + /** + * key: makeKey(axis.model) + * value: { + * axis, + * coordSys, + * axisPointerModel, + * triggerTooltip, + * involveSeries, + * snap, + * seriesModels, + * seriesDataCount + * } + */ + axesInfo: {}, + seriesInvolved: false, + + /** + * key: makeKey(coordSys.model) + * value: Object: key makeKey(axis.model), value: axisInfo + */ + coordSysAxesInfo: {}, + coordSysMap: {} + }; + collectAxesInfo(result, ecModel, api); // Check seriesInvolved for performance, in case too many series in some chart. + + result.seriesInvolved && collectSeriesInfo(result, ecModel); + return result; + } + + function collectAxesInfo(result, ecModel, api) { + var globalTooltipModel = ecModel.getComponent('tooltip'); + var globalAxisPointerModel = ecModel.getComponent('axisPointer'); // links can only be set on global. + + var linksOption = globalAxisPointerModel.get('link', true) || []; + var linkGroups = []; // Collect axes info. + + each(api.getCoordinateSystems(), function (coordSys) { + // Some coordinate system do not support axes, like geo. + if (!coordSys.axisPointerEnabled) { + return; + } + + var coordSysKey = makeKey(coordSys.model); + var axesInfoInCoordSys = result.coordSysAxesInfo[coordSysKey] = {}; + result.coordSysMap[coordSysKey] = coordSys; // Set tooltip (like 'cross') is a convienent way to show axisPointer + // for user. So we enable seting tooltip on coordSys model. + + var coordSysModel = coordSys.model; + var baseTooltipModel = coordSysModel.getModel('tooltip', globalTooltipModel); + each(coordSys.getAxes(), curry(saveTooltipAxisInfo, false, null)); // If axis tooltip used, choose tooltip axis for each coordSys. + // Notice this case: coordSys is `grid` but not `cartesian2D` here. + + if (coordSys.getTooltipAxes && globalTooltipModel // If tooltip.showContent is set as false, tooltip will not + // show but axisPointer will show as normal. + && baseTooltipModel.get('show')) { + // Compatible with previous logic. But series.tooltip.trigger: 'axis' + // or series.data[n].tooltip.trigger: 'axis' are not support any more. + var triggerAxis = baseTooltipModel.get('trigger') === 'axis'; + var cross = baseTooltipModel.get(['axisPointer', 'type']) === 'cross'; + var tooltipAxes = coordSys.getTooltipAxes(baseTooltipModel.get(['axisPointer', 'axis'])); + + if (triggerAxis || cross) { + each(tooltipAxes.baseAxes, curry(saveTooltipAxisInfo, cross ? 'cross' : true, triggerAxis)); + } + + if (cross) { + each(tooltipAxes.otherAxes, curry(saveTooltipAxisInfo, 'cross', false)); + } + } // fromTooltip: true | false | 'cross' + // triggerTooltip: true | false | null + + + function saveTooltipAxisInfo(fromTooltip, triggerTooltip, axis) { + var axisPointerModel = axis.model.getModel('axisPointer', globalAxisPointerModel); + var axisPointerShow = axisPointerModel.get('show'); + + if (!axisPointerShow || axisPointerShow === 'auto' && !fromTooltip && !isHandleTrigger(axisPointerModel)) { + return; + } + + if (triggerTooltip == null) { + triggerTooltip = axisPointerModel.get('triggerTooltip'); + } + + axisPointerModel = fromTooltip ? makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) : axisPointerModel; + var snap = axisPointerModel.get('snap'); + var axisKey = makeKey(axis.model); + var involveSeries = triggerTooltip || snap || axis.type === 'category'; // If result.axesInfo[key] exist, override it (tooltip has higher priority). + + var axisInfo = result.axesInfo[axisKey] = { + key: axisKey, + axis: axis, + coordSys: coordSys, + axisPointerModel: axisPointerModel, + triggerTooltip: triggerTooltip, + involveSeries: involveSeries, + snap: snap, + useHandle: isHandleTrigger(axisPointerModel), + seriesModels: [], + linkGroup: null + }; + axesInfoInCoordSys[axisKey] = axisInfo; + result.seriesInvolved = result.seriesInvolved || involveSeries; + var groupIndex = getLinkGroupIndex(linksOption, axis); + + if (groupIndex != null) { + var linkGroup = linkGroups[groupIndex] || (linkGroups[groupIndex] = { + axesInfo: {} + }); + linkGroup.axesInfo[axisKey] = axisInfo; + linkGroup.mapper = linksOption[groupIndex].mapper; + axisInfo.linkGroup = linkGroup; + } + } + }); + } + + function makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) { + var tooltipAxisPointerModel = baseTooltipModel.getModel('axisPointer'); + var fields = ['type', 'snap', 'lineStyle', 'shadowStyle', 'label', 'animation', 'animationDurationUpdate', 'animationEasingUpdate', 'z']; + var volatileOption = {}; + each(fields, function (field) { + volatileOption[field] = clone(tooltipAxisPointerModel.get(field)); + }); // category axis do not auto snap, otherwise some tick that do not + // has value can not be hovered. value/time/log axis default snap if + // triggered from tooltip and trigger tooltip. + + volatileOption.snap = axis.type !== 'category' && !!triggerTooltip; // Compatibel with previous behavior, tooltip axis do not show label by default. + // Only these properties can be overrided from tooltip to axisPointer. + + if (tooltipAxisPointerModel.get('type') === 'cross') { + volatileOption.type = 'line'; + } + + var labelOption = volatileOption.label || (volatileOption.label = {}); // Follow the convention, do not show label when triggered by tooltip by default. + + labelOption.show == null && (labelOption.show = false); + + if (fromTooltip === 'cross') { + // When 'cross', both axes show labels. + var tooltipAxisPointerLabelShow = tooltipAxisPointerModel.get(['label', 'show']); + labelOption.show = tooltipAxisPointerLabelShow != null ? tooltipAxisPointerLabelShow : true; // If triggerTooltip, this is a base axis, which should better not use cross style + // (cross style is dashed by default) + + if (!triggerTooltip) { + var crossStyle = volatileOption.lineStyle = tooltipAxisPointerModel.get('crossStyle'); + crossStyle && defaults(labelOption, crossStyle.textStyle); + } + } + + return axis.model.getModel('axisPointer', new Model(volatileOption, globalAxisPointerModel, ecModel)); + } + + function collectSeriesInfo(result, ecModel) { + // Prepare data for axis trigger + ecModel.eachSeries(function (seriesModel) { + // Notice this case: this coordSys is `cartesian2D` but not `grid`. + var coordSys = seriesModel.coordinateSystem; + var seriesTooltipTrigger = seriesModel.get(['tooltip', 'trigger'], true); + var seriesTooltipShow = seriesModel.get(['tooltip', 'show'], true); + + if (!coordSys || seriesTooltipTrigger === 'none' || seriesTooltipTrigger === false || seriesTooltipTrigger === 'item' || seriesTooltipShow === false || seriesModel.get(['axisPointer', 'show'], true) === false) { + return; + } + + each(result.coordSysAxesInfo[makeKey(coordSys.model)], function (axisInfo) { + var axis = axisInfo.axis; + + if (coordSys.getAxis(axis.dim) === axis) { + axisInfo.seriesModels.push(seriesModel); + axisInfo.seriesDataCount == null && (axisInfo.seriesDataCount = 0); + axisInfo.seriesDataCount += seriesModel.getData().count(); + } + }); + }); + } + /** + * For example: + * { + * axisPointer: { + * links: [{ + * xAxisIndex: [2, 4], + * yAxisIndex: 'all' + * }, { + * xAxisId: ['a5', 'a7'], + * xAxisName: 'xxx' + * }] + * } + * } + */ + + + function getLinkGroupIndex(linksOption, axis) { + var axisModel = axis.model; + var dim = axis.dim; + + for (var i = 0; i < linksOption.length; i++) { + var linkOption = linksOption[i] || {}; + + if (checkPropInLink(linkOption[dim + 'AxisId'], axisModel.id) || checkPropInLink(linkOption[dim + 'AxisIndex'], axisModel.componentIndex) || checkPropInLink(linkOption[dim + 'AxisName'], axisModel.name)) { + return i; + } + } + } + + function checkPropInLink(linkPropValue, axisPropValue) { + return linkPropValue === 'all' || isArray(linkPropValue) && indexOf(linkPropValue, axisPropValue) >= 0 || linkPropValue === axisPropValue; + } + + function fixValue(axisModel) { + var axisInfo = getAxisInfo(axisModel); + + if (!axisInfo) { + return; + } + + var axisPointerModel = axisInfo.axisPointerModel; + var scale = axisInfo.axis.scale; + var option = axisPointerModel.option; + var status = axisPointerModel.get('status'); + var value = axisPointerModel.get('value'); // Parse init value for category and time axis. + + if (value != null) { + value = scale.parse(value); + } + + var useHandle = isHandleTrigger(axisPointerModel); // If `handle` used, `axisPointer` will always be displayed, so value + // and status should be initialized. + + if (status == null) { + option.status = useHandle ? 'show' : 'hide'; + } + + var extent = scale.getExtent().slice(); + extent[0] > extent[1] && extent.reverse(); + + if ( // Pick a value on axis when initializing. + value == null // If both `handle` and `dataZoom` are used, value may be out of axis extent, + // where we should re-pick a value to keep `handle` displaying normally. + || value > extent[1]) { + // Make handle displayed on the end of the axis when init, which looks better. + value = extent[1]; + } + + if (value < extent[0]) { + value = extent[0]; + } + + option.value = value; + + if (useHandle) { + option.status = axisInfo.axis.scale.isBlank() ? 'hide' : 'show'; + } + } + function getAxisInfo(axisModel) { + var coordSysAxesInfo = (axisModel.ecModel.getComponent('axisPointer') || {}).coordSysAxesInfo; + return coordSysAxesInfo && coordSysAxesInfo.axesInfo[makeKey(axisModel)]; + } + function getAxisPointerModel(axisModel) { + var axisInfo = getAxisInfo(axisModel); + return axisInfo && axisInfo.axisPointerModel; + } + + function isHandleTrigger(axisPointerModel) { + return !!axisPointerModel.get(['handle', 'show']); + } + /** + * @param {module:echarts/model/Model} model + * @return {string} unique key + */ + + + function makeKey(model) { + return model.type + '||' + model.id; + } + + var axisPointerClazz = {}; + /** + * Base class of AxisView. + */ + + var AxisView = + /** @class */ + function (_super) { + __extends(AxisView, _super); + + function AxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AxisView.type; + return _this; + } + /** + * @override + */ + + + AxisView.prototype.render = function (axisModel, ecModel, api, payload) { + // FIXME + // This process should proformed after coordinate systems updated + // (axis scale updated), and should be performed each time update. + // So put it here temporarily, although it is not appropriate to + // put a model-writing procedure in `view`. + this.axisPointerClass && fixValue(axisModel); + + _super.prototype.render.apply(this, arguments); + + this._doUpdateAxisPointerClass(axisModel, api, true); + }; + /** + * Action handler. + */ + + + AxisView.prototype.updateAxisPointer = function (axisModel, ecModel, api, payload) { + this._doUpdateAxisPointerClass(axisModel, api, false); + }; + /** + * @override + */ + + + AxisView.prototype.remove = function (ecModel, api) { + var axisPointer = this._axisPointer; + axisPointer && axisPointer.remove(api); + }; + /** + * @override + */ + + + AxisView.prototype.dispose = function (ecModel, api) { + this._disposeAxisPointer(api); + + _super.prototype.dispose.apply(this, arguments); + }; + + AxisView.prototype._doUpdateAxisPointerClass = function (axisModel, api, forceRender) { + var Clazz = AxisView.getAxisPointerClass(this.axisPointerClass); + + if (!Clazz) { + return; + } + + var axisPointerModel = getAxisPointerModel(axisModel); + axisPointerModel ? (this._axisPointer || (this._axisPointer = new Clazz())).render(axisModel, axisPointerModel, api, forceRender) : this._disposeAxisPointer(api); + }; + + AxisView.prototype._disposeAxisPointer = function (api) { + this._axisPointer && this._axisPointer.dispose(api); + this._axisPointer = null; + }; + + AxisView.registerAxisPointerClass = function (type, clazz) { + if ("development" !== 'production') { + if (axisPointerClazz[type]) { + throw new Error('axisPointer ' + type + ' exists'); + } + } + + axisPointerClazz[type] = clazz; + }; + + AxisView.getAxisPointerClass = function (type) { + return type && axisPointerClazz[type]; + }; + AxisView.type = 'axis'; + return AxisView; + }(ComponentView); + + var inner$6 = makeInner(); + function rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, gridModel) { + var axis = axisModel.axis; + + if (axis.scale.isBlank()) { + return; + } // TODO: TYPE + + + var splitAreaModel = axisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + var gridRect = gridModel.coordinateSystem.getRect(); + var ticksCoords = axis.getTicksCoords({ + tickModel: splitAreaModel, + clamp: true + }); + + if (!ticksCoords.length) { + return; + } // For Making appropriate splitArea animation, the color and anid + // should be corresponding to previous one if possible. + + + var areaColorsLen = areaColors.length; + var lastSplitAreaColors = inner$6(axisView).splitAreaColors; + var newSplitAreaColors = createHashMap(); + var colorIndex = 0; + + if (lastSplitAreaColors) { + for (var i = 0; i < ticksCoords.length; i++) { + var cIndex = lastSplitAreaColors.get(ticksCoords[i].tickValue); + + if (cIndex != null) { + colorIndex = (cIndex + (areaColorsLen - 1) * i) % areaColorsLen; + break; + } + } + } + + var prev = axis.toGlobalCoord(ticksCoords[0].coord); + var areaStyle = areaStyleModel.getAreaStyle(); + areaColors = isArray(areaColors) ? areaColors : [areaColors]; + + for (var i = 1; i < ticksCoords.length; i++) { + var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); + var x = void 0; + var y = void 0; + var width = void 0; + var height = void 0; + + if (axis.isHorizontal()) { + x = prev; + y = gridRect.y; + width = tickCoord - x; + height = gridRect.height; + prev = x + width; + } else { + x = gridRect.x; + y = prev; + width = gridRect.width; + height = tickCoord - y; + prev = y + height; + } + + var tickValue = ticksCoords[i - 1].tickValue; + tickValue != null && newSplitAreaColors.set(tickValue, colorIndex); + axisGroup.add(new Rect({ + anid: tickValue != null ? 'area_' + tickValue : null, + shape: { + x: x, + y: y, + width: width, + height: height + }, + style: defaults({ + fill: areaColors[colorIndex] + }, areaStyle), + autoBatch: true, + silent: true + })); + colorIndex = (colorIndex + 1) % areaColorsLen; + } + + inner$6(axisView).splitAreaColors = newSplitAreaColors; + } + function rectCoordAxisHandleRemove(axisView) { + inner$6(axisView).splitAreaColors = null; + } + + var axisBuilderAttrs = ['axisLine', 'axisTickLabel', 'axisName']; + var selfBuilderAttrs = ['splitArea', 'splitLine', 'minorSplitLine']; + + var CartesianAxisView = + /** @class */ + function (_super) { + __extends(CartesianAxisView, _super); + + function CartesianAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CartesianAxisView.type; + _this.axisPointerClass = 'CartesianAxisPointer'; + return _this; + } + /** + * @override + */ + + + CartesianAxisView.prototype.render = function (axisModel, ecModel, api, payload) { + this.group.removeAll(); + var oldAxisGroup = this._axisGroup; + this._axisGroup = new Group(); + this.group.add(this._axisGroup); + + if (!axisModel.get('show')) { + return; + } + + var gridModel = axisModel.getCoordSysModel(); + var layout = layout$1(gridModel, axisModel); + var axisBuilder = new AxisBuilder(axisModel, extend({ + handleAutoShown: function (elementType) { + var cartesians = gridModel.coordinateSystem.getCartesians(); + + for (var i = 0; i < cartesians.length; i++) { + if (isIntervalOrLogScale(cartesians[i].getOtherAxis(axisModel.axis).scale)) { + // Still show axis tick or axisLine if other axis is value / log + return true; + } + } // Not show axisTick or axisLine if other axis is category / time + + + return false; + } + }, layout)); + each(axisBuilderAttrs, axisBuilder.add, axisBuilder); + + this._axisGroup.add(axisBuilder.getGroup()); + + each(selfBuilderAttrs, function (name) { + if (axisModel.get([name, 'show'])) { + axisElementBuilders[name](this, this._axisGroup, axisModel, gridModel); + } + }, this); // THIS is a special case for bar racing chart. + // Update the axis label from the natural initial layout to + // sorted layout should has no animation. + + var isInitialSortFromBarRacing = payload && payload.type === 'changeAxisOrder' && payload.isInitSort; + + if (!isInitialSortFromBarRacing) { + groupTransition(oldAxisGroup, this._axisGroup, axisModel); + } + + _super.prototype.render.call(this, axisModel, ecModel, api, payload); + }; + + CartesianAxisView.prototype.remove = function () { + rectCoordAxisHandleRemove(this); + }; + + CartesianAxisView.type = 'cartesianAxis'; + return CartesianAxisView; + }(AxisView); + + var axisElementBuilders = { + splitLine: function (axisView, axisGroup, axisModel, gridModel) { + var axis = axisModel.axis; + + if (axis.scale.isBlank()) { + return; + } + + var splitLineModel = axisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + lineColors = isArray(lineColors) ? lineColors : [lineColors]; + var gridRect = gridModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + var lineCount = 0; + var ticksCoords = axis.getTicksCoords({ + tickModel: splitLineModel + }); + var p1 = []; + var p2 = []; + var lineStyle = lineStyleModel.getLineStyle(); + + for (var i = 0; i < ticksCoords.length; i++) { + var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); + + if (isHorizontal) { + p1[0] = tickCoord; + p1[1] = gridRect.y; + p2[0] = tickCoord; + p2[1] = gridRect.y + gridRect.height; + } else { + p1[0] = gridRect.x; + p1[1] = tickCoord; + p2[0] = gridRect.x + gridRect.width; + p2[1] = tickCoord; + } + + var colorIndex = lineCount++ % lineColors.length; + var tickValue = ticksCoords[i].tickValue; + axisGroup.add(new Line({ + anid: tickValue != null ? 'line_' + ticksCoords[i].tickValue : null, + subPixelOptimize: true, + autoBatch: true, + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + style: defaults({ + stroke: lineColors[colorIndex] + }, lineStyle), + silent: true + })); + } + }, + minorSplitLine: function (axisView, axisGroup, axisModel, gridModel) { + var axis = axisModel.axis; + var minorSplitLineModel = axisModel.getModel('minorSplitLine'); + var lineStyleModel = minorSplitLineModel.getModel('lineStyle'); + var gridRect = gridModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + var minorTicksCoords = axis.getMinorTicksCoords(); + + if (!minorTicksCoords.length) { + return; + } + + var p1 = []; + var p2 = []; + var lineStyle = lineStyleModel.getLineStyle(); + + for (var i = 0; i < minorTicksCoords.length; i++) { + for (var k = 0; k < minorTicksCoords[i].length; k++) { + var tickCoord = axis.toGlobalCoord(minorTicksCoords[i][k].coord); + + if (isHorizontal) { + p1[0] = tickCoord; + p1[1] = gridRect.y; + p2[0] = tickCoord; + p2[1] = gridRect.y + gridRect.height; + } else { + p1[0] = gridRect.x; + p1[1] = tickCoord; + p2[0] = gridRect.x + gridRect.width; + p2[1] = tickCoord; + } + + axisGroup.add(new Line({ + anid: 'minor_line_' + minorTicksCoords[i][k].tickValue, + subPixelOptimize: true, + autoBatch: true, + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + style: lineStyle, + silent: true + })); + } + } + }, + splitArea: function (axisView, axisGroup, axisModel, gridModel) { + rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, gridModel); + } + }; + + var CartesianXAxisView = + /** @class */ + function (_super) { + __extends(CartesianXAxisView, _super); + + function CartesianXAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CartesianXAxisView.type; + return _this; + } + + CartesianXAxisView.type = 'xAxis'; + return CartesianXAxisView; + }(CartesianAxisView); + + var CartesianYAxisView = + /** @class */ + function (_super) { + __extends(CartesianYAxisView, _super); + + function CartesianYAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CartesianXAxisView.type; + return _this; + } + + CartesianYAxisView.type = 'yAxis'; + return CartesianYAxisView; + }(CartesianAxisView); + + var GridView = + /** @class */ + function (_super) { + __extends(GridView, _super); + + function GridView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'grid'; + return _this; + } + + GridView.prototype.render = function (gridModel, ecModel) { + this.group.removeAll(); + + if (gridModel.get('show')) { + this.group.add(new Rect({ + shape: gridModel.coordinateSystem.getRect(), + style: defaults({ + fill: gridModel.get('backgroundColor') + }, gridModel.getItemStyle()), + silent: true, + z2: -1 + })); + } + }; + + GridView.type = 'grid'; + return GridView; + }(ComponentView); + + var extraOption = { + // gridIndex: 0, + // gridId: '', + offset: 0 + }; + function install$5(registers) { + registers.registerComponentView(GridView); + registers.registerComponentModel(GridModel); + registers.registerCoordinateSystem('cartesian2d', Grid); + axisModelCreator(registers, 'x', CartesianAxisModel, extraOption); + axisModelCreator(registers, 'y', CartesianAxisModel, extraOption); + registers.registerComponentView(CartesianXAxisView); + registers.registerComponentView(CartesianYAxisView); + registers.registerPreprocessor(function (option) { + // Only create grid when need + if (option.xAxis && option.yAxis && !option.grid) { + option.grid = {}; + } + }); + } + + function install$6(registers) { + // In case developer forget to include grid component + use(install$5); + registers.registerSeriesModel(ScatterSeriesModel); + registers.registerChartView(ScatterView); + registers.registerLayout(pointsLayout('scatter')); + } + + function radarLayout(ecModel) { + ecModel.eachSeriesByType('radar', function (seriesModel) { + var data = seriesModel.getData(); + var points = []; + var coordSys = seriesModel.coordinateSystem; + + if (!coordSys) { + return; + } + + var axes = coordSys.getIndicatorAxes(); + each(axes, function (axis, axisIndex) { + data.each(data.mapDimension(axes[axisIndex].dim), function (val, dataIndex) { + points[dataIndex] = points[dataIndex] || []; + var point = coordSys.dataToPoint(val, axisIndex); + points[dataIndex][axisIndex] = isValidPoint(point) ? point : getValueMissingPoint(coordSys); + }); + }); // Close polygon + + data.each(function (idx) { + // TODO + // Is it appropriate to connect to the next data when some data is missing? + // Or, should trade it like `connectNull` in line chart? + var firstPoint = find(points[idx], function (point) { + return isValidPoint(point); + }) || getValueMissingPoint(coordSys); // Copy the first actual point to the end of the array + + points[idx].push(firstPoint.slice()); + data.setItemLayout(idx, points[idx]); + }); + }); + } + + function isValidPoint(point) { + return !isNaN(point[0]) && !isNaN(point[1]); + } + + function getValueMissingPoint(coordSys) { + // It is error-prone to input [NaN, NaN] into polygon, polygon. + // (probably cause problem when refreshing or animating) + return [coordSys.cx, coordSys.cy]; + } + + function radarBackwardCompat(option) { + var polarOptArr = option.polar; + + if (polarOptArr) { + if (!isArray(polarOptArr)) { + polarOptArr = [polarOptArr]; + } + + var polarNotRadar_1 = []; + each(polarOptArr, function (polarOpt, idx) { + if (polarOpt.indicator) { + if (polarOpt.type && !polarOpt.shape) { + polarOpt.shape = polarOpt.type; + } + + option.radar = option.radar || []; + + if (!isArray(option.radar)) { + option.radar = [option.radar]; + } + + option.radar.push(polarOpt); + } else { + polarNotRadar_1.push(polarOpt); + } + }); + option.polar = polarNotRadar_1; + } + + each(option.series, function (seriesOpt) { + if (seriesOpt && seriesOpt.type === 'radar' && seriesOpt.polarIndex) { + seriesOpt.radarIndex = seriesOpt.polarIndex; + } + }); + } + + var RadarView = + /** @class */ + function (_super) { + __extends(RadarView, _super); + + function RadarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadarView.type; + return _this; + } + + RadarView.prototype.render = function (seriesModel, ecModel, api) { + var polar = seriesModel.coordinateSystem; + var group = this.group; + var data = seriesModel.getData(); + var oldData = this._data; + + function createSymbol$1(data, idx) { + var symbolType = data.getItemVisual(idx, 'symbol') || 'circle'; + + if (symbolType === 'none') { + return; + } + + var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + var symbolPath = createSymbol(symbolType, -1, -1, 2, 2); + var symbolRotate = data.getItemVisual(idx, 'symbolRotate') || 0; + symbolPath.attr({ + style: { + strokeNoScale: true + }, + z2: 100, + scaleX: symbolSize[0] / 2, + scaleY: symbolSize[1] / 2, + rotation: symbolRotate * Math.PI / 180 || 0 + }); + return symbolPath; + } + + function updateSymbols(oldPoints, newPoints, symbolGroup, data, idx, isInit) { + // Simply rerender all + symbolGroup.removeAll(); + + for (var i = 0; i < newPoints.length - 1; i++) { + var symbolPath = createSymbol$1(data, idx); + + if (symbolPath) { + symbolPath.__dimIdx = i; + + if (oldPoints[i]) { + symbolPath.setPosition(oldPoints[i]); + graphic[isInit ? 'initProps' : 'updateProps'](symbolPath, { + x: newPoints[i][0], + y: newPoints[i][1] + }, seriesModel, idx); + } else { + symbolPath.setPosition(newPoints[i]); + } + + symbolGroup.add(symbolPath); + } + } + } + + function getInitialPoints(points) { + return map(points, function (pt) { + return [polar.cx, polar.cy]; + }); + } + + data.diff(oldData).add(function (idx) { + var points = data.getItemLayout(idx); + + if (!points) { + return; + } + + var polygon = new Polygon(); + var polyline = new Polyline(); + var target = { + shape: { + points: points + } + }; + polygon.shape.points = getInitialPoints(points); + polyline.shape.points = getInitialPoints(points); + initProps(polygon, target, seriesModel, idx); + initProps(polyline, target, seriesModel, idx); + var itemGroup = new Group(); + var symbolGroup = new Group(); + itemGroup.add(polyline); + itemGroup.add(polygon); + itemGroup.add(symbolGroup); + updateSymbols(polyline.shape.points, points, symbolGroup, data, idx, true); + data.setItemGraphicEl(idx, itemGroup); + }).update(function (newIdx, oldIdx) { + var itemGroup = oldData.getItemGraphicEl(oldIdx); + var polyline = itemGroup.childAt(0); + var polygon = itemGroup.childAt(1); + var symbolGroup = itemGroup.childAt(2); + var target = { + shape: { + points: data.getItemLayout(newIdx) + } + }; + + if (!target.shape.points) { + return; + } + + updateSymbols(polyline.shape.points, target.shape.points, symbolGroup, data, newIdx, false); + saveOldStyle(polygon); + saveOldStyle(polyline); + updateProps(polyline, target, seriesModel); + updateProps(polygon, target, seriesModel); + data.setItemGraphicEl(newIdx, itemGroup); + }).remove(function (idx) { + group.remove(oldData.getItemGraphicEl(idx)); + }).execute(); + data.eachItemGraphicEl(function (itemGroup, idx) { + var itemModel = data.getItemModel(idx); + var polyline = itemGroup.childAt(0); + var polygon = itemGroup.childAt(1); + var symbolGroup = itemGroup.childAt(2); // Radar uses the visual encoded from itemStyle. + + var itemStyle = data.getItemVisual(idx, 'style'); + var color = itemStyle.fill; + group.add(itemGroup); + polyline.useStyle(defaults(itemModel.getModel('lineStyle').getLineStyle(), { + fill: 'none', + stroke: color + })); + setStatesStylesFromModel(polyline, itemModel, 'lineStyle'); + setStatesStylesFromModel(polygon, itemModel, 'areaStyle'); + var areaStyleModel = itemModel.getModel('areaStyle'); + var polygonIgnore = areaStyleModel.isEmpty() && areaStyleModel.parentModel.isEmpty(); + polygon.ignore = polygonIgnore; + each(['emphasis', 'select', 'blur'], function (stateName) { + var stateModel = itemModel.getModel([stateName, 'areaStyle']); + var stateIgnore = stateModel.isEmpty() && stateModel.parentModel.isEmpty(); // Won't be ignore if normal state is not ignore. + + polygon.ensureState(stateName).ignore = stateIgnore && polygonIgnore; + }); + polygon.useStyle(defaults(areaStyleModel.getAreaStyle(), { + fill: color, + opacity: 0.7, + decal: itemStyle.decal + })); + var emphasisModel = itemModel.getModel('emphasis'); + var itemHoverStyle = emphasisModel.getModel('itemStyle').getItemStyle(); + symbolGroup.eachChild(function (symbolPath) { + if (symbolPath instanceof ZRImage) { + var pathStyle = symbolPath.style; + symbolPath.useStyle(extend({ + // TODO other properties like x, y ? + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, itemStyle)); + } else { + symbolPath.useStyle(itemStyle); + symbolPath.setColor(color); + symbolPath.style.strokeNoScale = true; + } + + var pathEmphasisState = symbolPath.ensureState('emphasis'); + pathEmphasisState.style = clone(itemHoverStyle); + var defaultText = data.getStore().get(data.getDimensionIndex(symbolPath.__dimIdx), idx); + (defaultText == null || isNaN(defaultText)) && (defaultText = ''); + setLabelStyle(symbolPath, getLabelStatesModels(itemModel), { + labelFetcher: data.hostModel, + labelDataIndex: idx, + labelDimIndex: symbolPath.__dimIdx, + defaultText: defaultText, + inheritColor: color, + defaultOpacity: itemStyle.opacity + }); + }); + toggleHoverEmphasis(itemGroup, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }); + this._data = data; + }; + + RadarView.prototype.remove = function () { + this.group.removeAll(); + this._data = null; + }; + + RadarView.type = 'radar'; + return RadarView; + }(ChartView); + + var RadarSeriesModel = + /** @class */ + function (_super) { + __extends(RadarSeriesModel, _super); + + function RadarSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadarSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } // Overwrite + + + RadarSeriesModel.prototype.init = function (option) { + _super.prototype.init.apply(this, arguments); // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + + + this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this)); + }; + + RadarSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesDataSimply(this, { + generateCoord: 'indicator_', + generateCoordCount: Infinity + }); + }; + + RadarSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var coordSys = this.coordinateSystem; + var indicatorAxes = coordSys.getIndicatorAxes(); + var name = this.getData().getName(dataIndex); + var nameToDisplay = name === '' ? this.name : name; + var markerColor = retrieveVisualColorForTooltipMarker(this, dataIndex); + return createTooltipMarkup('section', { + header: nameToDisplay, + sortBlocks: true, + blocks: map(indicatorAxes, function (axis) { + var val = data.get(data.mapDimension(axis.dim), dataIndex); + return createTooltipMarkup('nameValue', { + markerType: 'subItem', + markerColor: markerColor, + name: axis.name, + value: val, + sortParam: val + }); + }) + }); + }; + + RadarSeriesModel.prototype.getTooltipPosition = function (dataIndex) { + if (dataIndex != null) { + var data_1 = this.getData(); + var coordSys = this.coordinateSystem; + var values = data_1.getValues(map(coordSys.dimensions, function (dim) { + return data_1.mapDimension(dim); + }), dataIndex); + + for (var i = 0, len = values.length; i < len; i++) { + if (!isNaN(values[i])) { + var indicatorAxes = coordSys.getIndicatorAxes(); + return coordSys.coordToPoint(indicatorAxes[i].dataToCoord(values[i]), i); + } + } + } + }; + + RadarSeriesModel.type = 'series.radar'; + RadarSeriesModel.dependencies = ['radar']; + RadarSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + colorBy: 'data', + coordinateSystem: 'radar', + legendHoverLink: true, + radarIndex: 0, + lineStyle: { + width: 2, + type: 'solid', + join: 'round' + }, + label: { + position: 'top' + }, + // areaStyle: { + // }, + // itemStyle: {} + symbolSize: 8 // symbolRotate: null + + }; + return RadarSeriesModel; + }(SeriesModel); + + var valueAxisDefault = axisDefault.value; + + function defaultsShow(opt, show) { + return defaults({ + show: show + }, opt); + } + + var RadarModel = + /** @class */ + function (_super) { + __extends(RadarModel, _super); + + function RadarModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadarModel.type; + return _this; + } + + RadarModel.prototype.optionUpdated = function () { + var boundaryGap = this.get('boundaryGap'); + var splitNumber = this.get('splitNumber'); + var scale = this.get('scale'); + var axisLine = this.get('axisLine'); + var axisTick = this.get('axisTick'); // let axisType = this.get('axisType'); + + var axisLabel = this.get('axisLabel'); + var nameTextStyle = this.get('axisName'); + var showName = this.get(['axisName', 'show']); + var nameFormatter = this.get(['axisName', 'formatter']); + var nameGap = this.get('axisNameGap'); + var triggerEvent = this.get('triggerEvent'); + var indicatorModels = map(this.get('indicator') || [], function (indicatorOpt) { + // PENDING + if (indicatorOpt.max != null && indicatorOpt.max > 0 && !indicatorOpt.min) { + indicatorOpt.min = 0; + } else if (indicatorOpt.min != null && indicatorOpt.min < 0 && !indicatorOpt.max) { + indicatorOpt.max = 0; + } + + var iNameTextStyle = nameTextStyle; + + if (indicatorOpt.color != null) { + iNameTextStyle = defaults({ + color: indicatorOpt.color + }, nameTextStyle); + } // Use same configuration + + + var innerIndicatorOpt = merge(clone(indicatorOpt), { + boundaryGap: boundaryGap, + splitNumber: splitNumber, + scale: scale, + axisLine: axisLine, + axisTick: axisTick, + // axisType: axisType, + axisLabel: axisLabel, + // Compatible with 2 and use text + name: indicatorOpt.text, + showName: showName, + nameLocation: 'end', + nameGap: nameGap, + // min: 0, + nameTextStyle: iNameTextStyle, + triggerEvent: triggerEvent + }, false); + + if (isString(nameFormatter)) { + var indName = innerIndicatorOpt.name; + innerIndicatorOpt.name = nameFormatter.replace('{value}', indName != null ? indName : ''); + } else if (isFunction(nameFormatter)) { + innerIndicatorOpt.name = nameFormatter(innerIndicatorOpt.name, innerIndicatorOpt); + } + + var model = new Model(innerIndicatorOpt, null, this.ecModel); + mixin(model, AxisModelCommonMixin.prototype); // For triggerEvent. + + model.mainType = 'radar'; + model.componentIndex = this.componentIndex; + return model; + }, this); + this._indicatorModels = indicatorModels; + }; + + RadarModel.prototype.getIndicatorModels = function () { + return this._indicatorModels; + }; + + RadarModel.type = 'radar'; + RadarModel.defaultOption = { + // zlevel: 0, + z: 0, + center: ['50%', '50%'], + radius: '75%', + startAngle: 90, + axisName: { + show: true // formatter: null + // textStyle: {} + + }, + boundaryGap: [0, 0], + splitNumber: 5, + axisNameGap: 15, + scale: false, + // Polygon or circle + shape: 'polygon', + axisLine: merge({ + lineStyle: { + color: '#bbb' + } + }, valueAxisDefault.axisLine), + axisLabel: defaultsShow(valueAxisDefault.axisLabel, false), + axisTick: defaultsShow(valueAxisDefault.axisTick, false), + // axisType: 'value', + splitLine: defaultsShow(valueAxisDefault.splitLine, true), + splitArea: defaultsShow(valueAxisDefault.splitArea, true), + // {text, min, max} + indicator: [] + }; + return RadarModel; + }(ComponentModel); + + var axisBuilderAttrs$1 = ['axisLine', 'axisTickLabel', 'axisName']; + + var RadarView$1 = + /** @class */ + function (_super) { + __extends(RadarView, _super); + + function RadarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadarView.type; + return _this; + } + + RadarView.prototype.render = function (radarModel, ecModel, api) { + var group = this.group; + group.removeAll(); + + this._buildAxes(radarModel); + + this._buildSplitLineAndArea(radarModel); + }; + + RadarView.prototype._buildAxes = function (radarModel) { + var radar = radarModel.coordinateSystem; + var indicatorAxes = radar.getIndicatorAxes(); + var axisBuilders = map(indicatorAxes, function (indicatorAxis) { + var axisName = indicatorAxis.model.get('showName') ? indicatorAxis.name : ''; // hide name + + var axisBuilder = new AxisBuilder(indicatorAxis.model, { + axisName: axisName, + position: [radar.cx, radar.cy], + rotation: indicatorAxis.angle, + labelDirection: -1, + tickDirection: -1, + nameDirection: 1 + }); + return axisBuilder; + }); + each(axisBuilders, function (axisBuilder) { + each(axisBuilderAttrs$1, axisBuilder.add, axisBuilder); + this.group.add(axisBuilder.getGroup()); + }, this); + }; + + RadarView.prototype._buildSplitLineAndArea = function (radarModel) { + var radar = radarModel.coordinateSystem; + var indicatorAxes = radar.getIndicatorAxes(); + + if (!indicatorAxes.length) { + return; + } + + var shape = radarModel.get('shape'); + var splitLineModel = radarModel.getModel('splitLine'); + var splitAreaModel = radarModel.getModel('splitArea'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var showSplitLine = splitLineModel.get('show'); + var showSplitArea = splitAreaModel.get('show'); + var splitLineColors = lineStyleModel.get('color'); + var splitAreaColors = areaStyleModel.get('color'); + var splitLineColorsArr = isArray(splitLineColors) ? splitLineColors : [splitLineColors]; + var splitAreaColorsArr = isArray(splitAreaColors) ? splitAreaColors : [splitAreaColors]; + var splitLines = []; + var splitAreas = []; + + function getColorIndex(areaOrLine, areaOrLineColorList, idx) { + var colorIndex = idx % areaOrLineColorList.length; + areaOrLine[colorIndex] = areaOrLine[colorIndex] || []; + return colorIndex; + } + + if (shape === 'circle') { + var ticksRadius = indicatorAxes[0].getTicksCoords(); + var cx = radar.cx; + var cy = radar.cy; + + for (var i = 0; i < ticksRadius.length; i++) { + if (showSplitLine) { + var colorIndex = getColorIndex(splitLines, splitLineColorsArr, i); + splitLines[colorIndex].push(new Circle({ + shape: { + cx: cx, + cy: cy, + r: ticksRadius[i].coord + } + })); + } + + if (showSplitArea && i < ticksRadius.length - 1) { + var colorIndex = getColorIndex(splitAreas, splitAreaColorsArr, i); + splitAreas[colorIndex].push(new Ring({ + shape: { + cx: cx, + cy: cy, + r0: ticksRadius[i].coord, + r: ticksRadius[i + 1].coord + } + })); + } + } + } // Polyyon + else { + var realSplitNumber_1; + var axesTicksPoints = map(indicatorAxes, function (indicatorAxis, idx) { + var ticksCoords = indicatorAxis.getTicksCoords(); + realSplitNumber_1 = realSplitNumber_1 == null ? ticksCoords.length - 1 : Math.min(ticksCoords.length - 1, realSplitNumber_1); + return map(ticksCoords, function (tickCoord) { + return radar.coordToPoint(tickCoord.coord, idx); + }); + }); + var prevPoints = []; + + for (var i = 0; i <= realSplitNumber_1; i++) { + var points = []; + + for (var j = 0; j < indicatorAxes.length; j++) { + points.push(axesTicksPoints[j][i]); + } // Close + + + if (points[0]) { + points.push(points[0].slice()); + } else { + if ("development" !== 'production') { + console.error('Can\'t draw value axis ' + i); + } + } + + if (showSplitLine) { + var colorIndex = getColorIndex(splitLines, splitLineColorsArr, i); + splitLines[colorIndex].push(new Polyline({ + shape: { + points: points + } + })); + } + + if (showSplitArea && prevPoints) { + var colorIndex = getColorIndex(splitAreas, splitAreaColorsArr, i - 1); + splitAreas[colorIndex].push(new Polygon({ + shape: { + points: points.concat(prevPoints) + } + })); + } + + prevPoints = points.slice().reverse(); + } + } + + var lineStyle = lineStyleModel.getLineStyle(); + var areaStyle = areaStyleModel.getAreaStyle(); // Add splitArea before splitLine + + each(splitAreas, function (splitAreas, idx) { + this.group.add(mergePath$1(splitAreas, { + style: defaults({ + stroke: 'none', + fill: splitAreaColorsArr[idx % splitAreaColorsArr.length] + }, areaStyle), + silent: true + })); + }, this); + each(splitLines, function (splitLines, idx) { + this.group.add(mergePath$1(splitLines, { + style: defaults({ + fill: 'none', + stroke: splitLineColorsArr[idx % splitLineColorsArr.length] + }, lineStyle), + silent: true + })); + }, this); + }; + + RadarView.type = 'radar'; + return RadarView; + }(ComponentView); + + var IndicatorAxis = + /** @class */ + function (_super) { + __extends(IndicatorAxis, _super); + + function IndicatorAxis(dim, scale, radiusExtent) { + var _this = _super.call(this, dim, scale, radiusExtent) || this; + + _this.type = 'value'; + _this.angle = 0; + _this.name = ''; + return _this; + } + + return IndicatorAxis; + }(Axis); + + var Radar = + /** @class */ + function () { + function Radar(radarModel, ecModel, api) { + /** + * + * Radar dimensions + */ + this.dimensions = []; + this._model = radarModel; + this._indicatorAxes = map(radarModel.getIndicatorModels(), function (indicatorModel, idx) { + var dim = 'indicator_' + idx; + var indicatorAxis = new IndicatorAxis(dim, new IntervalScale() // (indicatorModel.get('axisType') === 'log') ? new LogScale() : new IntervalScale() + ); + indicatorAxis.name = indicatorModel.get('name'); // Inject model and axis + + indicatorAxis.model = indicatorModel; + indicatorModel.axis = indicatorAxis; + this.dimensions.push(dim); + return indicatorAxis; + }, this); + this.resize(radarModel, api); + } + + Radar.prototype.getIndicatorAxes = function () { + return this._indicatorAxes; + }; + + Radar.prototype.dataToPoint = function (value, indicatorIndex) { + var indicatorAxis = this._indicatorAxes[indicatorIndex]; + return this.coordToPoint(indicatorAxis.dataToCoord(value), indicatorIndex); + }; // TODO: API should be coordToPoint([coord, indicatorIndex]) + + + Radar.prototype.coordToPoint = function (coord, indicatorIndex) { + var indicatorAxis = this._indicatorAxes[indicatorIndex]; + var angle = indicatorAxis.angle; + var x = this.cx + coord * Math.cos(angle); + var y = this.cy - coord * Math.sin(angle); + return [x, y]; + }; + + Radar.prototype.pointToData = function (pt) { + var dx = pt[0] - this.cx; + var dy = pt[1] - this.cy; + var radius = Math.sqrt(dx * dx + dy * dy); + dx /= radius; + dy /= radius; + var radian = Math.atan2(-dy, dx); // Find the closest angle + // FIXME index can calculated directly + + var minRadianDiff = Infinity; + var closestAxis; + var closestAxisIdx = -1; + + for (var i = 0; i < this._indicatorAxes.length; i++) { + var indicatorAxis = this._indicatorAxes[i]; + var diff = Math.abs(radian - indicatorAxis.angle); + + if (diff < minRadianDiff) { + closestAxis = indicatorAxis; + closestAxisIdx = i; + minRadianDiff = diff; + } + } + + return [closestAxisIdx, +(closestAxis && closestAxis.coordToData(radius))]; + }; + + Radar.prototype.resize = function (radarModel, api) { + var center = radarModel.get('center'); + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + var viewSize = Math.min(viewWidth, viewHeight) / 2; + this.cx = parsePercent$1(center[0], viewWidth); + this.cy = parsePercent$1(center[1], viewHeight); + this.startAngle = radarModel.get('startAngle') * Math.PI / 180; // radius may be single value like `20`, `'80%'`, or array like `[10, '80%']` + + var radius = radarModel.get('radius'); + + if (isString(radius) || isNumber(radius)) { + radius = [0, radius]; + } + + this.r0 = parsePercent$1(radius[0], viewSize); + this.r = parsePercent$1(radius[1], viewSize); + each(this._indicatorAxes, function (indicatorAxis, idx) { + indicatorAxis.setExtent(this.r0, this.r); + var angle = this.startAngle + idx * Math.PI * 2 / this._indicatorAxes.length; // Normalize to [-PI, PI] + + angle = Math.atan2(Math.sin(angle), Math.cos(angle)); + indicatorAxis.angle = angle; + }, this); + }; + + Radar.prototype.update = function (ecModel, api) { + var indicatorAxes = this._indicatorAxes; + var radarModel = this._model; + each(indicatorAxes, function (indicatorAxis) { + indicatorAxis.scale.setExtent(Infinity, -Infinity); + }); + ecModel.eachSeriesByType('radar', function (radarSeries, idx) { + if (radarSeries.get('coordinateSystem') !== 'radar' // @ts-ignore + || ecModel.getComponent('radar', radarSeries.get('radarIndex')) !== radarModel) { + return; + } + + var data = radarSeries.getData(); + each(indicatorAxes, function (indicatorAxis) { + indicatorAxis.scale.unionExtentFromData(data, data.mapDimension(indicatorAxis.dim)); + }); + }, this); + var splitNumber = radarModel.get('splitNumber'); + var dummyScale = new IntervalScale(); + dummyScale.setExtent(0, splitNumber); + dummyScale.setInterval(1); // Force all the axis fixing the maxSplitNumber. + + each(indicatorAxes, function (indicatorAxis, idx) { + alignScaleTicks(indicatorAxis.scale, indicatorAxis.model, dummyScale); + }); + }; + + Radar.prototype.convertToPixel = function (ecModel, finder, value) { + console.warn('Not implemented.'); + return null; + }; + + Radar.prototype.convertFromPixel = function (ecModel, finder, pixel) { + console.warn('Not implemented.'); + return null; + }; + + Radar.prototype.containPoint = function (point) { + console.warn('Not implemented.'); + return false; + }; + + Radar.create = function (ecModel, api) { + var radarList = []; + ecModel.eachComponent('radar', function (radarModel) { + var radar = new Radar(radarModel, ecModel, api); + radarList.push(radar); + radarModel.coordinateSystem = radar; + }); + ecModel.eachSeriesByType('radar', function (radarSeries) { + if (radarSeries.get('coordinateSystem') === 'radar') { + // Inject coordinate system + // @ts-ignore + radarSeries.coordinateSystem = radarList[radarSeries.get('radarIndex') || 0]; + } + }); + return radarList; + }; + /** + * Radar dimensions is based on the data + */ + + + Radar.dimensions = []; + return Radar; + }(); + + function install$7(registers) { + registers.registerCoordinateSystem('radar', Radar); + registers.registerComponentModel(RadarModel); + registers.registerComponentView(RadarView$1); + registers.registerVisual({ + seriesType: 'radar', + reset: function (seriesModel) { + var data = seriesModel.getData(); // itemVisual symbol is for selected data + + data.each(function (idx) { + data.setItemVisual(idx, 'legendIcon', 'roundRect'); + }); // visual is for unselected data + + data.setVisual('legendIcon', 'roundRect'); + } + }); + } + + function install$8(registers) { + use(install$7); + registers.registerChartView(RadarView); + registers.registerSeriesModel(RadarSeriesModel); + registers.registerLayout(radarLayout); + registers.registerProcessor(dataFilter('radar')); + registers.registerPreprocessor(radarBackwardCompat); + } + + var ATTR = '\0_ec_interaction_mutex'; + function take(zr, resourceKey, userKey) { + var store = getStore(zr); + store[resourceKey] = userKey; + } + function release(zr, resourceKey, userKey) { + var store = getStore(zr); + var uKey = store[resourceKey]; + + if (uKey === userKey) { + store[resourceKey] = null; + } + } + function isTaken(zr, resourceKey) { + return !!getStore(zr)[resourceKey]; + } + + function getStore(zr) { + return zr[ATTR] || (zr[ATTR] = {}); + } + /** + * payload: { + * type: 'takeGlobalCursor', + * key: 'dataZoomSelect', or 'brush', or ..., + * If no userKey, release global cursor. + * } + */ + // TODO: SELF REGISTERED. + + + registerAction({ + type: 'takeGlobalCursor', + event: 'globalCursorTaken', + update: 'update' + }, noop); + + var RoamController = + /** @class */ + function (_super) { + __extends(RoamController, _super); + + function RoamController(zr) { + var _this = _super.call(this) || this; + + _this._zr = zr; // Avoid two roamController bind the same handler + + var mousedownHandler = bind(_this._mousedownHandler, _this); + var mousemoveHandler = bind(_this._mousemoveHandler, _this); + var mouseupHandler = bind(_this._mouseupHandler, _this); + var mousewheelHandler = bind(_this._mousewheelHandler, _this); + var pinchHandler = bind(_this._pinchHandler, _this); + /** + * Notice: only enable needed types. For example, if 'zoom' + * is not needed, 'zoom' should not be enabled, otherwise + * default mousewheel behaviour (scroll page) will be disabled. + */ + + _this.enable = function (controlType, opt) { + // Disable previous first + this.disable(); + this._opt = defaults(clone(opt) || {}, { + zoomOnMouseWheel: true, + moveOnMouseMove: true, + // By default, wheel do not trigger move. + moveOnMouseWheel: false, + preventDefaultMouseMove: true + }); + + if (controlType == null) { + controlType = true; + } + + if (controlType === true || controlType === 'move' || controlType === 'pan') { + zr.on('mousedown', mousedownHandler); + zr.on('mousemove', mousemoveHandler); + zr.on('mouseup', mouseupHandler); + } + + if (controlType === true || controlType === 'scale' || controlType === 'zoom') { + zr.on('mousewheel', mousewheelHandler); + zr.on('pinch', pinchHandler); + } + }; + + _this.disable = function () { + zr.off('mousedown', mousedownHandler); + zr.off('mousemove', mousemoveHandler); + zr.off('mouseup', mouseupHandler); + zr.off('mousewheel', mousewheelHandler); + zr.off('pinch', pinchHandler); + }; + + return _this; + } + + RoamController.prototype.isDragging = function () { + return this._dragging; + }; + + RoamController.prototype.isPinching = function () { + return this._pinching; + }; + + RoamController.prototype.setPointerChecker = function (pointerChecker) { + this.pointerChecker = pointerChecker; + }; + + RoamController.prototype.dispose = function () { + this.disable(); + }; + + RoamController.prototype._mousedownHandler = function (e) { + if (isMiddleOrRightButtonOnMouseUpDown(e) || e.target && e.target.draggable) { + return; + } + + var x = e.offsetX; + var y = e.offsetY; // Only check on mosedown, but not mousemove. + // Mouse can be out of target when mouse moving. + + if (this.pointerChecker && this.pointerChecker(e, x, y)) { + this._x = x; + this._y = y; + this._dragging = true; + } + }; + + RoamController.prototype._mousemoveHandler = function (e) { + if (!this._dragging || !isAvailableBehavior('moveOnMouseMove', e, this._opt) || e.gestureEvent === 'pinch' || isTaken(this._zr, 'globalPan')) { + return; + } + + var x = e.offsetX; + var y = e.offsetY; + var oldX = this._x; + var oldY = this._y; + var dx = x - oldX; + var dy = y - oldY; + this._x = x; + this._y = y; + this._opt.preventDefaultMouseMove && stop(e.event); + trigger(this, 'pan', 'moveOnMouseMove', e, { + dx: dx, + dy: dy, + oldX: oldX, + oldY: oldY, + newX: x, + newY: y, + isAvailableBehavior: null + }); + }; + + RoamController.prototype._mouseupHandler = function (e) { + if (!isMiddleOrRightButtonOnMouseUpDown(e)) { + this._dragging = false; + } + }; + + RoamController.prototype._mousewheelHandler = function (e) { + var shouldZoom = isAvailableBehavior('zoomOnMouseWheel', e, this._opt); + var shouldMove = isAvailableBehavior('moveOnMouseWheel', e, this._opt); + var wheelDelta = e.wheelDelta; + var absWheelDeltaDelta = Math.abs(wheelDelta); + var originX = e.offsetX; + var originY = e.offsetY; // wheelDelta maybe -0 in chrome mac. + + if (wheelDelta === 0 || !shouldZoom && !shouldMove) { + return; + } // If both `shouldZoom` and `shouldMove` is true, trigger + // their event both, and the final behavior is determined + // by event listener themselves. + + + if (shouldZoom) { + // Convenience: + // Mac and VM Windows on Mac: scroll up: zoom out. + // Windows: scroll up: zoom in. + // FIXME: Should do more test in different environment. + // wheelDelta is too complicated in difference nvironment + // (https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel), + // although it has been normallized by zrender. + // wheelDelta of mouse wheel is bigger than touch pad. + var factor = absWheelDeltaDelta > 3 ? 1.4 : absWheelDeltaDelta > 1 ? 1.2 : 1.1; + var scale = wheelDelta > 0 ? factor : 1 / factor; + checkPointerAndTrigger(this, 'zoom', 'zoomOnMouseWheel', e, { + scale: scale, + originX: originX, + originY: originY, + isAvailableBehavior: null + }); + } + + if (shouldMove) { + // FIXME: Should do more test in different environment. + var absDelta = Math.abs(wheelDelta); // wheelDelta of mouse wheel is bigger than touch pad. + + var scrollDelta = (wheelDelta > 0 ? 1 : -1) * (absDelta > 3 ? 0.4 : absDelta > 1 ? 0.15 : 0.05); + checkPointerAndTrigger(this, 'scrollMove', 'moveOnMouseWheel', e, { + scrollDelta: scrollDelta, + originX: originX, + originY: originY, + isAvailableBehavior: null + }); + } + }; + + RoamController.prototype._pinchHandler = function (e) { + if (isTaken(this._zr, 'globalPan')) { + return; + } + + var scale = e.pinchScale > 1 ? 1.1 : 1 / 1.1; + checkPointerAndTrigger(this, 'zoom', null, e, { + scale: scale, + originX: e.pinchX, + originY: e.pinchY, + isAvailableBehavior: null + }); + }; + + return RoamController; + }(Eventful); + + function checkPointerAndTrigger(controller, eventName, behaviorToCheck, e, contollerEvent) { + if (controller.pointerChecker && controller.pointerChecker(e, contollerEvent.originX, contollerEvent.originY)) { + // When mouse is out of roamController rect, + // default befavoius should not be be disabled, otherwise + // page sliding is disabled, contrary to expectation. + stop(e.event); + trigger(controller, eventName, behaviorToCheck, e, contollerEvent); + } + } + + function trigger(controller, eventName, behaviorToCheck, e, contollerEvent) { + // Also provide behavior checker for event listener, for some case that + // multiple components share one listener. + contollerEvent.isAvailableBehavior = bind(isAvailableBehavior, null, behaviorToCheck, e); // TODO should not have type issue. + + controller.trigger(eventName, contollerEvent); + } // settings: { + // zoomOnMouseWheel + // moveOnMouseMove + // moveOnMouseWheel + // } + // The value can be: true / false / 'shift' / 'ctrl' / 'alt'. + + + function isAvailableBehavior(behaviorToCheck, e, settings) { + var setting = settings[behaviorToCheck]; + return !behaviorToCheck || setting && (!isString(setting) || e.event[setting + 'Key']); + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + + /** + * For geo and graph. + */ + function updateViewOnPan(controllerHost, dx, dy) { + var target = controllerHost.target; + target.x += dx; + target.y += dy; + target.dirty(); + } + /** + * For geo and graph. + */ + + function updateViewOnZoom(controllerHost, zoomDelta, zoomX, zoomY) { + var target = controllerHost.target; + var zoomLimit = controllerHost.zoomLimit; + var newZoom = controllerHost.zoom = controllerHost.zoom || 1; + newZoom *= zoomDelta; + + if (zoomLimit) { + var zoomMin = zoomLimit.min || 0; + var zoomMax = zoomLimit.max || Infinity; + newZoom = Math.max(Math.min(zoomMax, newZoom), zoomMin); + } + + var zoomScale = newZoom / controllerHost.zoom; + controllerHost.zoom = newZoom; // Keep the mouse center when scaling + + target.x -= (zoomX - target.x) * (zoomScale - 1); + target.y -= (zoomY - target.y) * (zoomScale - 1); + target.scaleX *= zoomScale; + target.scaleY *= zoomScale; + target.dirty(); + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + var IRRELEVANT_EXCLUDES = { + 'axisPointer': 1, + 'tooltip': 1, + 'brush': 1 + }; + /** + * Avoid that: mouse click on a elements that is over geo or graph, + * but roam is triggered. + */ + + function onIrrelevantElement(e, api, targetCoordSysModel) { + var model = api.getComponentByElement(e.topTarget); // If model is axisModel, it works only if it is injected with coordinateSystem. + + var coordSys = model && model.coordinateSystem; + return model && model !== targetCoordSysModel && !IRRELEVANT_EXCLUDES.hasOwnProperty(model.mainType) && coordSys && coordSys.model !== targetCoordSysModel; + } + + function parseXML(svg) { + if (isString(svg)) { + var parser = new DOMParser(); + svg = parser.parseFromString(svg, 'text/xml'); + } + var svgNode = svg; + if (svgNode.nodeType === 9) { + svgNode = svgNode.firstChild; + } + while (svgNode.nodeName.toLowerCase() !== 'svg' || svgNode.nodeType !== 1) { + svgNode = svgNode.nextSibling; + } + return svgNode; + } + + var nodeParsers; + var INHERITABLE_STYLE_ATTRIBUTES_MAP = { + 'fill': 'fill', + 'stroke': 'stroke', + 'stroke-width': 'lineWidth', + 'opacity': 'opacity', + 'fill-opacity': 'fillOpacity', + 'stroke-opacity': 'strokeOpacity', + 'stroke-dasharray': 'lineDash', + 'stroke-dashoffset': 'lineDashOffset', + 'stroke-linecap': 'lineCap', + 'stroke-linejoin': 'lineJoin', + 'stroke-miterlimit': 'miterLimit', + 'font-family': 'fontFamily', + 'font-size': 'fontSize', + 'font-style': 'fontStyle', + 'font-weight': 'fontWeight', + 'text-anchor': 'textAlign', + 'visibility': 'visibility', + 'display': 'display' + }; + var INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS = keys(INHERITABLE_STYLE_ATTRIBUTES_MAP); + var SELF_STYLE_ATTRIBUTES_MAP = { + 'alignment-baseline': 'textBaseline', + 'stop-color': 'stopColor' + }; + var SELF_STYLE_ATTRIBUTES_MAP_KEYS = keys(SELF_STYLE_ATTRIBUTES_MAP); + var SVGParser = (function () { + function SVGParser() { + this._defs = {}; + this._root = null; + } + SVGParser.prototype.parse = function (xml, opt) { + opt = opt || {}; + var svg = parseXML(xml); + if ("development" !== 'production') { + if (!svg) { + throw new Error('Illegal svg'); + } + } + this._defsUsePending = []; + var root = new Group(); + this._root = root; + var named = []; + var viewBox = svg.getAttribute('viewBox') || ''; + var width = parseFloat((svg.getAttribute('width') || opt.width)); + var height = parseFloat((svg.getAttribute('height') || opt.height)); + isNaN(width) && (width = null); + isNaN(height) && (height = null); + parseAttributes(svg, root, null, true, false); + var child = svg.firstChild; + while (child) { + this._parseNode(child, root, named, null, false, false); + child = child.nextSibling; + } + applyDefs(this._defs, this._defsUsePending); + this._defsUsePending = []; + var viewBoxRect; + var viewBoxTransform; + if (viewBox) { + var viewBoxArr = splitNumberSequence(viewBox); + if (viewBoxArr.length >= 4) { + viewBoxRect = { + x: parseFloat((viewBoxArr[0] || 0)), + y: parseFloat((viewBoxArr[1] || 0)), + width: parseFloat(viewBoxArr[2]), + height: parseFloat(viewBoxArr[3]) + }; + } + } + if (viewBoxRect && width != null && height != null) { + viewBoxTransform = makeViewBoxTransform(viewBoxRect, { x: 0, y: 0, width: width, height: height }); + if (!opt.ignoreViewBox) { + var elRoot = root; + root = new Group(); + root.add(elRoot); + elRoot.scaleX = elRoot.scaleY = viewBoxTransform.scale; + elRoot.x = viewBoxTransform.x; + elRoot.y = viewBoxTransform.y; + } + } + if (!opt.ignoreRootClip && width != null && height != null) { + root.setClipPath(new Rect({ + shape: { x: 0, y: 0, width: width, height: height } + })); + } + return { + root: root, + width: width, + height: height, + viewBoxRect: viewBoxRect, + viewBoxTransform: viewBoxTransform, + named: named + }; + }; + SVGParser.prototype._parseNode = function (xmlNode, parentGroup, named, namedFrom, isInDefs, isInText) { + var nodeName = xmlNode.nodeName.toLowerCase(); + var el; + var namedFromForSub = namedFrom; + if (nodeName === 'defs') { + isInDefs = true; + } + if (nodeName === 'text') { + isInText = true; + } + if (nodeName === 'defs' || nodeName === 'switch') { + el = parentGroup; + } + else { + if (!isInDefs) { + var parser_1 = nodeParsers[nodeName]; + if (parser_1 && hasOwn(nodeParsers, nodeName)) { + el = parser_1.call(this, xmlNode, parentGroup); + var nameAttr = xmlNode.getAttribute('name'); + if (nameAttr) { + var newNamed = { + name: nameAttr, + namedFrom: null, + svgNodeTagLower: nodeName, + el: el + }; + named.push(newNamed); + if (nodeName === 'g') { + namedFromForSub = newNamed; + } + } + else if (namedFrom) { + named.push({ + name: namedFrom.name, + namedFrom: namedFrom, + svgNodeTagLower: nodeName, + el: el + }); + } + parentGroup.add(el); + } + } + var parser = paintServerParsers[nodeName]; + if (parser && hasOwn(paintServerParsers, nodeName)) { + var def = parser.call(this, xmlNode); + var id = xmlNode.getAttribute('id'); + if (id) { + this._defs[id] = def; + } + } + } + if (el && el.isGroup) { + var child = xmlNode.firstChild; + while (child) { + if (child.nodeType === 1) { + this._parseNode(child, el, named, namedFromForSub, isInDefs, isInText); + } + else if (child.nodeType === 3 && isInText) { + this._parseText(child, el); + } + child = child.nextSibling; + } + } + }; + SVGParser.prototype._parseText = function (xmlNode, parentGroup) { + var text = new TSpan({ + style: { + text: xmlNode.textContent + }, + silent: true, + x: this._textX || 0, + y: this._textY || 0 + }); + inheritStyle(parentGroup, text); + parseAttributes(xmlNode, text, this._defsUsePending, false, false); + applyTextAlignment(text, parentGroup); + var textStyle = text.style; + var fontSize = textStyle.fontSize; + if (fontSize && fontSize < 9) { + textStyle.fontSize = 9; + text.scaleX *= fontSize / 9; + text.scaleY *= fontSize / 9; + } + var font = (textStyle.fontSize || textStyle.fontFamily) && [ + textStyle.fontStyle, + textStyle.fontWeight, + (textStyle.fontSize || 12) + 'px', + textStyle.fontFamily || 'sans-serif' + ].join(' '); + textStyle.font = font; + var rect = text.getBoundingRect(); + this._textX += rect.width; + parentGroup.add(text); + return text; + }; + SVGParser.internalField = (function () { + nodeParsers = { + 'g': function (xmlNode, parentGroup) { + var g = new Group(); + inheritStyle(parentGroup, g); + parseAttributes(xmlNode, g, this._defsUsePending, false, false); + return g; + }, + 'rect': function (xmlNode, parentGroup) { + var rect = new Rect(); + inheritStyle(parentGroup, rect); + parseAttributes(xmlNode, rect, this._defsUsePending, false, false); + rect.setShape({ + x: parseFloat(xmlNode.getAttribute('x') || '0'), + y: parseFloat(xmlNode.getAttribute('y') || '0'), + width: parseFloat(xmlNode.getAttribute('width') || '0'), + height: parseFloat(xmlNode.getAttribute('height') || '0') + }); + rect.silent = true; + return rect; + }, + 'circle': function (xmlNode, parentGroup) { + var circle = new Circle(); + inheritStyle(parentGroup, circle); + parseAttributes(xmlNode, circle, this._defsUsePending, false, false); + circle.setShape({ + cx: parseFloat(xmlNode.getAttribute('cx') || '0'), + cy: parseFloat(xmlNode.getAttribute('cy') || '0'), + r: parseFloat(xmlNode.getAttribute('r') || '0') + }); + circle.silent = true; + return circle; + }, + 'line': function (xmlNode, parentGroup) { + var line = new Line(); + inheritStyle(parentGroup, line); + parseAttributes(xmlNode, line, this._defsUsePending, false, false); + line.setShape({ + x1: parseFloat(xmlNode.getAttribute('x1') || '0'), + y1: parseFloat(xmlNode.getAttribute('y1') || '0'), + x2: parseFloat(xmlNode.getAttribute('x2') || '0'), + y2: parseFloat(xmlNode.getAttribute('y2') || '0') + }); + line.silent = true; + return line; + }, + 'ellipse': function (xmlNode, parentGroup) { + var ellipse = new Ellipse(); + inheritStyle(parentGroup, ellipse); + parseAttributes(xmlNode, ellipse, this._defsUsePending, false, false); + ellipse.setShape({ + cx: parseFloat(xmlNode.getAttribute('cx') || '0'), + cy: parseFloat(xmlNode.getAttribute('cy') || '0'), + rx: parseFloat(xmlNode.getAttribute('rx') || '0'), + ry: parseFloat(xmlNode.getAttribute('ry') || '0') + }); + ellipse.silent = true; + return ellipse; + }, + 'polygon': function (xmlNode, parentGroup) { + var pointsStr = xmlNode.getAttribute('points'); + var pointsArr; + if (pointsStr) { + pointsArr = parsePoints(pointsStr); + } + var polygon = new Polygon({ + shape: { + points: pointsArr || [] + }, + silent: true + }); + inheritStyle(parentGroup, polygon); + parseAttributes(xmlNode, polygon, this._defsUsePending, false, false); + return polygon; + }, + 'polyline': function (xmlNode, parentGroup) { + var pointsStr = xmlNode.getAttribute('points'); + var pointsArr; + if (pointsStr) { + pointsArr = parsePoints(pointsStr); + } + var polyline = new Polyline({ + shape: { + points: pointsArr || [] + }, + silent: true + }); + inheritStyle(parentGroup, polyline); + parseAttributes(xmlNode, polyline, this._defsUsePending, false, false); + return polyline; + }, + 'image': function (xmlNode, parentGroup) { + var img = new ZRImage(); + inheritStyle(parentGroup, img); + parseAttributes(xmlNode, img, this._defsUsePending, false, false); + img.setStyle({ + image: xmlNode.getAttribute('xlink:href') || xmlNode.getAttribute('href'), + x: +xmlNode.getAttribute('x'), + y: +xmlNode.getAttribute('y'), + width: +xmlNode.getAttribute('width'), + height: +xmlNode.getAttribute('height') + }); + img.silent = true; + return img; + }, + 'text': function (xmlNode, parentGroup) { + var x = xmlNode.getAttribute('x') || '0'; + var y = xmlNode.getAttribute('y') || '0'; + var dx = xmlNode.getAttribute('dx') || '0'; + var dy = xmlNode.getAttribute('dy') || '0'; + this._textX = parseFloat(x) + parseFloat(dx); + this._textY = parseFloat(y) + parseFloat(dy); + var g = new Group(); + inheritStyle(parentGroup, g); + parseAttributes(xmlNode, g, this._defsUsePending, false, true); + return g; + }, + 'tspan': function (xmlNode, parentGroup) { + var x = xmlNode.getAttribute('x'); + var y = xmlNode.getAttribute('y'); + if (x != null) { + this._textX = parseFloat(x); + } + if (y != null) { + this._textY = parseFloat(y); + } + var dx = xmlNode.getAttribute('dx') || '0'; + var dy = xmlNode.getAttribute('dy') || '0'; + var g = new Group(); + inheritStyle(parentGroup, g); + parseAttributes(xmlNode, g, this._defsUsePending, false, true); + this._textX += parseFloat(dx); + this._textY += parseFloat(dy); + return g; + }, + 'path': function (xmlNode, parentGroup) { + var d = xmlNode.getAttribute('d') || ''; + var path = createFromString(d); + inheritStyle(parentGroup, path); + parseAttributes(xmlNode, path, this._defsUsePending, false, false); + path.silent = true; + return path; + } + }; + })(); + return SVGParser; + }()); + var paintServerParsers = { + 'lineargradient': function (xmlNode) { + var x1 = parseInt(xmlNode.getAttribute('x1') || '0', 10); + var y1 = parseInt(xmlNode.getAttribute('y1') || '0', 10); + var x2 = parseInt(xmlNode.getAttribute('x2') || '10', 10); + var y2 = parseInt(xmlNode.getAttribute('y2') || '0', 10); + var gradient = new LinearGradient(x1, y1, x2, y2); + parsePaintServerUnit(xmlNode, gradient); + parseGradientColorStops(xmlNode, gradient); + return gradient; + }, + 'radialgradient': function (xmlNode) { + var cx = parseInt(xmlNode.getAttribute('cx') || '0', 10); + var cy = parseInt(xmlNode.getAttribute('cy') || '0', 10); + var r = parseInt(xmlNode.getAttribute('r') || '0', 10); + var gradient = new RadialGradient(cx, cy, r); + parsePaintServerUnit(xmlNode, gradient); + parseGradientColorStops(xmlNode, gradient); + return gradient; + } + }; + function parsePaintServerUnit(xmlNode, gradient) { + var gradientUnits = xmlNode.getAttribute('gradientUnits'); + if (gradientUnits === 'userSpaceOnUse') { + gradient.global = true; + } + } + function parseGradientColorStops(xmlNode, gradient) { + var stop = xmlNode.firstChild; + while (stop) { + if (stop.nodeType === 1 + && stop.nodeName.toLocaleLowerCase() === 'stop') { + var offsetStr = stop.getAttribute('offset'); + var offset = void 0; + if (offsetStr && offsetStr.indexOf('%') > 0) { + offset = parseInt(offsetStr, 10) / 100; + } + else if (offsetStr) { + offset = parseFloat(offsetStr); + } + else { + offset = 0; + } + var styleVals = {}; + parseInlineStyle(stop, styleVals, styleVals); + var stopColor = styleVals.stopColor + || stop.getAttribute('stop-color') + || '#000000'; + gradient.colorStops.push({ + offset: offset, + color: stopColor + }); + } + stop = stop.nextSibling; + } + } + function inheritStyle(parent, child) { + if (parent && parent.__inheritedStyle) { + if (!child.__inheritedStyle) { + child.__inheritedStyle = {}; + } + defaults(child.__inheritedStyle, parent.__inheritedStyle); + } + } + function parsePoints(pointsString) { + var list = splitNumberSequence(pointsString); + var points = []; + for (var i = 0; i < list.length; i += 2) { + var x = parseFloat(list[i]); + var y = parseFloat(list[i + 1]); + points.push([x, y]); + } + return points; + } + function parseAttributes(xmlNode, el, defsUsePending, onlyInlineStyle, isTextGroup) { + var disp = el; + var inheritedStyle = disp.__inheritedStyle = disp.__inheritedStyle || {}; + var selfStyle = {}; + if (xmlNode.nodeType === 1) { + parseTransformAttribute(xmlNode, el); + parseInlineStyle(xmlNode, inheritedStyle, selfStyle); + if (!onlyInlineStyle) { + parseAttributeStyle(xmlNode, inheritedStyle, selfStyle); + } + } + disp.style = disp.style || {}; + if (inheritedStyle.fill != null) { + disp.style.fill = getFillStrokeStyle(disp, 'fill', inheritedStyle.fill, defsUsePending); + } + if (inheritedStyle.stroke != null) { + disp.style.stroke = getFillStrokeStyle(disp, 'stroke', inheritedStyle.stroke, defsUsePending); + } + each([ + 'lineWidth', 'opacity', 'fillOpacity', 'strokeOpacity', 'miterLimit', 'fontSize' + ], function (propName) { + if (inheritedStyle[propName] != null) { + disp.style[propName] = parseFloat(inheritedStyle[propName]); + } + }); + each([ + 'lineDashOffset', 'lineCap', 'lineJoin', 'fontWeight', 'fontFamily', 'fontStyle', 'textAlign' + ], function (propName) { + if (inheritedStyle[propName] != null) { + disp.style[propName] = inheritedStyle[propName]; + } + }); + if (isTextGroup) { + disp.__selfStyle = selfStyle; + } + if (inheritedStyle.lineDash) { + disp.style.lineDash = map(splitNumberSequence(inheritedStyle.lineDash), function (str) { + return parseFloat(str); + }); + } + if (inheritedStyle.visibility === 'hidden' || inheritedStyle.visibility === 'collapse') { + disp.invisible = true; + } + if (inheritedStyle.display === 'none') { + disp.ignore = true; + } + } + function applyTextAlignment(text, parentGroup) { + var parentSelfStyle = parentGroup.__selfStyle; + if (parentSelfStyle) { + var textBaseline = parentSelfStyle.textBaseline; + var zrTextBaseline = textBaseline; + if (!textBaseline || textBaseline === 'auto') { + zrTextBaseline = 'alphabetic'; + } + else if (textBaseline === 'baseline') { + zrTextBaseline = 'alphabetic'; + } + else if (textBaseline === 'before-edge' || textBaseline === 'text-before-edge') { + zrTextBaseline = 'top'; + } + else if (textBaseline === 'after-edge' || textBaseline === 'text-after-edge') { + zrTextBaseline = 'bottom'; + } + else if (textBaseline === 'central' || textBaseline === 'mathematical') { + zrTextBaseline = 'middle'; + } + text.style.textBaseline = zrTextBaseline; + } + var parentInheritedStyle = parentGroup.__inheritedStyle; + if (parentInheritedStyle) { + var textAlign = parentInheritedStyle.textAlign; + var zrTextAlign = textAlign; + if (textAlign) { + if (textAlign === 'middle') { + zrTextAlign = 'center'; + } + text.style.textAlign = zrTextAlign; + } + } + } + var urlRegex = /^url\(\s*#(.*?)\)/; + function getFillStrokeStyle(el, method, str, defsUsePending) { + var urlMatch = str && str.match(urlRegex); + if (urlMatch) { + var url = trim(urlMatch[1]); + defsUsePending.push([el, method, url]); + return; + } + if (str === 'none') { + str = null; + } + return str; + } + function applyDefs(defs, defsUsePending) { + for (var i = 0; i < defsUsePending.length; i++) { + var item = defsUsePending[i]; + item[0].style[item[1]] = defs[item[2]]; + } + } + var numberReg$1 = /-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g; + function splitNumberSequence(rawStr) { + return rawStr.match(numberReg$1) || []; + } + var transformRegex = /(translate|scale|rotate|skewX|skewY|matrix)\(([\-\s0-9\.eE,]*)\)/g; + var DEGREE_TO_ANGLE = Math.PI / 180; + function parseTransformAttribute(xmlNode, node) { + var transform = xmlNode.getAttribute('transform'); + if (transform) { + transform = transform.replace(/,/g, ' '); + var transformOps_1 = []; + var mt = null; + transform.replace(transformRegex, function (str, type, value) { + transformOps_1.push(type, value); + return ''; + }); + for (var i = transformOps_1.length - 1; i > 0; i -= 2) { + var value = transformOps_1[i]; + var type = transformOps_1[i - 1]; + var valueArr = splitNumberSequence(value); + mt = mt || create$1(); + switch (type) { + case 'translate': + translate(mt, mt, [parseFloat(valueArr[0]), parseFloat(valueArr[1] || '0')]); + break; + case 'scale': + scale$1(mt, mt, [parseFloat(valueArr[0]), parseFloat(valueArr[1] || valueArr[0])]); + break; + case 'rotate': + rotate(mt, mt, -parseFloat(valueArr[0]) * DEGREE_TO_ANGLE); + break; + case 'skewX': + var sx = Math.tan(parseFloat(valueArr[0]) * DEGREE_TO_ANGLE); + mul$1(mt, [1, 0, sx, 1, 0, 0], mt); + break; + case 'skewY': + var sy = Math.tan(parseFloat(valueArr[0]) * DEGREE_TO_ANGLE); + mul$1(mt, [1, sy, 0, 1, 0, 0], mt); + break; + case 'matrix': + mt[0] = parseFloat(valueArr[0]); + mt[1] = parseFloat(valueArr[1]); + mt[2] = parseFloat(valueArr[2]); + mt[3] = parseFloat(valueArr[3]); + mt[4] = parseFloat(valueArr[4]); + mt[5] = parseFloat(valueArr[5]); + break; + } + } + node.setLocalTransform(mt); + } + } + var styleRegex = /([^\s:;]+)\s*:\s*([^:;]+)/g; + function parseInlineStyle(xmlNode, inheritableStyleResult, selfStyleResult) { + var style = xmlNode.getAttribute('style'); + if (!style) { + return; + } + styleRegex.lastIndex = 0; + var styleRegResult; + while ((styleRegResult = styleRegex.exec(style)) != null) { + var svgStlAttr = styleRegResult[1]; + var zrInheritableStlAttr = hasOwn(INHERITABLE_STYLE_ATTRIBUTES_MAP, svgStlAttr) + ? INHERITABLE_STYLE_ATTRIBUTES_MAP[svgStlAttr] + : null; + if (zrInheritableStlAttr) { + inheritableStyleResult[zrInheritableStlAttr] = styleRegResult[2]; + } + var zrSelfStlAttr = hasOwn(SELF_STYLE_ATTRIBUTES_MAP, svgStlAttr) + ? SELF_STYLE_ATTRIBUTES_MAP[svgStlAttr] + : null; + if (zrSelfStlAttr) { + selfStyleResult[zrSelfStlAttr] = styleRegResult[2]; + } + } + } + function parseAttributeStyle(xmlNode, inheritableStyleResult, selfStyleResult) { + for (var i = 0; i < INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS.length; i++) { + var svgAttrName = INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS[i]; + var attrValue = xmlNode.getAttribute(svgAttrName); + if (attrValue != null) { + inheritableStyleResult[INHERITABLE_STYLE_ATTRIBUTES_MAP[svgAttrName]] = attrValue; + } + } + for (var i = 0; i < SELF_STYLE_ATTRIBUTES_MAP_KEYS.length; i++) { + var svgAttrName = SELF_STYLE_ATTRIBUTES_MAP_KEYS[i]; + var attrValue = xmlNode.getAttribute(svgAttrName); + if (attrValue != null) { + selfStyleResult[SELF_STYLE_ATTRIBUTES_MAP[svgAttrName]] = attrValue; + } + } + } + function makeViewBoxTransform(viewBoxRect, boundingRect) { + var scaleX = boundingRect.width / viewBoxRect.width; + var scaleY = boundingRect.height / viewBoxRect.height; + var scale = Math.min(scaleX, scaleY); + return { + scale: scale, + x: -(viewBoxRect.x + viewBoxRect.width / 2) * scale + (boundingRect.x + boundingRect.width / 2), + y: -(viewBoxRect.y + viewBoxRect.height / 2) * scale + (boundingRect.y + boundingRect.height / 2) + }; + } + function parseSVG(xml, opt) { + var parser = new SVGParser(); + return parser.parse(xml, opt); + } + + /** + * "region available" means that: enable users to set attribute `name="xxx"` on those tags + * to make it be a region. + * 1. region styles and its label styles can be defined in echarts opton: + * ```js + * geo: { + * regions: [{ + * name: 'xxx', + * itemStyle: { ... }, + * label: { ... } + * }, { + * ... + * }, + * ...] + * }; + * ``` + * 2. name can be duplicated in different SVG tag. All of the tags with the same name share + * a region option. For exampel if there are two <path> representing two lung lobes. They have + * no common parents but both of them need to display label "lung" inside. + */ + + var REGION_AVAILABLE_SVG_TAG_MAP = createHashMap(['rect', 'circle', 'line', 'ellipse', 'polygon', 'polyline', 'path', // <text> <tspan> are also enabled becuase some SVG might paint text itself, + // but still need to trigger events or tooltip. + 'text', 'tspan', // <g> is also enabled because this case: if multiple tags share one name + // and need label displayed, every tags will display the name, which is not + // expected. So we can put them into a <g name="xxx">. Thereby only one label + // displayed and located based on the bounding rect of the <g>. + 'g']); + + var GeoSVGResource = + /** @class */ + function () { + function GeoSVGResource(mapName, svg) { + this.type = 'geoSVG'; // All used graphics. key: hostKey, value: root + + this._usedGraphicMap = createHashMap(); // All unused graphics. + + this._freedGraphics = []; + this._mapName = mapName; // Only perform parse to XML object here, which might be time + // consiming for large SVG. + // Although convert XML to zrender element is also time consiming, + // if we do it here, the clone of zrender elements has to be + // required. So we do it once for each geo instance, util real + // performance issues call for optimizing it. + + this._parsedXML = parseXML(svg); + } + + GeoSVGResource.prototype.load = function () + /* nameMap: NameMap */ + { + // In the "load" stage, graphic need to be built to + // get boundingRect for geo coordinate system. + var firstGraphic = this._firstGraphic; // Create the return data structure only when first graphic created. + // Because they will be used in geo coordinate system update stage, + // and `regions` will be mounted at `geo` coordinate system, + // in which there is no "view" info, so that it should better not to + // make references to graphic elements. + + if (!firstGraphic) { + firstGraphic = this._firstGraphic = this._buildGraphic(this._parsedXML); + + this._freedGraphics.push(firstGraphic); + + this._boundingRect = this._firstGraphic.boundingRect.clone(); // PENDING: `nameMap` will not be supported until some real requirement come. + // if (nameMap) { + // named = applyNameMap(named, nameMap); + // } + + var _a = createRegions(firstGraphic.named), + regions = _a.regions, + regionsMap = _a.regionsMap; + + this._regions = regions; + this._regionsMap = regionsMap; + } + + return { + boundingRect: this._boundingRect, + regions: this._regions, + regionsMap: this._regionsMap + }; + }; + + GeoSVGResource.prototype._buildGraphic = function (svgXML) { + var result; + var rootFromParse; + + try { + result = svgXML && parseSVG(svgXML, { + ignoreViewBox: true, + ignoreRootClip: true + }) || {}; + rootFromParse = result.root; + assert(rootFromParse != null); + } catch (e) { + throw new Error('Invalid svg format\n' + e.message); + } // Note: we keep the covenant that the root has no transform. So always add an extra root. + + + var root = new Group(); + root.add(rootFromParse); + root.isGeoSVGGraphicRoot = true; // [THE_RULE_OF_VIEWPORT_AND_VIEWBOX] + // + // Consider: `<svg width="..." height="..." viewBox="...">` + // - the `width/height` we call it `svgWidth/svgHeight` for short. + // - `(0, 0, svgWidth, svgHeight)` defines the viewport of the SVG, or say, + // "viewport boundingRect", or `boundingRect` for short. + // - `viewBox` defines the transform from the real content ot the viewport. + // `viewBox` has the same unit as the content of SVG. + // If `viewBox` exists, a transform is defined, so the unit of `svgWidth/svgHeight` become + // different from the content of SVG. Otherwise, they are the same. + // + // If both `svgWidth/svgHeight/viewBox` are specified in a SVG file, the transform rule will be: + // 0. `boundingRect` is `(0, 0, svgWidth, svgHeight)`. Set it to Geo['_rect'] (View['_rect']). + // 1. Make a transform from `viewBox` to `boundingRect`. + // Note: only suport `preserveAspectRatio 'xMidYMid'` here. That is, this transform will preserve + // the aspect ratio. + // 2. Make a transform from boundingRect to Geo['_viewRect'] (View['_viewRect']) + // (`Geo`/`View` will do this job). + // Note: this transform might not preserve aspect radio, which depending on how users specify + // viewRect in echarts option (e.g., `geo.left/top/width/height` will not preserve aspect ratio, + // but `geo.layoutCenter/layoutSize` will preserve aspect ratio). + // + // If `svgWidth/svgHeight` not specified, we use `viewBox` as the `boundingRect` to make the SVG + // layout look good. + // + // If neither `svgWidth/svgHeight` nor `viewBox` are not specified, we calculate the boundingRect + // of the SVG content and use them to make SVG layout look good. + + var svgWidth = result.width; + var svgHeight = result.height; + var viewBoxRect = result.viewBoxRect; + var boundingRect = this._boundingRect; + + if (!boundingRect) { + var bRectX = void 0; + var bRectY = void 0; + var bRectWidth = void 0; + var bRectHeight = void 0; + + if (svgWidth != null) { + bRectX = 0; + bRectWidth = svgWidth; + } else if (viewBoxRect) { + bRectX = viewBoxRect.x; + bRectWidth = viewBoxRect.width; + } + + if (svgHeight != null) { + bRectY = 0; + bRectHeight = svgHeight; + } else if (viewBoxRect) { + bRectY = viewBoxRect.y; + bRectHeight = viewBoxRect.height; + } // If both viewBox and svgWidth/svgHeight not specified, + // we have to determine how to layout those element to make them look good. + + + if (bRectX == null || bRectY == null) { + var calculatedBoundingRect = rootFromParse.getBoundingRect(); + + if (bRectX == null) { + bRectX = calculatedBoundingRect.x; + bRectWidth = calculatedBoundingRect.width; + } + + if (bRectY == null) { + bRectY = calculatedBoundingRect.y; + bRectHeight = calculatedBoundingRect.height; + } + } + + boundingRect = this._boundingRect = new BoundingRect(bRectX, bRectY, bRectWidth, bRectHeight); + } + + if (viewBoxRect) { + var viewBoxTransform = makeViewBoxTransform(viewBoxRect, boundingRect); // Only support `preserveAspectRatio 'xMidYMid'` + + rootFromParse.scaleX = rootFromParse.scaleY = viewBoxTransform.scale; + rootFromParse.x = viewBoxTransform.x; + rootFromParse.y = viewBoxTransform.y; + } // SVG needs to clip based on `viewBox`. And some SVG files really rely on this feature. + // They do not strictly confine all of the content inside a display rect, but deliberately + // use a `viewBox` to define a displayable rect. + // PENDING: + // The drawback of the `setClipPath` here is: the region label (genereted by echarts) near the + // edge might also be clipped, because region labels are put as `textContent` of the SVG path. + + + root.setClipPath(new Rect({ + shape: boundingRect.plain() + })); + var named = []; + each(result.named, function (namedItem) { + if (REGION_AVAILABLE_SVG_TAG_MAP.get(namedItem.svgNodeTagLower) != null) { + named.push(namedItem); + setSilent(namedItem.el); + } + }); + return { + root: root, + boundingRect: boundingRect, + named: named + }; + }; + /** + * Consider: + * (1) One graphic element can not be shared by different `geoView` running simultaneously. + * Notice, also need to consider multiple echarts instances share a `mapRecord`. + * (2) Converting SVG to graphic elements is time consuming. + * (3) In the current architecture, `load` should be called frequently to get boundingRect, + * and it is called without view info. + * So we maintain graphic elements in this module, and enables `view` to use/return these + * graphics from/to the pool with it's uid. + */ + + + GeoSVGResource.prototype.useGraphic = function (hostKey + /*, nameMap: NameMap */ + ) { + var usedRootMap = this._usedGraphicMap; + var svgGraphic = usedRootMap.get(hostKey); + + if (svgGraphic) { + return svgGraphic; + } + + svgGraphic = this._freedGraphics.pop() // use the first boundingRect to avoid duplicated boundingRect calculation. + || this._buildGraphic(this._parsedXML); + usedRootMap.set(hostKey, svgGraphic); // PENDING: `nameMap` will not be supported until some real requirement come. + // `nameMap` can only be obtained from echarts option. + // The original `named` must not be modified. + // if (nameMap) { + // svgGraphic = extend({}, svgGraphic); + // svgGraphic.named = applyNameMap(svgGraphic.named, nameMap); + // } + + return svgGraphic; + }; + + GeoSVGResource.prototype.freeGraphic = function (hostKey) { + var usedRootMap = this._usedGraphicMap; + var svgGraphic = usedRootMap.get(hostKey); + + if (svgGraphic) { + usedRootMap.removeKey(hostKey); + + this._freedGraphics.push(svgGraphic); + } + }; + + return GeoSVGResource; + }(); + + function setSilent(el) { + // Only named element has silent: false, other elements should + // act as background and has no user interaction. + el.silent = false; // text|tspan will be converted to group. + + if (el.isGroup) { + el.traverse(function (child) { + child.silent = false; + }); + } + } + + function createRegions(named) { + var regions = []; + var regionsMap = createHashMap(); // Create resions only for the first graphic. + + each(named, function (namedItem) { + // Region has feature to calculate center for tooltip or other features. + // If there is a <g name="xxx">, the center should be the center of the + // bounding rect of the g. + if (namedItem.namedFrom != null) { + return; + } + + var region = new GeoSVGRegion(namedItem.name, namedItem.el); // PENDING: if `nameMap` supported, this region can not be mounted on + // `this`, but can only be created each time `load()` called. + + regions.push(region); // PENDING: if multiple tag named with the same name, only one will be + // found by `_regionsMap`. `_regionsMap` is used to find a coordinate + // by name. We use `region.getCenter()` as the coordinate. + + regionsMap.set(namedItem.name, region); + }); + return { + regions: regions, + regionsMap: regionsMap + }; + } // PENDING: `nameMap` will not be supported until some real requirement come. + // /** + // * Use the alias in geoNameMap. + // * The input `named` must not be modified. + // */ + // function applyNameMap( + // named: GeoSVGGraphicRecord['named'], + // nameMap: NameMap + // ): GeoSVGGraphicRecord['named'] { + // const result = [] as GeoSVGGraphicRecord['named']; + // for (let i = 0; i < named.length; i++) { + // let regionGraphic = named[i]; + // const name = regionGraphic.name; + // if (nameMap && nameMap.hasOwnProperty(name)) { + // regionGraphic = extend({}, regionGraphic); + // regionGraphic.name = name; + // } + // result.push(regionGraphic); + // } + // return result; + // } + + var geoCoord = [126, 25]; + var nanhaiName = '南海诸岛'; + var points$1 = [[[0, 3.5], [7, 11.2], [15, 11.9], [30, 7], [42, 0.7], [52, 0.7], [56, 7.7], [59, 0.7], [64, 0.7], [64, 0], [5, 0], [0, 3.5]], [[13, 16.1], [19, 14.7], [16, 21.7], [11, 23.1], [13, 16.1]], [[12, 32.2], [14, 38.5], [15, 38.5], [13, 32.2], [12, 32.2]], [[16, 47.6], [12, 53.2], [13, 53.2], [18, 47.6], [16, 47.6]], [[6, 64.4], [8, 70], [9, 70], [8, 64.4], [6, 64.4]], [[23, 82.6], [29, 79.8], [30, 79.8], [25, 82.6], [23, 82.6]], [[37, 70.7], [43, 62.3], [44, 62.3], [39, 70.7], [37, 70.7]], [[48, 51.1], [51, 45.5], [53, 45.5], [50, 51.1], [48, 51.1]], [[51, 35], [51, 28.7], [53, 28.7], [53, 35], [51, 35]], [[52, 22.4], [55, 17.5], [56, 17.5], [53, 22.4], [52, 22.4]], [[58, 12.6], [62, 7], [63, 7], [60, 12.6], [58, 12.6]], [[0, 3.5], [0, 93.1], [64, 93.1], [64, 0], [63, 0], [63, 92.4], [1, 92.4], [1, 3.5], [0, 3.5]]]; + + for (var i = 0; i < points$1.length; i++) { + for (var k = 0; k < points$1[i].length; k++) { + points$1[i][k][0] /= 10.5; + points$1[i][k][1] /= -10.5 / 0.75; + points$1[i][k][0] += geoCoord[0]; + points$1[i][k][1] += geoCoord[1]; + } + } + + function fixNanhai(mapType, regions) { + if (mapType === 'china') { + for (var i = 0; i < regions.length; i++) { + // Already exists. + if (regions[i].name === nanhaiName) { + return; + } + } + + regions.push(new GeoJSONRegion(nanhaiName, map(points$1, function (exterior) { + return { + type: 'polygon', + exterior: exterior + }; + }), geoCoord)); + } + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + var coordsOffsetMap = { + '南海诸岛': [32, 80], + // 全国 + '广东': [0, -10], + '香港': [10, 5], + '澳门': [-10, 10], + //'北京': [-10, 0], + '天津': [5, 5] + }; + function fixTextCoords(mapType, region) { + if (mapType === 'china') { + var coordFix = coordsOffsetMap[region.name]; + + if (coordFix) { + var cp = region.getCenter(); + cp[0] += coordFix[0] / 10.5; + cp[1] += -coordFix[1] / (10.5 / 0.75); + region.setCenter(cp); + } + } + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + // Fix for 钓鱼岛 + // let Region = require('../Region'); + // let zrUtil = require('zrender/lib/core/util'); + // let geoCoord = [126, 25]; + var points$2 = [[[123.45165252685547, 25.73527164402261], [123.49731445312499, 25.73527164402261], [123.49731445312499, 25.750734064600884], [123.45165252685547, 25.750734064600884], [123.45165252685547, 25.73527164402261]]]; + function fixDiaoyuIsland(mapType, region) { + if (mapType === 'china' && region.name === '台湾') { + region.geometries.push({ + type: 'polygon', + exterior: points$2[0] + }); + } + } + + var DEFAULT_NAME_PROPERTY = 'name'; + + var GeoJSONResource = + /** @class */ + function () { + function GeoJSONResource(mapName, geoJSON, specialAreas) { + this.type = 'geoJSON'; + this._parsedMap = createHashMap(); + this._mapName = mapName; + this._specialAreas = specialAreas; // PENDING: delay the parse to the first usage to rapid up the FMP? + + this._geoJSON = parseInput(geoJSON); + } + /** + * @param nameMap can be null/undefined + * @param nameProperty can be null/undefined + */ + + + GeoJSONResource.prototype.load = function (nameMap, nameProperty) { + nameProperty = nameProperty || DEFAULT_NAME_PROPERTY; + + var parsed = this._parsedMap.get(nameProperty); + + if (!parsed) { + var rawRegions = this._parseToRegions(nameProperty); + + parsed = this._parsedMap.set(nameProperty, { + regions: rawRegions, + boundingRect: calculateBoundingRect(rawRegions) + }); + } + + var regionsMap = createHashMap(); + var finalRegions = []; + each(parsed.regions, function (region) { + var regionName = region.name; // Try use the alias in geoNameMap + + if (nameMap && hasOwn(nameMap, regionName)) { + region = region.cloneShallow(regionName = nameMap[regionName]); + } + + finalRegions.push(region); + regionsMap.set(regionName, region); + }); + return { + regions: finalRegions, + boundingRect: parsed.boundingRect || new BoundingRect(0, 0, 0, 0), + regionsMap: regionsMap + }; + }; + + GeoJSONResource.prototype._parseToRegions = function (nameProperty) { + var mapName = this._mapName; + var geoJSON = this._geoJSON; + var rawRegions; // https://jsperf.com/try-catch-performance-overhead + + try { + rawRegions = geoJSON ? parseGeoJSON(geoJSON, nameProperty) : []; + } catch (e) { + throw new Error('Invalid geoJson format\n' + e.message); + } + + fixNanhai(mapName, rawRegions); + each(rawRegions, function (region) { + var regionName = region.name; + fixTextCoords(mapName, region); + fixDiaoyuIsland(mapName, region); // Some area like Alaska in USA map needs to be tansformed + // to look better + + var specialArea = this._specialAreas && this._specialAreas[regionName]; + + if (specialArea) { + region.transformTo(specialArea.left, specialArea.top, specialArea.width, specialArea.height); + } + }, this); + return rawRegions; + }; + /** + * Only for exporting to users. + * **MUST NOT** used internally. + */ + + + GeoJSONResource.prototype.getMapForUser = function () { + return { + // For backward compatibility, use geoJson + // PENDING: it has been returning them without clone. + // do we need to avoid outsite modification? + geoJson: this._geoJSON, + geoJSON: this._geoJSON, + specialAreas: this._specialAreas + }; + }; + + return GeoJSONResource; + }(); + + function calculateBoundingRect(regions) { + var rect; + + for (var i = 0; i < regions.length; i++) { + var regionRect = regions[i].getBoundingRect(); + rect = rect || regionRect.clone(); + rect.union(regionRect); + } + + return rect; + } + + function parseInput(source) { + return !isString(source) ? source : typeof JSON !== 'undefined' && JSON.parse ? JSON.parse(source) : new Function('return (' + source + ');')(); + } + + var storage = createHashMap(); + var geoSourceManager = { + /** + * Compatible with previous `echarts.registerMap`. + * + * @usage + * ```js + * + * echarts.registerMap('USA', geoJson, specialAreas); + * + * echarts.registerMap('USA', { + * geoJson: geoJson, + * specialAreas: {...} + * }); + * echarts.registerMap('USA', { + * geoJSON: geoJson, + * specialAreas: {...} + * }); + * + * echarts.registerMap('airport', { + * svg: svg + * } + * ``` + * + * Note: + * Do not support that register multiple geoJSON or SVG + * one map name. Because different geoJSON and SVG have + * different unit. It's not easy to make sure how those + * units are mapping/normalize. + * If intending to use multiple geoJSON or SVG, we can + * use multiple geo coordinate system. + */ + registerMap: function (mapName, rawDef, rawSpecialAreas) { + if (rawDef.svg) { + var resource = new GeoSVGResource(mapName, rawDef.svg); + storage.set(mapName, resource); + } else { + // Recommend: + // echarts.registerMap('eu', { geoJSON: xxx, specialAreas: xxx }); + // Backward compatibility: + // echarts.registerMap('eu', geoJSON, specialAreas); + // echarts.registerMap('eu', { geoJson: xxx, specialAreas: xxx }); + var geoJSON = rawDef.geoJson || rawDef.geoJSON; + + if (geoJSON && !rawDef.features) { + rawSpecialAreas = rawDef.specialAreas; + } else { + geoJSON = rawDef; + } + + var resource = new GeoJSONResource(mapName, geoJSON, rawSpecialAreas); + storage.set(mapName, resource); + } + }, + getGeoResource: function (mapName) { + return storage.get(mapName); + }, + + /** + * Only for exporting to users. + * **MUST NOT** used internally. + */ + getMapForUser: function (mapName) { + var resource = storage.get(mapName); // Do not support return SVG until some real requirement come. + + return resource && resource.type === 'geoJSON' && resource.getMapForUser(); + }, + load: function (mapName, nameMap, nameProperty) { + var resource = storage.get(mapName); + + if (!resource) { + if ("development" !== 'production') { + console.error('Map ' + mapName + ' not exists. The GeoJSON of the map must be provided.'); + } + + return; + } + + return resource.load(nameMap, nameProperty); + } + }; + + /** + * Only these tags enable use `itemStyle` if they are named in SVG. + * Other tags like <text> <tspan> <image> might not suitable for `itemStyle`. + * They will not be considered to be styled until some requirements come. + */ + + var OPTION_STYLE_ENABLED_TAGS = ['rect', 'circle', 'line', 'ellipse', 'polygon', 'polyline', 'path']; + var OPTION_STYLE_ENABLED_TAG_MAP = createHashMap(OPTION_STYLE_ENABLED_TAGS); + var STATE_TRIGGER_TAG_MAP = createHashMap(OPTION_STYLE_ENABLED_TAGS.concat(['g'])); + var LABEL_HOST_MAP = createHashMap(OPTION_STYLE_ENABLED_TAGS.concat(['g'])); + var mapLabelRaw = makeInner(); + + function getFixedItemStyle(model) { + var itemStyle = model.getItemStyle(); + var areaColor = model.get('areaColor'); // If user want the color not to be changed when hover, + // they should both set areaColor and color to be null. + + if (areaColor != null) { + itemStyle.fill = areaColor; + } + + return itemStyle; + } // Only stroke can be used for line. + // Using fill in style if stroke not exits. + // TODO Not sure yet. Perhaps a separate `lineStyle`? + + + function fixLineStyle(styleHost) { + var style = styleHost.style; + + if (style) { + style.stroke = style.stroke || style.fill; + style.fill = null; + } + } + + var MapDraw = + /** @class */ + function () { + function MapDraw(api) { + var group = new Group(); + this.uid = getUID('ec_map_draw'); + this._controller = new RoamController(api.getZr()); + this._controllerHost = { + target: group + }; + this.group = group; + group.add(this._regionsGroup = new Group()); + group.add(this._svgGroup = new Group()); + } + + MapDraw.prototype.draw = function (mapOrGeoModel, ecModel, api, fromView, payload) { + var isGeo = mapOrGeoModel.mainType === 'geo'; // Map series has data. GEO model that controlled by map series + // will be assigned with map data. Other GEO model has no data. + + var data = mapOrGeoModel.getData && mapOrGeoModel.getData(); + isGeo && ecModel.eachComponent({ + mainType: 'series', + subType: 'map' + }, function (mapSeries) { + if (!data && mapSeries.getHostGeoModel() === mapOrGeoModel) { + data = mapSeries.getData(); + } + }); + var geo = mapOrGeoModel.coordinateSystem; + var regionsGroup = this._regionsGroup; + var group = this.group; + var transformInfo = geo.getTransformInfo(); + var transformInfoRaw = transformInfo.raw; + var transformInfoRoam = transformInfo.roam; // No animation when first draw or in action + + var isFirstDraw = !regionsGroup.childAt(0) || payload; + + if (isFirstDraw) { + group.x = transformInfoRoam.x; + group.y = transformInfoRoam.y; + group.scaleX = transformInfoRoam.scaleX; + group.scaleY = transformInfoRoam.scaleY; + group.dirty(); + } else { + updateProps(group, transformInfoRoam, mapOrGeoModel); + } + + var isVisualEncodedByVisualMap = data && data.getVisual('visualMeta') && data.getVisual('visualMeta').length > 0; + var viewBuildCtx = { + api: api, + geo: geo, + mapOrGeoModel: mapOrGeoModel, + data: data, + isVisualEncodedByVisualMap: isVisualEncodedByVisualMap, + isGeo: isGeo, + transformInfoRaw: transformInfoRaw + }; + + if (geo.resourceType === 'geoJSON') { + this._buildGeoJSON(viewBuildCtx); + } else if (geo.resourceType === 'geoSVG') { + this._buildSVG(viewBuildCtx); + } + + this._updateController(mapOrGeoModel, ecModel, api); + + this._updateMapSelectHandler(mapOrGeoModel, regionsGroup, api, fromView); + }; + + MapDraw.prototype._buildGeoJSON = function (viewBuildCtx) { + var regionsGroupByName = this._regionsGroupByName = createHashMap(); + var regionsInfoByName = createHashMap(); + var regionsGroup = this._regionsGroup; + var transformInfoRaw = viewBuildCtx.transformInfoRaw; + var mapOrGeoModel = viewBuildCtx.mapOrGeoModel; + var data = viewBuildCtx.data; + var projection = viewBuildCtx.geo.projection; + var projectionStream = projection && projection.stream; + + function transformPoint(point, project) { + if (project) { + // projection may return null point. + point = project(point); + } + + return point && [point[0] * transformInfoRaw.scaleX + transformInfoRaw.x, point[1] * transformInfoRaw.scaleY + transformInfoRaw.y]; + } + + function transformPolygonPoints(inPoints) { + var outPoints = []; // If projectionStream is provided. Use it instead of single point project. + + var project = !projectionStream && projection && projection.project; + + for (var i = 0; i < inPoints.length; ++i) { + var newPt = transformPoint(inPoints[i], project); + newPt && outPoints.push(newPt); + } + + return outPoints; + } + + function getPolyShape(points) { + return { + shape: { + points: transformPolygonPoints(points) + } + }; + } + + regionsGroup.removeAll(); // Only when the resource is GeoJSON, there is `geo.regions`. + + each(viewBuildCtx.geo.regions, function (region) { + var regionName = region.name; // Consider in GeoJson properties.name may be duplicated, for example, + // there is multiple region named "United Kindom" or "France" (so many + // colonies). And it is not appropriate to merge them in geo, which + // will make them share the same label and bring trouble in label + // location calculation. + + var regionGroup = regionsGroupByName.get(regionName); + + var _a = regionsInfoByName.get(regionName) || {}, + dataIdx = _a.dataIdx, + regionModel = _a.regionModel; + + if (!regionGroup) { + regionGroup = regionsGroupByName.set(regionName, new Group()); + regionsGroup.add(regionGroup); + dataIdx = data ? data.indexOfName(regionName) : null; + regionModel = viewBuildCtx.isGeo ? mapOrGeoModel.getRegionModel(regionName) : data ? data.getItemModel(dataIdx) : null; + regionsInfoByName.set(regionName, { + dataIdx: dataIdx, + regionModel: regionModel + }); + } + + var polygonSubpaths = []; + var polylineSubpaths = []; + each(region.geometries, function (geometry) { + // Polygon and MultiPolygon + if (geometry.type === 'polygon') { + var polys = [geometry.exterior].concat(geometry.interiors || []); + + if (projectionStream) { + polys = projectPolys(polys, projectionStream); + } + + each(polys, function (poly) { + polygonSubpaths.push(new Polygon(getPolyShape(poly))); + }); + } // LineString and MultiLineString + else { + var points = geometry.points; + + if (projectionStream) { + points = projectPolys(points, projectionStream, true); + } + + each(points, function (points) { + polylineSubpaths.push(new Polyline(getPolyShape(points))); + }); + } + }); + var centerPt = transformPoint(region.getCenter(), projection && projection.project); + + function createCompoundPath(subpaths, isLine) { + if (!subpaths.length) { + return; + } + + var compoundPath = new CompoundPath({ + culling: true, + segmentIgnoreThreshold: 1, + shape: { + paths: subpaths + } + }); + regionGroup.add(compoundPath); + applyOptionStyleForRegion(viewBuildCtx, compoundPath, dataIdx, regionModel); + resetLabelForRegion(viewBuildCtx, compoundPath, regionName, regionModel, mapOrGeoModel, dataIdx, centerPt); + + if (isLine) { + fixLineStyle(compoundPath); + each(compoundPath.states, fixLineStyle); + } + } + + createCompoundPath(polygonSubpaths); + createCompoundPath(polylineSubpaths, true); + }); // Ensure children have been added to `regionGroup` before calling them. + + regionsGroupByName.each(function (regionGroup, regionName) { + var _a = regionsInfoByName.get(regionName), + dataIdx = _a.dataIdx, + regionModel = _a.regionModel; + + resetEventTriggerForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel, dataIdx); + resetTooltipForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel); + resetStateTriggerForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel); + }, this); + }; + + MapDraw.prototype._buildSVG = function (viewBuildCtx) { + var mapName = viewBuildCtx.geo.map; + var transformInfoRaw = viewBuildCtx.transformInfoRaw; + this._svgGroup.x = transformInfoRaw.x; + this._svgGroup.y = transformInfoRaw.y; + this._svgGroup.scaleX = transformInfoRaw.scaleX; + this._svgGroup.scaleY = transformInfoRaw.scaleY; + + if (this._svgResourceChanged(mapName)) { + this._freeSVG(); + + this._useSVG(mapName); + } + + var svgDispatcherMap = this._svgDispatcherMap = createHashMap(); + var focusSelf = false; + each(this._svgGraphicRecord.named, function (namedItem) { + // Note that we also allow different elements have the same name. + // For example, a glyph of a city and the label of the city have + // the same name and their tooltip info can be defined in a single + // region option. + var regionName = namedItem.name; + var mapOrGeoModel = viewBuildCtx.mapOrGeoModel; + var data = viewBuildCtx.data; + var svgNodeTagLower = namedItem.svgNodeTagLower; + var el = namedItem.el; + var dataIdx = data ? data.indexOfName(regionName) : null; + var regionModel = mapOrGeoModel.getRegionModel(regionName); + + if (OPTION_STYLE_ENABLED_TAG_MAP.get(svgNodeTagLower) != null && el instanceof Displayable) { + applyOptionStyleForRegion(viewBuildCtx, el, dataIdx, regionModel); + } + + if (el instanceof Displayable) { + el.culling = true; + } // We do not know how the SVG like so we'd better not to change z2. + // Otherwise it might bring some unexpected result. For example, + // an area hovered that make some inner city can not be clicked. + + + el.z2EmphasisLift = 0; // If self named: + + if (!namedItem.namedFrom) { + // label should batter to be displayed based on the center of <g> + // if it is named rather than displayed on each child. + if (LABEL_HOST_MAP.get(svgNodeTagLower) != null) { + resetLabelForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel, dataIdx, null); + } + + resetEventTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel, dataIdx); + resetTooltipForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel); + + if (STATE_TRIGGER_TAG_MAP.get(svgNodeTagLower) != null) { + var focus_1 = resetStateTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel); + + if (focus_1 === 'self') { + focusSelf = true; + } + + var els = svgDispatcherMap.get(regionName) || svgDispatcherMap.set(regionName, []); + els.push(el); + } + } + }, this); + + this._enableBlurEntireSVG(focusSelf, viewBuildCtx); + }; + + MapDraw.prototype._enableBlurEntireSVG = function (focusSelf, viewBuildCtx) { + // It's a little complicated to support blurring the entire geoSVG in series-map. + // So do not suport it until some requirements come. + // At present, in series-map, only regions can be blurred. + if (focusSelf && viewBuildCtx.isGeo) { + var blurStyle = viewBuildCtx.mapOrGeoModel.getModel(['blur', 'itemStyle']).getItemStyle(); // Only suport `opacity` here. Because not sure that other props are suitable for + // all of the elements generated by SVG (especially for Text/TSpan/Image/... ). + + var opacity_1 = blurStyle.opacity; + + this._svgGraphicRecord.root.traverse(function (el) { + if (!el.isGroup) { + // PENDING: clear those settings to SVG elements when `_freeSVG`. + // (Currently it happen not to be needed.) + setDefaultStateProxy(el); + var style = el.ensureState('blur').style || {}; // Do not overwrite the region style that already set from region option. + + if (style.opacity == null && opacity_1 != null) { + style.opacity = opacity_1; + } // If `ensureState('blur').style = {}`, there will be default opacity. + // Enable `stateTransition` (animation). + + + el.ensureState('emphasis'); + } + }); + } + }; + + MapDraw.prototype.remove = function () { + this._regionsGroup.removeAll(); + + this._regionsGroupByName = null; + + this._svgGroup.removeAll(); + + this._freeSVG(); + + this._controller.dispose(); + + this._controllerHost = null; + }; + + MapDraw.prototype.findHighDownDispatchers = function (name, geoModel) { + if (name == null) { + return []; + } + + var geo = geoModel.coordinateSystem; + + if (geo.resourceType === 'geoJSON') { + var regionsGroupByName = this._regionsGroupByName; + + if (regionsGroupByName) { + var regionGroup = regionsGroupByName.get(name); + return regionGroup ? [regionGroup] : []; + } + } else if (geo.resourceType === 'geoSVG') { + return this._svgDispatcherMap && this._svgDispatcherMap.get(name) || []; + } + }; + + MapDraw.prototype._svgResourceChanged = function (mapName) { + return this._svgMapName !== mapName; + }; + + MapDraw.prototype._useSVG = function (mapName) { + var resource = geoSourceManager.getGeoResource(mapName); + + if (resource && resource.type === 'geoSVG') { + var svgGraphic = resource.useGraphic(this.uid); + + this._svgGroup.add(svgGraphic.root); + + this._svgGraphicRecord = svgGraphic; + this._svgMapName = mapName; + } + }; + + MapDraw.prototype._freeSVG = function () { + var mapName = this._svgMapName; + + if (mapName == null) { + return; + } + + var resource = geoSourceManager.getGeoResource(mapName); + + if (resource && resource.type === 'geoSVG') { + resource.freeGraphic(this.uid); + } + + this._svgGraphicRecord = null; + this._svgDispatcherMap = null; + + this._svgGroup.removeAll(); + + this._svgMapName = null; + }; + + MapDraw.prototype._updateController = function (mapOrGeoModel, ecModel, api) { + var geo = mapOrGeoModel.coordinateSystem; + var controller = this._controller; + var controllerHost = this._controllerHost; // @ts-ignore FIXME:TS + + controllerHost.zoomLimit = mapOrGeoModel.get('scaleLimit'); + controllerHost.zoom = geo.getZoom(); // roamType is will be set default true if it is null + // @ts-ignore FIXME:TS + + controller.enable(mapOrGeoModel.get('roam') || false); + var mainType = mapOrGeoModel.mainType; + + function makeActionBase() { + var action = { + type: 'geoRoam', + componentType: mainType + }; + action[mainType + 'Id'] = mapOrGeoModel.id; + return action; + } + + controller.off('pan').on('pan', function (e) { + this._mouseDownFlag = false; + updateViewOnPan(controllerHost, e.dx, e.dy); + api.dispatchAction(extend(makeActionBase(), { + dx: e.dx, + dy: e.dy, + animation: { + duration: 0 + } + })); + }, this); + controller.off('zoom').on('zoom', function (e) { + this._mouseDownFlag = false; + updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY); + api.dispatchAction(extend(makeActionBase(), { + zoom: e.scale, + originX: e.originX, + originY: e.originY, + animation: { + duration: 0 + } + })); + }, this); + controller.setPointerChecker(function (e, x, y) { + return geo.containPoint([x, y]) && !onIrrelevantElement(e, api, mapOrGeoModel); + }); + }; + /** + * FIXME: this is a temporarily workaround. + * When `geoRoam` the elements need to be reset in `MapView['render']`, because the props like + * `ignore` might have been modified by `LabelManager`, and `LabelManager#addLabelsOfSeries` + * will subsequently cache `defaultAttr` like `ignore`. If do not do this reset, the modified + * props will have no chance to be restored. + * Note: this reset should be after `clearStates` in `renderSeries` becuase `useStates` in + * `renderSeries` will cache the modified `ignore` to `el._normalState`. + * TODO: + * Use clone/immutable in `LabelManager`? + */ + + + MapDraw.prototype.resetForLabelLayout = function () { + this.group.traverse(function (el) { + var label = el.getTextContent(); + + if (label) { + label.ignore = mapLabelRaw(label).ignore; + } + }); + }; + + MapDraw.prototype._updateMapSelectHandler = function (mapOrGeoModel, regionsGroup, api, fromView) { + var mapDraw = this; + regionsGroup.off('mousedown'); + regionsGroup.off('click'); // @ts-ignore FIXME:TS resolve type conflict + + if (mapOrGeoModel.get('selectedMode')) { + regionsGroup.on('mousedown', function () { + mapDraw._mouseDownFlag = true; + }); + regionsGroup.on('click', function (e) { + if (!mapDraw._mouseDownFlag) { + return; + } + + mapDraw._mouseDownFlag = false; + }); + } + }; + + return MapDraw; + }(); + + function applyOptionStyleForRegion(viewBuildCtx, el, dataIndex, regionModel) { + // All of the path are using `itemStyle`, becuase + // (1) Some SVG also use fill on polyline (The different between + // polyline and polygon is "open" or "close" but not fill or not). + // (2) For the common props like opacity, if some use itemStyle + // and some use `lineStyle`, it might confuse users. + // (3) Most SVG use <path>, where can not detect wether draw a "line" + // or a filled shape, so use `itemStyle` for <path>. + var normalStyleModel = regionModel.getModel('itemStyle'); + var emphasisStyleModel = regionModel.getModel(['emphasis', 'itemStyle']); + var blurStyleModel = regionModel.getModel(['blur', 'itemStyle']); + var selectStyleModel = regionModel.getModel(['select', 'itemStyle']); // NOTE: DONT use 'style' in visual when drawing map. + // This component is used for drawing underlying map for both geo component and map series. + + var normalStyle = getFixedItemStyle(normalStyleModel); + var emphasisStyle = getFixedItemStyle(emphasisStyleModel); + var selectStyle = getFixedItemStyle(selectStyleModel); + var blurStyle = getFixedItemStyle(blurStyleModel); // Update the itemStyle if has data visual + + var data = viewBuildCtx.data; + + if (data) { + // Only visual color of each item will be used. It can be encoded by visualMap + // But visual color of series is used in symbol drawing + // Visual color for each series is for the symbol draw + var style = data.getItemVisual(dataIndex, 'style'); + var decal = data.getItemVisual(dataIndex, 'decal'); + + if (viewBuildCtx.isVisualEncodedByVisualMap && style.fill) { + normalStyle.fill = style.fill; + } + + if (decal) { + normalStyle.decal = createOrUpdatePatternFromDecal(decal, viewBuildCtx.api); + } + } // SVG text, tspan and image can be named but not supporeted + // to be styled by region option yet. + + + el.setStyle(normalStyle); + el.style.strokeNoScale = true; + el.ensureState('emphasis').style = emphasisStyle; + el.ensureState('select').style = selectStyle; + el.ensureState('blur').style = blurStyle; // Enable blur + + setDefaultStateProxy(el); + } + + function resetLabelForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel, // Exist only if `viewBuildCtx.data` exists. + dataIdx, // If labelXY not provided, use `textConfig.position: 'inside'` + labelXY) { + var data = viewBuildCtx.data; + var isGeo = viewBuildCtx.isGeo; + var isDataNaN = data && isNaN(data.get(data.mapDimension('value'), dataIdx)); + var itemLayout = data && data.getItemLayout(dataIdx); // In the following cases label will be drawn + // 1. In map series and data value is NaN + // 2. In geo component + // 3. Region has no series legendIcon, which will be add a showLabel flag in mapSymbolLayout + + if (isGeo || isDataNaN || itemLayout && itemLayout.showLabel) { + var query = !isGeo ? dataIdx : regionName; + var labelFetcher = void 0; // Consider dataIdx not found. + + if (!data || dataIdx >= 0) { + labelFetcher = mapOrGeoModel; + } + + var specifiedTextOpt = labelXY ? { + normal: { + align: 'center', + verticalAlign: 'middle' + } + } : null; // Caveat: must be called after `setDefaultStateProxy(el);` called. + // because textContent will be assign with `el.stateProxy` inside. + + setLabelStyle(el, getLabelStatesModels(regionModel), { + labelFetcher: labelFetcher, + labelDataIndex: query, + defaultText: regionName + }, specifiedTextOpt); + var textEl = el.getTextContent(); + + if (textEl) { + mapLabelRaw(textEl).ignore = textEl.ignore; + + if (el.textConfig && labelXY) { + // Compute a relative offset based on the el bounding rect. + var rect = el.getBoundingRect().clone(); // Need to make sure the percent position base on the same rect in normal and + // emphasis state. Otherwise if using boundingRect of el, but the emphasis state + // has borderWidth (even 0.5px), the text position will be changed obviously + // if the position is very big like ['1234%', '1345%']. + + el.textConfig.layoutRect = rect; + el.textConfig.position = [(labelXY[0] - rect.x) / rect.width * 100 + '%', (labelXY[1] - rect.y) / rect.height * 100 + '%']; + } + } // PENDING: + // If labelLayout is enabled (test/label-layout.html), el.dataIndex should be specified. + // But el.dataIndex is also used to determine whether user event should be triggered, + // where el.seriesIndex or el.dataModel must be specified. At present for a single el + // there is not case that "only label layout enabled but user event disabled", so here + // we depends `resetEventTriggerForRegion` to do the job of setting `el.dataIndex`. + + + el.disableLabelAnimation = true; + } else { + el.removeTextContent(); + el.removeTextConfig(); + el.disableLabelAnimation = null; + } + } + + function resetEventTriggerForRegion(viewBuildCtx, eventTrigger, regionName, regionModel, mapOrGeoModel, // Exist only if `viewBuildCtx.data` exists. + dataIdx) { + // setItemGraphicEl, setHoverStyle after all polygons and labels + // are added to the rigionGroup + if (viewBuildCtx.data) { + // FIXME: when series-map use a SVG map, and there are duplicated name specified + // on different SVG elements, after `data.setItemGraphicEl(...)`: + // (1) all of them will be mounted with `dataIndex`, `seriesIndex`, so that tooltip + // can be triggered only mouse hover. That's correct. + // (2) only the last element will be kept in `data`, so that if trigger tooltip + // by `dispatchAction`, only the last one can be found and triggered. That might be + // not correct. We will fix it in future if anyone demanding that. + viewBuildCtx.data.setItemGraphicEl(dataIdx, eventTrigger); + } // series-map will not trigger "geoselectchange" no matter it is + // based on a declared geo component. Becuause series-map will + // trigger "selectchange". If it trigger both the two events, + // If users call `chart.dispatchAction({type: 'toggleSelect'})`, + // it not easy to also fire event "geoselectchanged". + else { + // Package custom mouse event for geo component + getECData(eventTrigger).eventData = { + componentType: 'geo', + componentIndex: mapOrGeoModel.componentIndex, + geoIndex: mapOrGeoModel.componentIndex, + name: regionName, + region: regionModel && regionModel.option || {} + }; + } + } + + function resetTooltipForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel) { + if (!viewBuildCtx.data) { + setTooltipConfig({ + el: el, + componentModel: mapOrGeoModel, + itemName: regionName, + // @ts-ignore FIXME:TS fix the "compatible with each other"? + itemTooltipOption: regionModel.get('tooltip') + }); + } + } + + function resetStateTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel) { + // @ts-ignore FIXME:TS fix the "compatible with each other"? + el.highDownSilentOnTouch = !!mapOrGeoModel.get('selectedMode'); // @ts-ignore FIXME:TS fix the "compatible with each other"? + + var emphasisModel = regionModel.getModel('emphasis'); + var focus = emphasisModel.get('focus'); + toggleHoverEmphasis(el, focus, emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + + if (viewBuildCtx.isGeo) { + enableComponentHighDownFeatures(el, mapOrGeoModel, regionName); + } + + return focus; + } + + function projectPolys(rings, // Polygons include exterior and interiors. Or polylines. + createStream, isLine) { + var polygons = []; + var curPoly; + + function startPolygon() { + curPoly = []; + } + + function endPolygon() { + if (curPoly.length) { + polygons.push(curPoly); + curPoly = []; + } + } + + var stream = createStream({ + polygonStart: startPolygon, + polygonEnd: endPolygon, + lineStart: startPolygon, + lineEnd: endPolygon, + point: function (x, y) { + // May have NaN values from stream. + if (isFinite(x) && isFinite(y)) { + curPoly.push([x, y]); + } + }, + sphere: function () {} + }); + !isLine && stream.polygonStart(); + each(rings, function (ring) { + stream.lineStart(); + + for (var i = 0; i < ring.length; i++) { + stream.point(ring[i][0], ring[i][1]); + } + + stream.lineEnd(); + }); + !isLine && stream.polygonEnd(); + return polygons; + } + // @ts-ignore FIXME:TS fix the "compatible with each other"? + + var MapView = + /** @class */ + function (_super) { + __extends(MapView, _super); + + function MapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MapView.type; + return _this; + } + + MapView.prototype.render = function (mapModel, ecModel, api, payload) { + // Not render if it is an toggleSelect action from self + if (payload && payload.type === 'mapToggleSelect' && payload.from === this.uid) { + return; + } + + var group = this.group; + group.removeAll(); + + if (mapModel.getHostGeoModel()) { + return; + } + + if (this._mapDraw && payload && payload.type === 'geoRoam') { + this._mapDraw.resetForLabelLayout(); + } // Not update map if it is an roam action from self + + + if (!(payload && payload.type === 'geoRoam' && payload.componentType === 'series' && payload.seriesId === mapModel.id)) { + if (mapModel.needsDrawMap) { + var mapDraw = this._mapDraw || new MapDraw(api); + group.add(mapDraw.group); + mapDraw.draw(mapModel, ecModel, api, this, payload); + this._mapDraw = mapDraw; + } else { + // Remove drawed map + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + } + } else { + var mapDraw = this._mapDraw; + mapDraw && group.add(mapDraw.group); + } + + mapModel.get('showLegendSymbol') && ecModel.getComponent('legend') && this._renderSymbols(mapModel, ecModel, api); + }; + + MapView.prototype.remove = function () { + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + this.group.removeAll(); + }; + + MapView.prototype.dispose = function () { + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + }; + + MapView.prototype._renderSymbols = function (mapModel, ecModel, api) { + var originalData = mapModel.originalData; + var group = this.group; + originalData.each(originalData.mapDimension('value'), function (value, originalDataIndex) { + if (isNaN(value)) { + return; + } + + var layout = originalData.getItemLayout(originalDataIndex); + + if (!layout || !layout.point) { + // Not exists in map + return; + } + + var point = layout.point; + var offset = layout.offset; + var circle = new Circle({ + style: { + // Because the special of map draw. + // Which needs statistic of multiple series and draw on one map. + // And each series also need a symbol with legend color + // + // Layout and visual are put one the different data + // TODO + fill: mapModel.getData().getVisual('style').fill + }, + shape: { + cx: point[0] + offset * 9, + cy: point[1], + r: 3 + }, + silent: true, + // Do not overlap the first series, on which labels are displayed. + z2: 8 + (!offset ? Z2_EMPHASIS_LIFT + 1 : 0) + }); // Only the series that has the first value on the same region is in charge of rendering the label. + // But consider the case: + // series: [ + // {id: 'X', type: 'map', map: 'm', {data: [{name: 'A', value: 11}, {name: 'B', {value: 22}]}, + // {id: 'Y', type: 'map', map: 'm', {data: [{name: 'A', value: 21}, {name: 'C', {value: 33}]} + // ] + // The offset `0` of item `A` is at series `X`, but of item `C` is at series `Y`. + // For backward compatibility, we follow the rule that render label `A` by the + // settings on series `X` but render label `C` by the settings on series `Y`. + + if (!offset) { + var fullData = mapModel.mainSeries.getData(); + var name_1 = originalData.getName(originalDataIndex); + var fullIndex_1 = fullData.indexOfName(name_1); + var itemModel = originalData.getItemModel(originalDataIndex); + var labelModel = itemModel.getModel('label'); + var regionGroup = fullData.getItemGraphicEl(fullIndex_1); // `getFormattedLabel` needs to use `getData` inside. Here + // `mapModel.getData()` is shallow cloned from `mainSeries.getData()`. + // FIXME + // If this is not the `mainSeries`, the item model (like label formatter) + // set on original data item will never get. But it has been working + // like that from the begining, and this scenario is rarely encountered. + // So it won't be fixed until have to. + + setLabelStyle(circle, getLabelStatesModels(itemModel), { + labelFetcher: { + getFormattedLabel: function (idx, state) { + return mapModel.getFormattedLabel(fullIndex_1, state); + } + }, + defaultText: name_1 + }); + circle.disableLabelAnimation = true; + + if (!labelModel.get('position')) { + circle.setTextConfig({ + position: 'bottom' + }); + } + + regionGroup.onHoverStateChange = function (toState) { + setStatesFlag(circle, toState); + }; + } + + group.add(circle); + }); + }; + + MapView.type = 'map'; + return MapView; + }(ChartView); + + var MapSeries = + /** @class */ + function (_super) { + __extends(MapSeries, _super); + + function MapSeries() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MapSeries.type; // Only first map series of same mapType will drawMap. + + _this.needsDrawMap = false; // Group of all map series with same mapType + + _this.seriesGroup = []; + + _this.getTooltipPosition = function (dataIndex) { + if (dataIndex != null) { + var name_1 = this.getData().getName(dataIndex); + var geo = this.coordinateSystem; + var region = geo.getRegion(name_1); + return region && geo.dataToPoint(region.getCenter()); + } + }; + + return _this; + } + + MapSeries.prototype.getInitialData = function (option) { + var data = createSeriesDataSimply(this, { + coordDimensions: ['value'], + encodeDefaulter: curry(makeSeriesEncodeForNameBased, this) + }); + var dataNameMap = createHashMap(); + var toAppendNames = []; + + for (var i = 0, len = data.count(); i < len; i++) { + var name_2 = data.getName(i); + dataNameMap.set(name_2, true); + } + + var geoSource = geoSourceManager.load(this.getMapType(), this.option.nameMap, this.option.nameProperty); + each(geoSource.regions, function (region) { + var name = region.name; + + if (!dataNameMap.get(name)) { + toAppendNames.push(name); + } + }); // Complete data with missing regions. The consequent processes (like visual + // map and render) can not be performed without a "full data". For example, + // find `dataIndex` by name. + + data.appendValues([], toAppendNames); + return data; + }; + /** + * If no host geo model, return null, which means using a + * inner exclusive geo model. + */ + + + MapSeries.prototype.getHostGeoModel = function () { + var geoIndex = this.option.geoIndex; + return geoIndex != null ? this.ecModel.getComponent('geo', geoIndex) : null; + }; + + MapSeries.prototype.getMapType = function () { + return (this.getHostGeoModel() || this).option.map; + }; // _fillOption(option, mapName) { + // Shallow clone + // option = zrUtil.extend({}, option); + // option.data = geoCreator.getFilledRegions(option.data, mapName, option.nameMap); + // return option; + // } + + + MapSeries.prototype.getRawValue = function (dataIndex) { + // Use value stored in data instead because it is calculated from multiple series + // FIXME Provide all value of multiple series ? + var data = this.getData(); + return data.get(data.mapDimension('value'), dataIndex); + }; + /** + * Get model of region + */ + + + MapSeries.prototype.getRegionModel = function (regionName) { + var data = this.getData(); + return data.getItemModel(data.indexOfName(regionName)); + }; + /** + * Map tooltip formatter + */ + + + MapSeries.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + // FIXME orignalData and data is a bit confusing + var data = this.getData(); + var value = this.getRawValue(dataIndex); + var name = data.getName(dataIndex); + var seriesGroup = this.seriesGroup; + var seriesNames = []; + + for (var i = 0; i < seriesGroup.length; i++) { + var otherIndex = seriesGroup[i].originalData.indexOfName(name); + var valueDim = data.mapDimension('value'); + + if (!isNaN(seriesGroup[i].originalData.get(valueDim, otherIndex))) { + seriesNames.push(seriesGroup[i].name); + } + } + + return createTooltipMarkup('section', { + header: seriesNames.join(', '), + noHeader: !seriesNames.length, + blocks: [createTooltipMarkup('nameValue', { + name: name, + value: value + })] + }); + }; + + MapSeries.prototype.setZoom = function (zoom) { + this.option.zoom = zoom; + }; + + MapSeries.prototype.setCenter = function (center) { + this.option.center = center; + }; + + MapSeries.prototype.getLegendIcon = function (opt) { + var iconType = opt.icon || 'roundRect'; + var icon = createSymbol(iconType, 0, 0, opt.itemWidth, opt.itemHeight, opt.itemStyle.fill); + icon.setStyle(opt.itemStyle); // Map do not use itemStyle.borderWidth as border width + + icon.style.stroke = 'none'; // No rotation because no series visual symbol for map + + if (iconType.indexOf('empty') > -1) { + icon.style.stroke = icon.style.fill; + icon.style.fill = '#fff'; + icon.style.lineWidth = 2; + } + + return icon; + }; + + MapSeries.type = 'series.map'; + MapSeries.dependencies = ['geo']; + MapSeries.layoutMode = 'box'; + MapSeries.defaultOption = { + // 一级层叠 + // zlevel: 0, + // 二级层叠 + z: 2, + coordinateSystem: 'geo', + // map should be explicitly specified since ec3. + map: '', + // If `geoIndex` is not specified, a exclusive geo will be + // created. Otherwise use the specified geo component, and + // `map` and `mapType` are ignored. + // geoIndex: 0, + // 'center' | 'left' | 'right' | 'x%' | {number} + left: 'center', + // 'center' | 'top' | 'bottom' | 'x%' | {number} + top: 'center', + // right + // bottom + // width: + // height + // Aspect is width / height. Inited to be geoJson bbox aspect + // This parameter is used for scale this aspect + // Default value: + // for geoSVG source: 1, + // for geoJSON source: 0.75. + aspectScale: null, + ///// Layout with center and size + // If you wan't to put map in a fixed size box with right aspect ratio + // This two properties may more conveninet + // layoutCenter: [50%, 50%] + // layoutSize: 100 + showLegendSymbol: true, + // Define left-top, right-bottom coords to control view + // For example, [ [180, 90], [-180, -90] ], + // higher priority than center and zoom + boundingCoords: null, + // Default on center of map + center: null, + zoom: 1, + scaleLimit: null, + selectedMode: true, + label: { + show: false, + color: '#000' + }, + // scaleLimit: null, + itemStyle: { + borderWidth: 0.5, + borderColor: '#444', + areaColor: '#eee' + }, + emphasis: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + areaColor: 'rgba(255,215,0,0.8)' + } + }, + select: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + color: 'rgba(255,215,0,0.8)' + } + }, + nameProperty: 'name' + }; + return MapSeries; + }(SeriesModel); + + function dataStatistics(datas, statisticType) { + var dataNameMap = {}; + each(datas, function (data) { + data.each(data.mapDimension('value'), function (value, idx) { + // Add prefix to avoid conflict with Object.prototype. + var mapKey = 'ec-' + data.getName(idx); + dataNameMap[mapKey] = dataNameMap[mapKey] || []; + + if (!isNaN(value)) { + dataNameMap[mapKey].push(value); + } + }); + }); + return datas[0].map(datas[0].mapDimension('value'), function (value, idx) { + var mapKey = 'ec-' + datas[0].getName(idx); + var sum = 0; + var min = Infinity; + var max = -Infinity; + var len = dataNameMap[mapKey].length; + + for (var i = 0; i < len; i++) { + min = Math.min(min, dataNameMap[mapKey][i]); + max = Math.max(max, dataNameMap[mapKey][i]); + sum += dataNameMap[mapKey][i]; + } + + var result; + + if (statisticType === 'min') { + result = min; + } else if (statisticType === 'max') { + result = max; + } else if (statisticType === 'average') { + result = sum / len; + } else { + result = sum; + } + + return len === 0 ? NaN : result; + }); + } + + function mapDataStatistic(ecModel) { + var seriesGroups = {}; + ecModel.eachSeriesByType('map', function (seriesModel) { + var hostGeoModel = seriesModel.getHostGeoModel(); + var key = hostGeoModel ? 'o' + hostGeoModel.id : 'i' + seriesModel.getMapType(); + (seriesGroups[key] = seriesGroups[key] || []).push(seriesModel); + }); + each(seriesGroups, function (seriesList, key) { + var data = dataStatistics(map(seriesList, function (seriesModel) { + return seriesModel.getData(); + }), seriesList[0].get('mapValueCalculation')); + + for (var i = 0; i < seriesList.length; i++) { + seriesList[i].originalData = seriesList[i].getData(); + } // FIXME Put where? + + + for (var i = 0; i < seriesList.length; i++) { + seriesList[i].seriesGroup = seriesList; + seriesList[i].needsDrawMap = i === 0 && !seriesList[i].getHostGeoModel(); + seriesList[i].setData(data.cloneShallow()); + seriesList[i].mainSeries = seriesList[0]; + } + }); + } + + function mapSymbolLayout(ecModel) { + var processedMapType = {}; + ecModel.eachSeriesByType('map', function (mapSeries) { + var mapType = mapSeries.getMapType(); + + if (mapSeries.getHostGeoModel() || processedMapType[mapType]) { + return; + } + + var mapSymbolOffsets = {}; + each(mapSeries.seriesGroup, function (subMapSeries) { + var geo = subMapSeries.coordinateSystem; + var data = subMapSeries.originalData; + + if (subMapSeries.get('showLegendSymbol') && ecModel.getComponent('legend')) { + data.each(data.mapDimension('value'), function (value, idx) { + var name = data.getName(idx); + var region = geo.getRegion(name); // If input series.data is [11, 22, '-'/null/undefined, 44], + // it will be filled with NaN: [11, 22, NaN, 44] and NaN will + // not be drawn. So here must validate if value is NaN. + + if (!region || isNaN(value)) { + return; + } + + var offset = mapSymbolOffsets[name] || 0; + var point = geo.dataToPoint(region.getCenter()); + mapSymbolOffsets[name] = offset + 1; + data.setItemLayout(idx, { + point: point, + offset: offset + }); + }); + } + }); // Show label of those region not has legendIcon (which is offset 0) + + var data = mapSeries.getData(); + data.each(function (idx) { + var name = data.getName(idx); + var layout = data.getItemLayout(idx) || {}; + layout.showLabel = !mapSymbolOffsets[name]; + data.setItemLayout(idx, layout); + }); + processedMapType[mapType] = true; + }); + } + + var v2ApplyTransform = applyTransform; + + var View = + /** @class */ + function (_super) { + __extends(View, _super); + + function View(name) { + var _this = _super.call(this) || this; + + _this.type = 'view'; + _this.dimensions = ['x', 'y']; + /** + * Represents the transform brought by roam/zoom. + * If `View['_viewRect']` applies roam transform, + * we can get the final displayed rect. + */ + + _this._roamTransformable = new Transformable(); + /** + * Represents the transform from `View['_rect']` to `View['_viewRect']`. + */ + + _this._rawTransformable = new Transformable(); + _this.name = name; + return _this; + } + + View.prototype.setBoundingRect = function (x, y, width, height) { + this._rect = new BoundingRect(x, y, width, height); + return this._rect; + }; + /** + * @return {module:zrender/core/BoundingRect} + */ + + + View.prototype.getBoundingRect = function () { + return this._rect; + }; + + View.prototype.setViewRect = function (x, y, width, height) { + this._transformTo(x, y, width, height); + + this._viewRect = new BoundingRect(x, y, width, height); + }; + /** + * Transformed to particular position and size + */ + + + View.prototype._transformTo = function (x, y, width, height) { + var rect = this.getBoundingRect(); + var rawTransform = this._rawTransformable; + rawTransform.transform = rect.calculateTransform(new BoundingRect(x, y, width, height)); + var rawParent = rawTransform.parent; + rawTransform.parent = null; + rawTransform.decomposeTransform(); + rawTransform.parent = rawParent; + + this._updateTransform(); + }; + /** + * Set center of view + */ + + + View.prototype.setCenter = function (centerCoord, api) { + if (!centerCoord) { + return; + } + + this._center = [parsePercent$1(centerCoord[0], api.getWidth()), parsePercent$1(centerCoord[1], api.getHeight())]; + + this._updateCenterAndZoom(); + }; + + View.prototype.setZoom = function (zoom) { + zoom = zoom || 1; + var zoomLimit = this.zoomLimit; + + if (zoomLimit) { + if (zoomLimit.max != null) { + zoom = Math.min(zoomLimit.max, zoom); + } + + if (zoomLimit.min != null) { + zoom = Math.max(zoomLimit.min, zoom); + } + } + + this._zoom = zoom; + + this._updateCenterAndZoom(); + }; + /** + * Get default center without roam + */ + + + View.prototype.getDefaultCenter = function () { + // Rect before any transform + var rawRect = this.getBoundingRect(); + var cx = rawRect.x + rawRect.width / 2; + var cy = rawRect.y + rawRect.height / 2; + return [cx, cy]; + }; + + View.prototype.getCenter = function () { + return this._center || this.getDefaultCenter(); + }; + + View.prototype.getZoom = function () { + return this._zoom || 1; + }; + + View.prototype.getRoamTransform = function () { + return this._roamTransformable.getLocalTransform(); + }; + /** + * Remove roam + */ + + + View.prototype._updateCenterAndZoom = function () { + // Must update after view transform updated + var rawTransformMatrix = this._rawTransformable.getLocalTransform(); + + var roamTransform = this._roamTransformable; + var defaultCenter = this.getDefaultCenter(); + var center = this.getCenter(); + var zoom = this.getZoom(); + center = applyTransform([], center, rawTransformMatrix); + defaultCenter = applyTransform([], defaultCenter, rawTransformMatrix); + roamTransform.originX = center[0]; + roamTransform.originY = center[1]; + roamTransform.x = defaultCenter[0] - center[0]; + roamTransform.y = defaultCenter[1] - center[1]; + roamTransform.scaleX = roamTransform.scaleY = zoom; + + this._updateTransform(); + }; + /** + * Update transform props on `this` based on the current + * `this._roamTransformable` and `this._rawTransformable`. + */ + + + View.prototype._updateTransform = function () { + var roamTransformable = this._roamTransformable; + var rawTransformable = this._rawTransformable; + rawTransformable.parent = roamTransformable; + roamTransformable.updateTransform(); + rawTransformable.updateTransform(); + copy$1(this.transform || (this.transform = []), rawTransformable.transform || create$1()); + this._rawTransform = rawTransformable.getLocalTransform(); + this.invTransform = this.invTransform || []; + invert(this.invTransform, this.transform); + this.decomposeTransform(); + }; + + View.prototype.getTransformInfo = function () { + var rawTransformable = this._rawTransformable; + var roamTransformable = this._roamTransformable; // Becuase roamTransformabel has `originX/originY` modified, + // but the caller of `getTransformInfo` can not handle `originX/originY`, + // so need to recalcualte them. + + var dummyTransformable = new Transformable(); + dummyTransformable.transform = roamTransformable.transform; + dummyTransformable.decomposeTransform(); + return { + roam: { + x: dummyTransformable.x, + y: dummyTransformable.y, + scaleX: dummyTransformable.scaleX, + scaleY: dummyTransformable.scaleY + }, + raw: { + x: rawTransformable.x, + y: rawTransformable.y, + scaleX: rawTransformable.scaleX, + scaleY: rawTransformable.scaleY + } + }; + }; + + View.prototype.getViewRect = function () { + return this._viewRect; + }; + /** + * Get view rect after roam transform + */ + + + View.prototype.getViewRectAfterRoam = function () { + var rect = this.getBoundingRect().clone(); + rect.applyTransform(this.transform); + return rect; + }; + /** + * Convert a single (lon, lat) data item to (x, y) point. + */ + + + View.prototype.dataToPoint = function (data, noRoam, out) { + var transform = noRoam ? this._rawTransform : this.transform; + out = out || []; + return transform ? v2ApplyTransform(out, data, transform) : copy(out, data); + }; + /** + * Convert a (x, y) point to (lon, lat) data + */ + + + View.prototype.pointToData = function (point) { + var invTransform = this.invTransform; + return invTransform ? v2ApplyTransform([], point, invTransform) : [point[0], point[1]]; + }; + + View.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys(finder); + return coordSys === this ? coordSys.dataToPoint(value) : null; + }; + + View.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys(finder); + return coordSys === this ? coordSys.pointToData(pixel) : null; + }; + /** + * @implements + */ + + + View.prototype.containPoint = function (point) { + return this.getViewRectAfterRoam().contain(point[0], point[1]); + }; + + View.dimensions = ['x', 'y']; + return View; + }(Transformable); + + function getCoordSys(finder) { + var seriesModel = finder.seriesModel; + return seriesModel ? seriesModel.coordinateSystem : null; // e.g., graph. + } + + var GEO_DEFAULT_PARAMS = { + 'geoJSON': { + aspectScale: 0.75, + invertLongitute: true + }, + 'geoSVG': { + aspectScale: 1, + invertLongitute: false + } + }; + var geo2DDimensions = ['lng', 'lat']; + + var Geo = + /** @class */ + function (_super) { + __extends(Geo, _super); + + function Geo(name, map, opt) { + var _this = _super.call(this, name) || this; + + _this.dimensions = geo2DDimensions; + _this.type = 'geo'; // Only store specified name coord via `addGeoCoord`. + + _this._nameCoordMap = createHashMap(); + _this.map = map; + var projection = opt.projection; + var source = geoSourceManager.load(map, opt.nameMap, opt.nameProperty); + var resource = geoSourceManager.getGeoResource(map); + var resourceType = _this.resourceType = resource ? resource.type : null; + var regions = _this.regions = source.regions; + var defaultParams = GEO_DEFAULT_PARAMS[resource.type]; + _this._regionsMap = source.regionsMap; + _this.regions = source.regions; + + if ("development" !== 'production' && projection) { + // Do some check + if (resourceType === 'geoSVG') { + if ("development" !== 'production') { + warn("Map " + map + " with SVG source can't use projection. Only GeoJSON source supports projection."); + } + + projection = null; + } + + if (!(projection.project && projection.unproject)) { + if ("development" !== 'production') { + warn('project and unproject must be both provided in the projeciton.'); + } + + projection = null; + } + } + + _this.projection = projection; + var boundingRect; + + if (projection) { + // Can't reuse the raw bounding rect + for (var i = 0; i < regions.length; i++) { + var regionRect = regions[i].getBoundingRect(projection); + boundingRect = boundingRect || regionRect.clone(); + boundingRect.union(regionRect); + } + } else { + boundingRect = source.boundingRect; + } + + _this.setBoundingRect(boundingRect.x, boundingRect.y, boundingRect.width, boundingRect.height); // aspectScale and invertLongitute actually is the parameters default raw projection. + // So we ignore them if projection is given. + // Ignore default aspect scale if projection exits. + + + _this.aspectScale = projection ? 1 : retrieve2(opt.aspectScale, defaultParams.aspectScale); // Not invert longitute if projection exits. + + _this._invertLongitute = projection ? false : defaultParams.invertLongitute; + return _this; + } + + Geo.prototype._transformTo = function (x, y, width, height) { + var rect = this.getBoundingRect(); + var invertLongitute = this._invertLongitute; + rect = rect.clone(); + + if (invertLongitute) { + // Longitute is inverted + rect.y = -rect.y - rect.height; + } + + var rawTransformable = this._rawTransformable; + rawTransformable.transform = rect.calculateTransform(new BoundingRect(x, y, width, height)); + var rawParent = rawTransformable.parent; + rawTransformable.parent = null; + rawTransformable.decomposeTransform(); + rawTransformable.parent = rawParent; + + if (invertLongitute) { + rawTransformable.scaleY = -rawTransformable.scaleY; + } + + this._updateTransform(); + }; + + Geo.prototype.getRegion = function (name) { + return this._regionsMap.get(name); + }; + + Geo.prototype.getRegionByCoord = function (coord) { + var regions = this.regions; + + for (var i = 0; i < regions.length; i++) { + var region = regions[i]; + + if (region.type === 'geoJSON' && region.contain(coord)) { + return regions[i]; + } + } + }; + /** + * Add geoCoord for indexing by name + */ + + + Geo.prototype.addGeoCoord = function (name, geoCoord) { + this._nameCoordMap.set(name, geoCoord); + }; + /** + * Get geoCoord by name + */ + + + Geo.prototype.getGeoCoord = function (name) { + var region = this._regionsMap.get(name); // calcualte center only on demand. + + + return this._nameCoordMap.get(name) || region && region.getCenter(); + }; + + Geo.prototype.dataToPoint = function (data, noRoam, out) { + if (isString(data)) { + // Map area name to geoCoord + data = this.getGeoCoord(data); + } + + if (data) { + var projection = this.projection; + + if (projection) { + // projection may return null point. + data = projection.project(data); + } + + return data && this.projectedToPoint(data, noRoam, out); + } + }; + + Geo.prototype.pointToData = function (point) { + var projection = this.projection; + + if (projection) { + // projection may return null point. + point = projection.unproject(point); + } + + return point && this.pointToProjected(point); + }; + /** + * Point to projected data. Same with pointToData when projection is used. + */ + + + Geo.prototype.pointToProjected = function (point) { + return _super.prototype.pointToData.call(this, point); + }; + + Geo.prototype.projectedToPoint = function (projected, noRoam, out) { + return _super.prototype.dataToPoint.call(this, projected, noRoam, out); + }; + + Geo.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys$1(finder); + return coordSys === this ? coordSys.dataToPoint(value) : null; + }; + + Geo.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys$1(finder); + return coordSys === this ? coordSys.pointToData(pixel) : null; + }; + + return Geo; + }(View); + mixin(Geo, View); + + function getCoordSys$1(finder) { + var geoModel = finder.geoModel; + var seriesModel = finder.seriesModel; + return geoModel ? geoModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem // For map series. + || (seriesModel.getReferringComponents('geo', SINGLE_REFERRING).models[0] || {}).coordinateSystem : null; + } + + /** + * Resize method bound to the geo + */ + + function resizeGeo(geoModel, api) { + var boundingCoords = geoModel.get('boundingCoords'); + + if (boundingCoords != null) { + var leftTop_1 = boundingCoords[0]; + var rightBottom_1 = boundingCoords[1]; + + if (!(isFinite(leftTop_1[0]) && isFinite(leftTop_1[1]) && isFinite(rightBottom_1[0]) && isFinite(rightBottom_1[1]))) { + if ("development" !== 'production') { + console.error('Invalid boundingCoords'); + } + } else { + // Sample around the lng/lat rect and use projection to calculate actual bounding rect. + var projection_1 = this.projection; + + if (projection_1) { + var xMin = leftTop_1[0]; + var yMin = leftTop_1[1]; + var xMax = rightBottom_1[0]; + var yMax = rightBottom_1[1]; + leftTop_1 = [Infinity, Infinity]; + rightBottom_1 = [-Infinity, -Infinity]; // TODO better way? + + var sampleLine = function (x0, y0, x1, y1) { + var dx = x1 - x0; + var dy = y1 - y0; + + for (var i = 0; i <= 100; i++) { + var p = i / 100; + var pt = projection_1.project([x0 + dx * p, y0 + dy * p]); + min(leftTop_1, leftTop_1, pt); + max(rightBottom_1, rightBottom_1, pt); + } + }; // Top + + + sampleLine(xMin, yMin, xMax, yMin); // Right + + sampleLine(xMax, yMin, xMax, yMax); // Bottom + + sampleLine(xMax, yMax, xMin, yMax); // Left + + sampleLine(xMin, yMax, xMax, yMin); + } + + this.setBoundingRect(leftTop_1[0], leftTop_1[1], rightBottom_1[0] - leftTop_1[0], rightBottom_1[1] - leftTop_1[1]); + } + } + + var rect = this.getBoundingRect(); + var centerOption = geoModel.get('layoutCenter'); + var sizeOption = geoModel.get('layoutSize'); + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + var aspect = rect.width / rect.height * this.aspectScale; + var useCenterAndSize = false; + var center; + var size; + + if (centerOption && sizeOption) { + center = [parsePercent$1(centerOption[0], viewWidth), parsePercent$1(centerOption[1], viewHeight)]; + size = parsePercent$1(sizeOption, Math.min(viewWidth, viewHeight)); + + if (!isNaN(center[0]) && !isNaN(center[1]) && !isNaN(size)) { + useCenterAndSize = true; + } else { + if ("development" !== 'production') { + console.warn('Given layoutCenter or layoutSize data are invalid. Use left/top/width/height instead.'); + } + } + } + + var viewRect; + + if (useCenterAndSize) { + viewRect = {}; + + if (aspect > 1) { + // Width is same with size + viewRect.width = size; + viewRect.height = size / aspect; + } else { + viewRect.height = size; + viewRect.width = size * aspect; + } + + viewRect.y = center[1] - viewRect.height / 2; + viewRect.x = center[0] - viewRect.width / 2; + } else { + // Use left/top/width/height + var boxLayoutOption = geoModel.getBoxLayoutParams(); + boxLayoutOption.aspect = aspect; + viewRect = getLayoutRect(boxLayoutOption, { + width: viewWidth, + height: viewHeight + }); + } + + this.setViewRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height); + this.setCenter(geoModel.get('center'), api); + this.setZoom(geoModel.get('zoom')); + } // Back compat for ECharts2, where the coord map is set on map series: + // {type: 'map', geoCoord: {'cityA': [116.46,39.92], 'cityA': [119.12,24.61]}}, + + + function setGeoCoords(geo, model) { + each(model.get('geoCoord'), function (geoCoord, name) { + geo.addGeoCoord(name, geoCoord); + }); + } + + var GeoCreator = + /** @class */ + function () { + function GeoCreator() { + // For deciding which dimensions to use when creating list data + this.dimensions = geo2DDimensions; + } + + GeoCreator.prototype.create = function (ecModel, api) { + var geoList = []; + + function getCommonGeoProperties(model) { + return { + nameProperty: model.get('nameProperty'), + aspectScale: model.get('aspectScale'), + projection: model.get('projection') + }; + } // FIXME Create each time may be slow + + + ecModel.eachComponent('geo', function (geoModel, idx) { + var mapName = geoModel.get('map'); + var geo = new Geo(mapName + idx, mapName, extend({ + nameMap: geoModel.get('nameMap') + }, getCommonGeoProperties(geoModel))); + geo.zoomLimit = geoModel.get('scaleLimit'); + geoList.push(geo); // setGeoCoords(geo, geoModel); + + geoModel.coordinateSystem = geo; + geo.model = geoModel; // Inject resize method + + geo.resize = resizeGeo; + geo.resize(geoModel, api); + }); + ecModel.eachSeries(function (seriesModel) { + var coordSys = seriesModel.get('coordinateSystem'); + + if (coordSys === 'geo') { + var geoIndex = seriesModel.get('geoIndex') || 0; + seriesModel.coordinateSystem = geoList[geoIndex]; + } + }); // If has map series + + var mapModelGroupBySeries = {}; + ecModel.eachSeriesByType('map', function (seriesModel) { + if (!seriesModel.getHostGeoModel()) { + var mapType = seriesModel.getMapType(); + mapModelGroupBySeries[mapType] = mapModelGroupBySeries[mapType] || []; + mapModelGroupBySeries[mapType].push(seriesModel); + } + }); + each(mapModelGroupBySeries, function (mapSeries, mapType) { + var nameMapList = map(mapSeries, function (singleMapSeries) { + return singleMapSeries.get('nameMap'); + }); + var geo = new Geo(mapType, mapType, extend({ + nameMap: mergeAll(nameMapList) + }, getCommonGeoProperties(mapSeries[0]))); + geo.zoomLimit = retrieve.apply(null, map(mapSeries, function (singleMapSeries) { + return singleMapSeries.get('scaleLimit'); + })); + geoList.push(geo); // Inject resize method + + geo.resize = resizeGeo; + geo.resize(mapSeries[0], api); + each(mapSeries, function (singleMapSeries) { + singleMapSeries.coordinateSystem = geo; + setGeoCoords(geo, singleMapSeries); + }); + }); + return geoList; + }; + /** + * Fill given regions array + */ + + + GeoCreator.prototype.getFilledRegions = function (originRegionArr, mapName, nameMap, nameProperty) { + // Not use the original + var regionsArr = (originRegionArr || []).slice(); + var dataNameMap = createHashMap(); + + for (var i = 0; i < regionsArr.length; i++) { + dataNameMap.set(regionsArr[i].name, regionsArr[i]); + } + + var source = geoSourceManager.load(mapName, nameMap, nameProperty); + each(source.regions, function (region) { + var name = region.name; + !dataNameMap.get(name) && regionsArr.push({ + name: name + }); + }); + return regionsArr; + }; + + return GeoCreator; + }(); + + var geoCreator = new GeoCreator(); + + var GeoModel = + /** @class */ + function (_super) { + __extends(GeoModel, _super); + + function GeoModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GeoModel.type; + return _this; + } + + GeoModel.prototype.init = function (option, parentModel, ecModel) { + var source = geoSourceManager.getGeoResource(option.map); + + if (source && source.type === 'geoJSON') { + var itemStyle = option.itemStyle = option.itemStyle || {}; + + if (!('color' in itemStyle)) { + itemStyle.color = '#eee'; + } + } + + this.mergeDefaultAndTheme(option, ecModel); // Default label emphasis `show` + + defaultEmphasis(option, 'label', ['show']); + }; + + GeoModel.prototype.optionUpdated = function () { + var _this = this; + + var option = this.option; + option.regions = geoCreator.getFilledRegions(option.regions, option.map, option.nameMap, option.nameProperty); + var selectedMap = {}; + this._optionModelMap = reduce(option.regions || [], function (optionModelMap, regionOpt) { + var regionName = regionOpt.name; + + if (regionName) { + optionModelMap.set(regionName, new Model(regionOpt, _this, _this.ecModel)); + + if (regionOpt.selected) { + selectedMap[regionName] = true; + } + } + + return optionModelMap; + }, createHashMap()); + + if (!option.selectedMap) { + option.selectedMap = selectedMap; + } + }; + /** + * Get model of region. + */ + + + GeoModel.prototype.getRegionModel = function (name) { + return this._optionModelMap.get(name) || new Model(null, this, this.ecModel); + }; + /** + * Format label + * @param name Region name + */ + + + GeoModel.prototype.getFormattedLabel = function (name, status) { + var regionModel = this.getRegionModel(name); + var formatter = status === 'normal' ? regionModel.get(['label', 'formatter']) : regionModel.get(['emphasis', 'label', 'formatter']); + var params = { + name: name + }; + + if (isFunction(formatter)) { + params.status = status; + return formatter(params); + } else if (isString(formatter)) { + return formatter.replace('{a}', name != null ? name : ''); + } + }; + + GeoModel.prototype.setZoom = function (zoom) { + this.option.zoom = zoom; + }; + + GeoModel.prototype.setCenter = function (center) { + this.option.center = center; + }; // PENGING If selectedMode is null ? + + + GeoModel.prototype.select = function (name) { + var option = this.option; + var selectedMode = option.selectedMode; + + if (!selectedMode) { + return; + } + + if (selectedMode !== 'multiple') { + option.selectedMap = null; + } + + var selectedMap = option.selectedMap || (option.selectedMap = {}); + selectedMap[name] = true; + }; + + GeoModel.prototype.unSelect = function (name) { + var selectedMap = this.option.selectedMap; + + if (selectedMap) { + selectedMap[name] = false; + } + }; + + GeoModel.prototype.toggleSelected = function (name) { + this[this.isSelected(name) ? 'unSelect' : 'select'](name); + }; + + GeoModel.prototype.isSelected = function (name) { + var selectedMap = this.option.selectedMap; + return !!(selectedMap && selectedMap[name]); + }; + + GeoModel.type = 'geo'; + GeoModel.layoutMode = 'box'; + GeoModel.defaultOption = { + // zlevel: 0, + z: 0, + show: true, + left: 'center', + top: 'center', + // Default value: + // for geoSVG source: 1, + // for geoJSON source: 0.75. + aspectScale: null, + ///// Layout with center and size + // If you wan't to put map in a fixed size box with right aspect ratio + // This two properties may more conveninet + // layoutCenter: [50%, 50%] + // layoutSize: 100 + silent: false, + // Map type + map: '', + // Define left-top, right-bottom coords to control view + // For example, [ [180, 90], [-180, -90] ] + boundingCoords: null, + // Default on center of map + center: null, + zoom: 1, + scaleLimit: null, + // selectedMode: false + label: { + show: false, + color: '#000' + }, + itemStyle: { + borderWidth: 0.5, + borderColor: '#444' // Default color: + // + geoJSON: #eee + // + geoSVG: null (use SVG original `fill`) + // color: '#eee' + + }, + emphasis: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + color: 'rgba(255,215,0,0.8)' + } + }, + select: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + color: 'rgba(255,215,0,0.8)' + } + }, + regions: [] // tooltip: { + // show: false + // } + + }; + return GeoModel; + }(ComponentModel); + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + function getCenterCoord(view, point) { + // Use projected coord as center because it's linear. + return view.pointToProjected ? view.pointToProjected(point) : view.pointToData(point); + } + + function updateCenterAndZoom(view, payload, zoomLimit, api) { + var previousZoom = view.getZoom(); + var center = view.getCenter(); + var zoom = payload.zoom; + var point = view.projectedToPoint ? view.projectedToPoint(center) : view.dataToPoint(center); + + if (payload.dx != null && payload.dy != null) { + point[0] -= payload.dx; + point[1] -= payload.dy; + view.setCenter(getCenterCoord(view, point), api); + } + + if (zoom != null) { + if (zoomLimit) { + var zoomMin = zoomLimit.min || 0; + var zoomMax = zoomLimit.max || Infinity; + zoom = Math.max(Math.min(previousZoom * zoom, zoomMax), zoomMin) / previousZoom; + } // Zoom on given point(originX, originY) + + + view.scaleX *= zoom; + view.scaleY *= zoom; + var fixX = (payload.originX - view.x) * (zoom - 1); + var fixY = (payload.originY - view.y) * (zoom - 1); + view.x -= fixX; + view.y -= fixY; + view.updateTransform(); // Get the new center + + view.setCenter(getCenterCoord(view, point), api); + view.setZoom(zoom * previousZoom); + } + + return { + center: view.getCenter(), + zoom: view.getZoom() + }; + } + + var GeoView = + /** @class */ + function (_super) { + __extends(GeoView, _super); + + function GeoView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GeoView.type; + _this.focusBlurEnabled = true; + return _this; + } + + GeoView.prototype.init = function (ecModel, api) { + this._api = api; + }; + + GeoView.prototype.render = function (geoModel, ecModel, api, payload) { + this._model = geoModel; + + if (!geoModel.get('show')) { + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + return; + } + + if (!this._mapDraw) { + this._mapDraw = new MapDraw(api); + } + + var mapDraw = this._mapDraw; + mapDraw.draw(geoModel, ecModel, api, this, payload); + mapDraw.group.on('click', this._handleRegionClick, this); + mapDraw.group.silent = geoModel.get('silent'); + this.group.add(mapDraw.group); + this.updateSelectStatus(geoModel, ecModel, api); + }; + + GeoView.prototype._handleRegionClick = function (e) { + var eventData; + findEventDispatcher(e.target, function (current) { + return (eventData = getECData(current).eventData) != null; + }, true); + + if (eventData) { + this._api.dispatchAction({ + type: 'geoToggleSelect', + geoId: this._model.id, + name: eventData.name + }); + } + }; + + GeoView.prototype.updateSelectStatus = function (model, ecModel, api) { + var _this = this; + + this._mapDraw.group.traverse(function (node) { + var eventData = getECData(node).eventData; + + if (eventData) { + _this._model.isSelected(eventData.name) ? api.enterSelect(node) : api.leaveSelect(node); // No need to traverse children. + + return true; + } + }); + }; + + GeoView.prototype.findHighDownDispatchers = function (name) { + return this._mapDraw && this._mapDraw.findHighDownDispatchers(name, this._model); + }; + + GeoView.prototype.dispose = function () { + this._mapDraw && this._mapDraw.remove(); + }; + + GeoView.type = 'geo'; + return GeoView; + }(ComponentView); + + function registerMap$1(mapName, geoJson, specialAreas) { + geoSourceManager.registerMap(mapName, geoJson, specialAreas); + } + + function install$9(registers) { + registers.registerCoordinateSystem('geo', geoCreator); + registers.registerComponentModel(GeoModel); + registers.registerComponentView(GeoView); + registers.registerImpl('registerMap', registerMap$1); + registers.registerImpl('getMap', function (mapName) { + return geoSourceManager.getMapForUser(mapName); + }); + + function makeAction(method, actionInfo) { + actionInfo.update = 'geo:updateSelectStatus'; + registers.registerAction(actionInfo, function (payload, ecModel) { + var selected = {}; + var allSelected = []; + ecModel.eachComponent({ + mainType: 'geo', + query: payload + }, function (geoModel) { + geoModel[method](payload.name); + var geo = geoModel.coordinateSystem; + each(geo.regions, function (region) { + selected[region.name] = geoModel.isSelected(region.name) || false; + }); // Notice: there might be duplicated name in different regions. + + var names = []; + each(selected, function (v, name) { + selected[name] && names.push(name); + }); + allSelected.push({ + geoIndex: geoModel.componentIndex, + // Use singular, the same naming convention as the event `selectchanged`. + name: names + }); + }); + return { + selected: selected, + allSelected: allSelected, + name: payload.name + }; + }); + } + + makeAction('toggleSelected', { + type: 'geoToggleSelect', + event: 'geoselectchanged' + }); + makeAction('select', { + type: 'geoSelect', + event: 'geoselected' + }); + makeAction('unSelect', { + type: 'geoUnSelect', + event: 'geounselected' + }); + /** + * @payload + * @property {string} [componentType=series] + * @property {number} [dx] + * @property {number} [dy] + * @property {number} [zoom] + * @property {number} [originX] + * @property {number} [originY] + */ + + registers.registerAction({ + type: 'geoRoam', + event: 'geoRoam', + update: 'updateTransform' + }, function (payload, ecModel, api) { + var componentType = payload.componentType || 'series'; + ecModel.eachComponent({ + mainType: componentType, + query: payload + }, function (componentModel) { + var geo = componentModel.coordinateSystem; + + if (geo.type !== 'geo') { + return; + } + + var res = updateCenterAndZoom(geo, payload, componentModel.get('scaleLimit'), api); + componentModel.setCenter && componentModel.setCenter(res.center); + componentModel.setZoom && componentModel.setZoom(res.zoom); // All map series with same `map` use the same geo coordinate system + // So the center and zoom must be in sync. Include the series not selected by legend + + if (componentType === 'series') { + each(componentModel.seriesGroup, function (seriesModel) { + seriesModel.setCenter(res.center); + seriesModel.setZoom(res.zoom); + }); + } + }); + }); + } + + function install$a(registers) { + use(install$9); + registers.registerChartView(MapView); + registers.registerSeriesModel(MapSeries); + registers.registerLayout(mapSymbolLayout); + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, mapDataStatistic); + createLegacyDataSelectAction('map', registers.registerAction); + } + + /** + * Initialize all computational message for following algorithm. + */ + + function init$2(inRoot) { + var root = inRoot; + root.hierNode = { + defaultAncestor: null, + ancestor: root, + prelim: 0, + modifier: 0, + change: 0, + shift: 0, + i: 0, + thread: null + }; + var nodes = [root]; + var node; + var children; + + while (node = nodes.pop()) { + // jshint ignore:line + children = node.children; + + if (node.isExpand && children.length) { + var n = children.length; + + for (var i = n - 1; i >= 0; i--) { + var child = children[i]; + child.hierNode = { + defaultAncestor: null, + ancestor: child, + prelim: 0, + modifier: 0, + change: 0, + shift: 0, + i: i, + thread: null + }; + nodes.push(child); + } + } + } + } + /** + * The implementation of this function was originally copied from "d3.js" + * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js> + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * Computes a preliminary x coordinate for node. Before that, this function is + * applied recursively to the children of node, as well as the function + * apportion(). After spacing out the children by calling executeShifts(), the + * node is placed to the midpoint of its outermost children. + */ + + function firstWalk(node, separation) { + var children = node.isExpand ? node.children : []; + var siblings = node.parentNode.children; + var subtreeW = node.hierNode.i ? siblings[node.hierNode.i - 1] : null; + + if (children.length) { + executeShifts(node); + var midPoint = (children[0].hierNode.prelim + children[children.length - 1].hierNode.prelim) / 2; + + if (subtreeW) { + node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW); + node.hierNode.modifier = node.hierNode.prelim - midPoint; + } else { + node.hierNode.prelim = midPoint; + } + } else if (subtreeW) { + node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW); + } + + node.parentNode.hierNode.defaultAncestor = apportion(node, subtreeW, node.parentNode.hierNode.defaultAncestor || siblings[0], separation); + } + /** + * The implementation of this function was originally copied from "d3.js" + * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js> + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * Computes all real x-coordinates by summing up the modifiers recursively. + */ + + function secondWalk(node) { + var nodeX = node.hierNode.prelim + node.parentNode.hierNode.modifier; + node.setLayout({ + x: nodeX + }, true); + node.hierNode.modifier += node.parentNode.hierNode.modifier; + } + function separation(cb) { + return arguments.length ? cb : defaultSeparation; + } + /** + * Transform the common coordinate to radial coordinate. + */ + + function radialCoordinate(rad, r) { + rad -= Math.PI / 2; + return { + x: r * Math.cos(rad), + y: r * Math.sin(rad) + }; + } + /** + * Get the layout position of the whole view. + */ + + function getViewRect$1(seriesModel, api) { + return getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + } + /** + * All other shifts, applied to the smaller subtrees between w- and w+, are + * performed by this function. + * + * The implementation of this function was originally copied from "d3.js" + * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js> + * with some modifications made for this program. + * See the license statement at the head of this file. + */ + + function executeShifts(node) { + var children = node.children; + var n = children.length; + var shift = 0; + var change = 0; + + while (--n >= 0) { + var child = children[n]; + child.hierNode.prelim += shift; + child.hierNode.modifier += shift; + change += child.hierNode.change; + shift += child.hierNode.shift + change; + } + } + /** + * The implementation of this function was originally copied from "d3.js" + * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js> + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * The core of the algorithm. Here, a new subtree is combined with the + * previous subtrees. Threads are used to traverse the inside and outside + * contours of the left and right subtree up to the highest common level. + * Whenever two nodes of the inside contours conflict, we compute the left + * one of the greatest uncommon ancestors using the function nextAncestor() + * and call moveSubtree() to shift the subtree and prepare the shifts of + * smaller subtrees. Finally, we add a new thread (if necessary). + */ + + + function apportion(subtreeV, subtreeW, ancestor, separation) { + if (subtreeW) { + var nodeOutRight = subtreeV; + var nodeInRight = subtreeV; + var nodeOutLeft = nodeInRight.parentNode.children[0]; + var nodeInLeft = subtreeW; + var sumOutRight = nodeOutRight.hierNode.modifier; + var sumInRight = nodeInRight.hierNode.modifier; + var sumOutLeft = nodeOutLeft.hierNode.modifier; + var sumInLeft = nodeInLeft.hierNode.modifier; + + while (nodeInLeft = nextRight(nodeInLeft), nodeInRight = nextLeft(nodeInRight), nodeInLeft && nodeInRight) { + nodeOutRight = nextRight(nodeOutRight); + nodeOutLeft = nextLeft(nodeOutLeft); + nodeOutRight.hierNode.ancestor = subtreeV; + var shift = nodeInLeft.hierNode.prelim + sumInLeft - nodeInRight.hierNode.prelim - sumInRight + separation(nodeInLeft, nodeInRight); + + if (shift > 0) { + moveSubtree(nextAncestor(nodeInLeft, subtreeV, ancestor), subtreeV, shift); + sumInRight += shift; + sumOutRight += shift; + } + + sumInLeft += nodeInLeft.hierNode.modifier; + sumInRight += nodeInRight.hierNode.modifier; + sumOutRight += nodeOutRight.hierNode.modifier; + sumOutLeft += nodeOutLeft.hierNode.modifier; + } + + if (nodeInLeft && !nextRight(nodeOutRight)) { + nodeOutRight.hierNode.thread = nodeInLeft; + nodeOutRight.hierNode.modifier += sumInLeft - sumOutRight; + } + + if (nodeInRight && !nextLeft(nodeOutLeft)) { + nodeOutLeft.hierNode.thread = nodeInRight; + nodeOutLeft.hierNode.modifier += sumInRight - sumOutLeft; + ancestor = subtreeV; + } + } + + return ancestor; + } + /** + * This function is used to traverse the right contour of a subtree. + * It returns the rightmost child of node or the thread of node. The function + * returns null if and only if node is on the highest depth of its subtree. + */ + + + function nextRight(node) { + var children = node.children; + return children.length && node.isExpand ? children[children.length - 1] : node.hierNode.thread; + } + /** + * This function is used to traverse the left contour of a subtree (or a subforest). + * It returns the leftmost child of node or the thread of node. The function + * returns null if and only if node is on the highest depth of its subtree. + */ + + + function nextLeft(node) { + var children = node.children; + return children.length && node.isExpand ? children[0] : node.hierNode.thread; + } + /** + * If nodeInLeft’s ancestor is a sibling of node, returns nodeInLeft’s ancestor. + * Otherwise, returns the specified ancestor. + */ + + + function nextAncestor(nodeInLeft, node, ancestor) { + return nodeInLeft.hierNode.ancestor.parentNode === node.parentNode ? nodeInLeft.hierNode.ancestor : ancestor; + } + /** + * The implementation of this function was originally copied from "d3.js" + * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js> + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * Shifts the current subtree rooted at wr. + * This is done by increasing prelim(w+) and modifier(w+) by shift. + */ + + + function moveSubtree(wl, wr, shift) { + var change = shift / (wr.hierNode.i - wl.hierNode.i); + wr.hierNode.change -= change; + wr.hierNode.shift += shift; + wr.hierNode.modifier += shift; + wr.hierNode.prelim += shift; + wl.hierNode.change += change; + } + /** + * The implementation of this function was originally copied from "d3.js" + * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js> + * with some modifications made for this program. + * See the license statement at the head of this file. + */ + + + function defaultSeparation(node1, node2) { + return node1.parentNode === node2.parentNode ? 1 : 2; + } + + var TreeEdgeShape = + /** @class */ + function () { + function TreeEdgeShape() { + this.parentPoint = []; + this.childPoints = []; + } + + return TreeEdgeShape; + }(); + + var TreePath = + /** @class */ + function (_super) { + __extends(TreePath, _super); + + function TreePath(opts) { + return _super.call(this, opts) || this; + } + + TreePath.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + + TreePath.prototype.getDefaultShape = function () { + return new TreeEdgeShape(); + }; + + TreePath.prototype.buildPath = function (ctx, shape) { + var childPoints = shape.childPoints; + var childLen = childPoints.length; + var parentPoint = shape.parentPoint; + var firstChildPos = childPoints[0]; + var lastChildPos = childPoints[childLen - 1]; + + if (childLen === 1) { + ctx.moveTo(parentPoint[0], parentPoint[1]); + ctx.lineTo(firstChildPos[0], firstChildPos[1]); + return; + } + + var orient = shape.orient; + var forkDim = orient === 'TB' || orient === 'BT' ? 0 : 1; + var otherDim = 1 - forkDim; + var forkPosition = parsePercent$1(shape.forkPosition, 1); + var tmpPoint = []; + tmpPoint[forkDim] = parentPoint[forkDim]; + tmpPoint[otherDim] = parentPoint[otherDim] + (lastChildPos[otherDim] - parentPoint[otherDim]) * forkPosition; + ctx.moveTo(parentPoint[0], parentPoint[1]); + ctx.lineTo(tmpPoint[0], tmpPoint[1]); + ctx.moveTo(firstChildPos[0], firstChildPos[1]); + tmpPoint[forkDim] = firstChildPos[forkDim]; + ctx.lineTo(tmpPoint[0], tmpPoint[1]); + tmpPoint[forkDim] = lastChildPos[forkDim]; + ctx.lineTo(tmpPoint[0], tmpPoint[1]); + ctx.lineTo(lastChildPos[0], lastChildPos[1]); + + for (var i = 1; i < childLen - 1; i++) { + var point = childPoints[i]; + ctx.moveTo(point[0], point[1]); + tmpPoint[forkDim] = point[forkDim]; + ctx.lineTo(tmpPoint[0], tmpPoint[1]); + } + }; + + return TreePath; + }(Path); + + var TreeView = + /** @class */ + function (_super) { + __extends(TreeView, _super); + + function TreeView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TreeView.type; + _this._mainGroup = new Group(); + return _this; + } + + TreeView.prototype.init = function (ecModel, api) { + this._controller = new RoamController(api.getZr()); + this._controllerHost = { + target: this.group + }; + this.group.add(this._mainGroup); + }; + + TreeView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var layoutInfo = seriesModel.layoutInfo; + var group = this._mainGroup; + var layout = seriesModel.get('layout'); + + if (layout === 'radial') { + group.x = layoutInfo.x + layoutInfo.width / 2; + group.y = layoutInfo.y + layoutInfo.height / 2; + } else { + group.x = layoutInfo.x; + group.y = layoutInfo.y; + } + + this._updateViewCoordSys(seriesModel, api); + + this._updateController(seriesModel, ecModel, api); + + var oldData = this._data; + data.diff(oldData).add(function (newIdx) { + if (symbolNeedsDraw$1(data, newIdx)) { + // Create node and edge + updateNode(data, newIdx, null, group, seriesModel); + } + }).update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + + if (!symbolNeedsDraw$1(data, newIdx)) { + symbolEl && removeNode(oldData, oldIdx, symbolEl, group, seriesModel); + return; + } // Update node and edge + + + updateNode(data, newIdx, symbolEl, group, seriesModel); + }).remove(function (oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); // When remove a collapsed node of subtree, since the collapsed + // node haven't been initialized with a symbol element, + // you can't found it's symbol element through index. + // so if we want to remove the symbol element we should insure + // that the symbol element is not null. + + if (symbolEl) { + removeNode(oldData, oldIdx, symbolEl, group, seriesModel); + } + }).execute(); + this._nodeScaleRatio = seriesModel.get('nodeScaleRatio'); + + this._updateNodeAndLinkScale(seriesModel); + + if (seriesModel.get('expandAndCollapse') === true) { + data.eachItemGraphicEl(function (el, dataIndex) { + el.off('click').on('click', function () { + api.dispatchAction({ + type: 'treeExpandAndCollapse', + seriesId: seriesModel.id, + dataIndex: dataIndex + }); + }); + }); + } + + this._data = data; + }; + + TreeView.prototype._updateViewCoordSys = function (seriesModel, api) { + var data = seriesModel.getData(); + var points = []; + data.each(function (idx) { + var layout = data.getItemLayout(idx); + + if (layout && !isNaN(layout.x) && !isNaN(layout.y)) { + points.push([+layout.x, +layout.y]); + } + }); + var min = []; + var max = []; + fromPoints(points, min, max); // If don't Store min max when collapse the root node after roam, + // the root node will disappear. + + var oldMin = this._min; + var oldMax = this._max; // If width or height is 0 + + if (max[0] - min[0] === 0) { + min[0] = oldMin ? oldMin[0] : min[0] - 1; + max[0] = oldMax ? oldMax[0] : max[0] + 1; + } + + if (max[1] - min[1] === 0) { + min[1] = oldMin ? oldMin[1] : min[1] - 1; + max[1] = oldMax ? oldMax[1] : max[1] + 1; + } + + var viewCoordSys = seriesModel.coordinateSystem = new View(); + viewCoordSys.zoomLimit = seriesModel.get('scaleLimit'); + viewCoordSys.setBoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]); + viewCoordSys.setCenter(seriesModel.get('center'), api); + viewCoordSys.setZoom(seriesModel.get('zoom')); // Here we use viewCoordSys just for computing the 'position' and 'scale' of the group + + this.group.attr({ + x: viewCoordSys.x, + y: viewCoordSys.y, + scaleX: viewCoordSys.scaleX, + scaleY: viewCoordSys.scaleY + }); + this._min = min; + this._max = max; + }; + + TreeView.prototype._updateController = function (seriesModel, ecModel, api) { + var _this = this; + + var controller = this._controller; + var controllerHost = this._controllerHost; + var group = this.group; + controller.setPointerChecker(function (e, x, y) { + var rect = group.getBoundingRect(); + rect.applyTransform(group.transform); + return rect.contain(x, y) && !onIrrelevantElement(e, api, seriesModel); + }); + controller.enable(seriesModel.get('roam')); + controllerHost.zoomLimit = seriesModel.get('scaleLimit'); + controllerHost.zoom = seriesModel.coordinateSystem.getZoom(); + controller.off('pan').off('zoom').on('pan', function (e) { + updateViewOnPan(controllerHost, e.dx, e.dy); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'treeRoam', + dx: e.dx, + dy: e.dy + }); + }).on('zoom', function (e) { + updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'treeRoam', + zoom: e.scale, + originX: e.originX, + originY: e.originY + }); + + _this._updateNodeAndLinkScale(seriesModel); // Only update label layout on zoom + + + api.updateLabelLayout(); + }); + }; + + TreeView.prototype._updateNodeAndLinkScale = function (seriesModel) { + var data = seriesModel.getData(); + + var nodeScale = this._getNodeGlobalScale(seriesModel); + + data.eachItemGraphicEl(function (el, idx) { + el.setSymbolScale(nodeScale); + }); + }; + + TreeView.prototype._getNodeGlobalScale = function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys.type !== 'view') { + return 1; + } + + var nodeScaleRatio = this._nodeScaleRatio; + var groupZoom = coordSys.scaleX || 1; // Scale node when zoom changes + + var roamZoom = coordSys.getZoom(); + var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1; + return nodeScale / groupZoom; + }; + + TreeView.prototype.dispose = function () { + this._controller && this._controller.dispose(); + this._controllerHost = null; + }; + + TreeView.prototype.remove = function () { + this._mainGroup.removeAll(); + + this._data = null; + }; + + TreeView.type = 'tree'; + return TreeView; + }(ChartView); + + function symbolNeedsDraw$1(data, dataIndex) { + var layout = data.getItemLayout(dataIndex); + return layout && !isNaN(layout.x) && !isNaN(layout.y); + } + + function updateNode(data, dataIndex, symbolEl, group, seriesModel) { + var isInit = !symbolEl; + var node = data.tree.getNodeByDataIndex(dataIndex); + var itemModel = node.getModel(); + var visualColor = node.getVisual('style').fill; + var symbolInnerColor = node.isExpand === false && node.children.length !== 0 ? visualColor : '#fff'; + var virtualRoot = data.tree.root; + var source = node.parentNode === virtualRoot ? node : node.parentNode || node; + var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex); + var sourceLayout = source.getLayout(); + var sourceOldLayout = sourceSymbolEl ? { + x: sourceSymbolEl.__oldX, + y: sourceSymbolEl.__oldY, + rawX: sourceSymbolEl.__radialOldRawX, + rawY: sourceSymbolEl.__radialOldRawY + } : sourceLayout; + var targetLayout = node.getLayout(); + + if (isInit) { + symbolEl = new Symbol(data, dataIndex, null, { + symbolInnerColor: symbolInnerColor, + useNameLabel: true + }); + symbolEl.x = sourceOldLayout.x; + symbolEl.y = sourceOldLayout.y; + } else { + symbolEl.updateData(data, dataIndex, null, { + symbolInnerColor: symbolInnerColor, + useNameLabel: true + }); + } + + symbolEl.__radialOldRawX = symbolEl.__radialRawX; + symbolEl.__radialOldRawY = symbolEl.__radialRawY; + symbolEl.__radialRawX = targetLayout.rawX; + symbolEl.__radialRawY = targetLayout.rawY; + group.add(symbolEl); + data.setItemGraphicEl(dataIndex, symbolEl); + symbolEl.__oldX = symbolEl.x; + symbolEl.__oldY = symbolEl.y; + updateProps(symbolEl, { + x: targetLayout.x, + y: targetLayout.y + }, seriesModel); + var symbolPath = symbolEl.getSymbolPath(); + + if (seriesModel.get('layout') === 'radial') { + var realRoot = virtualRoot.children[0]; + var rootLayout = realRoot.getLayout(); + var length_1 = realRoot.children.length; + var rad = void 0; + var isLeft = void 0; + + if (targetLayout.x === rootLayout.x && node.isExpand === true && realRoot.children.length) { + var center = { + x: (realRoot.children[0].getLayout().x + realRoot.children[length_1 - 1].getLayout().x) / 2, + y: (realRoot.children[0].getLayout().y + realRoot.children[length_1 - 1].getLayout().y) / 2 + }; + rad = Math.atan2(center.y - rootLayout.y, center.x - rootLayout.x); + + if (rad < 0) { + rad = Math.PI * 2 + rad; + } + + isLeft = center.x < rootLayout.x; + + if (isLeft) { + rad = rad - Math.PI; + } + } else { + rad = Math.atan2(targetLayout.y - rootLayout.y, targetLayout.x - rootLayout.x); + + if (rad < 0) { + rad = Math.PI * 2 + rad; + } + + if (node.children.length === 0 || node.children.length !== 0 && node.isExpand === false) { + isLeft = targetLayout.x < rootLayout.x; + + if (isLeft) { + rad = rad - Math.PI; + } + } else { + isLeft = targetLayout.x > rootLayout.x; + + if (!isLeft) { + rad = rad - Math.PI; + } + } + } + + var textPosition = isLeft ? 'left' : 'right'; + var normalLabelModel = itemModel.getModel('label'); + var rotate = normalLabelModel.get('rotate'); + var labelRotateRadian = rotate * (Math.PI / 180); + var textContent = symbolPath.getTextContent(); + + if (textContent) { + symbolPath.setTextConfig({ + position: normalLabelModel.get('position') || textPosition, + rotation: rotate == null ? -rad : labelRotateRadian, + origin: 'center' + }); + textContent.setStyle('verticalAlign', 'middle'); + } + } // Handle status + + + var focus = itemModel.get(['emphasis', 'focus']); + var focusDataIndices = focus === 'relative' ? concatArray(node.getAncestorsIndices(), node.getDescendantIndices()) : focus === 'ancestor' ? node.getAncestorsIndices() : focus === 'descendant' ? node.getDescendantIndices() : null; + + if (focusDataIndices) { + // Modify the focus to data indices. + getECData(symbolEl).focus = focusDataIndices; + } + + drawEdge(seriesModel, node, virtualRoot, symbolEl, sourceOldLayout, sourceLayout, targetLayout, group); + + if (symbolEl.__edge) { + symbolEl.onHoverStateChange = function (toState) { + if (toState !== 'blur') { + // NOTE: Ensure the parent elements will been blurred firstly. + // According to the return of getAncestorsIndices and getDescendantIndices + // TODO: A bit tricky. + var parentEl = node.parentNode && data.getItemGraphicEl(node.parentNode.dataIndex); + + if (!(parentEl && parentEl.hoverState === HOVER_STATE_BLUR)) { + setStatesFlag(symbolEl.__edge, toState); + } + } + }; + } + } + + function drawEdge(seriesModel, node, virtualRoot, symbolEl, sourceOldLayout, sourceLayout, targetLayout, group) { + var itemModel = node.getModel(); + var edgeShape = seriesModel.get('edgeShape'); + var layout = seriesModel.get('layout'); + var orient = seriesModel.getOrient(); + var curvature = seriesModel.get(['lineStyle', 'curveness']); + var edgeForkPosition = seriesModel.get('edgeForkPosition'); + var lineStyle = itemModel.getModel('lineStyle').getLineStyle(); + var edge = symbolEl.__edge; // curve edge from node -> parent + // polyline edge from node -> children + + if (edgeShape === 'curve') { + if (node.parentNode && node.parentNode !== virtualRoot) { + if (!edge) { + edge = symbolEl.__edge = new BezierCurve({ + shape: getEdgeShape(layout, orient, curvature, sourceOldLayout, sourceOldLayout) + }); + } + + updateProps(edge, { + shape: getEdgeShape(layout, orient, curvature, sourceLayout, targetLayout) + }, seriesModel); + } + } else if (edgeShape === 'polyline') { + if (layout === 'orthogonal') { + if (node !== virtualRoot && node.children && node.children.length !== 0 && node.isExpand === true) { + var children = node.children; + var childPoints = []; + + for (var i = 0; i < children.length; i++) { + var childLayout = children[i].getLayout(); + childPoints.push([childLayout.x, childLayout.y]); + } + + if (!edge) { + edge = symbolEl.__edge = new TreePath({ + shape: { + parentPoint: [targetLayout.x, targetLayout.y], + childPoints: [[targetLayout.x, targetLayout.y]], + orient: orient, + forkPosition: edgeForkPosition + } + }); + } + + updateProps(edge, { + shape: { + parentPoint: [targetLayout.x, targetLayout.y], + childPoints: childPoints + } + }, seriesModel); + } + } else { + if ("development" !== 'production') { + throw new Error('The polyline edgeShape can only be used in orthogonal layout'); + } + } + } // show all edge when edgeShape is 'curve', filter node `isExpand` is false when edgeShape is 'polyline' + + + if (edge && !(edgeShape === 'polyline' && !node.isExpand)) { + edge.useStyle(defaults({ + strokeNoScale: true, + fill: null + }, lineStyle)); + setStatesStylesFromModel(edge, itemModel, 'lineStyle'); + setDefaultStateProxy(edge); + group.add(edge); + } + } + + function removeNodeEdge(node, data, group, seriesModel, removeAnimationOpt) { + var virtualRoot = data.tree.root; + + var _a = getSourceNode(virtualRoot, node), + source = _a.source, + sourceLayout = _a.sourceLayout; + + var symbolEl = data.getItemGraphicEl(node.dataIndex); + + if (!symbolEl) { + return; + } + + var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex); + var sourceEdge = sourceSymbolEl.__edge; // 1. when expand the sub tree, delete the children node should delete the edge of + // the source at the same time. because the polyline edge shape is only owned by the source. + // 2.when the node is the only children of the source, delete the node should delete the edge of + // the source at the same time. the same reason as above. + + var edge = symbolEl.__edge || (source.isExpand === false || source.children.length === 1 ? sourceEdge : undefined); + var edgeShape = seriesModel.get('edgeShape'); + var layoutOpt = seriesModel.get('layout'); + var orient = seriesModel.get('orient'); + var curvature = seriesModel.get(['lineStyle', 'curveness']); + + if (edge) { + if (edgeShape === 'curve') { + removeElement(edge, { + shape: getEdgeShape(layoutOpt, orient, curvature, sourceLayout, sourceLayout), + style: { + opacity: 0 + } + }, seriesModel, { + cb: function () { + group.remove(edge); + }, + removeOpt: removeAnimationOpt + }); + } else if (edgeShape === 'polyline' && seriesModel.get('layout') === 'orthogonal') { + removeElement(edge, { + shape: { + parentPoint: [sourceLayout.x, sourceLayout.y], + childPoints: [[sourceLayout.x, sourceLayout.y]] + }, + style: { + opacity: 0 + } + }, seriesModel, { + cb: function () { + group.remove(edge); + }, + removeOpt: removeAnimationOpt + }); + } + } + } + + function getSourceNode(virtualRoot, node) { + var source = node.parentNode === virtualRoot ? node : node.parentNode || node; + var sourceLayout; + + while (sourceLayout = source.getLayout(), sourceLayout == null) { + source = source.parentNode === virtualRoot ? source : source.parentNode || source; + } + + return { + source: source, + sourceLayout: sourceLayout + }; + } + + function removeNode(data, dataIndex, symbolEl, group, seriesModel) { + var node = data.tree.getNodeByDataIndex(dataIndex); + var virtualRoot = data.tree.root; + var sourceLayout = getSourceNode(virtualRoot, node).sourceLayout; // Use same duration and easing with update to have more consistent animation. + + var removeAnimationOpt = { + duration: seriesModel.get('animationDurationUpdate'), + easing: seriesModel.get('animationEasingUpdate') + }; + removeElement(symbolEl, { + x: sourceLayout.x + 1, + y: sourceLayout.y + 1 + }, seriesModel, { + cb: function () { + group.remove(symbolEl); + data.setItemGraphicEl(dataIndex, null); + }, + removeOpt: removeAnimationOpt + }); + symbolEl.fadeOut(null, data.hostModel, { + fadeLabel: true, + animation: removeAnimationOpt + }); // remove edge as parent node + + node.children.forEach(function (childNode) { + removeNodeEdge(childNode, data, group, seriesModel, removeAnimationOpt); + }); // remove edge as child node + + removeNodeEdge(node, data, group, seriesModel, removeAnimationOpt); + } + + function getEdgeShape(layoutOpt, orient, curvature, sourceLayout, targetLayout) { + var cpx1; + var cpy1; + var cpx2; + var cpy2; + var x1; + var x2; + var y1; + var y2; + + if (layoutOpt === 'radial') { + x1 = sourceLayout.rawX; + y1 = sourceLayout.rawY; + x2 = targetLayout.rawX; + y2 = targetLayout.rawY; + var radialCoor1 = radialCoordinate(x1, y1); + var radialCoor2 = radialCoordinate(x1, y1 + (y2 - y1) * curvature); + var radialCoor3 = radialCoordinate(x2, y2 + (y1 - y2) * curvature); + var radialCoor4 = radialCoordinate(x2, y2); + return { + x1: radialCoor1.x || 0, + y1: radialCoor1.y || 0, + x2: radialCoor4.x || 0, + y2: radialCoor4.y || 0, + cpx1: radialCoor2.x || 0, + cpy1: radialCoor2.y || 0, + cpx2: radialCoor3.x || 0, + cpy2: radialCoor3.y || 0 + }; + } else { + x1 = sourceLayout.x; + y1 = sourceLayout.y; + x2 = targetLayout.x; + y2 = targetLayout.y; + + if (orient === 'LR' || orient === 'RL') { + cpx1 = x1 + (x2 - x1) * curvature; + cpy1 = y1; + cpx2 = x2 + (x1 - x2) * curvature; + cpy2 = y2; + } + + if (orient === 'TB' || orient === 'BT') { + cpx1 = x1; + cpy1 = y1 + (y2 - y1) * curvature; + cpx2 = x2; + cpy2 = y2 + (y1 - y2) * curvature; + } + } + + return { + x1: x1, + y1: y1, + x2: x2, + y2: y2, + cpx1: cpx1, + cpy1: cpy1, + cpx2: cpx2, + cpy2: cpy2 + }; + } + + var inner$7 = makeInner(); + + function linkSeriesData(opt) { + var mainData = opt.mainData; + var datas = opt.datas; + + if (!datas) { + datas = { + main: mainData + }; + opt.datasAttr = { + main: 'data' + }; + } + + opt.datas = opt.mainData = null; + linkAll(mainData, datas, opt); // Porxy data original methods. + + each(datas, function (data) { + each(mainData.TRANSFERABLE_METHODS, function (methodName) { + data.wrapMethod(methodName, curry(transferInjection, opt)); + }); + }); // Beyond transfer, additional features should be added to `cloneShallow`. + + mainData.wrapMethod('cloneShallow', curry(cloneShallowInjection, opt)); // Only mainData trigger change, because struct.update may trigger + // another changable methods, which may bring about dead lock. + + each(mainData.CHANGABLE_METHODS, function (methodName) { + mainData.wrapMethod(methodName, curry(changeInjection, opt)); + }); // Make sure datas contains mainData. + + assert(datas[mainData.dataType] === mainData); + } + + function transferInjection(opt, res) { + if (isMainData(this)) { + // Transfer datas to new main data. + var datas = extend({}, inner$7(this).datas); + datas[this.dataType] = res; + linkAll(res, datas, opt); + } else { + // Modify the reference in main data to point newData. + linkSingle(res, this.dataType, inner$7(this).mainData, opt); + } + + return res; + } + + function changeInjection(opt, res) { + opt.struct && opt.struct.update(); + return res; + } + + function cloneShallowInjection(opt, res) { + // cloneShallow, which brings about some fragilities, may be inappropriate + // to be exposed as an API. So for implementation simplicity we can make + // the restriction that cloneShallow of not-mainData should not be invoked + // outside, but only be invoked here. + each(inner$7(res).datas, function (data, dataType) { + data !== res && linkSingle(data.cloneShallow(), dataType, res, opt); + }); + return res; + } + /** + * Supplement method to List. + * + * @public + * @param [dataType] If not specified, return mainData. + */ + + + function getLinkedData(dataType) { + var mainData = inner$7(this).mainData; + return dataType == null || mainData == null ? mainData : inner$7(mainData).datas[dataType]; + } + /** + * Get list of all linked data + */ + + + function getLinkedDataAll() { + var mainData = inner$7(this).mainData; + return mainData == null ? [{ + data: mainData + }] : map(keys(inner$7(mainData).datas), function (type) { + return { + type: type, + data: inner$7(mainData).datas[type] + }; + }); + } + + function isMainData(data) { + return inner$7(data).mainData === data; + } + + function linkAll(mainData, datas, opt) { + inner$7(mainData).datas = {}; + each(datas, function (data, dataType) { + linkSingle(data, dataType, mainData, opt); + }); + } + + function linkSingle(data, dataType, mainData, opt) { + inner$7(mainData).datas[dataType] = data; + inner$7(data).mainData = mainData; + data.dataType = dataType; + + if (opt.struct) { + data[opt.structAttr] = opt.struct; + opt.struct[opt.datasAttr[dataType]] = data; + } // Supplement method. + + + data.getLinkedData = getLinkedData; + data.getLinkedDataAll = getLinkedDataAll; + } + + var TreeNode = + /** @class */ + function () { + function TreeNode(name, hostTree) { + this.depth = 0; + this.height = 0; + /** + * Reference to list item. + * Do not persistent dataIndex outside, + * besause it may be changed by list. + * If dataIndex -1, + * this node is logical deleted (filtered) in list. + */ + + this.dataIndex = -1; + this.children = []; + this.viewChildren = []; + this.isExpand = false; + this.name = name || ''; + this.hostTree = hostTree; + } + /** + * The node is removed. + */ + + + TreeNode.prototype.isRemoved = function () { + return this.dataIndex < 0; + }; + + TreeNode.prototype.eachNode = function (options, cb, context) { + if (isFunction(options)) { + context = cb; + cb = options; + options = null; + } + + options = options || {}; + + if (isString(options)) { + options = { + order: options + }; + } + + var order = options.order || 'preorder'; + var children = this[options.attr || 'children']; + var suppressVisitSub; + order === 'preorder' && (suppressVisitSub = cb.call(context, this)); + + for (var i = 0; !suppressVisitSub && i < children.length; i++) { + children[i].eachNode(options, cb, context); + } + + order === 'postorder' && cb.call(context, this); + }; + /** + * Update depth and height of this subtree. + */ + + + TreeNode.prototype.updateDepthAndHeight = function (depth) { + var height = 0; + this.depth = depth; + + for (var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + child.updateDepthAndHeight(depth + 1); + + if (child.height > height) { + height = child.height; + } + } + + this.height = height + 1; + }; + + TreeNode.prototype.getNodeById = function (id) { + if (this.getId() === id) { + return this; + } + + for (var i = 0, children = this.children, len = children.length; i < len; i++) { + var res = children[i].getNodeById(id); + + if (res) { + return res; + } + } + }; + + TreeNode.prototype.contains = function (node) { + if (node === this) { + return true; + } + + for (var i = 0, children = this.children, len = children.length; i < len; i++) { + var res = children[i].contains(node); + + if (res) { + return res; + } + } + }; + /** + * @param includeSelf Default false. + * @return order: [root, child, grandchild, ...] + */ + + + TreeNode.prototype.getAncestors = function (includeSelf) { + var ancestors = []; + var node = includeSelf ? this : this.parentNode; + + while (node) { + ancestors.push(node); + node = node.parentNode; + } + + ancestors.reverse(); + return ancestors; + }; + + TreeNode.prototype.getAncestorsIndices = function () { + var indices = []; + var currNode = this; + + while (currNode) { + indices.push(currNode.dataIndex); + currNode = currNode.parentNode; + } + + indices.reverse(); + return indices; + }; + + TreeNode.prototype.getDescendantIndices = function () { + var indices = []; + this.eachNode(function (childNode) { + indices.push(childNode.dataIndex); + }); + return indices; + }; + + TreeNode.prototype.getValue = function (dimension) { + var data = this.hostTree.data; + return data.getStore().get(data.getDimensionIndex(dimension || 'value'), this.dataIndex); + }; + + TreeNode.prototype.setLayout = function (layout, merge) { + this.dataIndex >= 0 && this.hostTree.data.setItemLayout(this.dataIndex, layout, merge); + }; + /** + * @return {Object} layout + */ + + + TreeNode.prototype.getLayout = function () { + return this.hostTree.data.getItemLayout(this.dataIndex); + }; // @depcrecated + // getModel<T = unknown, S extends keyof T = keyof T>(path: S): Model<T[S]> + // eslint-disable-next-line @typescript-eslint/no-unused-vars + + + TreeNode.prototype.getModel = function (path) { + if (this.dataIndex < 0) { + return; + } + + var hostTree = this.hostTree; + var itemModel = hostTree.data.getItemModel(this.dataIndex); + return itemModel.getModel(path); + }; // TODO: TYPE More specific model + + + TreeNode.prototype.getLevelModel = function () { + return (this.hostTree.levelModels || [])[this.depth]; + }; + + TreeNode.prototype.setVisual = function (key, value) { + this.dataIndex >= 0 && this.hostTree.data.setItemVisual(this.dataIndex, key, value); + }; + /** + * Get item visual + * FIXME: make return type better + */ + + + TreeNode.prototype.getVisual = function (key) { + return this.hostTree.data.getItemVisual(this.dataIndex, key); + }; + + TreeNode.prototype.getRawIndex = function () { + return this.hostTree.data.getRawIndex(this.dataIndex); + }; + + TreeNode.prototype.getId = function () { + return this.hostTree.data.getId(this.dataIndex); + }; + /** + * index in parent's children + */ + + + TreeNode.prototype.getChildIndex = function () { + if (this.parentNode) { + var children = this.parentNode.children; + + for (var i = 0; i < children.length; ++i) { + if (children[i] === this) { + return i; + } + } + + return -1; + } + + return -1; + }; + /** + * if this is an ancestor of another node + * + * @param node another node + * @return if is ancestor + */ + + + TreeNode.prototype.isAncestorOf = function (node) { + var parent = node.parentNode; + + while (parent) { + if (parent === this) { + return true; + } + + parent = parent.parentNode; + } + + return false; + }; + /** + * if this is an descendant of another node + * + * @param node another node + * @return if is descendant + */ + + + TreeNode.prototype.isDescendantOf = function (node) { + return node !== this && node.isAncestorOf(this); + }; + + return TreeNode; + }(); + + var Tree = + /** @class */ + function () { + function Tree(hostModel) { + this.type = 'tree'; + this._nodes = []; + this.hostModel = hostModel; + } + + Tree.prototype.eachNode = function (options, cb, context) { + this.root.eachNode(options, cb, context); + }; + + Tree.prototype.getNodeByDataIndex = function (dataIndex) { + var rawIndex = this.data.getRawIndex(dataIndex); + return this._nodes[rawIndex]; + }; + + Tree.prototype.getNodeById = function (name) { + return this.root.getNodeById(name); + }; + /** + * Update item available by list, + * when list has been performed options like 'filterSelf' or 'map'. + */ + + + Tree.prototype.update = function () { + var data = this.data; + var nodes = this._nodes; + + for (var i = 0, len = nodes.length; i < len; i++) { + nodes[i].dataIndex = -1; + } + + for (var i = 0, len = data.count(); i < len; i++) { + nodes[data.getRawIndex(i)].dataIndex = i; + } + }; + /** + * Clear all layouts + */ + + + Tree.prototype.clearLayouts = function () { + this.data.clearItemLayouts(); + }; + /** + * data node format: + * { + * name: ... + * value: ... + * children: [ + * { + * name: ... + * value: ... + * children: ... + * }, + * ... + * ] + * } + */ + + + Tree.createTree = function (dataRoot, hostModel, beforeLink) { + var tree = new Tree(hostModel); + var listData = []; + var dimMax = 1; + buildHierarchy(dataRoot); + + function buildHierarchy(dataNode, parentNode) { + var value = dataNode.value; + dimMax = Math.max(dimMax, isArray(value) ? value.length : 1); + listData.push(dataNode); + var node = new TreeNode(convertOptionIdName(dataNode.name, ''), tree); + parentNode ? addChild(node, parentNode) : tree.root = node; + + tree._nodes.push(node); + + var children = dataNode.children; + + if (children) { + for (var i = 0; i < children.length; i++) { + buildHierarchy(children[i], node); + } + } + } + + tree.root.updateDepthAndHeight(0); + var dimensions = prepareSeriesDataSchema(listData, { + coordDimensions: ['value'], + dimensionsCount: dimMax + }).dimensions; + var list = new SeriesData(dimensions, hostModel); + list.initData(listData); + beforeLink && beforeLink(list); + linkSeriesData({ + mainData: list, + struct: tree, + structAttr: 'tree' + }); + tree.update(); + return tree; + }; + + return Tree; + }(); + /** + * It is needed to consider the mess of 'list', 'hostModel' when creating a TreeNote, + * so this function is not ready and not necessary to be public. + */ + + + function addChild(child, node) { + var children = node.children; + + if (child.parentNode === node) { + return; + } + + children.push(child); + child.parentNode = node; + } + + function retrieveTargetInfo(payload, validPayloadTypes, seriesModel) { + if (payload && indexOf(validPayloadTypes, payload.type) >= 0) { + var root = seriesModel.getData().tree.root; + var targetNode = payload.targetNode; + + if (isString(targetNode)) { + targetNode = root.getNodeById(targetNode); + } + + if (targetNode && root.contains(targetNode)) { + return { + node: targetNode + }; + } + + var targetNodeId = payload.targetNodeId; + + if (targetNodeId != null && (targetNode = root.getNodeById(targetNodeId))) { + return { + node: targetNode + }; + } + } + } // Not includes the given node at the last item. + + function getPathToRoot(node) { + var path = []; + + while (node) { + node = node.parentNode; + node && path.push(node); + } + + return path.reverse(); + } + function aboveViewRoot(viewRoot, node) { + var viewPath = getPathToRoot(viewRoot); + return indexOf(viewPath, node) >= 0; + } // From root to the input node (the input node will be included). + + function wrapTreePathInfo(node, seriesModel) { + var treePathInfo = []; + + while (node) { + var nodeDataIndex = node.dataIndex; + treePathInfo.push({ + name: node.name, + dataIndex: nodeDataIndex, + value: seriesModel.getRawValue(nodeDataIndex) + }); + node = node.parentNode; + } + + treePathInfo.reverse(); + return treePathInfo; + } + + var TreeSeriesModel = + /** @class */ + function (_super) { + __extends(TreeSeriesModel, _super); + + function TreeSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.hasSymbolVisual = true; // Do it self. + + _this.ignoreStyleOnData = true; + return _this; + } + /** + * Init a tree data structure from data in option series + */ + + + TreeSeriesModel.prototype.getInitialData = function (option) { + //create an virtual root + var root = { + name: option.name, + children: option.data + }; + var leaves = option.leaves || {}; + var leavesModel = new Model(leaves, this, this.ecModel); + var tree = Tree.createTree(root, this, beforeLink); + + function beforeLink(nodeData) { + nodeData.wrapMethod('getItemModel', function (model, idx) { + var node = tree.getNodeByDataIndex(idx); + + if (!(node && node.children.length && node.isExpand)) { + model.parentModel = leavesModel; + } + + return model; + }); + } + + var treeDepth = 0; + tree.eachNode('preorder', function (node) { + if (node.depth > treeDepth) { + treeDepth = node.depth; + } + }); + var expandAndCollapse = option.expandAndCollapse; + var expandTreeDepth = expandAndCollapse && option.initialTreeDepth >= 0 ? option.initialTreeDepth : treeDepth; + tree.root.eachNode('preorder', function (node) { + var item = node.hostTree.data.getRawDataItem(node.dataIndex); // Add item.collapsed != null, because users can collapse node original in the series.data. + + node.isExpand = item && item.collapsed != null ? !item.collapsed : node.depth <= expandTreeDepth; + }); + return tree.data; + }; + /** + * Make the configuration 'orient' backward compatibly, with 'horizontal = LR', 'vertical = TB'. + * @returns {string} orient + */ + + + TreeSeriesModel.prototype.getOrient = function () { + var orient = this.get('orient'); + + if (orient === 'horizontal') { + orient = 'LR'; + } else if (orient === 'vertical') { + orient = 'TB'; + } + + return orient; + }; + + TreeSeriesModel.prototype.setZoom = function (zoom) { + this.option.zoom = zoom; + }; + + TreeSeriesModel.prototype.setCenter = function (center) { + this.option.center = center; + }; + + TreeSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var tree = this.getData().tree; + var realRoot = tree.root.children[0]; + var node = tree.getNodeByDataIndex(dataIndex); + var value = node.getValue(); + var name = node.name; + + while (node && node !== realRoot) { + name = node.parentNode.name + '.' + name; + node = node.parentNode; + } + + return createTooltipMarkup('nameValue', { + name: name, + value: value, + noValue: isNaN(value) || value == null + }); + }; // Add tree path to tooltip param + + + TreeSeriesModel.prototype.getDataParams = function (dataIndex) { + var params = _super.prototype.getDataParams.apply(this, arguments); + + var node = this.getData().tree.getNodeByDataIndex(dataIndex); + params.treeAncestors = wrapTreePathInfo(node, this); + params.collapsed = !node.isExpand; + return params; + }; + + TreeSeriesModel.type = 'series.tree'; // can support the position parameters 'left', 'top','right','bottom', 'width', + // 'height' in the setOption() with 'merge' mode normal. + + TreeSeriesModel.layoutMode = 'box'; + TreeSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'view', + // the position of the whole view + left: '12%', + top: '12%', + right: '12%', + bottom: '12%', + // the layout of the tree, two value can be selected, 'orthogonal' or 'radial' + layout: 'orthogonal', + // value can be 'polyline' + edgeShape: 'curve', + edgeForkPosition: '50%', + // true | false | 'move' | 'scale', see module:component/helper/RoamController. + roam: false, + // Symbol size scale ratio in roam + nodeScaleRatio: 0.4, + // Default on center of graph + center: null, + zoom: 1, + orient: 'LR', + symbol: 'emptyCircle', + symbolSize: 7, + expandAndCollapse: true, + initialTreeDepth: 2, + lineStyle: { + color: '#ccc', + width: 1.5, + curveness: 0.5 + }, + itemStyle: { + color: 'lightsteelblue', + // borderColor: '#c23531', + borderWidth: 1.5 + }, + label: { + show: true + }, + animationEasing: 'linear', + animationDuration: 700, + animationDurationUpdate: 500 + }; + return TreeSeriesModel; + }(SeriesModel); + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + + /** + * Traverse the tree from bottom to top and do something + */ + function eachAfter(root, callback, separation) { + var nodes = [root]; + var next = []; + var node; + + while (node = nodes.pop()) { + // jshint ignore:line + next.push(node); + + if (node.isExpand) { + var children = node.children; + + if (children.length) { + for (var i = 0; i < children.length; i++) { + nodes.push(children[i]); + } + } + } + } + + while (node = next.pop()) { + // jshint ignore:line + callback(node, separation); + } + } + /** + * Traverse the tree from top to bottom and do something + */ + + + function eachBefore(root, callback) { + var nodes = [root]; + var node; + + while (node = nodes.pop()) { + // jshint ignore:line + callback(node); + + if (node.isExpand) { + var children = node.children; + + if (children.length) { + for (var i = children.length - 1; i >= 0; i--) { + nodes.push(children[i]); + } + } + } + } + } + + function treeLayout(ecModel, api) { + ecModel.eachSeriesByType('tree', function (seriesModel) { + commonLayout(seriesModel, api); + }); + } + + function commonLayout(seriesModel, api) { + var layoutInfo = getViewRect$1(seriesModel, api); + seriesModel.layoutInfo = layoutInfo; + var layout = seriesModel.get('layout'); + var width = 0; + var height = 0; + var separation$1 = null; + + if (layout === 'radial') { + width = 2 * Math.PI; + height = Math.min(layoutInfo.height, layoutInfo.width) / 2; + separation$1 = separation(function (node1, node2) { + return (node1.parentNode === node2.parentNode ? 1 : 2) / node1.depth; + }); + } else { + width = layoutInfo.width; + height = layoutInfo.height; + separation$1 = separation(); + } + + var virtualRoot = seriesModel.getData().tree.root; + var realRoot = virtualRoot.children[0]; + + if (realRoot) { + init$2(virtualRoot); + eachAfter(realRoot, firstWalk, separation$1); + virtualRoot.hierNode.modifier = -realRoot.hierNode.prelim; + eachBefore(realRoot, secondWalk); + var left_1 = realRoot; + var right_1 = realRoot; + var bottom_1 = realRoot; + eachBefore(realRoot, function (node) { + var x = node.getLayout().x; + + if (x < left_1.getLayout().x) { + left_1 = node; + } + + if (x > right_1.getLayout().x) { + right_1 = node; + } + + if (node.depth > bottom_1.depth) { + bottom_1 = node; + } + }); + var delta = left_1 === right_1 ? 1 : separation$1(left_1, right_1) / 2; + var tx_1 = delta - left_1.getLayout().x; + var kx_1 = 0; + var ky_1 = 0; + var coorX_1 = 0; + var coorY_1 = 0; + + if (layout === 'radial') { + kx_1 = width / (right_1.getLayout().x + delta + tx_1); // here we use (node.depth - 1), bucause the real root's depth is 1 + + ky_1 = height / (bottom_1.depth - 1 || 1); + eachBefore(realRoot, function (node) { + coorX_1 = (node.getLayout().x + tx_1) * kx_1; + coorY_1 = (node.depth - 1) * ky_1; + var finalCoor = radialCoordinate(coorX_1, coorY_1); + node.setLayout({ + x: finalCoor.x, + y: finalCoor.y, + rawX: coorX_1, + rawY: coorY_1 + }, true); + }); + } else { + var orient_1 = seriesModel.getOrient(); + + if (orient_1 === 'RL' || orient_1 === 'LR') { + ky_1 = height / (right_1.getLayout().x + delta + tx_1); + kx_1 = width / (bottom_1.depth - 1 || 1); + eachBefore(realRoot, function (node) { + coorY_1 = (node.getLayout().x + tx_1) * ky_1; + coorX_1 = orient_1 === 'LR' ? (node.depth - 1) * kx_1 : width - (node.depth - 1) * kx_1; + node.setLayout({ + x: coorX_1, + y: coorY_1 + }, true); + }); + } else if (orient_1 === 'TB' || orient_1 === 'BT') { + kx_1 = width / (right_1.getLayout().x + delta + tx_1); + ky_1 = height / (bottom_1.depth - 1 || 1); + eachBefore(realRoot, function (node) { + coorX_1 = (node.getLayout().x + tx_1) * kx_1; + coorY_1 = orient_1 === 'TB' ? (node.depth - 1) * ky_1 : height - (node.depth - 1) * ky_1; + node.setLayout({ + x: coorX_1, + y: coorY_1 + }, true); + }); + } + } + } + } + + function treeVisual(ecModel) { + ecModel.eachSeriesByType('tree', function (seriesModel) { + var data = seriesModel.getData(); + var tree = data.tree; + tree.eachNode(function (node) { + var model = node.getModel(); // TODO Optimize + + var style = model.getModel('itemStyle').getItemStyle(); + var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style'); + extend(existsStyle, style); + }); + }); + } + + function installTreeAction(registers) { + registers.registerAction({ + type: 'treeExpandAndCollapse', + event: 'treeExpandAndCollapse', + update: 'update' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'tree', + query: payload + }, function (seriesModel) { + var dataIndex = payload.dataIndex; + var tree = seriesModel.getData().tree; + var node = tree.getNodeByDataIndex(dataIndex); + node.isExpand = !node.isExpand; + }); + }); + registers.registerAction({ + type: 'treeRoam', + event: 'treeRoam', + // Here we set 'none' instead of 'update', because roam action + // just need to update the transform matrix without having to recalculate + // the layout. So don't need to go through the whole update process, such + // as 'dataPrcocess', 'coordSystemUpdate', 'layout' and so on. + update: 'none' + }, function (payload, ecModel, api) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'tree', + query: payload + }, function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var res = updateCenterAndZoom(coordSys, payload, undefined, api); + seriesModel.setCenter && seriesModel.setCenter(res.center); + seriesModel.setZoom && seriesModel.setZoom(res.zoom); + }); + }); + } + + function install$b(registers) { + registers.registerChartView(TreeView); + registers.registerSeriesModel(TreeSeriesModel); + registers.registerLayout(treeLayout); + registers.registerVisual(treeVisual); + installTreeAction(registers); + } + + var actionTypes = ['treemapZoomToNode', 'treemapRender', 'treemapMove']; + function installTreemapAction(registers) { + for (var i = 0; i < actionTypes.length; i++) { + registers.registerAction({ + type: actionTypes[i], + update: 'updateView' + }, noop); + } + + registers.registerAction({ + type: 'treemapRootToNode', + update: 'updateView' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'treemap', + query: payload + }, handleRootToNode); + + function handleRootToNode(model, index) { + var types = ['treemapZoomToNode', 'treemapRootToNode']; + var targetInfo = retrieveTargetInfo(payload, types, model); + + if (targetInfo) { + var originViewRoot = model.getViewRoot(); + + if (originViewRoot) { + payload.direction = aboveViewRoot(originViewRoot, targetInfo.node) ? 'rollUp' : 'drillDown'; + } + + model.resetViewRoot(targetInfo.node); + } + } + }); + } + + function enableAriaDecalForTree(seriesModel) { + var data = seriesModel.getData(); + var tree = data.tree; + var decalPaletteScope = {}; + tree.eachNode(function (node) { + // Use decal of level 1 node + var current = node; + + while (current && current.depth > 1) { + current = current.parentNode; + } + + var decal = getDecalFromPalette(seriesModel.ecModel, current.name || current.dataIndex + '', decalPaletteScope); + node.setVisual('decal', decal); + }); + } + + var TreemapSeriesModel = + /** @class */ + function (_super) { + __extends(TreemapSeriesModel, _super); + + function TreemapSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TreemapSeriesModel.type; + _this.preventUsingHoverLayer = true; + return _this; + } + /** + * @override + */ + + + TreemapSeriesModel.prototype.getInitialData = function (option, ecModel) { + // Create a virtual root. + var root = { + name: option.name, + children: option.data + }; + completeTreeValue(root); + var levels = option.levels || []; // Used in "visual priority" in `treemapVisual.js`. + // This way is a little tricky, must satisfy the precondition: + // 1. There is no `treeNode.getModel('itemStyle.xxx')` used. + // 2. The `Model.prototype.getModel()` will not use any clone-like way. + + var designatedVisualItemStyle = this.designatedVisualItemStyle = {}; + var designatedVisualModel = new Model({ + itemStyle: designatedVisualItemStyle + }, this, ecModel); + levels = option.levels = setDefault(levels, ecModel); + var levelModels = map(levels || [], function (levelDefine) { + return new Model(levelDefine, designatedVisualModel, ecModel); + }, this); // Make sure always a new tree is created when setOption, + // in TreemapView, we check whether oldTree === newTree + // to choose mappings approach among old shapes and new shapes. + + var tree = Tree.createTree(root, this, beforeLink); + + function beforeLink(nodeData) { + nodeData.wrapMethod('getItemModel', function (model, idx) { + var node = tree.getNodeByDataIndex(idx); + var levelModel = node ? levelModels[node.depth] : null; // If no levelModel, we also need `designatedVisualModel`. + + model.parentModel = levelModel || designatedVisualModel; + return model; + }); + } + + return tree.data; + }; + + TreemapSeriesModel.prototype.optionUpdated = function () { + this.resetViewRoot(); + }; + /** + * @override + * @param {number} dataIndex + * @param {boolean} [mutipleSeries=false] + */ + + + TreemapSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var value = this.getRawValue(dataIndex); + var name = data.getName(dataIndex); + return createTooltipMarkup('nameValue', { + name: name, + value: value + }); + }; + /** + * Add tree path to tooltip param + * + * @override + * @param {number} dataIndex + * @return {Object} + */ + + + TreemapSeriesModel.prototype.getDataParams = function (dataIndex) { + var params = _super.prototype.getDataParams.apply(this, arguments); + + var node = this.getData().tree.getNodeByDataIndex(dataIndex); + params.treeAncestors = wrapTreePathInfo(node, this); // compatitable the previous code. + + params.treePathInfo = params.treeAncestors; + return params; + }; + /** + * @public + * @param {Object} layoutInfo { + * x: containerGroup x + * y: containerGroup y + * width: containerGroup width + * height: containerGroup height + * } + */ + + + TreemapSeriesModel.prototype.setLayoutInfo = function (layoutInfo) { + /** + * @readOnly + * @type {Object} + */ + this.layoutInfo = this.layoutInfo || {}; + extend(this.layoutInfo, layoutInfo); + }; + /** + * @param {string} id + * @return {number} index + */ + + + TreemapSeriesModel.prototype.mapIdToIndex = function (id) { + // A feature is implemented: + // index is monotone increasing with the sequence of + // input id at the first time. + // This feature can make sure that each data item and its + // mapped color have the same index between data list and + // color list at the beginning, which is useful for user + // to adjust data-color mapping. + + /** + * @private + * @type {Object} + */ + var idIndexMap = this._idIndexMap; + + if (!idIndexMap) { + idIndexMap = this._idIndexMap = createHashMap(); + /** + * @private + * @type {number} + */ + + this._idIndexMapCount = 0; + } + + var index = idIndexMap.get(id); + + if (index == null) { + idIndexMap.set(id, index = this._idIndexMapCount++); + } + + return index; + }; + + TreemapSeriesModel.prototype.getViewRoot = function () { + return this._viewRoot; + }; + + TreemapSeriesModel.prototype.resetViewRoot = function (viewRoot) { + viewRoot ? this._viewRoot = viewRoot : viewRoot = this._viewRoot; + var root = this.getRawData().tree.root; + + if (!viewRoot || viewRoot !== root && !root.contains(viewRoot)) { + this._viewRoot = root; + } + }; + + TreemapSeriesModel.prototype.enableAriaDecal = function () { + enableAriaDecalForTree(this); + }; + + TreemapSeriesModel.type = 'series.treemap'; + TreemapSeriesModel.layoutMode = 'box'; + TreemapSeriesModel.defaultOption = { + // Disable progressive rendering + progressive: 0, + // size: ['80%', '80%'], // deprecated, compatible with ec2. + left: 'center', + top: 'middle', + width: '80%', + height: '80%', + sort: true, + clipWindow: 'origin', + squareRatio: 0.5 * (1 + Math.sqrt(5)), + leafDepth: null, + drillDownIcon: '▶', + // to align specialized icon. ▷▶❒❐▼✚ + zoomToNodeRatio: 0.32 * 0.32, + roam: true, + nodeClick: 'zoomToNode', + animation: true, + animationDurationUpdate: 900, + animationEasing: 'quinticInOut', + breadcrumb: { + show: true, + height: 22, + left: 'center', + top: 'bottom', + // right + // bottom + emptyItemWidth: 25, + itemStyle: { + color: 'rgba(0,0,0,0.7)', + textStyle: { + color: '#fff' + } + } + }, + label: { + show: true, + // Do not use textDistance, for ellipsis rect just the same as treemap node rect. + distance: 0, + padding: 5, + position: 'inside', + // formatter: null, + color: '#fff', + overflow: 'truncate' // align + // verticalAlign + + }, + upperLabel: { + show: false, + position: [0, '50%'], + height: 20, + // formatter: null, + // color: '#fff', + overflow: 'truncate', + // align: null, + verticalAlign: 'middle' + }, + itemStyle: { + color: null, + colorAlpha: null, + colorSaturation: null, + borderWidth: 0, + gapWidth: 0, + borderColor: '#fff', + borderColorSaturation: null // If specified, borderColor will be ineffective, and the + // border color is evaluated by color of current node and + // borderColorSaturation. + + }, + emphasis: { + upperLabel: { + show: true, + position: [0, '50%'], + overflow: 'truncate', + verticalAlign: 'middle' + } + }, + visualDimension: 0, + visualMin: null, + visualMax: null, + color: [], + // level[n].color (if necessary). + // + Specify color list of each level. level[0].color would be global + // color list if not specified. (see method `setDefault`). + // + But set as a empty array to forbid fetch color from global palette + // when using nodeModel.get('color'), otherwise nodes on deep level + // will always has color palette set and are not able to inherit color + // from parent node. + // + TreemapSeries.color can not be set as 'none', otherwise effect + // legend color fetching (see seriesColor.js). + colorAlpha: null, + colorSaturation: null, + colorMappingBy: 'index', + visibleMin: 10, + // be rendered. Only works when sort is 'asc' or 'desc'. + childrenVisibleMin: null, + // grandchildren will not show. + // Why grandchildren? If not grandchildren but children, + // some siblings show children and some not, + // the appearance may be mess and not consistent, + levels: [] // Each item: { + // visibleMin, itemStyle, visualDimension, label + // } + + }; + return TreemapSeriesModel; + }(SeriesModel); + /** + * @param {Object} dataNode + */ + + + function completeTreeValue(dataNode) { + // Postorder travel tree. + // If value of none-leaf node is not set, + // calculate it by suming up the value of all children. + var sum = 0; + each(dataNode.children, function (child) { + completeTreeValue(child); + var childValue = child.value; + isArray(childValue) && (childValue = childValue[0]); + sum += childValue; + }); + var thisValue = dataNode.value; + + if (isArray(thisValue)) { + thisValue = thisValue[0]; + } + + if (thisValue == null || isNaN(thisValue)) { + thisValue = sum; + } // Value should not less than 0. + + + if (thisValue < 0) { + thisValue = 0; + } + + isArray(dataNode.value) ? dataNode.value[0] = thisValue : dataNode.value = thisValue; + } + /** + * set default to level configuration + */ + + + function setDefault(levels, ecModel) { + var globalColorList = normalizeToArray(ecModel.get('color')); + var globalDecalList = normalizeToArray(ecModel.get(['aria', 'decal', 'decals'])); + + if (!globalColorList) { + return; + } + + levels = levels || []; + var hasColorDefine; + var hasDecalDefine; + each(levels, function (levelDefine) { + var model = new Model(levelDefine); + var modelColor = model.get('color'); + var modelDecal = model.get('decal'); + + if (model.get(['itemStyle', 'color']) || modelColor && modelColor !== 'none') { + hasColorDefine = true; + } + + if (model.get(['itemStyle', 'decal']) || modelDecal && modelDecal !== 'none') { + hasDecalDefine = true; + } + }); + var level0 = levels[0] || (levels[0] = {}); + + if (!hasColorDefine) { + level0.color = globalColorList.slice(); + } + + if (!hasDecalDefine && globalDecalList) { + level0.decal = globalDecalList.slice(); + } + + return levels; + } + + var TEXT_PADDING = 8; + var ITEM_GAP = 8; + var ARRAY_LENGTH = 5; + + var Breadcrumb = + /** @class */ + function () { + function Breadcrumb(containerGroup) { + this.group = new Group(); + containerGroup.add(this.group); + } + + Breadcrumb.prototype.render = function (seriesModel, api, targetNode, onSelect) { + var model = seriesModel.getModel('breadcrumb'); + var thisGroup = this.group; + thisGroup.removeAll(); + + if (!model.get('show') || !targetNode) { + return; + } + + var normalStyleModel = model.getModel('itemStyle'); // let emphasisStyleModel = model.getModel('emphasis.itemStyle'); + + var textStyleModel = normalStyleModel.getModel('textStyle'); + var layoutParam = { + pos: { + left: model.get('left'), + right: model.get('right'), + top: model.get('top'), + bottom: model.get('bottom') + }, + box: { + width: api.getWidth(), + height: api.getHeight() + }, + emptyItemWidth: model.get('emptyItemWidth'), + totalWidth: 0, + renderList: [] + }; + + this._prepare(targetNode, layoutParam, textStyleModel); + + this._renderContent(seriesModel, layoutParam, normalStyleModel, textStyleModel, onSelect); + + positionElement(thisGroup, layoutParam.pos, layoutParam.box); + }; + /** + * Prepare render list and total width + * @private + */ + + + Breadcrumb.prototype._prepare = function (targetNode, layoutParam, textStyleModel) { + for (var node = targetNode; node; node = node.parentNode) { + var text = convertOptionIdName(node.getModel().get('name'), ''); + var textRect = textStyleModel.getTextRect(text); + var itemWidth = Math.max(textRect.width + TEXT_PADDING * 2, layoutParam.emptyItemWidth); + layoutParam.totalWidth += itemWidth + ITEM_GAP; + layoutParam.renderList.push({ + node: node, + text: text, + width: itemWidth + }); + } + }; + /** + * @private + */ + + + Breadcrumb.prototype._renderContent = function (seriesModel, layoutParam, normalStyleModel, textStyleModel, onSelect) { + // Start rendering. + var lastX = 0; + var emptyItemWidth = layoutParam.emptyItemWidth; + var height = seriesModel.get(['breadcrumb', 'height']); + var availableSize = getAvailableSize(layoutParam.pos, layoutParam.box); + var totalWidth = layoutParam.totalWidth; + var renderList = layoutParam.renderList; + + for (var i = renderList.length - 1; i >= 0; i--) { + var item = renderList[i]; + var itemNode = item.node; + var itemWidth = item.width; + var text = item.text; // Hdie text and shorten width if necessary. + + if (totalWidth > availableSize.width) { + totalWidth -= itemWidth - emptyItemWidth; + itemWidth = emptyItemWidth; + text = null; + } + + var el = new Polygon({ + shape: { + points: makeItemPoints(lastX, 0, itemWidth, height, i === renderList.length - 1, i === 0) + }, + style: defaults(normalStyleModel.getItemStyle(), { + lineJoin: 'bevel' + }), + textContent: new ZRText({ + style: { + text: text, + fill: textStyleModel.getTextColor(), + font: textStyleModel.getFont() + } + }), + textConfig: { + position: 'inside' + }, + z2: Z2_EMPHASIS_LIFT * 1e4, + onclick: curry(onSelect, itemNode) + }); + el.disableLabelAnimation = true; + this.group.add(el); + packEventData(el, seriesModel, itemNode); + lastX += itemWidth + ITEM_GAP; + } + }; + + Breadcrumb.prototype.remove = function () { + this.group.removeAll(); + }; + + return Breadcrumb; + }(); + + function makeItemPoints(x, y, itemWidth, itemHeight, head, tail) { + var points = [[head ? x : x - ARRAY_LENGTH, y], [x + itemWidth, y], [x + itemWidth, y + itemHeight], [head ? x : x - ARRAY_LENGTH, y + itemHeight]]; + !tail && points.splice(2, 0, [x + itemWidth + ARRAY_LENGTH, y + itemHeight / 2]); + !head && points.push([x, y + itemHeight / 2]); + return points; + } // Package custom mouse event. + + + function packEventData(el, seriesModel, itemNode) { + getECData(el).eventData = { + componentType: 'series', + componentSubType: 'treemap', + componentIndex: seriesModel.componentIndex, + seriesIndex: seriesModel.seriesIndex, + seriesName: seriesModel.name, + seriesType: 'treemap', + selfType: 'breadcrumb', + nodeData: { + dataIndex: itemNode && itemNode.dataIndex, + name: itemNode && itemNode.name + }, + treePathInfo: itemNode && wrapTreePathInfo(itemNode, seriesModel) + }; + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + + /** + * Animate multiple elements with a single done-callback. + * + * @example + * animation + * .createWrap() + * .add(el1, {x: 10, y: 10}) + * .add(el2, {shape: {width: 500}, style: {fill: 'red'}}, 400) + * .done(function () { // done }) + * .start('cubicOut'); + */ + var AnimationWrap = + /** @class */ + function () { + function AnimationWrap() { + this._storage = []; + this._elExistsMap = {}; + } + /** + * Caution: a el can only be added once, otherwise 'done' + * might not be called. This method checks this (by el.id), + * suppresses adding and returns false when existing el found. + * + * @return Whether adding succeeded. + */ + + + AnimationWrap.prototype.add = function (el, target, duration, delay, easing) { + if (this._elExistsMap[el.id]) { + return false; + } + + this._elExistsMap[el.id] = true; + + this._storage.push({ + el: el, + target: target, + duration: duration, + delay: delay, + easing: easing + }); + + return true; + }; + /** + * Only execute when animation done/aborted. + */ + + + AnimationWrap.prototype.finished = function (callback) { + this._finishedCallback = callback; + return this; + }; + /** + * Will stop exist animation firstly. + */ + + + AnimationWrap.prototype.start = function () { + var _this = this; + + var count = this._storage.length; + + var checkTerminate = function () { + count--; + + if (count <= 0) { + // Guard. + _this._storage.length = 0; + _this._elExistsMap = {}; + _this._finishedCallback && _this._finishedCallback(); + } + }; + + for (var i = 0, len = this._storage.length; i < len; i++) { + var item = this._storage[i]; + item.el.animateTo(item.target, { + duration: item.duration, + delay: item.delay, + easing: item.easing, + setToFinal: true, + done: checkTerminate, + aborted: checkTerminate + }); + } + + return this; + }; + + return AnimationWrap; + }(); + + function createWrap() { + return new AnimationWrap(); + } + + var Group$1 = Group; + var Rect$1 = Rect; + var DRAG_THRESHOLD = 3; + var PATH_LABEL_NOAMAL = 'label'; + var PATH_UPPERLABEL_NORMAL = 'upperLabel'; // Should larger than emphasis states lift z + + var Z2_BASE = Z2_EMPHASIS_LIFT * 10; // Should bigger than every z2. + + var Z2_BG = Z2_EMPHASIS_LIFT * 2; + var Z2_CONTENT = Z2_EMPHASIS_LIFT * 3; + var getStateItemStyle = makeStyleMapper([['fill', 'color'], // `borderColor` and `borderWidth` has been occupied, + // so use `stroke` to indicate the stroke of the rect. + ['stroke', 'strokeColor'], ['lineWidth', 'strokeWidth'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ]); + + var getItemStyleNormal = function (model) { + // Normal style props should include emphasis style props. + var itemStyle = getStateItemStyle(model); // Clear styles set by emphasis. + + itemStyle.stroke = itemStyle.fill = itemStyle.lineWidth = null; + return itemStyle; + }; + + var inner$8 = makeInner(); + + var TreemapView = + /** @class */ + function (_super) { + __extends(TreemapView, _super); + + function TreemapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TreemapView.type; + _this._state = 'ready'; + _this._storage = createStorage(); + return _this; + } + /** + * @override + */ + + + TreemapView.prototype.render = function (seriesModel, ecModel, api, payload) { + var models = ecModel.findComponents({ + mainType: 'series', + subType: 'treemap', + query: payload + }); + + if (indexOf(models, seriesModel) < 0) { + return; + } + + this.seriesModel = seriesModel; + this.api = api; + this.ecModel = ecModel; + var types = ['treemapZoomToNode', 'treemapRootToNode']; + var targetInfo = retrieveTargetInfo(payload, types, seriesModel); + var payloadType = payload && payload.type; + var layoutInfo = seriesModel.layoutInfo; + var isInit = !this._oldTree; + var thisStorage = this._storage; // Mark new root when action is treemapRootToNode. + + var reRoot = payloadType === 'treemapRootToNode' && targetInfo && thisStorage ? { + rootNodeGroup: thisStorage.nodeGroup[targetInfo.node.getRawIndex()], + direction: payload.direction + } : null; + + var containerGroup = this._giveContainerGroup(layoutInfo); + + var hasAnimation = seriesModel.get('animation'); + + var renderResult = this._doRender(containerGroup, seriesModel, reRoot); + + hasAnimation && !isInit && (!payloadType || payloadType === 'treemapZoomToNode' || payloadType === 'treemapRootToNode') ? this._doAnimation(containerGroup, renderResult, seriesModel, reRoot) : renderResult.renderFinally(); + + this._resetController(api); + + this._renderBreadcrumb(seriesModel, api, targetInfo); + }; + + TreemapView.prototype._giveContainerGroup = function (layoutInfo) { + var containerGroup = this._containerGroup; + + if (!containerGroup) { + // FIXME + // 加一层containerGroup是为了clip,但是现在clip功能并没有实现。 + containerGroup = this._containerGroup = new Group$1(); + + this._initEvents(containerGroup); + + this.group.add(containerGroup); + } + + containerGroup.x = layoutInfo.x; + containerGroup.y = layoutInfo.y; + return containerGroup; + }; + + TreemapView.prototype._doRender = function (containerGroup, seriesModel, reRoot) { + var thisTree = seriesModel.getData().tree; + var oldTree = this._oldTree; // Clear last shape records. + + var lastsForAnimation = createStorage(); + var thisStorage = createStorage(); + var oldStorage = this._storage; + var willInvisibleEls = []; + + function doRenderNode(thisNode, oldNode, parentGroup, depth) { + return renderNode(seriesModel, thisStorage, oldStorage, reRoot, lastsForAnimation, willInvisibleEls, thisNode, oldNode, parentGroup, depth); + } // Notice: when thisTree and oldTree are the same tree (see list.cloneShallow), + // the oldTree is actually losted, so we can not find all of the old graphic + // elements from tree. So we use this stragegy: make element storage, move + // from old storage to new storage, clear old storage. + + + dualTravel(thisTree.root ? [thisTree.root] : [], oldTree && oldTree.root ? [oldTree.root] : [], containerGroup, thisTree === oldTree || !oldTree, 0); // Process all removing. + + var willDeleteEls = clearStorage(oldStorage); + this._oldTree = thisTree; + this._storage = thisStorage; + return { + lastsForAnimation: lastsForAnimation, + willDeleteEls: willDeleteEls, + renderFinally: renderFinally + }; + + function dualTravel(thisViewChildren, oldViewChildren, parentGroup, sameTree, depth) { + // When 'render' is triggered by action, + // 'this' and 'old' may be the same tree, + // we use rawIndex in that case. + if (sameTree) { + oldViewChildren = thisViewChildren; + each(thisViewChildren, function (child, index) { + !child.isRemoved() && processNode(index, index); + }); + } // Diff hierarchically (diff only in each subtree, but not whole). + // because, consistency of view is important. + else { + new DataDiffer(oldViewChildren, thisViewChildren, getKey, getKey).add(processNode).update(processNode).remove(curry(processNode, null)).execute(); + } + + function getKey(node) { + // Identify by name or raw index. + return node.getId(); + } + + function processNode(newIndex, oldIndex) { + var thisNode = newIndex != null ? thisViewChildren[newIndex] : null; + var oldNode = oldIndex != null ? oldViewChildren[oldIndex] : null; + var group = doRenderNode(thisNode, oldNode, parentGroup, depth); + group && dualTravel(thisNode && thisNode.viewChildren || [], oldNode && oldNode.viewChildren || [], group, sameTree, depth + 1); + } + } + + function clearStorage(storage) { + var willDeleteEls = createStorage(); + storage && each(storage, function (store, storageName) { + var delEls = willDeleteEls[storageName]; + each(store, function (el) { + el && (delEls.push(el), inner$8(el).willDelete = true); + }); + }); + return willDeleteEls; + } + + function renderFinally() { + each(willDeleteEls, function (els) { + each(els, function (el) { + el.parent && el.parent.remove(el); + }); + }); + each(willInvisibleEls, function (el) { + el.invisible = true; // Setting invisible is for optimizing, so no need to set dirty, + // just mark as invisible. + + el.dirty(); + }); + } + }; + + TreemapView.prototype._doAnimation = function (containerGroup, renderResult, seriesModel, reRoot) { + var durationOption = seriesModel.get('animationDurationUpdate'); + var easingOption = seriesModel.get('animationEasing'); // TODO: do not support function until necessary. + + var duration = (isFunction(durationOption) ? 0 : durationOption) || 0; + var easing = (isFunction(easingOption) ? null : easingOption) || 'cubicOut'; + var animationWrap = createWrap(); // Make delete animations. + + each(renderResult.willDeleteEls, function (store, storageName) { + each(store, function (el, rawIndex) { + if (el.invisible) { + return; + } + + var parent = el.parent; // Always has parent, and parent is nodeGroup. + + var target; + var innerStore = inner$8(parent); + + if (reRoot && reRoot.direction === 'drillDown') { + target = parent === reRoot.rootNodeGroup // This is the content element of view root. + // Only `content` will enter this branch, because + // `background` and `nodeGroup` will not be deleted. + ? { + shape: { + x: 0, + y: 0, + width: innerStore.nodeWidth, + height: innerStore.nodeHeight + }, + style: { + opacity: 0 + } + } // Others. + : { + style: { + opacity: 0 + } + }; + } else { + var targetX = 0; + var targetY = 0; + + if (!innerStore.willDelete) { + // Let node animate to right-bottom corner, cooperating with fadeout, + // which is appropriate for user understanding. + // Divided by 2 for reRoot rolling up effect. + targetX = innerStore.nodeWidth / 2; + targetY = innerStore.nodeHeight / 2; + } + + target = storageName === 'nodeGroup' ? { + x: targetX, + y: targetY, + style: { + opacity: 0 + } + } : { + shape: { + x: targetX, + y: targetY, + width: 0, + height: 0 + }, + style: { + opacity: 0 + } + }; + } // TODO: do not support delay until necessary. + + + target && animationWrap.add(el, target, duration, 0, easing); + }); + }); // Make other animations + + each(this._storage, function (store, storageName) { + each(store, function (el, rawIndex) { + var last = renderResult.lastsForAnimation[storageName][rawIndex]; + var target = {}; + + if (!last) { + return; + } + + if (el instanceof Group) { + if (last.oldX != null) { + target.x = el.x; + target.y = el.y; + el.x = last.oldX; + el.y = last.oldY; + } + } else { + if (last.oldShape) { + target.shape = extend({}, el.shape); + el.setShape(last.oldShape); + } + + if (last.fadein) { + el.setStyle('opacity', 0); + target.style = { + opacity: 1 + }; + } // When animation is stopped for succedent animation starting, + // el.style.opacity might not be 1 + else if (el.style.opacity !== 1) { + target.style = { + opacity: 1 + }; + } + } + + animationWrap.add(el, target, duration, 0, easing); + }); + }, this); + this._state = 'animating'; + animationWrap.finished(bind(function () { + this._state = 'ready'; + renderResult.renderFinally(); + }, this)).start(); + }; + + TreemapView.prototype._resetController = function (api) { + var controller = this._controller; // Init controller. + + if (!controller) { + controller = this._controller = new RoamController(api.getZr()); + controller.enable(this.seriesModel.get('roam')); + controller.on('pan', bind(this._onPan, this)); + controller.on('zoom', bind(this._onZoom, this)); + } + + var rect = new BoundingRect(0, 0, api.getWidth(), api.getHeight()); + controller.setPointerChecker(function (e, x, y) { + return rect.contain(x, y); + }); + }; + + TreemapView.prototype._clearController = function () { + var controller = this._controller; + + if (controller) { + controller.dispose(); + controller = null; + } + }; + + TreemapView.prototype._onPan = function (e) { + if (this._state !== 'animating' && (Math.abs(e.dx) > DRAG_THRESHOLD || Math.abs(e.dy) > DRAG_THRESHOLD)) { + // These param must not be cached. + var root = this.seriesModel.getData().tree.root; + + if (!root) { + return; + } + + var rootLayout = root.getLayout(); + + if (!rootLayout) { + return; + } + + this.api.dispatchAction({ + type: 'treemapMove', + from: this.uid, + seriesId: this.seriesModel.id, + rootRect: { + x: rootLayout.x + e.dx, + y: rootLayout.y + e.dy, + width: rootLayout.width, + height: rootLayout.height + } + }); + } + }; + + TreemapView.prototype._onZoom = function (e) { + var mouseX = e.originX; + var mouseY = e.originY; + + if (this._state !== 'animating') { + // These param must not be cached. + var root = this.seriesModel.getData().tree.root; + + if (!root) { + return; + } + + var rootLayout = root.getLayout(); + + if (!rootLayout) { + return; + } + + var rect = new BoundingRect(rootLayout.x, rootLayout.y, rootLayout.width, rootLayout.height); + var layoutInfo = this.seriesModel.layoutInfo; // Transform mouse coord from global to containerGroup. + + mouseX -= layoutInfo.x; + mouseY -= layoutInfo.y; // Scale root bounding rect. + + var m = create$1(); + translate(m, m, [-mouseX, -mouseY]); + scale$1(m, m, [e.scale, e.scale]); + translate(m, m, [mouseX, mouseY]); + rect.applyTransform(m); + this.api.dispatchAction({ + type: 'treemapRender', + from: this.uid, + seriesId: this.seriesModel.id, + rootRect: { + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + } + }); + } + }; + + TreemapView.prototype._initEvents = function (containerGroup) { + var _this = this; + + containerGroup.on('click', function (e) { + if (_this._state !== 'ready') { + return; + } + + var nodeClick = _this.seriesModel.get('nodeClick', true); + + if (!nodeClick) { + return; + } + + var targetInfo = _this.findTarget(e.offsetX, e.offsetY); + + if (!targetInfo) { + return; + } + + var node = targetInfo.node; + + if (node.getLayout().isLeafRoot) { + _this._rootToNode(targetInfo); + } else { + if (nodeClick === 'zoomToNode') { + _this._zoomToNode(targetInfo); + } else if (nodeClick === 'link') { + var itemModel = node.hostTree.data.getItemModel(node.dataIndex); + var link = itemModel.get('link', true); + var linkTarget = itemModel.get('target', true) || 'blank'; + link && windowOpen(link, linkTarget); + } + } + }, this); + }; + + TreemapView.prototype._renderBreadcrumb = function (seriesModel, api, targetInfo) { + var _this = this; + + if (!targetInfo) { + targetInfo = seriesModel.get('leafDepth', true) != null ? { + node: seriesModel.getViewRoot() + } // FIXME + // better way? + // Find breadcrumb tail on center of containerGroup. + : this.findTarget(api.getWidth() / 2, api.getHeight() / 2); + + if (!targetInfo) { + targetInfo = { + node: seriesModel.getData().tree.root + }; + } + } + + (this._breadcrumb || (this._breadcrumb = new Breadcrumb(this.group))).render(seriesModel, api, targetInfo.node, function (node) { + if (_this._state !== 'animating') { + aboveViewRoot(seriesModel.getViewRoot(), node) ? _this._rootToNode({ + node: node + }) : _this._zoomToNode({ + node: node + }); + } + }); + }; + /** + * @override + */ + + + TreemapView.prototype.remove = function () { + this._clearController(); + + this._containerGroup && this._containerGroup.removeAll(); + this._storage = createStorage(); + this._state = 'ready'; + this._breadcrumb && this._breadcrumb.remove(); + }; + + TreemapView.prototype.dispose = function () { + this._clearController(); + }; + + TreemapView.prototype._zoomToNode = function (targetInfo) { + this.api.dispatchAction({ + type: 'treemapZoomToNode', + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: targetInfo.node + }); + }; + + TreemapView.prototype._rootToNode = function (targetInfo) { + this.api.dispatchAction({ + type: 'treemapRootToNode', + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: targetInfo.node + }); + }; + /** + * @public + * @param {number} x Global coord x. + * @param {number} y Global coord y. + * @return {Object} info If not found, return undefined; + * @return {number} info.node Target node. + * @return {number} info.offsetX x refer to target node. + * @return {number} info.offsetY y refer to target node. + */ + + + TreemapView.prototype.findTarget = function (x, y) { + var targetInfo; + var viewRoot = this.seriesModel.getViewRoot(); + viewRoot.eachNode({ + attr: 'viewChildren', + order: 'preorder' + }, function (node) { + var bgEl = this._storage.background[node.getRawIndex()]; // If invisible, there might be no element. + + + if (bgEl) { + var point = bgEl.transformCoordToLocal(x, y); + var shape = bgEl.shape; // For performance consideration, dont use 'getBoundingRect'. + + if (shape.x <= point[0] && point[0] <= shape.x + shape.width && shape.y <= point[1] && point[1] <= shape.y + shape.height) { + targetInfo = { + node: node, + offsetX: point[0], + offsetY: point[1] + }; + } else { + return false; // Suppress visit subtree. + } + } + }, this); + return targetInfo; + }; + + TreemapView.type = 'treemap'; + return TreemapView; + }(ChartView); + /** + * @inner + */ + + + function createStorage() { + return { + nodeGroup: [], + background: [], + content: [] + }; + } + /** + * @inner + * @return Return undefined means do not travel further. + */ + + + function renderNode(seriesModel, thisStorage, oldStorage, reRoot, lastsForAnimation, willInvisibleEls, thisNode, oldNode, parentGroup, depth) { + // Whether under viewRoot. + if (!thisNode) { + // Deleting nodes will be performed finally. This method just find + // element from old storage, or create new element, set them to new + // storage, and set styles. + return; + } // ------------------------------------------------------------------- + // Start of closure variables available in "Procedures in renderNode". + + + var thisLayout = thisNode.getLayout(); + var data = seriesModel.getData(); + var nodeModel = thisNode.getModel(); // Only for enabling highlight/downplay. Clear firstly. + // Because some node will not be rendered. + + data.setItemGraphicEl(thisNode.dataIndex, null); + + if (!thisLayout || !thisLayout.isInView) { + return; + } + + var thisWidth = thisLayout.width; + var thisHeight = thisLayout.height; + var borderWidth = thisLayout.borderWidth; + var thisInvisible = thisLayout.invisible; + var thisRawIndex = thisNode.getRawIndex(); + var oldRawIndex = oldNode && oldNode.getRawIndex(); + var thisViewChildren = thisNode.viewChildren; + var upperHeight = thisLayout.upperHeight; + var isParent = thisViewChildren && thisViewChildren.length; + var itemStyleNormalModel = nodeModel.getModel('itemStyle'); + var itemStyleEmphasisModel = nodeModel.getModel(['emphasis', 'itemStyle']); + var itemStyleBlurModel = nodeModel.getModel(['blur', 'itemStyle']); + var itemStyleSelectModel = nodeModel.getModel(['select', 'itemStyle']); + var borderRadius = itemStyleNormalModel.get('borderRadius') || 0; // End of closure ariables available in "Procedures in renderNode". + // ----------------------------------------------------------------- + // Node group + + var group = giveGraphic('nodeGroup', Group$1); + + if (!group) { + return; + } + + parentGroup.add(group); // x,y are not set when el is above view root. + + group.x = thisLayout.x || 0; + group.y = thisLayout.y || 0; + group.markRedraw(); + inner$8(group).nodeWidth = thisWidth; + inner$8(group).nodeHeight = thisHeight; + + if (thisLayout.isAboveViewRoot) { + return group; + } // Background + + + var bg = giveGraphic('background', Rect$1, depth, Z2_BG); + bg && renderBackground(group, bg, isParent && thisLayout.upperLabelHeight); + var emphasisModel = nodeModel.getModel('emphasis'); + var focus = emphasisModel.get('focus'); + var blurScope = emphasisModel.get('blurScope'); + var isDisabled = emphasisModel.get('disabled'); + var focusOrIndices = focus === 'ancestor' ? thisNode.getAncestorsIndices() : focus === 'descendant' ? thisNode.getDescendantIndices() : focus; // No children, render content. + + if (isParent) { + // Because of the implementation about "traverse" in graphic hover style, we + // can not set hover listener on the "group" of non-leaf node. Otherwise the + // hover event from the descendents will be listenered. + if (isHighDownDispatcher(group)) { + setAsHighDownDispatcher(group, false); + } + + if (bg) { + setAsHighDownDispatcher(bg, !isDisabled); // Only for enabling highlight/downplay. + + data.setItemGraphicEl(thisNode.dataIndex, bg); + enableHoverFocus(bg, focusOrIndices, blurScope); + } + } else { + var content = giveGraphic('content', Rect$1, depth, Z2_CONTENT); + content && renderContent(group, content); + bg.disableMorphing = true; + + if (bg && isHighDownDispatcher(bg)) { + setAsHighDownDispatcher(bg, false); + } + + setAsHighDownDispatcher(group, !isDisabled); // Only for enabling highlight/downplay. + + data.setItemGraphicEl(thisNode.dataIndex, group); + enableHoverFocus(group, focusOrIndices, blurScope); + } + + return group; // ---------------------------- + // | Procedures in renderNode | + // ---------------------------- + + function renderBackground(group, bg, useUpperLabel) { + var ecData = getECData(bg); // For tooltip. + + ecData.dataIndex = thisNode.dataIndex; + ecData.seriesIndex = seriesModel.seriesIndex; + bg.setShape({ + x: 0, + y: 0, + width: thisWidth, + height: thisHeight, + r: borderRadius + }); + + if (thisInvisible) { + // If invisible, do not set visual, otherwise the element will + // change immediately before animation. We think it is OK to + // remain its origin color when moving out of the view window. + processInvisible(bg); + } else { + bg.invisible = false; + var style = thisNode.getVisual('style'); + var visualBorderColor = style.stroke; + var normalStyle = getItemStyleNormal(itemStyleNormalModel); + normalStyle.fill = visualBorderColor; + var emphasisStyle = getStateItemStyle(itemStyleEmphasisModel); + emphasisStyle.fill = itemStyleEmphasisModel.get('borderColor'); + var blurStyle = getStateItemStyle(itemStyleBlurModel); + blurStyle.fill = itemStyleBlurModel.get('borderColor'); + var selectStyle = getStateItemStyle(itemStyleSelectModel); + selectStyle.fill = itemStyleSelectModel.get('borderColor'); + + if (useUpperLabel) { + var upperLabelWidth = thisWidth - 2 * borderWidth; + prepareText( // PENDING: convert ZRColor to ColorString for text. + bg, visualBorderColor, style.opacity, { + x: borderWidth, + y: 0, + width: upperLabelWidth, + height: upperHeight + }); + } // For old bg. + else { + bg.removeTextContent(); + } + + bg.setStyle(normalStyle); + bg.ensureState('emphasis').style = emphasisStyle; + bg.ensureState('blur').style = blurStyle; + bg.ensureState('select').style = selectStyle; + setDefaultStateProxy(bg); + } + + group.add(bg); + } + + function renderContent(group, content) { + var ecData = getECData(content); // For tooltip. + + ecData.dataIndex = thisNode.dataIndex; + ecData.seriesIndex = seriesModel.seriesIndex; + var contentWidth = Math.max(thisWidth - 2 * borderWidth, 0); + var contentHeight = Math.max(thisHeight - 2 * borderWidth, 0); + content.culling = true; + content.setShape({ + x: borderWidth, + y: borderWidth, + width: contentWidth, + height: contentHeight, + r: borderRadius + }); + + if (thisInvisible) { + // If invisible, do not set visual, otherwise the element will + // change immediately before animation. We think it is OK to + // remain its origin color when moving out of the view window. + processInvisible(content); + } else { + content.invisible = false; + var nodeStyle = thisNode.getVisual('style'); + var visualColor = nodeStyle.fill; + var normalStyle = getItemStyleNormal(itemStyleNormalModel); + normalStyle.fill = visualColor; + normalStyle.decal = nodeStyle.decal; + var emphasisStyle = getStateItemStyle(itemStyleEmphasisModel); + var blurStyle = getStateItemStyle(itemStyleBlurModel); + var selectStyle = getStateItemStyle(itemStyleSelectModel); // PENDING: convert ZRColor to ColorString for text. + + prepareText(content, visualColor, nodeStyle.opacity, null); + content.setStyle(normalStyle); + content.ensureState('emphasis').style = emphasisStyle; + content.ensureState('blur').style = blurStyle; + content.ensureState('select').style = selectStyle; + setDefaultStateProxy(content); + } + + group.add(content); + } + + function processInvisible(element) { + // Delay invisible setting utill animation finished, + // avoid element vanish suddenly before animation. + !element.invisible && willInvisibleEls.push(element); + } + + function prepareText(rectEl, visualColor, visualOpacity, // Can be null/undefined + upperLabelRect) { + var normalLabelModel = nodeModel.getModel(upperLabelRect ? PATH_UPPERLABEL_NORMAL : PATH_LABEL_NOAMAL); + var defaultText = convertOptionIdName(nodeModel.get('name'), null); + var isShow = normalLabelModel.getShallow('show'); + setLabelStyle(rectEl, getLabelStatesModels(nodeModel, upperLabelRect ? PATH_UPPERLABEL_NORMAL : PATH_LABEL_NOAMAL), { + defaultText: isShow ? defaultText : null, + inheritColor: visualColor, + defaultOpacity: visualOpacity, + labelFetcher: seriesModel, + labelDataIndex: thisNode.dataIndex + }); + var textEl = rectEl.getTextContent(); + + if (!textEl) { + return; + } + + var textStyle = textEl.style; + var textPadding = normalizeCssArray(textStyle.padding || 0); + + if (upperLabelRect) { + rectEl.setTextConfig({ + layoutRect: upperLabelRect + }); + textEl.disableLabelLayout = true; + } + + textEl.beforeUpdate = function () { + var width = Math.max((upperLabelRect ? upperLabelRect.width : rectEl.shape.width) - textPadding[1] - textPadding[3], 0); + var height = Math.max((upperLabelRect ? upperLabelRect.height : rectEl.shape.height) - textPadding[0] - textPadding[2], 0); + + if (textStyle.width !== width || textStyle.height !== height) { + textEl.setStyle({ + width: width, + height: height + }); + } + }; + + textStyle.truncateMinChar = 2; + textStyle.lineOverflow = 'truncate'; + addDrillDownIcon(textStyle, upperLabelRect, thisLayout); + var textEmphasisState = textEl.getState('emphasis'); + addDrillDownIcon(textEmphasisState ? textEmphasisState.style : null, upperLabelRect, thisLayout); + } + + function addDrillDownIcon(style, upperLabelRect, thisLayout) { + var text = style ? style.text : null; + + if (!upperLabelRect && thisLayout.isLeafRoot && text != null) { + var iconChar = seriesModel.get('drillDownIcon', true); + style.text = iconChar ? iconChar + ' ' + text : text; + } + } + + function giveGraphic(storageName, Ctor, depth, z) { + var element = oldRawIndex != null && oldStorage[storageName][oldRawIndex]; + var lasts = lastsForAnimation[storageName]; + + if (element) { + // Remove from oldStorage + oldStorage[storageName][oldRawIndex] = null; + prepareAnimationWhenHasOld(lasts, element); + } // If invisible and no old element, do not create new element (for optimizing). + else if (!thisInvisible) { + element = new Ctor(); + + if (element instanceof Displayable) { + element.z2 = calculateZ2(depth, z); + } + + prepareAnimationWhenNoOld(lasts, element); + } // Set to thisStorage + + + return thisStorage[storageName][thisRawIndex] = element; + } + + function prepareAnimationWhenHasOld(lasts, element) { + var lastCfg = lasts[thisRawIndex] = {}; + + if (element instanceof Group$1) { + lastCfg.oldX = element.x; + lastCfg.oldY = element.y; + } else { + lastCfg.oldShape = extend({}, element.shape); + } + } // If a element is new, we need to find the animation start point carefully, + // otherwise it will looks strange when 'zoomToNode'. + + + function prepareAnimationWhenNoOld(lasts, element) { + var lastCfg = lasts[thisRawIndex] = {}; + var parentNode = thisNode.parentNode; + var isGroup = element instanceof Group; + + if (parentNode && (!reRoot || reRoot.direction === 'drillDown')) { + var parentOldX = 0; + var parentOldY = 0; // New nodes appear from right-bottom corner in 'zoomToNode' animation. + // For convenience, get old bounding rect from background. + + var parentOldBg = lastsForAnimation.background[parentNode.getRawIndex()]; + + if (!reRoot && parentOldBg && parentOldBg.oldShape) { + parentOldX = parentOldBg.oldShape.width; + parentOldY = parentOldBg.oldShape.height; + } // When no parent old shape found, its parent is new too, + // so we can just use {x:0, y:0}. + + + if (isGroup) { + lastCfg.oldX = 0; + lastCfg.oldY = parentOldY; + } else { + lastCfg.oldShape = { + x: parentOldX, + y: parentOldY, + width: 0, + height: 0 + }; + } + } // Fade in, user can be aware that these nodes are new. + + + lastCfg.fadein = !isGroup; + } + } // We can not set all backgroud with the same z, Because the behaviour of + // drill down and roll up differ background creation sequence from tree + // hierarchy sequence, which cause that lowser background element overlap + // upper ones. So we calculate z based on depth. + // Moreover, we try to shrink down z interval to [0, 1] to avoid that + // treemap with large z overlaps other components. + + + function calculateZ2(depth, z2InLevel) { + return depth * Z2_BASE + z2InLevel; + } + + var each$3 = each; + var isObject$3 = isObject; + var CATEGORY_DEFAULT_VISUAL_INDEX = -1; + + var VisualMapping = + /** @class */ + function () { + function VisualMapping(option) { + var mappingMethod = option.mappingMethod; + var visualType = option.type; + var thisOption = this.option = clone(option); + this.type = visualType; + this.mappingMethod = mappingMethod; + this._normalizeData = normalizers[mappingMethod]; + var visualHandler = VisualMapping.visualHandlers[visualType]; + this.applyVisual = visualHandler.applyVisual; + this.getColorMapper = visualHandler.getColorMapper; + this._normalizedToVisual = visualHandler._normalizedToVisual[mappingMethod]; + + if (mappingMethod === 'piecewise') { + normalizeVisualRange(thisOption); + preprocessForPiecewise(thisOption); + } else if (mappingMethod === 'category') { + thisOption.categories ? preprocessForSpecifiedCategory(thisOption) // categories is ordinal when thisOption.categories not specified, + // which need no more preprocess except normalize visual. + : normalizeVisualRange(thisOption, true); + } else { + // mappingMethod === 'linear' or 'fixed' + assert(mappingMethod !== 'linear' || thisOption.dataExtent); + normalizeVisualRange(thisOption); + } + } + + VisualMapping.prototype.mapValueToVisual = function (value) { + var normalized = this._normalizeData(value); + + return this._normalizedToVisual(normalized, value); + }; + + VisualMapping.prototype.getNormalizer = function () { + return bind(this._normalizeData, this); + }; + /** + * List available visual types. + * + * @public + * @return {Array.<string>} + */ + + + VisualMapping.listVisualTypes = function () { + return keys(VisualMapping.visualHandlers); + }; // /** + // * @public + // */ + // static addVisualHandler(name, handler) { + // visualHandlers[name] = handler; + // } + + /** + * @public + */ + + + VisualMapping.isValidType = function (visualType) { + return VisualMapping.visualHandlers.hasOwnProperty(visualType); + }; + /** + * Convinent method. + * Visual can be Object or Array or primary type. + */ + + + VisualMapping.eachVisual = function (visual, callback, context) { + if (isObject(visual)) { + each(visual, callback, context); + } else { + callback.call(context, visual); + } + }; + + VisualMapping.mapVisual = function (visual, callback, context) { + var isPrimary; + var newVisual = isArray(visual) ? [] : isObject(visual) ? {} : (isPrimary = true, null); + VisualMapping.eachVisual(visual, function (v, key) { + var newVal = callback.call(context, v, key); + isPrimary ? newVisual = newVal : newVisual[key] = newVal; + }); + return newVisual; + }; + /** + * Retrieve visual properties from given object. + */ + + + VisualMapping.retrieveVisuals = function (obj) { + var ret = {}; + var hasVisual; + obj && each$3(VisualMapping.visualHandlers, function (h, visualType) { + if (obj.hasOwnProperty(visualType)) { + ret[visualType] = obj[visualType]; + hasVisual = true; + } + }); + return hasVisual ? ret : null; + }; + /** + * Give order to visual types, considering colorSaturation, colorAlpha depends on color. + * + * @public + * @param {(Object|Array)} visualTypes If Object, like: {color: ..., colorSaturation: ...} + * IF Array, like: ['color', 'symbol', 'colorSaturation'] + * @return {Array.<string>} Sorted visual types. + */ + + + VisualMapping.prepareVisualTypes = function (visualTypes) { + if (isArray(visualTypes)) { + visualTypes = visualTypes.slice(); + } else if (isObject$3(visualTypes)) { + var types_1 = []; + each$3(visualTypes, function (item, type) { + types_1.push(type); + }); + visualTypes = types_1; + } else { + return []; + } + + visualTypes.sort(function (type1, type2) { + // color should be front of colorSaturation, colorAlpha, ... + // symbol and symbolSize do not matter. + return type2 === 'color' && type1 !== 'color' && type1.indexOf('color') === 0 ? 1 : -1; + }); + return visualTypes; + }; + /** + * 'color', 'colorSaturation', 'colorAlpha', ... are depends on 'color'. + * Other visuals are only depends on themself. + */ + + + VisualMapping.dependsOn = function (visualType1, visualType2) { + return visualType2 === 'color' ? !!(visualType1 && visualType1.indexOf(visualType2) === 0) : visualType1 === visualType2; + }; + /** + * @param value + * @param pieceList [{value: ..., interval: [min, max]}, ...] + * Always from small to big. + * @param findClosestWhenOutside Default to be false + * @return index + */ + + + VisualMapping.findPieceIndex = function (value, pieceList, findClosestWhenOutside) { + var possibleI; + var abs = Infinity; // value has the higher priority. + + for (var i = 0, len = pieceList.length; i < len; i++) { + var pieceValue = pieceList[i].value; + + if (pieceValue != null) { + if (pieceValue === value // FIXME + // It is supposed to compare value according to value type of dimension, + // but currently value type can exactly be string or number. + // Compromise for numeric-like string (like '12'), especially + // in the case that visualMap.categories is ['22', '33']. + || isString(pieceValue) && pieceValue === value + '') { + return i; + } + + findClosestWhenOutside && updatePossible(pieceValue, i); + } + } + + for (var i = 0, len = pieceList.length; i < len; i++) { + var piece = pieceList[i]; + var interval = piece.interval; + var close_1 = piece.close; + + if (interval) { + if (interval[0] === -Infinity) { + if (littleThan(close_1[1], value, interval[1])) { + return i; + } + } else if (interval[1] === Infinity) { + if (littleThan(close_1[0], interval[0], value)) { + return i; + } + } else if (littleThan(close_1[0], interval[0], value) && littleThan(close_1[1], value, interval[1])) { + return i; + } + + findClosestWhenOutside && updatePossible(interval[0], i); + findClosestWhenOutside && updatePossible(interval[1], i); + } + } + + if (findClosestWhenOutside) { + return value === Infinity ? pieceList.length - 1 : value === -Infinity ? 0 : possibleI; + } + + function updatePossible(val, index) { + var newAbs = Math.abs(val - value); + + if (newAbs < abs) { + abs = newAbs; + possibleI = index; + } + } + }; + + VisualMapping.visualHandlers = { + color: { + applyVisual: makeApplyVisual('color'), + getColorMapper: function () { + var thisOption = this.option; + return bind(thisOption.mappingMethod === 'category' ? function (value, isNormalized) { + !isNormalized && (value = this._normalizeData(value)); + return doMapCategory.call(this, value); + } : function (value, isNormalized, out) { + // If output rgb array + // which will be much faster and useful in pixel manipulation + var returnRGBArray = !!out; + !isNormalized && (value = this._normalizeData(value)); + out = fastLerp(value, thisOption.parsedVisual, out); + return returnRGBArray ? out : stringify(out, 'rgba'); + }, this); + }, + _normalizedToVisual: { + linear: function (normalized) { + return stringify(fastLerp(normalized, this.option.parsedVisual), 'rgba'); + }, + category: doMapCategory, + piecewise: function (normalized, value) { + var result = getSpecifiedVisual.call(this, value); + + if (result == null) { + result = stringify(fastLerp(normalized, this.option.parsedVisual), 'rgba'); + } + + return result; + }, + fixed: doMapFixed + } + }, + colorHue: makePartialColorVisualHandler(function (color$1, value) { + return modifyHSL(color$1, value); + }), + colorSaturation: makePartialColorVisualHandler(function (color$1, value) { + return modifyHSL(color$1, null, value); + }), + colorLightness: makePartialColorVisualHandler(function (color$1, value) { + return modifyHSL(color$1, null, null, value); + }), + colorAlpha: makePartialColorVisualHandler(function (color$1, value) { + return modifyAlpha(color$1, value); + }), + decal: { + applyVisual: makeApplyVisual('decal'), + _normalizedToVisual: { + linear: null, + category: doMapCategory, + piecewise: null, + fixed: null + } + }, + opacity: { + applyVisual: makeApplyVisual('opacity'), + _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) + }, + liftZ: { + applyVisual: makeApplyVisual('liftZ'), + _normalizedToVisual: { + linear: doMapFixed, + category: doMapFixed, + piecewise: doMapFixed, + fixed: doMapFixed + } + }, + symbol: { + applyVisual: function (value, getter, setter) { + var symbolCfg = this.mapValueToVisual(value); + setter('symbol', symbolCfg); + }, + _normalizedToVisual: { + linear: doMapToArray, + category: doMapCategory, + piecewise: function (normalized, value) { + var result = getSpecifiedVisual.call(this, value); + + if (result == null) { + result = doMapToArray.call(this, normalized); + } + + return result; + }, + fixed: doMapFixed + } + }, + symbolSize: { + applyVisual: makeApplyVisual('symbolSize'), + _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) + } + }; + return VisualMapping; + }(); + + function preprocessForPiecewise(thisOption) { + var pieceList = thisOption.pieceList; + thisOption.hasSpecialVisual = false; + each(pieceList, function (piece, index) { + piece.originIndex = index; // piece.visual is "result visual value" but not + // a visual range, so it does not need to be normalized. + + if (piece.visual != null) { + thisOption.hasSpecialVisual = true; + } + }); + } + + function preprocessForSpecifiedCategory(thisOption) { + // Hash categories. + var categories = thisOption.categories; + var categoryMap = thisOption.categoryMap = {}; + var visual = thisOption.visual; + each$3(categories, function (cate, index) { + categoryMap[cate] = index; + }); // Process visual map input. + + if (!isArray(visual)) { + var visualArr_1 = []; + + if (isObject(visual)) { + each$3(visual, function (v, cate) { + var index = categoryMap[cate]; + visualArr_1[index != null ? index : CATEGORY_DEFAULT_VISUAL_INDEX] = v; + }); + } else { + // Is primary type, represents default visual. + visualArr_1[CATEGORY_DEFAULT_VISUAL_INDEX] = visual; + } + + visual = setVisualToOption(thisOption, visualArr_1); + } // Remove categories that has no visual, + // then we can mapping them to CATEGORY_DEFAULT_VISUAL_INDEX. + + + for (var i = categories.length - 1; i >= 0; i--) { + if (visual[i] == null) { + delete categoryMap[categories[i]]; + categories.pop(); + } + } + } + + function normalizeVisualRange(thisOption, isCategory) { + var visual = thisOption.visual; + var visualArr = []; + + if (isObject(visual)) { + each$3(visual, function (v) { + visualArr.push(v); + }); + } else if (visual != null) { + visualArr.push(visual); + } + + var doNotNeedPair = { + color: 1, + symbol: 1 + }; + + if (!isCategory && visualArr.length === 1 && !doNotNeedPair.hasOwnProperty(thisOption.type)) { + // Do not care visualArr.length === 0, which is illegal. + visualArr[1] = visualArr[0]; + } + + setVisualToOption(thisOption, visualArr); + } + + function makePartialColorVisualHandler(applyValue) { + return { + applyVisual: function (value, getter, setter) { + // Only used in HSL + var colorChannel = this.mapValueToVisual(value); // Must not be array value + + setter('color', applyValue(getter('color'), colorChannel)); + }, + _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) + }; + } + + function doMapToArray(normalized) { + var visual = this.option.visual; + return visual[Math.round(linearMap(normalized, [0, 1], [0, visual.length - 1], true))] || {}; // TODO {}? + } + + function makeApplyVisual(visualType) { + return function (value, getter, setter) { + setter(visualType, this.mapValueToVisual(value)); + }; + } + + function doMapCategory(normalized) { + var visual = this.option.visual; + return visual[this.option.loop && normalized !== CATEGORY_DEFAULT_VISUAL_INDEX ? normalized % visual.length : normalized]; + } + + function doMapFixed() { + // visual will be convert to array. + return this.option.visual[0]; + } + /** + * Create mapped to numeric visual + */ + + + function createNormalizedToNumericVisual(sourceExtent) { + return { + linear: function (normalized) { + return linearMap(normalized, sourceExtent, this.option.visual, true); + }, + category: doMapCategory, + piecewise: function (normalized, value) { + var result = getSpecifiedVisual.call(this, value); + + if (result == null) { + result = linearMap(normalized, sourceExtent, this.option.visual, true); + } + + return result; + }, + fixed: doMapFixed + }; + } + + function getSpecifiedVisual(value) { + var thisOption = this.option; + var pieceList = thisOption.pieceList; + + if (thisOption.hasSpecialVisual) { + var pieceIndex = VisualMapping.findPieceIndex(value, pieceList); + var piece = pieceList[pieceIndex]; + + if (piece && piece.visual) { + return piece.visual[this.type]; + } + } + } + + function setVisualToOption(thisOption, visualArr) { + thisOption.visual = visualArr; + + if (thisOption.type === 'color') { + thisOption.parsedVisual = map(visualArr, function (item) { + var color$1 = parse(item); + + if (!color$1 && "development" !== 'production') { + warn("'" + item + "' is an illegal color, fallback to '#000000'", true); + } + + return color$1 || [0, 0, 0, 1]; + }); + } + + return visualArr; + } + /** + * Normalizers by mapping methods. + */ + + + var normalizers = { + linear: function (value) { + return linearMap(value, this.option.dataExtent, [0, 1], true); + }, + piecewise: function (value) { + var pieceList = this.option.pieceList; + var pieceIndex = VisualMapping.findPieceIndex(value, pieceList, true); + + if (pieceIndex != null) { + return linearMap(pieceIndex, [0, pieceList.length - 1], [0, 1], true); + } + }, + category: function (value) { + var index = this.option.categories ? this.option.categoryMap[value] : value; // ordinal value + + return index == null ? CATEGORY_DEFAULT_VISUAL_INDEX : index; + }, + fixed: noop + }; + + function littleThan(close, a, b) { + return close ? a <= b : a < b; + } + + var ITEM_STYLE_NORMAL = 'itemStyle'; + var inner$9 = makeInner(); + var treemapVisual = { + seriesType: 'treemap', + reset: function (seriesModel) { + var tree = seriesModel.getData().tree; + var root = tree.root; + + if (root.isRemoved()) { + return; + } + + travelTree(root, // Visual should calculate from tree root but not view root. + {}, seriesModel.getViewRoot().getAncestors(), seriesModel); + } + }; + + function travelTree(node, designatedVisual, viewRootAncestors, seriesModel) { + var nodeModel = node.getModel(); + var nodeLayout = node.getLayout(); + var data = node.hostTree.data; // Optimize + + if (!nodeLayout || nodeLayout.invisible || !nodeLayout.isInView) { + return; + } + + var nodeItemStyleModel = nodeModel.getModel(ITEM_STYLE_NORMAL); + var visuals = buildVisuals(nodeItemStyleModel, designatedVisual, seriesModel); + var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style'); // calculate border color + + var borderColor = nodeItemStyleModel.get('borderColor'); + var borderColorSaturation = nodeItemStyleModel.get('borderColorSaturation'); + var thisNodeColor; + + if (borderColorSaturation != null) { + // For performance, do not always execute 'calculateColor'. + thisNodeColor = calculateColor(visuals); + borderColor = calculateBorderColor(borderColorSaturation, thisNodeColor); + } + + existsStyle.stroke = borderColor; + var viewChildren = node.viewChildren; + + if (!viewChildren || !viewChildren.length) { + thisNodeColor = calculateColor(visuals); // Apply visual to this node. + + existsStyle.fill = thisNodeColor; + } else { + var mapping_1 = buildVisualMapping(node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren); // Designate visual to children. + + each(viewChildren, function (child, index) { + // If higher than viewRoot, only ancestors of viewRoot is needed to visit. + if (child.depth >= viewRootAncestors.length || child === viewRootAncestors[child.depth]) { + var childVisual = mapVisual(nodeModel, visuals, child, index, mapping_1, seriesModel); + travelTree(child, childVisual, viewRootAncestors, seriesModel); + } + }); + } + } + + function buildVisuals(nodeItemStyleModel, designatedVisual, seriesModel) { + var visuals = extend({}, designatedVisual); + var designatedVisualItemStyle = seriesModel.designatedVisualItemStyle; + each(['color', 'colorAlpha', 'colorSaturation'], function (visualName) { + // Priority: thisNode > thisLevel > parentNodeDesignated > seriesModel + designatedVisualItemStyle[visualName] = designatedVisual[visualName]; + var val = nodeItemStyleModel.get(visualName); + designatedVisualItemStyle[visualName] = null; + val != null && (visuals[visualName] = val); + }); + return visuals; + } + + function calculateColor(visuals) { + var color = getValueVisualDefine(visuals, 'color'); + + if (color) { + var colorAlpha = getValueVisualDefine(visuals, 'colorAlpha'); + var colorSaturation = getValueVisualDefine(visuals, 'colorSaturation'); + + if (colorSaturation) { + color = modifyHSL(color, null, null, colorSaturation); + } + + if (colorAlpha) { + color = modifyAlpha(color, colorAlpha); + } + + return color; + } + } + + function calculateBorderColor(borderColorSaturation, thisNodeColor) { + return thisNodeColor != null // Can only be string + ? modifyHSL(thisNodeColor, null, null, borderColorSaturation) : null; + } + + function getValueVisualDefine(visuals, name) { + var value = visuals[name]; + + if (value != null && value !== 'none') { + return value; + } + } + + function buildVisualMapping(node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren) { + if (!viewChildren || !viewChildren.length) { + return; + } + + var rangeVisual = getRangeVisual(nodeModel, 'color') || visuals.color != null && visuals.color !== 'none' && (getRangeVisual(nodeModel, 'colorAlpha') || getRangeVisual(nodeModel, 'colorSaturation')); + + if (!rangeVisual) { + return; + } + + var visualMin = nodeModel.get('visualMin'); + var visualMax = nodeModel.get('visualMax'); + var dataExtent = nodeLayout.dataExtent.slice(); + visualMin != null && visualMin < dataExtent[0] && (dataExtent[0] = visualMin); + visualMax != null && visualMax > dataExtent[1] && (dataExtent[1] = visualMax); + var colorMappingBy = nodeModel.get('colorMappingBy'); + var opt = { + type: rangeVisual.name, + dataExtent: dataExtent, + visual: rangeVisual.range + }; + + if (opt.type === 'color' && (colorMappingBy === 'index' || colorMappingBy === 'id')) { + opt.mappingMethod = 'category'; + opt.loop = true; // categories is ordinal, so do not set opt.categories. + } else { + opt.mappingMethod = 'linear'; + } + + var mapping = new VisualMapping(opt); + inner$9(mapping).drColorMappingBy = colorMappingBy; + return mapping; + } // Notice: If we dont have the attribute 'colorRange', but only use + // attribute 'color' to represent both concepts of 'colorRange' and 'color', + // (It means 'colorRange' when 'color' is Array, means 'color' when not array), + // this problem will be encountered: + // If a level-1 node dont have children, and its siblings has children, + // and colorRange is set on level-1, then the node can not be colored. + // So we separate 'colorRange' and 'color' to different attributes. + + + function getRangeVisual(nodeModel, name) { + // 'colorRange', 'colorARange', 'colorSRange'. + // If not exsits on this node, fetch from levels and series. + var range = nodeModel.get(name); + return isArray(range) && range.length ? { + name: name, + range: range + } : null; + } + + function mapVisual(nodeModel, visuals, child, index, mapping, seriesModel) { + var childVisuals = extend({}, visuals); + + if (mapping) { + // Only support color, colorAlpha, colorSaturation. + var mappingType = mapping.type; + var colorMappingBy = mappingType === 'color' && inner$9(mapping).drColorMappingBy; + var value = colorMappingBy === 'index' ? index : colorMappingBy === 'id' ? seriesModel.mapIdToIndex(child.getId()) : child.getValue(nodeModel.get('visualDimension')); + childVisuals[mappingType] = mapping.mapValueToVisual(value); + } + + return childVisuals; + } + + var mathMax$7 = Math.max; + var mathMin$7 = Math.min; + var retrieveValue = retrieve; + var each$4 = each; + var PATH_BORDER_WIDTH = ['itemStyle', 'borderWidth']; + var PATH_GAP_WIDTH = ['itemStyle', 'gapWidth']; + var PATH_UPPER_LABEL_SHOW = ['upperLabel', 'show']; + var PATH_UPPER_LABEL_HEIGHT = ['upperLabel', 'height']; + /** + * @public + */ + + var treemapLayout = { + seriesType: 'treemap', + reset: function (seriesModel, ecModel, api, payload) { + // Layout result in each node: + // {x, y, width, height, area, borderWidth} + var ecWidth = api.getWidth(); + var ecHeight = api.getHeight(); + var seriesOption = seriesModel.option; + var layoutInfo = getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + var size = seriesOption.size || []; // Compatible with ec2. + + var containerWidth = parsePercent$1(retrieveValue(layoutInfo.width, size[0]), ecWidth); + var containerHeight = parsePercent$1(retrieveValue(layoutInfo.height, size[1]), ecHeight); // Fetch payload info. + + var payloadType = payload && payload.type; + var types = ['treemapZoomToNode', 'treemapRootToNode']; + var targetInfo = retrieveTargetInfo(payload, types, seriesModel); + var rootRect = payloadType === 'treemapRender' || payloadType === 'treemapMove' ? payload.rootRect : null; + var viewRoot = seriesModel.getViewRoot(); + var viewAbovePath = getPathToRoot(viewRoot); + + if (payloadType !== 'treemapMove') { + var rootSize = payloadType === 'treemapZoomToNode' ? estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) : rootRect ? [rootRect.width, rootRect.height] : [containerWidth, containerHeight]; + var sort_1 = seriesOption.sort; + + if (sort_1 && sort_1 !== 'asc' && sort_1 !== 'desc') { + // Default to be desc order. + sort_1 = 'desc'; + } + + var options = { + squareRatio: seriesOption.squareRatio, + sort: sort_1, + leafDepth: seriesOption.leafDepth + }; // layout should be cleared because using updateView but not update. + + viewRoot.hostTree.clearLayouts(); // TODO + // optimize: if out of view clip, do not layout. + // But take care that if do not render node out of view clip, + // how to calculate start po + + var viewRootLayout_1 = { + x: 0, + y: 0, + width: rootSize[0], + height: rootSize[1], + area: rootSize[0] * rootSize[1] + }; + viewRoot.setLayout(viewRootLayout_1); + squarify(viewRoot, options, false, 0); // Supplement layout. + + viewRootLayout_1 = viewRoot.getLayout(); + each$4(viewAbovePath, function (node, index) { + var childValue = (viewAbovePath[index + 1] || viewRoot).getValue(); + node.setLayout(extend({ + dataExtent: [childValue, childValue], + borderWidth: 0, + upperHeight: 0 + }, viewRootLayout_1)); + }); + } + + var treeRoot = seriesModel.getData().tree.root; + treeRoot.setLayout(calculateRootPosition(layoutInfo, rootRect, targetInfo), true); + seriesModel.setLayoutInfo(layoutInfo); // FIXME + // 现在没有clip功能,暂时取ec高宽。 + + prunning(treeRoot, // Transform to base element coordinate system. + new BoundingRect(-layoutInfo.x, -layoutInfo.y, ecWidth, ecHeight), viewAbovePath, viewRoot, 0); + } + }; + /** + * Layout treemap with squarify algorithm. + * The original presentation of this algorithm + * was made by Mark Bruls, Kees Huizing, and Jarke J. van Wijk + * <https://graphics.ethz.ch/teaching/scivis_common/Literature/squarifiedTreeMaps.pdf>. + * The implementation of this algorithm was originally copied from "d3.js" + * <https://github.com/d3/d3/blob/9cc9a875e636a1dcf36cc1e07bdf77e1ad6e2c74/src/layout/treemap.js> + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * @protected + * @param {module:echarts/data/Tree~TreeNode} node + * @param {Object} options + * @param {string} options.sort 'asc' or 'desc' + * @param {number} options.squareRatio + * @param {boolean} hideChildren + * @param {number} depth + */ + + function squarify(node, options, hideChildren, depth) { + var width; + var height; + + if (node.isRemoved()) { + return; + } + + var thisLayout = node.getLayout(); + width = thisLayout.width; + height = thisLayout.height; // Considering border and gap + + var nodeModel = node.getModel(); + var borderWidth = nodeModel.get(PATH_BORDER_WIDTH); + var halfGapWidth = nodeModel.get(PATH_GAP_WIDTH) / 2; + var upperLabelHeight = getUpperLabelHeight(nodeModel); + var upperHeight = Math.max(borderWidth, upperLabelHeight); + var layoutOffset = borderWidth - halfGapWidth; + var layoutOffsetUpper = upperHeight - halfGapWidth; + node.setLayout({ + borderWidth: borderWidth, + upperHeight: upperHeight, + upperLabelHeight: upperLabelHeight + }, true); + width = mathMax$7(width - 2 * layoutOffset, 0); + height = mathMax$7(height - layoutOffset - layoutOffsetUpper, 0); + var totalArea = width * height; + var viewChildren = initChildren(node, nodeModel, totalArea, options, hideChildren, depth); + + if (!viewChildren.length) { + return; + } + + var rect = { + x: layoutOffset, + y: layoutOffsetUpper, + width: width, + height: height + }; + var rowFixedLength = mathMin$7(width, height); + var best = Infinity; // the best row score so far + + var row = []; + row.area = 0; + + for (var i = 0, len = viewChildren.length; i < len;) { + var child = viewChildren[i]; + row.push(child); + row.area += child.getLayout().area; + var score = worst(row, rowFixedLength, options.squareRatio); // continue with this orientation + + if (score <= best) { + i++; + best = score; + } // abort, and try a different orientation + else { + row.area -= row.pop().getLayout().area; + position(row, rowFixedLength, rect, halfGapWidth, false); + rowFixedLength = mathMin$7(rect.width, rect.height); + row.length = row.area = 0; + best = Infinity; + } + } + + if (row.length) { + position(row, rowFixedLength, rect, halfGapWidth, true); + } + + if (!hideChildren) { + var childrenVisibleMin = nodeModel.get('childrenVisibleMin'); + + if (childrenVisibleMin != null && totalArea < childrenVisibleMin) { + hideChildren = true; + } + } + + for (var i = 0, len = viewChildren.length; i < len; i++) { + squarify(viewChildren[i], options, hideChildren, depth + 1); + } + } + /** + * Set area to each child, and calculate data extent for visual coding. + */ + + + function initChildren(node, nodeModel, totalArea, options, hideChildren, depth) { + var viewChildren = node.children || []; + var orderBy = options.sort; + orderBy !== 'asc' && orderBy !== 'desc' && (orderBy = null); + var overLeafDepth = options.leafDepth != null && options.leafDepth <= depth; // leafDepth has higher priority. + + if (hideChildren && !overLeafDepth) { + return node.viewChildren = []; + } // Sort children, order by desc. + + + viewChildren = filter(viewChildren, function (child) { + return !child.isRemoved(); + }); + sort$1(viewChildren, orderBy); + var info = statistic(nodeModel, viewChildren, orderBy); + + if (info.sum === 0) { + return node.viewChildren = []; + } + + info.sum = filterByThreshold(nodeModel, totalArea, info.sum, orderBy, viewChildren); + + if (info.sum === 0) { + return node.viewChildren = []; + } // Set area to each child. + + + for (var i = 0, len = viewChildren.length; i < len; i++) { + var area = viewChildren[i].getValue() / info.sum * totalArea; // Do not use setLayout({...}, true), because it is needed to clear last layout. + + viewChildren[i].setLayout({ + area: area + }); + } + + if (overLeafDepth) { + viewChildren.length && node.setLayout({ + isLeafRoot: true + }, true); + viewChildren.length = 0; + } + + node.viewChildren = viewChildren; + node.setLayout({ + dataExtent: info.dataExtent + }, true); + return viewChildren; + } + /** + * Consider 'visibleMin'. Modify viewChildren and get new sum. + */ + + + function filterByThreshold(nodeModel, totalArea, sum, orderBy, orderedChildren) { + // visibleMin is not supported yet when no option.sort. + if (!orderBy) { + return sum; + } + + var visibleMin = nodeModel.get('visibleMin'); + var len = orderedChildren.length; + var deletePoint = len; // Always travel from little value to big value. + + for (var i = len - 1; i >= 0; i--) { + var value = orderedChildren[orderBy === 'asc' ? len - i - 1 : i].getValue(); + + if (value / sum * totalArea < visibleMin) { + deletePoint = i; + sum -= value; + } + } + + orderBy === 'asc' ? orderedChildren.splice(0, len - deletePoint) : orderedChildren.splice(deletePoint, len - deletePoint); + return sum; + } + /** + * Sort + */ + + + function sort$1(viewChildren, orderBy) { + if (orderBy) { + viewChildren.sort(function (a, b) { + var diff = orderBy === 'asc' ? a.getValue() - b.getValue() : b.getValue() - a.getValue(); + return diff === 0 ? orderBy === 'asc' ? a.dataIndex - b.dataIndex : b.dataIndex - a.dataIndex : diff; + }); + } + + return viewChildren; + } + /** + * Statistic + */ + + + function statistic(nodeModel, children, orderBy) { + // Calculate sum. + var sum = 0; + + for (var i = 0, len = children.length; i < len; i++) { + sum += children[i].getValue(); + } // Statistic data extent for latter visual coding. + // Notice: data extent should be calculate based on raw children + // but not filtered view children, otherwise visual mapping will not + // be stable when zoom (where children is filtered by visibleMin). + + + var dimension = nodeModel.get('visualDimension'); + var dataExtent; // The same as area dimension. + + if (!children || !children.length) { + dataExtent = [NaN, NaN]; + } else if (dimension === 'value' && orderBy) { + dataExtent = [children[children.length - 1].getValue(), children[0].getValue()]; + orderBy === 'asc' && dataExtent.reverse(); + } // Other dimension. + else { + dataExtent = [Infinity, -Infinity]; + each$4(children, function (child) { + var value = child.getValue(dimension); + value < dataExtent[0] && (dataExtent[0] = value); + value > dataExtent[1] && (dataExtent[1] = value); + }); + } + + return { + sum: sum, + dataExtent: dataExtent + }; + } + /** + * Computes the score for the specified row, + * as the worst aspect ratio. + */ + + + function worst(row, rowFixedLength, ratio) { + var areaMax = 0; + var areaMin = Infinity; + + for (var i = 0, area = void 0, len = row.length; i < len; i++) { + area = row[i].getLayout().area; + + if (area) { + area < areaMin && (areaMin = area); + area > areaMax && (areaMax = area); + } + } + + var squareArea = row.area * row.area; + var f = rowFixedLength * rowFixedLength * ratio; + return squareArea ? mathMax$7(f * areaMax / squareArea, squareArea / (f * areaMin)) : Infinity; + } + /** + * Positions the specified row of nodes. Modifies `rect`. + */ + + + function position(row, rowFixedLength, rect, halfGapWidth, flush) { + // When rowFixedLength === rect.width, + // it is horizontal subdivision, + // rowFixedLength is the width of the subdivision, + // rowOtherLength is the height of the subdivision, + // and nodes will be positioned from left to right. + // wh[idx0WhenH] means: when horizontal, + // wh[idx0WhenH] => wh[0] => 'width'. + // xy[idx1WhenH] => xy[1] => 'y'. + var idx0WhenH = rowFixedLength === rect.width ? 0 : 1; + var idx1WhenH = 1 - idx0WhenH; + var xy = ['x', 'y']; + var wh = ['width', 'height']; + var last = rect[xy[idx0WhenH]]; + var rowOtherLength = rowFixedLength ? row.area / rowFixedLength : 0; + + if (flush || rowOtherLength > rect[wh[idx1WhenH]]) { + rowOtherLength = rect[wh[idx1WhenH]]; // over+underflow + } + + for (var i = 0, rowLen = row.length; i < rowLen; i++) { + var node = row[i]; + var nodeLayout = {}; + var step = rowOtherLength ? node.getLayout().area / rowOtherLength : 0; + var wh1 = nodeLayout[wh[idx1WhenH]] = mathMax$7(rowOtherLength - 2 * halfGapWidth, 0); // We use Math.max/min to avoid negative width/height when considering gap width. + + var remain = rect[xy[idx0WhenH]] + rect[wh[idx0WhenH]] - last; + var modWH = i === rowLen - 1 || remain < step ? remain : step; + var wh0 = nodeLayout[wh[idx0WhenH]] = mathMax$7(modWH - 2 * halfGapWidth, 0); + nodeLayout[xy[idx1WhenH]] = rect[xy[idx1WhenH]] + mathMin$7(halfGapWidth, wh1 / 2); + nodeLayout[xy[idx0WhenH]] = last + mathMin$7(halfGapWidth, wh0 / 2); + last += modWH; + node.setLayout(nodeLayout, true); + } + + rect[xy[idx1WhenH]] += rowOtherLength; + rect[wh[idx1WhenH]] -= rowOtherLength; + } // Return [containerWidth, containerHeight] as default. + + + function estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) { + // If targetInfo.node exists, we zoom to the node, + // so estimate whold width and heigth by target node. + var currNode = (targetInfo || {}).node; + var defaultSize = [containerWidth, containerHeight]; + + if (!currNode || currNode === viewRoot) { + return defaultSize; + } + + var parent; + var viewArea = containerWidth * containerHeight; + var area = viewArea * seriesModel.option.zoomToNodeRatio; + + while (parent = currNode.parentNode) { + // jshint ignore:line + var sum = 0; + var siblings = parent.children; + + for (var i = 0, len = siblings.length; i < len; i++) { + sum += siblings[i].getValue(); + } + + var currNodeValue = currNode.getValue(); + + if (currNodeValue === 0) { + return defaultSize; + } + + area *= sum / currNodeValue; // Considering border, suppose aspect ratio is 1. + + var parentModel = parent.getModel(); + var borderWidth = parentModel.get(PATH_BORDER_WIDTH); + var upperHeight = Math.max(borderWidth, getUpperLabelHeight(parentModel)); + area += 4 * borderWidth * borderWidth + (3 * borderWidth + upperHeight) * Math.pow(area, 0.5); + area > MAX_SAFE_INTEGER && (area = MAX_SAFE_INTEGER); + currNode = parent; + } + + area < viewArea && (area = viewArea); + var scale = Math.pow(area / viewArea, 0.5); + return [containerWidth * scale, containerHeight * scale]; + } // Root postion base on coord of containerGroup + + + function calculateRootPosition(layoutInfo, rootRect, targetInfo) { + if (rootRect) { + return { + x: rootRect.x, + y: rootRect.y + }; + } + + var defaultPosition = { + x: 0, + y: 0 + }; + + if (!targetInfo) { + return defaultPosition; + } // If targetInfo is fetched by 'retrieveTargetInfo', + // old tree and new tree are the same tree, + // so the node still exists and we can visit it. + + + var targetNode = targetInfo.node; + var layout = targetNode.getLayout(); + + if (!layout) { + return defaultPosition; + } // Transform coord from local to container. + + + var targetCenter = [layout.width / 2, layout.height / 2]; + var node = targetNode; + + while (node) { + var nodeLayout = node.getLayout(); + targetCenter[0] += nodeLayout.x; + targetCenter[1] += nodeLayout.y; + node = node.parentNode; + } + + return { + x: layoutInfo.width / 2 - targetCenter[0], + y: layoutInfo.height / 2 - targetCenter[1] + }; + } // Mark nodes visible for prunning when visual coding and rendering. + // Prunning depends on layout and root position, so we have to do it after layout. + + + function prunning(node, clipRect, viewAbovePath, viewRoot, depth) { + var nodeLayout = node.getLayout(); + var nodeInViewAbovePath = viewAbovePath[depth]; + var isAboveViewRoot = nodeInViewAbovePath && nodeInViewAbovePath === node; + + if (nodeInViewAbovePath && !isAboveViewRoot || depth === viewAbovePath.length && node !== viewRoot) { + return; + } + + node.setLayout({ + // isInView means: viewRoot sub tree + viewAbovePath + isInView: true, + // invisible only means: outside view clip so that the node can not + // see but still layout for animation preparation but not render. + invisible: !isAboveViewRoot && !clipRect.intersect(nodeLayout), + isAboveViewRoot: isAboveViewRoot + }, true); // Transform to child coordinate. + + var childClipRect = new BoundingRect(clipRect.x - nodeLayout.x, clipRect.y - nodeLayout.y, clipRect.width, clipRect.height); + each$4(node.viewChildren || [], function (child) { + prunning(child, childClipRect, viewAbovePath, viewRoot, depth + 1); + }); + } + + function getUpperLabelHeight(model) { + return model.get(PATH_UPPER_LABEL_SHOW) ? model.get(PATH_UPPER_LABEL_HEIGHT) : 0; + } + + function install$c(registers) { + registers.registerSeriesModel(TreemapSeriesModel); + registers.registerChartView(TreemapView); + registers.registerVisual(treemapVisual); + registers.registerLayout(treemapLayout); + installTreemapAction(registers); + } + + function categoryFilter(ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + + if (!legendModels || !legendModels.length) { + return; + } + + ecModel.eachSeriesByType('graph', function (graphSeries) { + var categoriesData = graphSeries.getCategoriesData(); + var graph = graphSeries.getGraph(); + var data = graph.data; + var categoryNames = categoriesData.mapArray(categoriesData.getName); + data.filterSelf(function (idx) { + var model = data.getItemModel(idx); + var category = model.getShallow('category'); + + if (category != null) { + if (isNumber(category)) { + category = categoryNames[category]; + } // If in any legend component the status is not selected. + + + for (var i = 0; i < legendModels.length; i++) { + if (!legendModels[i].isSelected(category)) { + return false; + } + } + } + + return true; + }); + }); + } + + function categoryVisual(ecModel) { + var paletteScope = {}; + ecModel.eachSeriesByType('graph', function (seriesModel) { + var categoriesData = seriesModel.getCategoriesData(); + var data = seriesModel.getData(); + var categoryNameIdxMap = {}; + categoriesData.each(function (idx) { + var name = categoriesData.getName(idx); // Add prefix to avoid conflict with Object.prototype. + + categoryNameIdxMap['ec-' + name] = idx; + var itemModel = categoriesData.getItemModel(idx); + var style = itemModel.getModel('itemStyle').getItemStyle(); + + if (!style.fill) { + // Get color from palette. + style.fill = seriesModel.getColorFromPalette(name, paletteScope); + } + + categoriesData.setItemVisual(idx, 'style', style); + var symbolVisualList = ['symbol', 'symbolSize', 'symbolKeepAspect']; + + for (var i = 0; i < symbolVisualList.length; i++) { + var symbolVisual = itemModel.getShallow(symbolVisualList[i], true); + + if (symbolVisual != null) { + categoriesData.setItemVisual(idx, symbolVisualList[i], symbolVisual); + } + } + }); // Assign category color to visual + + if (categoriesData.count()) { + data.each(function (idx) { + var model = data.getItemModel(idx); + var categoryIdx = model.getShallow('category'); + + if (categoryIdx != null) { + if (isString(categoryIdx)) { + categoryIdx = categoryNameIdxMap['ec-' + categoryIdx]; + } + + var categoryStyle = categoriesData.getItemVisual(categoryIdx, 'style'); + var style = data.ensureUniqueItemVisual(idx, 'style'); + extend(style, categoryStyle); + var visualList = ['symbol', 'symbolSize', 'symbolKeepAspect']; + + for (var i = 0; i < visualList.length; i++) { + data.setItemVisual(idx, visualList[i], categoriesData.getItemVisual(categoryIdx, visualList[i])); + } + } + }); + } + }); + } + + function normalize$2(a) { + if (!(a instanceof Array)) { + a = [a, a]; + } + + return a; + } + + function graphEdgeVisual(ecModel) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + var graph = seriesModel.getGraph(); + var edgeData = seriesModel.getEdgeData(); + var symbolType = normalize$2(seriesModel.get('edgeSymbol')); + var symbolSize = normalize$2(seriesModel.get('edgeSymbolSize')); // const colorQuery = ['lineStyle', 'color'] as const; + // const opacityQuery = ['lineStyle', 'opacity'] as const; + + edgeData.setVisual('fromSymbol', symbolType && symbolType[0]); + edgeData.setVisual('toSymbol', symbolType && symbolType[1]); + edgeData.setVisual('fromSymbolSize', symbolSize && symbolSize[0]); + edgeData.setVisual('toSymbolSize', symbolSize && symbolSize[1]); + edgeData.setVisual('style', seriesModel.getModel('lineStyle').getLineStyle()); + edgeData.each(function (idx) { + var itemModel = edgeData.getItemModel(idx); + var edge = graph.getEdgeByIndex(idx); + var symbolType = normalize$2(itemModel.getShallow('symbol', true)); + var symbolSize = normalize$2(itemModel.getShallow('symbolSize', true)); // Edge visual must after node visual + + var style = itemModel.getModel('lineStyle').getLineStyle(); + var existsStyle = edgeData.ensureUniqueItemVisual(idx, 'style'); + extend(existsStyle, style); + + switch (existsStyle.stroke) { + case 'source': + { + var nodeStyle = edge.node1.getVisual('style'); + existsStyle.stroke = nodeStyle && nodeStyle.fill; + break; + } + + case 'target': + { + var nodeStyle = edge.node2.getVisual('style'); + existsStyle.stroke = nodeStyle && nodeStyle.fill; + break; + } + } + + symbolType[0] && edge.setVisual('fromSymbol', symbolType[0]); + symbolType[1] && edge.setVisual('toSymbol', symbolType[1]); + symbolSize[0] && edge.setVisual('fromSymbolSize', symbolSize[0]); + symbolSize[1] && edge.setVisual('toSymbolSize', symbolSize[1]); + }); + }); + } + + var KEY_DELIMITER = '-->'; + /** + * params handler + * @param {module:echarts/model/SeriesModel} seriesModel + * @returns {*} + */ + + var getAutoCurvenessParams = function (seriesModel) { + return seriesModel.get('autoCurveness') || null; + }; + /** + * Generate a list of edge curvatures, 20 is the default + * @param {module:echarts/model/SeriesModel} seriesModel + * @param {number} appendLength + * @return 20 => [0, -0.2, 0.2, -0.4, 0.4, -0.6, 0.6, -0.8, 0.8, -1, 1, -1.2, 1.2, -1.4, 1.4, -1.6, 1.6, -1.8, 1.8, -2] + */ + + + var createCurveness = function (seriesModel, appendLength) { + var autoCurvenessParmas = getAutoCurvenessParams(seriesModel); + var length = 20; + var curvenessList = []; // handler the function set + + if (isNumber(autoCurvenessParmas)) { + length = autoCurvenessParmas; + } else if (isArray(autoCurvenessParmas)) { + seriesModel.__curvenessList = autoCurvenessParmas; + return; + } // append length + + + if (appendLength > length) { + length = appendLength; + } // make sure the length is even + + + var len = length % 2 ? length + 2 : length + 3; + curvenessList = []; + + for (var i = 0; i < len; i++) { + curvenessList.push((i % 2 ? i + 1 : i) / 10 * (i % 2 ? -1 : 1)); + } + + seriesModel.__curvenessList = curvenessList; + }; + /** + * Create different cache key data in the positive and negative directions, in order to set the curvature later + * @param {number|string|module:echarts/data/Graph.Node} n1 + * @param {number|string|module:echarts/data/Graph.Node} n2 + * @param {module:echarts/model/SeriesModel} seriesModel + * @returns {string} key + */ + + + var getKeyOfEdges = function (n1, n2, seriesModel) { + var source = [n1.id, n1.dataIndex].join('.'); + var target = [n2.id, n2.dataIndex].join('.'); + return [seriesModel.uid, source, target].join(KEY_DELIMITER); + }; + /** + * get opposite key + * @param {string} key + * @returns {string} + */ + + + var getOppositeKey = function (key) { + var keys = key.split(KEY_DELIMITER); + return [keys[0], keys[2], keys[1]].join(KEY_DELIMITER); + }; + /** + * get edgeMap with key + * @param edge + * @param {module:echarts/model/SeriesModel} seriesModel + */ + + + var getEdgeFromMap = function (edge, seriesModel) { + var key = getKeyOfEdges(edge.node1, edge.node2, seriesModel); + return seriesModel.__edgeMap[key]; + }; + /** + * calculate all cases total length + * @param edge + * @param seriesModel + * @returns {number} + */ + + + var getTotalLengthBetweenNodes = function (edge, seriesModel) { + var len = getEdgeMapLengthWithKey(getKeyOfEdges(edge.node1, edge.node2, seriesModel), seriesModel); + var lenV = getEdgeMapLengthWithKey(getKeyOfEdges(edge.node2, edge.node1, seriesModel), seriesModel); + return len + lenV; + }; + /** + * + * @param key + */ + + + var getEdgeMapLengthWithKey = function (key, seriesModel) { + var edgeMap = seriesModel.__edgeMap; + return edgeMap[key] ? edgeMap[key].length : 0; + }; + /** + * Count the number of edges between the same two points, used to obtain the curvature table and the parity of the edge + * @see /graph/GraphSeries.js@getInitialData + * @param {module:echarts/model/SeriesModel} seriesModel + */ + + + function initCurvenessList(seriesModel) { + if (!getAutoCurvenessParams(seriesModel)) { + return; + } + + seriesModel.__curvenessList = []; + seriesModel.__edgeMap = {}; // calc the array of curveness List + + createCurveness(seriesModel); + } + /** + * set edgeMap with key + * @param {number|string|module:echarts/data/Graph.Node} n1 + * @param {number|string|module:echarts/data/Graph.Node} n2 + * @param {module:echarts/model/SeriesModel} seriesModel + * @param {number} index + */ + + function createEdgeMapForCurveness(n1, n2, seriesModel, index) { + if (!getAutoCurvenessParams(seriesModel)) { + return; + } + + var key = getKeyOfEdges(n1, n2, seriesModel); + var edgeMap = seriesModel.__edgeMap; + var oppositeEdges = edgeMap[getOppositeKey(key)]; // set direction + + if (edgeMap[key] && !oppositeEdges) { + edgeMap[key].isForward = true; + } else if (oppositeEdges && edgeMap[key]) { + oppositeEdges.isForward = true; + edgeMap[key].isForward = false; + } + + edgeMap[key] = edgeMap[key] || []; + edgeMap[key].push(index); + } + /** + * get curvature for edge + * @param edge + * @param {module:echarts/model/SeriesModel} seriesModel + * @param index + */ + + function getCurvenessForEdge(edge, seriesModel, index, needReverse) { + var autoCurvenessParams = getAutoCurvenessParams(seriesModel); + var isArrayParam = isArray(autoCurvenessParams); + + if (!autoCurvenessParams) { + return null; + } + + var edgeArray = getEdgeFromMap(edge, seriesModel); + + if (!edgeArray) { + return null; + } + + var edgeIndex = -1; + + for (var i = 0; i < edgeArray.length; i++) { + if (edgeArray[i] === index) { + edgeIndex = i; + break; + } + } // if totalLen is Longer createCurveness + + + var totalLen = getTotalLengthBetweenNodes(edge, seriesModel); + createCurveness(seriesModel, totalLen); + edge.lineStyle = edge.lineStyle || {}; // if is opposite edge, must set curvenss to opposite number + + var curKey = getKeyOfEdges(edge.node1, edge.node2, seriesModel); + var curvenessList = seriesModel.__curvenessList; // if pass array no need parity + + var parityCorrection = isArrayParam ? 0 : totalLen % 2 ? 0 : 1; + + if (!edgeArray.isForward) { + // the opposite edge show outside + var oppositeKey = getOppositeKey(curKey); + var len = getEdgeMapLengthWithKey(oppositeKey, seriesModel); + var resValue = curvenessList[edgeIndex + len + parityCorrection]; // isNeedReverse, simple, force type need reverse the curveness in the junction of the forword and the opposite + + if (needReverse) { + // set as array may make the parity handle with the len of opposite + if (isArrayParam) { + if (autoCurvenessParams && autoCurvenessParams[0] === 0) { + return (len + parityCorrection) % 2 ? resValue : -resValue; + } else { + return ((len % 2 ? 0 : 1) + parityCorrection) % 2 ? resValue : -resValue; + } + } else { + return (len + parityCorrection) % 2 ? resValue : -resValue; + } + } else { + return curvenessList[edgeIndex + len + parityCorrection]; + } + } else { + return curvenessList[parityCorrection + edgeIndex]; + } + } + + function simpleLayout(seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.type !== 'view') { + return; + } + + var graph = seriesModel.getGraph(); + graph.eachNode(function (node) { + var model = node.getModel(); + node.setLayout([+model.get('x'), +model.get('y')]); + }); + simpleLayoutEdge(graph, seriesModel); + } + function simpleLayoutEdge(graph, seriesModel) { + graph.eachEdge(function (edge, index) { + var curveness = retrieve3(edge.getModel().get(['lineStyle', 'curveness']), -getCurvenessForEdge(edge, seriesModel, index, true), 0); + var p1 = clone$1(edge.node1.getLayout()); + var p2 = clone$1(edge.node2.getLayout()); + var points = [p1, p2]; + + if (+curveness) { + points.push([(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * curveness]); + } + + edge.setLayout(points); + }); + } + + function graphSimpleLayout(ecModel, api) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + var layout = seriesModel.get('layout'); + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.type !== 'view') { + var data_1 = seriesModel.getData(); + var dimensions_1 = []; + each(coordSys.dimensions, function (coordDim) { + dimensions_1 = dimensions_1.concat(data_1.mapDimensionsAll(coordDim)); + }); + + for (var dataIndex = 0; dataIndex < data_1.count(); dataIndex++) { + var value = []; + var hasValue = false; + + for (var i = 0; i < dimensions_1.length; i++) { + var val = data_1.get(dimensions_1[i], dataIndex); + + if (!isNaN(val)) { + hasValue = true; + } + + value.push(val); + } + + if (hasValue) { + data_1.setItemLayout(dataIndex, coordSys.dataToPoint(value)); + } else { + // Also {Array.<number>}, not undefined to avoid if...else... statement + data_1.setItemLayout(dataIndex, [NaN, NaN]); + } + } + + simpleLayoutEdge(data_1.graph, seriesModel); + } else if (!layout || layout === 'none') { + simpleLayout(seriesModel); + } + }); + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + function getNodeGlobalScale(seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys.type !== 'view') { + return 1; + } + + var nodeScaleRatio = seriesModel.option.nodeScaleRatio; + var groupZoom = coordSys.scaleX; // Scale node when zoom changes + + var roamZoom = coordSys.getZoom(); + var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1; + return nodeScale / groupZoom; + } + function getSymbolSize(node) { + var symbolSize = node.getVisual('symbolSize'); + + if (symbolSize instanceof Array) { + symbolSize = (symbolSize[0] + symbolSize[1]) / 2; + } + + return +symbolSize; + } + + var PI$6 = Math.PI; + var _symbolRadiansHalf = []; + /** + * `basedOn` can be: + * 'value': + * This layout is not accurate and have same bad case. For example, + * if the min value is very smaller than the max value, the nodes + * with the min value probably overlap even though there is enough + * space to layout them. So we only use this approach in the as the + * init layout of the force layout. + * FIXME + * Probably we do not need this method any more but use + * `basedOn: 'symbolSize'` in force layout if + * delay its init operations to GraphView. + * 'symbolSize': + * This approach work only if all of the symbol size calculated. + * That is, the progressive rendering is not applied to graph. + * FIXME + * If progressive rendering is applied to graph some day, + * probably we have to use `basedOn: 'value'`. + */ + + function circularLayout(seriesModel, basedOn) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.type !== 'view') { + return; + } + + var rect = coordSys.getBoundingRect(); + var nodeData = seriesModel.getData(); + var graph = nodeData.graph; + var cx = rect.width / 2 + rect.x; + var cy = rect.height / 2 + rect.y; + var r = Math.min(rect.width, rect.height) / 2; + var count = nodeData.count(); + nodeData.setLayout({ + cx: cx, + cy: cy + }); + + if (!count) { + return; + } + + _layoutNodesBasedOn[basedOn](seriesModel, graph, nodeData, r, cx, cy, count); + + graph.eachEdge(function (edge, index) { + var curveness = retrieve3(edge.getModel().get(['lineStyle', 'curveness']), getCurvenessForEdge(edge, seriesModel, index), 0); + var p1 = clone$1(edge.node1.getLayout()); + var p2 = clone$1(edge.node2.getLayout()); + var cp1; + var x12 = (p1[0] + p2[0]) / 2; + var y12 = (p1[1] + p2[1]) / 2; + + if (+curveness) { + curveness *= 3; + cp1 = [cx * curveness + x12 * (1 - curveness), cy * curveness + y12 * (1 - curveness)]; + } + + edge.setLayout([p1, p2, cp1]); + }); + } + var _layoutNodesBasedOn = { + value: function (seriesModel, graph, nodeData, r, cx, cy, count) { + var angle = 0; + var sum = nodeData.getSum('value'); + var unitAngle = Math.PI * 2 / (sum || count); + graph.eachNode(function (node) { + var value = node.getValue('value'); + var radianHalf = unitAngle * (sum ? value : 1) / 2; + angle += radianHalf; + node.setLayout([r * Math.cos(angle) + cx, r * Math.sin(angle) + cy]); + angle += radianHalf; + }); + }, + symbolSize: function (seriesModel, graph, nodeData, r, cx, cy, count) { + var sumRadian = 0; + _symbolRadiansHalf.length = count; + var nodeScale = getNodeGlobalScale(seriesModel); + graph.eachNode(function (node) { + var symbolSize = getSymbolSize(node); // Normally this case will not happen, but we still add + // some the defensive code (2px is an arbitrary value). + + isNaN(symbolSize) && (symbolSize = 2); + symbolSize < 0 && (symbolSize = 0); + symbolSize *= nodeScale; + var symbolRadianHalf = Math.asin(symbolSize / 2 / r); // when `symbolSize / 2` is bigger than `r`. + + isNaN(symbolRadianHalf) && (symbolRadianHalf = PI$6 / 2); + _symbolRadiansHalf[node.dataIndex] = symbolRadianHalf; + sumRadian += symbolRadianHalf * 2; + }); + var halfRemainRadian = (2 * PI$6 - sumRadian) / count / 2; + var angle = 0; + graph.eachNode(function (node) { + var radianHalf = halfRemainRadian + _symbolRadiansHalf[node.dataIndex]; + angle += radianHalf; + node.setLayout([r * Math.cos(angle) + cx, r * Math.sin(angle) + cy]); + angle += radianHalf; + }); + } + }; + + function graphCircularLayout(ecModel) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + if (seriesModel.get('layout') === 'circular') { + circularLayout(seriesModel, 'symbolSize'); + } + }); + } + + var scaleAndAdd$1 = scaleAndAdd; // function adjacentNode(n, e) { + // return e.n1 === n ? e.n2 : e.n1; + // } + + function forceLayout(inNodes, inEdges, opts) { + var nodes = inNodes; + var edges = inEdges; + var rect = opts.rect; + var width = rect.width; + var height = rect.height; + var center = [rect.x + width / 2, rect.y + height / 2]; // let scale = opts.scale || 1; + + var gravity = opts.gravity == null ? 0.1 : opts.gravity; // for (let i = 0; i < edges.length; i++) { + // let e = edges[i]; + // let n1 = e.n1; + // let n2 = e.n2; + // n1.edges = n1.edges || []; + // n2.edges = n2.edges || []; + // n1.edges.push(e); + // n2.edges.push(e); + // } + // Init position + + for (var i = 0; i < nodes.length; i++) { + var n = nodes[i]; + + if (!n.p) { + n.p = create(width * (Math.random() - 0.5) + center[0], height * (Math.random() - 0.5) + center[1]); + } + + n.pp = clone$1(n.p); + n.edges = null; + } // Formula in 'Graph Drawing by Force-directed Placement' + // let k = scale * Math.sqrt(width * height / nodes.length); + // let k2 = k * k; + + + var initialFriction = opts.friction == null ? 0.6 : opts.friction; + var friction = initialFriction; + var beforeStepCallback; + var afterStepCallback; + return { + warmUp: function () { + friction = initialFriction * 0.8; + }, + setFixed: function (idx) { + nodes[idx].fixed = true; + }, + setUnfixed: function (idx) { + nodes[idx].fixed = false; + }, + + /** + * Before step hook + */ + beforeStep: function (cb) { + beforeStepCallback = cb; + }, + + /** + * After step hook + */ + afterStep: function (cb) { + afterStepCallback = cb; + }, + + /** + * Some formulas were originally copied from "d3.js" + * https://github.com/d3/d3/blob/b516d77fb8566b576088e73410437494717ada26/src/layout/force.js + * with some modifications made for this project. + * See the license statement at the head of this file. + */ + step: function (cb) { + beforeStepCallback && beforeStepCallback(nodes, edges); + var v12 = []; + var nLen = nodes.length; + + for (var i = 0; i < edges.length; i++) { + var e = edges[i]; + + if (e.ignoreForceLayout) { + continue; + } + + var n1 = e.n1; + var n2 = e.n2; + sub(v12, n2.p, n1.p); + var d = len(v12) - e.d; + var w = n2.w / (n1.w + n2.w); + + if (isNaN(w)) { + w = 0; + } + + normalize(v12, v12); + !n1.fixed && scaleAndAdd$1(n1.p, n1.p, v12, w * d * friction); + !n2.fixed && scaleAndAdd$1(n2.p, n2.p, v12, -(1 - w) * d * friction); + } // Gravity + + + for (var i = 0; i < nLen; i++) { + var n = nodes[i]; + + if (!n.fixed) { + sub(v12, center, n.p); // let d = vec2.len(v12); + // vec2.scale(v12, v12, 1 / d); + // let gravityFactor = gravity; + + scaleAndAdd$1(n.p, n.p, v12, gravity * friction); + } + } // Repulsive + // PENDING + + + for (var i = 0; i < nLen; i++) { + var n1 = nodes[i]; + + for (var j = i + 1; j < nLen; j++) { + var n2 = nodes[j]; + sub(v12, n2.p, n1.p); + var d = len(v12); + + if (d === 0) { + // Random repulse + set(v12, Math.random() - 0.5, Math.random() - 0.5); + d = 1; + } + + var repFact = (n1.rep + n2.rep) / d / d; + !n1.fixed && scaleAndAdd$1(n1.pp, n1.pp, v12, repFact); + !n2.fixed && scaleAndAdd$1(n2.pp, n2.pp, v12, -repFact); + } + } + + var v = []; + + for (var i = 0; i < nLen; i++) { + var n = nodes[i]; + + if (!n.fixed) { + sub(v, n.p, n.pp); + scaleAndAdd$1(n.p, n.p, v, friction); + copy(n.pp, n.p); + } + } + + friction = friction * 0.992; + var finished = friction < 0.01; + afterStepCallback && afterStepCallback(nodes, edges, finished); + cb && cb(finished); + } + }; + } + + function graphForceLayout(ecModel) { + ecModel.eachSeriesByType('graph', function (graphSeries) { + var coordSys = graphSeries.coordinateSystem; + + if (coordSys && coordSys.type !== 'view') { + return; + } + + if (graphSeries.get('layout') === 'force') { + var preservedPoints_1 = graphSeries.preservedPoints || {}; + var graph_1 = graphSeries.getGraph(); + var nodeData_1 = graph_1.data; + var edgeData = graph_1.edgeData; + var forceModel = graphSeries.getModel('force'); + var initLayout = forceModel.get('initLayout'); + + if (graphSeries.preservedPoints) { + nodeData_1.each(function (idx) { + var id = nodeData_1.getId(idx); + nodeData_1.setItemLayout(idx, preservedPoints_1[id] || [NaN, NaN]); + }); + } else if (!initLayout || initLayout === 'none') { + simpleLayout(graphSeries); + } else if (initLayout === 'circular') { + circularLayout(graphSeries, 'value'); + } + + var nodeDataExtent_1 = nodeData_1.getDataExtent('value'); + var edgeDataExtent_1 = edgeData.getDataExtent('value'); // let edgeDataExtent = edgeData.getDataExtent('value'); + + var repulsion = forceModel.get('repulsion'); + var edgeLength = forceModel.get('edgeLength'); + var repulsionArr_1 = isArray(repulsion) ? repulsion : [repulsion, repulsion]; + var edgeLengthArr_1 = isArray(edgeLength) ? edgeLength : [edgeLength, edgeLength]; // Larger value has smaller length + + edgeLengthArr_1 = [edgeLengthArr_1[1], edgeLengthArr_1[0]]; + var nodes_1 = nodeData_1.mapArray('value', function (value, idx) { + var point = nodeData_1.getItemLayout(idx); + var rep = linearMap(value, nodeDataExtent_1, repulsionArr_1); + + if (isNaN(rep)) { + rep = (repulsionArr_1[0] + repulsionArr_1[1]) / 2; + } + + return { + w: rep, + rep: rep, + fixed: nodeData_1.getItemModel(idx).get('fixed'), + p: !point || isNaN(point[0]) || isNaN(point[1]) ? null : point + }; + }); + var edges = edgeData.mapArray('value', function (value, idx) { + var edge = graph_1.getEdgeByIndex(idx); + var d = linearMap(value, edgeDataExtent_1, edgeLengthArr_1); + + if (isNaN(d)) { + d = (edgeLengthArr_1[0] + edgeLengthArr_1[1]) / 2; + } + + var edgeModel = edge.getModel(); + var curveness = retrieve3(edge.getModel().get(['lineStyle', 'curveness']), -getCurvenessForEdge(edge, graphSeries, idx, true), 0); + return { + n1: nodes_1[edge.node1.dataIndex], + n2: nodes_1[edge.node2.dataIndex], + d: d, + curveness: curveness, + ignoreForceLayout: edgeModel.get('ignoreForceLayout') + }; + }); // let coordSys = graphSeries.coordinateSystem; + + var rect = coordSys.getBoundingRect(); + var forceInstance = forceLayout(nodes_1, edges, { + rect: rect, + gravity: forceModel.get('gravity'), + friction: forceModel.get('friction') + }); + forceInstance.beforeStep(function (nodes, edges) { + for (var i = 0, l = nodes.length; i < l; i++) { + if (nodes[i].fixed) { + // Write back to layout instance + copy(nodes[i].p, graph_1.getNodeByIndex(i).getLayout()); + } + } + }); + forceInstance.afterStep(function (nodes, edges, stopped) { + for (var i = 0, l = nodes.length; i < l; i++) { + if (!nodes[i].fixed) { + graph_1.getNodeByIndex(i).setLayout(nodes[i].p); + } + + preservedPoints_1[nodeData_1.getId(i)] = nodes[i].p; + } + + for (var i = 0, l = edges.length; i < l; i++) { + var e = edges[i]; + var edge = graph_1.getEdgeByIndex(i); + var p1 = e.n1.p; + var p2 = e.n2.p; + var points = edge.getLayout(); + points = points ? points.slice() : []; + points[0] = points[0] || []; + points[1] = points[1] || []; + copy(points[0], p1); + copy(points[1], p2); + + if (+e.curveness) { + points[2] = [(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * e.curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * e.curveness]; + } + + edge.setLayout(points); + } + }); + graphSeries.forceLayout = forceInstance; + graphSeries.preservedPoints = preservedPoints_1; // Step to get the layout + + forceInstance.step(); + } else { + // Remove prev injected forceLayout instance + graphSeries.forceLayout = null; + } + }); + } + + function getViewRect$2(seriesModel, api, aspect) { + var option = extend(seriesModel.getBoxLayoutParams(), { + aspect: aspect + }); + return getLayoutRect(option, { + width: api.getWidth(), + height: api.getHeight() + }); + } + + function createViewCoordSys(ecModel, api) { + var viewList = []; + ecModel.eachSeriesByType('graph', function (seriesModel) { + var coordSysType = seriesModel.get('coordinateSystem'); + + if (!coordSysType || coordSysType === 'view') { + var data_1 = seriesModel.getData(); + var positions = data_1.mapArray(function (idx) { + var itemModel = data_1.getItemModel(idx); + return [+itemModel.get('x'), +itemModel.get('y')]; + }); + var min = []; + var max = []; + fromPoints(positions, min, max); // If width or height is 0 + + if (max[0] - min[0] === 0) { + max[0] += 1; + min[0] -= 1; + } + + if (max[1] - min[1] === 0) { + max[1] += 1; + min[1] -= 1; + } + + var aspect = (max[0] - min[0]) / (max[1] - min[1]); // FIXME If get view rect after data processed? + + var viewRect = getViewRect$2(seriesModel, api, aspect); // Position may be NaN, use view rect instead + + if (isNaN(aspect)) { + min = [viewRect.x, viewRect.y]; + max = [viewRect.x + viewRect.width, viewRect.y + viewRect.height]; + } + + var bbWidth = max[0] - min[0]; + var bbHeight = max[1] - min[1]; + var viewWidth = viewRect.width; + var viewHeight = viewRect.height; + var viewCoordSys = seriesModel.coordinateSystem = new View(); + viewCoordSys.zoomLimit = seriesModel.get('scaleLimit'); + viewCoordSys.setBoundingRect(min[0], min[1], bbWidth, bbHeight); + viewCoordSys.setViewRect(viewRect.x, viewRect.y, viewWidth, viewHeight); // Update roam info + + viewCoordSys.setCenter(seriesModel.get('center'), api); + viewCoordSys.setZoom(seriesModel.get('zoom')); + viewList.push(viewCoordSys); + } + }); + return viewList; + } + + var straightLineProto = Line.prototype; + var bezierCurveProto = BezierCurve.prototype; + + var StraightLineShape = + /** @class */ + function () { + function StraightLineShape() { + // Start point + this.x1 = 0; + this.y1 = 0; // End point + + this.x2 = 0; + this.y2 = 0; + this.percent = 1; + } + + return StraightLineShape; + }(); + + var CurveShape = + /** @class */ + function (_super) { + __extends(CurveShape, _super); + + function CurveShape() { + return _super !== null && _super.apply(this, arguments) || this; + } + + return CurveShape; + }(StraightLineShape); + + function isStraightLine(shape) { + return isNaN(+shape.cpx1) || isNaN(+shape.cpy1); + } + + var ECLinePath = + /** @class */ + function (_super) { + __extends(ECLinePath, _super); + + function ECLinePath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'ec-line'; + return _this; + } + + ECLinePath.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + + ECLinePath.prototype.getDefaultShape = function () { + return new StraightLineShape(); + }; + + ECLinePath.prototype.buildPath = function (ctx, shape) { + if (isStraightLine(shape)) { + straightLineProto.buildPath.call(this, ctx, shape); + } else { + bezierCurveProto.buildPath.call(this, ctx, shape); + } + }; + + ECLinePath.prototype.pointAt = function (t) { + if (isStraightLine(this.shape)) { + return straightLineProto.pointAt.call(this, t); + } else { + return bezierCurveProto.pointAt.call(this, t); + } + }; + + ECLinePath.prototype.tangentAt = function (t) { + var shape = this.shape; + var p = isStraightLine(shape) ? [shape.x2 - shape.x1, shape.y2 - shape.y1] : bezierCurveProto.tangentAt.call(this, t); + return normalize(p, p); + }; + + return ECLinePath; + }(Path); + + var SYMBOL_CATEGORIES = ['fromSymbol', 'toSymbol']; + + function makeSymbolTypeKey(symbolCategory) { + return '_' + symbolCategory + 'Type'; + } + /** + * @inner + */ + + + function createSymbol$1(name, lineData, idx) { + var symbolType = lineData.getItemVisual(idx, name); + + if (!symbolType || symbolType === 'none') { + return; + } + + var symbolSize = lineData.getItemVisual(idx, name + 'Size'); + var symbolRotate = lineData.getItemVisual(idx, name + 'Rotate'); + var symbolOffset = lineData.getItemVisual(idx, name + 'Offset'); + var symbolKeepAspect = lineData.getItemVisual(idx, name + 'KeepAspect'); + var symbolSizeArr = normalizeSymbolSize(symbolSize); + var symbolOffsetArr = normalizeSymbolOffset(symbolOffset || 0, symbolSizeArr); + var symbolPath = createSymbol(symbolType, -symbolSizeArr[0] / 2 + symbolOffsetArr[0], -symbolSizeArr[1] / 2 + symbolOffsetArr[1], symbolSizeArr[0], symbolSizeArr[1], null, symbolKeepAspect); + symbolPath.__specifiedRotation = symbolRotate == null || isNaN(symbolRotate) ? void 0 : +symbolRotate * Math.PI / 180 || 0; + symbolPath.name = name; + return symbolPath; + } + + function createLine(points) { + var line = new ECLinePath({ + name: 'line', + subPixelOptimize: true + }); + setLinePoints(line.shape, points); + return line; + } + + function setLinePoints(targetShape, points) { + targetShape.x1 = points[0][0]; + targetShape.y1 = points[0][1]; + targetShape.x2 = points[1][0]; + targetShape.y2 = points[1][1]; + targetShape.percent = 1; + var cp1 = points[2]; + + if (cp1) { + targetShape.cpx1 = cp1[0]; + targetShape.cpy1 = cp1[1]; + } else { + targetShape.cpx1 = NaN; + targetShape.cpy1 = NaN; + } + } + + var Line$1 = + /** @class */ + function (_super) { + __extends(Line, _super); + + function Line(lineData, idx, seriesScope) { + var _this = _super.call(this) || this; + + _this._createLine(lineData, idx, seriesScope); + + return _this; + } + + Line.prototype._createLine = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + var linePoints = lineData.getItemLayout(idx); + var line = createLine(linePoints); + line.shape.percent = 0; + initProps(line, { + shape: { + percent: 1 + } + }, seriesModel, idx); + this.add(line); + each(SYMBOL_CATEGORIES, function (symbolCategory) { + var symbol = createSymbol$1(symbolCategory, lineData, idx); // symbols must added after line to make sure + // it will be updated after line#update. + // Or symbol position and rotation update in line#beforeUpdate will be one frame slow + + this.add(symbol); + this[makeSymbolTypeKey(symbolCategory)] = lineData.getItemVisual(idx, symbolCategory); + }, this); + + this._updateCommonStl(lineData, idx, seriesScope); + }; // TODO More strict on the List type in parameters? + + + Line.prototype.updateData = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + var line = this.childOfName('line'); + var linePoints = lineData.getItemLayout(idx); + var target = { + shape: {} + }; + setLinePoints(target.shape, linePoints); + updateProps(line, target, seriesModel, idx); + each(SYMBOL_CATEGORIES, function (symbolCategory) { + var symbolType = lineData.getItemVisual(idx, symbolCategory); + var key = makeSymbolTypeKey(symbolCategory); // Symbol changed + + if (this[key] !== symbolType) { + this.remove(this.childOfName(symbolCategory)); + var symbol = createSymbol$1(symbolCategory, lineData, idx); + this.add(symbol); + } + + this[key] = symbolType; + }, this); + + this._updateCommonStl(lineData, idx, seriesScope); + }; + + Line.prototype.getLinePath = function () { + return this.childAt(0); + }; + + Line.prototype._updateCommonStl = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + var line = this.childOfName('line'); + var emphasisLineStyle = seriesScope && seriesScope.emphasisLineStyle; + var blurLineStyle = seriesScope && seriesScope.blurLineStyle; + var selectLineStyle = seriesScope && seriesScope.selectLineStyle; + var labelStatesModels = seriesScope && seriesScope.labelStatesModels; + var emphasisDisabled = seriesScope && seriesScope.emphasisDisabled; + var focus = seriesScope && seriesScope.focus; + var blurScope = seriesScope && seriesScope.blurScope; // Optimization for large dataset + + if (!seriesScope || lineData.hasItemOption) { + var itemModel = lineData.getItemModel(idx); + var emphasisModel = itemModel.getModel('emphasis'); + emphasisLineStyle = emphasisModel.getModel('lineStyle').getLineStyle(); + blurLineStyle = itemModel.getModel(['blur', 'lineStyle']).getLineStyle(); + selectLineStyle = itemModel.getModel(['select', 'lineStyle']).getLineStyle(); + emphasisDisabled = emphasisModel.get('disabled'); + focus = emphasisModel.get('focus'); + blurScope = emphasisModel.get('blurScope'); + labelStatesModels = getLabelStatesModels(itemModel); + } + + var lineStyle = lineData.getItemVisual(idx, 'style'); + var visualColor = lineStyle.stroke; + line.useStyle(lineStyle); + line.style.fill = null; + line.style.strokeNoScale = true; + line.ensureState('emphasis').style = emphasisLineStyle; + line.ensureState('blur').style = blurLineStyle; + line.ensureState('select').style = selectLineStyle; // Update symbol + + each(SYMBOL_CATEGORIES, function (symbolCategory) { + var symbol = this.childOfName(symbolCategory); + + if (symbol) { + // Share opacity and color with line. + symbol.setColor(visualColor); + symbol.style.opacity = lineStyle.opacity; + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var lineState = line.getState(stateName); + + if (lineState) { + var lineStateStyle = lineState.style || {}; + var state = symbol.ensureState(stateName); + var stateStyle = state.style || (state.style = {}); + + if (lineStateStyle.stroke != null) { + stateStyle[symbol.__isEmptyBrush ? 'stroke' : 'fill'] = lineStateStyle.stroke; + } + + if (lineStateStyle.opacity != null) { + stateStyle.opacity = lineStateStyle.opacity; + } + } + } + + symbol.markRedraw(); + } + }, this); + var rawVal = seriesModel.getRawValue(idx); + setLabelStyle(this, labelStatesModels, { + labelDataIndex: idx, + labelFetcher: { + getFormattedLabel: function (dataIndex, stateName) { + return seriesModel.getFormattedLabel(dataIndex, stateName, lineData.dataType); + } + }, + inheritColor: visualColor || '#000', + defaultOpacity: lineStyle.opacity, + defaultText: (rawVal == null ? lineData.getName(idx) : isFinite(rawVal) ? round(rawVal) : rawVal) + '' + }); + var label = this.getTextContent(); // Always set `textStyle` even if `normalStyle.text` is null, because default + // values have to be set on `normalStyle`. + + if (label) { + var labelNormalModel = labelStatesModels.normal; + label.__align = label.style.align; + label.__verticalAlign = label.style.verticalAlign; // 'start', 'middle', 'end' + + label.__position = labelNormalModel.get('position') || 'middle'; + var distance = labelNormalModel.get('distance'); + + if (!isArray(distance)) { + distance = [distance, distance]; + } + + label.__labelDistance = distance; + } + + this.setTextConfig({ + position: null, + local: true, + inside: false // Can't be inside for stroke element. + + }); + toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled); + }; + + Line.prototype.highlight = function () { + enterEmphasis(this); + }; + + Line.prototype.downplay = function () { + leaveEmphasis(this); + }; + + Line.prototype.updateLayout = function (lineData, idx) { + this.setLinePoints(lineData.getItemLayout(idx)); + }; + + Line.prototype.setLinePoints = function (points) { + var linePath = this.childOfName('line'); + setLinePoints(linePath.shape, points); + linePath.dirty(); + }; + + Line.prototype.beforeUpdate = function () { + var lineGroup = this; + var symbolFrom = lineGroup.childOfName('fromSymbol'); + var symbolTo = lineGroup.childOfName('toSymbol'); + var label = lineGroup.getTextContent(); // Quick reject + + if (!symbolFrom && !symbolTo && (!label || label.ignore)) { + return; + } + + var invScale = 1; + var parentNode = this.parent; + + while (parentNode) { + if (parentNode.scaleX) { + invScale /= parentNode.scaleX; + } + + parentNode = parentNode.parent; + } + + var line = lineGroup.childOfName('line'); // If line not changed + // FIXME Parent scale changed + + if (!this.__dirty && !line.__dirty) { + return; + } + + var percent = line.shape.percent; + var fromPos = line.pointAt(0); + var toPos = line.pointAt(percent); + var d = sub([], toPos, fromPos); + normalize(d, d); + + function setSymbolRotation(symbol, percent) { + // Fix #12388 + // when symbol is set to be 'arrow' in markLine, + // symbolRotate value will be ignored, and compulsively use tangent angle. + // rotate by default if symbol rotation is not specified + var specifiedRotation = symbol.__specifiedRotation; + + if (specifiedRotation == null) { + var tangent = line.tangentAt(percent); + symbol.attr('rotation', (percent === 1 ? -1 : 1) * Math.PI / 2 - Math.atan2(tangent[1], tangent[0])); + } else { + symbol.attr('rotation', specifiedRotation); + } + } + + if (symbolFrom) { + symbolFrom.setPosition(fromPos); + setSymbolRotation(symbolFrom, 0); + symbolFrom.scaleX = symbolFrom.scaleY = invScale * percent; + symbolFrom.markRedraw(); + } + + if (symbolTo) { + symbolTo.setPosition(toPos); + setSymbolRotation(symbolTo, 1); + symbolTo.scaleX = symbolTo.scaleY = invScale * percent; + symbolTo.markRedraw(); + } + + if (label && !label.ignore) { + label.x = label.y = 0; + label.originX = label.originY = 0; + var textAlign = void 0; + var textVerticalAlign = void 0; + var distance = label.__labelDistance; + var distanceX = distance[0] * invScale; + var distanceY = distance[1] * invScale; + var halfPercent = percent / 2; + var tangent = line.tangentAt(halfPercent); + var n = [tangent[1], -tangent[0]]; + var cp = line.pointAt(halfPercent); + + if (n[1] > 0) { + n[0] = -n[0]; + n[1] = -n[1]; + } + + var dir = tangent[0] < 0 ? -1 : 1; + + if (label.__position !== 'start' && label.__position !== 'end') { + var rotation = -Math.atan2(tangent[1], tangent[0]); + + if (toPos[0] < fromPos[0]) { + rotation = Math.PI + rotation; + } + + label.rotation = rotation; + } + + var dy = void 0; + + switch (label.__position) { + case 'insideStartTop': + case 'insideMiddleTop': + case 'insideEndTop': + case 'middle': + dy = -distanceY; + textVerticalAlign = 'bottom'; + break; + + case 'insideStartBottom': + case 'insideMiddleBottom': + case 'insideEndBottom': + dy = distanceY; + textVerticalAlign = 'top'; + break; + + default: + dy = 0; + textVerticalAlign = 'middle'; + } + + switch (label.__position) { + case 'end': + label.x = d[0] * distanceX + toPos[0]; + label.y = d[1] * distanceY + toPos[1]; + textAlign = d[0] > 0.8 ? 'left' : d[0] < -0.8 ? 'right' : 'center'; + textVerticalAlign = d[1] > 0.8 ? 'top' : d[1] < -0.8 ? 'bottom' : 'middle'; + break; + + case 'start': + label.x = -d[0] * distanceX + fromPos[0]; + label.y = -d[1] * distanceY + fromPos[1]; + textAlign = d[0] > 0.8 ? 'right' : d[0] < -0.8 ? 'left' : 'center'; + textVerticalAlign = d[1] > 0.8 ? 'bottom' : d[1] < -0.8 ? 'top' : 'middle'; + break; + + case 'insideStartTop': + case 'insideStart': + case 'insideStartBottom': + label.x = distanceX * dir + fromPos[0]; + label.y = fromPos[1] + dy; + textAlign = tangent[0] < 0 ? 'right' : 'left'; + label.originX = -distanceX * dir; + label.originY = -dy; + break; + + case 'insideMiddleTop': + case 'insideMiddle': + case 'insideMiddleBottom': + case 'middle': + label.x = cp[0]; + label.y = cp[1] + dy; + textAlign = 'center'; + label.originY = -dy; + break; + + case 'insideEndTop': + case 'insideEnd': + case 'insideEndBottom': + label.x = -distanceX * dir + toPos[0]; + label.y = toPos[1] + dy; + textAlign = tangent[0] >= 0 ? 'right' : 'left'; + label.originX = distanceX * dir; + label.originY = -dy; + break; + } + + label.scaleX = label.scaleY = invScale; + label.setStyle({ + // Use the user specified text align and baseline first + verticalAlign: label.__verticalAlign || textVerticalAlign, + align: label.__align || textAlign + }); + } + }; + + return Line; + }(Group); + + var LineDraw = + /** @class */ + function () { + function LineDraw(LineCtor) { + this.group = new Group(); + this._LineCtor = LineCtor || Line$1; + } + + LineDraw.prototype.updateData = function (lineData) { + var _this = this; // Remove progressive els. + + + this._progressiveEls = null; + var lineDraw = this; + var group = lineDraw.group; + var oldLineData = lineDraw._lineData; + lineDraw._lineData = lineData; // There is no oldLineData only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + + if (!oldLineData) { + group.removeAll(); + } + + var seriesScope = makeSeriesScope$1(lineData); + lineData.diff(oldLineData).add(function (idx) { + _this._doAdd(lineData, idx, seriesScope); + }).update(function (newIdx, oldIdx) { + _this._doUpdate(oldLineData, lineData, oldIdx, newIdx, seriesScope); + }).remove(function (idx) { + group.remove(oldLineData.getItemGraphicEl(idx)); + }).execute(); + }; + + LineDraw.prototype.updateLayout = function () { + var lineData = this._lineData; // Do not support update layout in incremental mode. + + if (!lineData) { + return; + } + + lineData.eachItemGraphicEl(function (el, idx) { + el.updateLayout(lineData, idx); + }, this); + }; + + LineDraw.prototype.incrementalPrepareUpdate = function (lineData) { + this._seriesScope = makeSeriesScope$1(lineData); + this._lineData = null; + this.group.removeAll(); + }; + + LineDraw.prototype.incrementalUpdate = function (taskParams, lineData) { + this._progressiveEls = []; + + function updateIncrementalAndHover(el) { + if (!el.isGroup && !isEffectObject(el)) { + el.incremental = true; + el.ensureState('emphasis').hoverLayer = true; + } + } + + for (var idx = taskParams.start; idx < taskParams.end; idx++) { + var itemLayout = lineData.getItemLayout(idx); + + if (lineNeedsDraw(itemLayout)) { + var el = new this._LineCtor(lineData, idx, this._seriesScope); + el.traverse(updateIncrementalAndHover); + this.group.add(el); + lineData.setItemGraphicEl(idx, el); + + this._progressiveEls.push(el); + } + } + }; + + LineDraw.prototype.remove = function () { + this.group.removeAll(); + }; + + LineDraw.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + LineDraw.prototype._doAdd = function (lineData, idx, seriesScope) { + var itemLayout = lineData.getItemLayout(idx); + + if (!lineNeedsDraw(itemLayout)) { + return; + } + + var el = new this._LineCtor(lineData, idx, seriesScope); + lineData.setItemGraphicEl(idx, el); + this.group.add(el); + }; + + LineDraw.prototype._doUpdate = function (oldLineData, newLineData, oldIdx, newIdx, seriesScope) { + var itemEl = oldLineData.getItemGraphicEl(oldIdx); + + if (!lineNeedsDraw(newLineData.getItemLayout(newIdx))) { + this.group.remove(itemEl); + return; + } + + if (!itemEl) { + itemEl = new this._LineCtor(newLineData, newIdx, seriesScope); + } else { + itemEl.updateData(newLineData, newIdx, seriesScope); + } + + newLineData.setItemGraphicEl(newIdx, itemEl); + this.group.add(itemEl); + }; + + return LineDraw; + }(); + + function isEffectObject(el) { + return el.animators && el.animators.length > 0; + } + + function makeSeriesScope$1(lineData) { + var hostModel = lineData.hostModel; + var emphasisModel = hostModel.getModel('emphasis'); + return { + lineStyle: hostModel.getModel('lineStyle').getLineStyle(), + emphasisLineStyle: emphasisModel.getModel(['lineStyle']).getLineStyle(), + blurLineStyle: hostModel.getModel(['blur', 'lineStyle']).getLineStyle(), + selectLineStyle: hostModel.getModel(['select', 'lineStyle']).getLineStyle(), + emphasisDisabled: emphasisModel.get('disabled'), + blurScope: emphasisModel.get('blurScope'), + focus: emphasisModel.get('focus'), + labelStatesModels: getLabelStatesModels(hostModel) + }; + } + + function isPointNaN(pt) { + return isNaN(pt[0]) || isNaN(pt[1]); + } + + function lineNeedsDraw(pts) { + return pts && !isPointNaN(pts[0]) && !isPointNaN(pts[1]); + } + + var v1 = []; + var v2 = []; + var v3 = []; + var quadraticAt$1 = quadraticAt; + var v2DistSquare = distSquare; + var mathAbs$2 = Math.abs; + + function intersectCurveCircle(curvePoints, center, radius) { + var p0 = curvePoints[0]; + var p1 = curvePoints[1]; + var p2 = curvePoints[2]; + var d = Infinity; + var t; + var radiusSquare = radius * radius; + var interval = 0.1; + + for (var _t = 0.1; _t <= 0.9; _t += 0.1) { + v1[0] = quadraticAt$1(p0[0], p1[0], p2[0], _t); + v1[1] = quadraticAt$1(p0[1], p1[1], p2[1], _t); + var diff = mathAbs$2(v2DistSquare(v1, center) - radiusSquare); + + if (diff < d) { + d = diff; + t = _t; + } + } // Assume the segment is monotone,Find root through Bisection method + // At most 32 iteration + + + for (var i = 0; i < 32; i++) { + // let prev = t - interval; + var next = t + interval; // v1[0] = quadraticAt(p0[0], p1[0], p2[0], prev); + // v1[1] = quadraticAt(p0[1], p1[1], p2[1], prev); + + v2[0] = quadraticAt$1(p0[0], p1[0], p2[0], t); + v2[1] = quadraticAt$1(p0[1], p1[1], p2[1], t); + v3[0] = quadraticAt$1(p0[0], p1[0], p2[0], next); + v3[1] = quadraticAt$1(p0[1], p1[1], p2[1], next); + var diff = v2DistSquare(v2, center) - radiusSquare; + + if (mathAbs$2(diff) < 1e-2) { + break; + } // let prevDiff = v2DistSquare(v1, center) - radiusSquare; + + + var nextDiff = v2DistSquare(v3, center) - radiusSquare; + interval /= 2; + + if (diff < 0) { + if (nextDiff >= 0) { + t = t + interval; + } else { + t = t - interval; + } + } else { + if (nextDiff >= 0) { + t = t - interval; + } else { + t = t + interval; + } + } + } + + return t; + } // Adjust edge to avoid + + + function adjustEdge(graph, scale) { + var tmp0 = []; + var quadraticSubdivide$1 = quadraticSubdivide; + var pts = [[], [], []]; + var pts2 = [[], []]; + var v = []; + scale /= 2; + graph.eachEdge(function (edge, idx) { + var linePoints = edge.getLayout(); + var fromSymbol = edge.getVisual('fromSymbol'); + var toSymbol = edge.getVisual('toSymbol'); + + if (!linePoints.__original) { + linePoints.__original = [clone$1(linePoints[0]), clone$1(linePoints[1])]; + + if (linePoints[2]) { + linePoints.__original.push(clone$1(linePoints[2])); + } + } + + var originalPoints = linePoints.__original; // Quadratic curve + + if (linePoints[2] != null) { + copy(pts[0], originalPoints[0]); + copy(pts[1], originalPoints[2]); + copy(pts[2], originalPoints[1]); + + if (fromSymbol && fromSymbol !== 'none') { + var symbolSize = getSymbolSize(edge.node1); + var t = intersectCurveCircle(pts, originalPoints[0], symbolSize * scale); // Subdivide and get the second + + quadraticSubdivide$1(pts[0][0], pts[1][0], pts[2][0], t, tmp0); + pts[0][0] = tmp0[3]; + pts[1][0] = tmp0[4]; + quadraticSubdivide$1(pts[0][1], pts[1][1], pts[2][1], t, tmp0); + pts[0][1] = tmp0[3]; + pts[1][1] = tmp0[4]; + } + + if (toSymbol && toSymbol !== 'none') { + var symbolSize = getSymbolSize(edge.node2); + var t = intersectCurveCircle(pts, originalPoints[1], symbolSize * scale); // Subdivide and get the first + + quadraticSubdivide$1(pts[0][0], pts[1][0], pts[2][0], t, tmp0); + pts[1][0] = tmp0[1]; + pts[2][0] = tmp0[2]; + quadraticSubdivide$1(pts[0][1], pts[1][1], pts[2][1], t, tmp0); + pts[1][1] = tmp0[1]; + pts[2][1] = tmp0[2]; + } // Copy back to layout + + + copy(linePoints[0], pts[0]); + copy(linePoints[1], pts[2]); + copy(linePoints[2], pts[1]); + } // Line + else { + copy(pts2[0], originalPoints[0]); + copy(pts2[1], originalPoints[1]); + sub(v, pts2[1], pts2[0]); + normalize(v, v); + + if (fromSymbol && fromSymbol !== 'none') { + var symbolSize = getSymbolSize(edge.node1); + scaleAndAdd(pts2[0], pts2[0], v, symbolSize * scale); + } + + if (toSymbol && toSymbol !== 'none') { + var symbolSize = getSymbolSize(edge.node2); + scaleAndAdd(pts2[1], pts2[1], v, -symbolSize * scale); + } + + copy(linePoints[0], pts2[0]); + copy(linePoints[1], pts2[1]); + } + }); + } + + function isViewCoordSys(coordSys) { + return coordSys.type === 'view'; + } + + var GraphView = + /** @class */ + function (_super) { + __extends(GraphView, _super); + + function GraphView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GraphView.type; + return _this; + } + + GraphView.prototype.init = function (ecModel, api) { + var symbolDraw = new SymbolDraw(); + var lineDraw = new LineDraw(); + var group = this.group; + this._controller = new RoamController(api.getZr()); + this._controllerHost = { + target: group + }; + group.add(symbolDraw.group); + group.add(lineDraw.group); + this._symbolDraw = symbolDraw; + this._lineDraw = lineDraw; + this._firstRender = true; + }; + + GraphView.prototype.render = function (seriesModel, ecModel, api) { + var _this = this; + + var coordSys = seriesModel.coordinateSystem; + this._model = seriesModel; + var symbolDraw = this._symbolDraw; + var lineDraw = this._lineDraw; + var group = this.group; + + if (isViewCoordSys(coordSys)) { + var groupNewProp = { + x: coordSys.x, + y: coordSys.y, + scaleX: coordSys.scaleX, + scaleY: coordSys.scaleY + }; + + if (this._firstRender) { + group.attr(groupNewProp); + } else { + updateProps(group, groupNewProp, seriesModel); + } + } // Fix edge contact point with node + + + adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); + var data = seriesModel.getData(); + symbolDraw.updateData(data); + var edgeData = seriesModel.getEdgeData(); // TODO: TYPE + + lineDraw.updateData(edgeData); + + this._updateNodeAndLinkScale(); + + this._updateController(seriesModel, ecModel, api); + + clearTimeout(this._layoutTimeout); + var forceLayout = seriesModel.forceLayout; + var layoutAnimation = seriesModel.get(['force', 'layoutAnimation']); + + if (forceLayout) { + this._startForceLayoutIteration(forceLayout, layoutAnimation); + } + + data.graph.eachNode(function (node) { + var idx = node.dataIndex; + var el = node.getGraphicEl(); + var itemModel = node.getModel(); + + if (!el) { + return; + } // Update draggable + + + el.off('drag').off('dragend'); + var draggable = itemModel.get('draggable'); + + if (draggable) { + el.on('drag', function () { + if (forceLayout) { + forceLayout.warmUp(); + !_this._layouting && _this._startForceLayoutIteration(forceLayout, layoutAnimation); + forceLayout.setFixed(idx); // Write position back to layout + + data.setItemLayout(idx, [el.x, el.y]); + } + }).on('dragend', function () { + if (forceLayout) { + forceLayout.setUnfixed(idx); + } + }); + } + + el.setDraggable(draggable && !!forceLayout, !!itemModel.get('cursor')); + var focus = itemModel.get(['emphasis', 'focus']); + + if (focus === 'adjacency') { + getECData(el).focus = node.getAdjacentDataIndices(); + } + }); + data.graph.eachEdge(function (edge) { + var el = edge.getGraphicEl(); + var focus = edge.getModel().get(['emphasis', 'focus']); + + if (!el) { + return; + } + + if (focus === 'adjacency') { + getECData(el).focus = { + edge: [edge.dataIndex], + node: [edge.node1.dataIndex, edge.node2.dataIndex] + }; + } + }); + var circularRotateLabel = seriesModel.get('layout') === 'circular' && seriesModel.get(['circular', 'rotateLabel']); + var cx = data.getLayout('cx'); + var cy = data.getLayout('cy'); + data.eachItemGraphicEl(function (el, idx) { + var itemModel = data.getItemModel(idx); + var labelRotate = itemModel.get(['label', 'rotate']) || 0; + var symbolPath = el.getSymbolPath(); + + if (circularRotateLabel) { + var pos = data.getItemLayout(idx); + var rad = Math.atan2(pos[1] - cy, pos[0] - cx); + + if (rad < 0) { + rad = Math.PI * 2 + rad; + } + + var isLeft = pos[0] < cx; + + if (isLeft) { + rad = rad - Math.PI; + } + + var textPosition = isLeft ? 'left' : 'right'; + symbolPath.setTextConfig({ + rotation: -rad, + position: textPosition, + origin: 'center' + }); + var emphasisState = symbolPath.ensureState('emphasis'); + extend(emphasisState.textConfig || (emphasisState.textConfig = {}), { + position: textPosition + }); + } else { + symbolPath.setTextConfig({ + rotation: labelRotate *= Math.PI / 180 + }); + } + }); + this._firstRender = false; + }; + + GraphView.prototype.dispose = function () { + this._controller && this._controller.dispose(); + this._controllerHost = null; + }; + + GraphView.prototype._startForceLayoutIteration = function (forceLayout, layoutAnimation) { + var self = this; + + (function step() { + forceLayout.step(function (stopped) { + self.updateLayout(self._model); + (self._layouting = !stopped) && (layoutAnimation ? self._layoutTimeout = setTimeout(step, 16) : step()); + }); + })(); + }; + + GraphView.prototype._updateController = function (seriesModel, ecModel, api) { + var _this = this; + + var controller = this._controller; + var controllerHost = this._controllerHost; + var group = this.group; + controller.setPointerChecker(function (e, x, y) { + var rect = group.getBoundingRect(); + rect.applyTransform(group.transform); + return rect.contain(x, y) && !onIrrelevantElement(e, api, seriesModel); + }); + + if (!isViewCoordSys(seriesModel.coordinateSystem)) { + controller.disable(); + return; + } + + controller.enable(seriesModel.get('roam')); + controllerHost.zoomLimit = seriesModel.get('scaleLimit'); + controllerHost.zoom = seriesModel.coordinateSystem.getZoom(); + controller.off('pan').off('zoom').on('pan', function (e) { + updateViewOnPan(controllerHost, e.dx, e.dy); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'graphRoam', + dx: e.dx, + dy: e.dy + }); + }).on('zoom', function (e) { + updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'graphRoam', + zoom: e.scale, + originX: e.originX, + originY: e.originY + }); + + _this._updateNodeAndLinkScale(); + + adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); + + _this._lineDraw.updateLayout(); // Only update label layout on zoom + + + api.updateLabelLayout(); + }); + }; + + GraphView.prototype._updateNodeAndLinkScale = function () { + var seriesModel = this._model; + var data = seriesModel.getData(); + var nodeScale = getNodeGlobalScale(seriesModel); + data.eachItemGraphicEl(function (el, idx) { + el && el.setSymbolScale(nodeScale); + }); + }; + + GraphView.prototype.updateLayout = function (seriesModel) { + adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); + + this._symbolDraw.updateLayout(); + + this._lineDraw.updateLayout(); + }; + + GraphView.prototype.remove = function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(); + this._lineDraw && this._lineDraw.remove(); + }; + + GraphView.type = 'graph'; + return GraphView; + }(ChartView); + + function generateNodeKey(id) { + return '_EC_' + id; + } + + var Graph = + /** @class */ + function () { + function Graph(directed) { + this.type = 'graph'; + this.nodes = []; + this.edges = []; + this._nodesMap = {}; + /** + * @type {Object.<string, module:echarts/data/Graph.Edge>} + * @private + */ + + this._edgesMap = {}; + this._directed = directed || false; + } + /** + * If is directed graph + */ + + + Graph.prototype.isDirected = function () { + return this._directed; + }; + /** + * Add a new node + */ + + Graph.prototype.addNode = function (id, dataIndex) { + id = id == null ? '' + dataIndex : '' + id; + var nodesMap = this._nodesMap; + + if (nodesMap[generateNodeKey(id)]) { + if ("development" !== 'production') { + console.error('Graph nodes have duplicate name or id'); + } + + return; + } + + var node = new GraphNode(id, dataIndex); + node.hostGraph = this; + this.nodes.push(node); + nodesMap[generateNodeKey(id)] = node; + return node; + }; + /** + * Get node by data index + */ + + Graph.prototype.getNodeByIndex = function (dataIndex) { + var rawIdx = this.data.getRawIndex(dataIndex); + return this.nodes[rawIdx]; + }; + /** + * Get node by id + */ + + Graph.prototype.getNodeById = function (id) { + return this._nodesMap[generateNodeKey(id)]; + }; + /** + * Add a new edge + */ + + Graph.prototype.addEdge = function (n1, n2, dataIndex) { + var nodesMap = this._nodesMap; + var edgesMap = this._edgesMap; // PNEDING + + if (isNumber(n1)) { + n1 = this.nodes[n1]; + } + + if (isNumber(n2)) { + n2 = this.nodes[n2]; + } + + if (!(n1 instanceof GraphNode)) { + n1 = nodesMap[generateNodeKey(n1)]; + } + + if (!(n2 instanceof GraphNode)) { + n2 = nodesMap[generateNodeKey(n2)]; + } + + if (!n1 || !n2) { + return; + } + + var key = n1.id + '-' + n2.id; + var edge = new GraphEdge(n1, n2, dataIndex); + edge.hostGraph = this; + + if (this._directed) { + n1.outEdges.push(edge); + n2.inEdges.push(edge); + } + + n1.edges.push(edge); + + if (n1 !== n2) { + n2.edges.push(edge); + } + + this.edges.push(edge); + edgesMap[key] = edge; + return edge; + }; + /** + * Get edge by data index + */ + + Graph.prototype.getEdgeByIndex = function (dataIndex) { + var rawIdx = this.edgeData.getRawIndex(dataIndex); + return this.edges[rawIdx]; + }; + /** + * Get edge by two linked nodes + */ + + Graph.prototype.getEdge = function (n1, n2) { + if (n1 instanceof GraphNode) { + n1 = n1.id; + } + + if (n2 instanceof GraphNode) { + n2 = n2.id; + } + + var edgesMap = this._edgesMap; + + if (this._directed) { + return edgesMap[n1 + '-' + n2]; + } else { + return edgesMap[n1 + '-' + n2] || edgesMap[n2 + '-' + n1]; + } + }; + /** + * Iterate all nodes + */ + + Graph.prototype.eachNode = function (cb, context) { + var nodes = this.nodes; + var len = nodes.length; + + for (var i = 0; i < len; i++) { + if (nodes[i].dataIndex >= 0) { + cb.call(context, nodes[i], i); + } + } + }; + /** + * Iterate all edges + */ + + Graph.prototype.eachEdge = function (cb, context) { + var edges = this.edges; + var len = edges.length; + + for (var i = 0; i < len; i++) { + if (edges[i].dataIndex >= 0 && edges[i].node1.dataIndex >= 0 && edges[i].node2.dataIndex >= 0) { + cb.call(context, edges[i], i); + } + } + }; + /** + * Breadth first traverse + * Return true to stop traversing + */ + + Graph.prototype.breadthFirstTraverse = function (cb, startNode, direction, context) { + if (!(startNode instanceof GraphNode)) { + startNode = this._nodesMap[generateNodeKey(startNode)]; + } + + if (!startNode) { + return; + } + + var edgeType = direction === 'out' ? 'outEdges' : direction === 'in' ? 'inEdges' : 'edges'; + + for (var i = 0; i < this.nodes.length; i++) { + this.nodes[i].__visited = false; + } + + if (cb.call(context, startNode, null)) { + return; + } + + var queue = [startNode]; + + while (queue.length) { + var currentNode = queue.shift(); + var edges = currentNode[edgeType]; + + for (var i = 0; i < edges.length; i++) { + var e = edges[i]; + var otherNode = e.node1 === currentNode ? e.node2 : e.node1; + + if (!otherNode.__visited) { + if (cb.call(context, otherNode, currentNode)) { + // Stop traversing + return; + } + + queue.push(otherNode); + otherNode.__visited = true; + } + } + } + }; + // depthFirstTraverse( + // cb, startNode, direction, context + // ) { + // }; + // Filter update + + Graph.prototype.update = function () { + var data = this.data; + var edgeData = this.edgeData; + var nodes = this.nodes; + var edges = this.edges; + + for (var i = 0, len = nodes.length; i < len; i++) { + nodes[i].dataIndex = -1; + } + + for (var i = 0, len = data.count(); i < len; i++) { + nodes[data.getRawIndex(i)].dataIndex = i; + } + + edgeData.filterSelf(function (idx) { + var edge = edges[edgeData.getRawIndex(idx)]; + return edge.node1.dataIndex >= 0 && edge.node2.dataIndex >= 0; + }); // Update edge + + for (var i = 0, len = edges.length; i < len; i++) { + edges[i].dataIndex = -1; + } + + for (var i = 0, len = edgeData.count(); i < len; i++) { + edges[edgeData.getRawIndex(i)].dataIndex = i; + } + }; + /** + * @return {module:echarts/data/Graph} + */ + + Graph.prototype.clone = function () { + var graph = new Graph(this._directed); + var nodes = this.nodes; + var edges = this.edges; + + for (var i = 0; i < nodes.length; i++) { + graph.addNode(nodes[i].id, nodes[i].dataIndex); + } + + for (var i = 0; i < edges.length; i++) { + var e = edges[i]; + graph.addEdge(e.node1.id, e.node2.id, e.dataIndex); + } + + return graph; + }; + return Graph; + }(); + + var GraphNode = + /** @class */ + function () { + function GraphNode(id, dataIndex) { + this.inEdges = []; + this.outEdges = []; + this.edges = []; + this.dataIndex = -1; + this.id = id == null ? '' : id; + this.dataIndex = dataIndex == null ? -1 : dataIndex; + } + /** + * @return {number} + */ + + + GraphNode.prototype.degree = function () { + return this.edges.length; + }; + /** + * @return {number} + */ + + + GraphNode.prototype.inDegree = function () { + return this.inEdges.length; + }; + /** + * @return {number} + */ + + + GraphNode.prototype.outDegree = function () { + return this.outEdges.length; + }; + + GraphNode.prototype.getModel = function (path) { + if (this.dataIndex < 0) { + return; + } + + var graph = this.hostGraph; + var itemModel = graph.data.getItemModel(this.dataIndex); + return itemModel.getModel(path); + }; + + GraphNode.prototype.getAdjacentDataIndices = function () { + var dataIndices = { + edge: [], + node: [] + }; + + for (var i = 0; i < this.edges.length; i++) { + var adjacentEdge = this.edges[i]; + + if (adjacentEdge.dataIndex < 0) { + continue; + } + + dataIndices.edge.push(adjacentEdge.dataIndex); + dataIndices.node.push(adjacentEdge.node1.dataIndex, adjacentEdge.node2.dataIndex); + } + + return dataIndices; + }; + + return GraphNode; + }(); + + var GraphEdge = + /** @class */ + function () { + function GraphEdge(n1, n2, dataIndex) { + this.dataIndex = -1; + this.node1 = n1; + this.node2 = n2; + this.dataIndex = dataIndex == null ? -1 : dataIndex; + } // eslint-disable-next-line @typescript-eslint/no-unused-vars + + + GraphEdge.prototype.getModel = function (path) { + if (this.dataIndex < 0) { + return; + } + + var graph = this.hostGraph; + var itemModel = graph.edgeData.getItemModel(this.dataIndex); + return itemModel.getModel(path); + }; + + GraphEdge.prototype.getAdjacentDataIndices = function () { + return { + edge: [this.dataIndex], + node: [this.node1.dataIndex, this.node2.dataIndex] + }; + }; + + return GraphEdge; + }(); + + function createGraphDataProxyMixin(hostName, dataName) { + return { + /** + * @param Default 'value'. can be 'a', 'b', 'c', 'd', 'e'. + */ + getValue: function (dimension) { + var data = this[hostName][dataName]; + return data.getStore().get(data.getDimensionIndex(dimension || 'value'), this.dataIndex); + }, + // TODO: TYPE stricter type. + setVisual: function (key, value) { + this.dataIndex >= 0 && this[hostName][dataName].setItemVisual(this.dataIndex, key, value); + }, + getVisual: function (key) { + return this[hostName][dataName].getItemVisual(this.dataIndex, key); + }, + setLayout: function (layout, merge) { + this.dataIndex >= 0 && this[hostName][dataName].setItemLayout(this.dataIndex, layout, merge); + }, + getLayout: function () { + return this[hostName][dataName].getItemLayout(this.dataIndex); + }, + getGraphicEl: function () { + return this[hostName][dataName].getItemGraphicEl(this.dataIndex); + }, + getRawIndex: function () { + return this[hostName][dataName].getRawIndex(this.dataIndex); + } + }; + } + mixin(GraphNode, createGraphDataProxyMixin('hostGraph', 'data')); + mixin(GraphEdge, createGraphDataProxyMixin('hostGraph', 'edgeData')); + + function createGraphFromNodeEdge(nodes, edges, seriesModel, directed, beforeLink) { + // ??? TODO + // support dataset? + var graph = new Graph(directed); + + for (var i = 0; i < nodes.length; i++) { + graph.addNode(retrieve( // Id, name, dataIndex + nodes[i].id, nodes[i].name, i), i); + } + + var linkNameList = []; + var validEdges = []; + var linkCount = 0; + + for (var i = 0; i < edges.length; i++) { + var link = edges[i]; + var source = link.source; + var target = link.target; // addEdge may fail when source or target not exists + + if (graph.addEdge(source, target, linkCount)) { + validEdges.push(link); + linkNameList.push(retrieve(convertOptionIdName(link.id, null), source + ' > ' + target)); + linkCount++; + } + } + + var coordSys = seriesModel.get('coordinateSystem'); + var nodeData; + + if (coordSys === 'cartesian2d' || coordSys === 'polar') { + nodeData = createSeriesData(nodes, seriesModel); + } else { + var coordSysCtor = CoordinateSystemManager.get(coordSys); + var coordDimensions = coordSysCtor ? coordSysCtor.dimensions || [] : []; // FIXME: Some geo do not need `value` dimenson, whereas `calendar` needs + // `value` dimension, but graph need `value` dimension. It's better to + // uniform this behavior. + + if (indexOf(coordDimensions, 'value') < 0) { + coordDimensions.concat(['value']); + } + + var dimensions = prepareSeriesDataSchema(nodes, { + coordDimensions: coordDimensions, + encodeDefine: seriesModel.getEncode() + }).dimensions; + nodeData = new SeriesData(dimensions, seriesModel); + nodeData.initData(nodes); + } + + var edgeData = new SeriesData(['value'], seriesModel); + edgeData.initData(validEdges, linkNameList); + beforeLink && beforeLink(nodeData, edgeData); + linkSeriesData({ + mainData: nodeData, + struct: graph, + structAttr: 'graph', + datas: { + node: nodeData, + edge: edgeData + }, + datasAttr: { + node: 'data', + edge: 'edgeData' + } + }); // Update dataIndex of nodes and edges because invalid edge may be removed + + graph.update(); + return graph; + } + + var GraphSeriesModel = + /** @class */ + function (_super) { + __extends(GraphSeriesModel, _super); + + function GraphSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GraphSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } + + GraphSeriesModel.prototype.init = function (option) { + _super.prototype.init.apply(this, arguments); + + var self = this; + + function getCategoriesData() { + return self._categoriesData; + } // Provide data for legend select + + + this.legendVisualProvider = new LegendVisualProvider(getCategoriesData, getCategoriesData); + this.fillDataTextStyle(option.edges || option.links); + + this._updateCategoriesData(); + }; + + GraphSeriesModel.prototype.mergeOption = function (option) { + _super.prototype.mergeOption.apply(this, arguments); + + this.fillDataTextStyle(option.edges || option.links); + + this._updateCategoriesData(); + }; + + GraphSeriesModel.prototype.mergeDefaultAndTheme = function (option) { + _super.prototype.mergeDefaultAndTheme.apply(this, arguments); + + defaultEmphasis(option, 'edgeLabel', ['show']); + }; + + GraphSeriesModel.prototype.getInitialData = function (option, ecModel) { + var edges = option.edges || option.links || []; + var nodes = option.data || option.nodes || []; + var self = this; + + if (nodes && edges) { + // auto curveness + initCurvenessList(this); + var graph = createGraphFromNodeEdge(nodes, edges, this, true, beforeLink); + each(graph.edges, function (edge) { + createEdgeMapForCurveness(edge.node1, edge.node2, this, edge.dataIndex); + }, this); + return graph.data; + } + + function beforeLink(nodeData, edgeData) { + // Overwrite nodeData.getItemModel to + nodeData.wrapMethod('getItemModel', function (model) { + var categoriesModels = self._categoriesModels; + var categoryIdx = model.getShallow('category'); + var categoryModel = categoriesModels[categoryIdx]; + + if (categoryModel) { + categoryModel.parentModel = model.parentModel; + model.parentModel = categoryModel; + } + + return model; + }); // TODO Inherit resolveParentPath by default in Model#getModel? + + var oldGetModel = Model.prototype.getModel; + + function newGetModel(path, parentModel) { + var model = oldGetModel.call(this, path, parentModel); + model.resolveParentPath = resolveParentPath; + return model; + } + + edgeData.wrapMethod('getItemModel', function (model) { + model.resolveParentPath = resolveParentPath; + model.getModel = newGetModel; + return model; + }); + + function resolveParentPath(pathArr) { + if (pathArr && (pathArr[0] === 'label' || pathArr[1] === 'label')) { + var newPathArr = pathArr.slice(); + + if (pathArr[0] === 'label') { + newPathArr[0] = 'edgeLabel'; + } else if (pathArr[1] === 'label') { + newPathArr[1] = 'edgeLabel'; + } + + return newPathArr; + } + + return pathArr; + } + } + }; + + GraphSeriesModel.prototype.getGraph = function () { + return this.getData().graph; + }; + + GraphSeriesModel.prototype.getEdgeData = function () { + return this.getGraph().edgeData; + }; + + GraphSeriesModel.prototype.getCategoriesData = function () { + return this._categoriesData; + }; + + GraphSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + if (dataType === 'edge') { + var nodeData = this.getData(); + var params = this.getDataParams(dataIndex, dataType); + var edge = nodeData.graph.getEdgeByIndex(dataIndex); + var sourceName = nodeData.getName(edge.node1.dataIndex); + var targetName = nodeData.getName(edge.node2.dataIndex); + var nameArr = []; + sourceName != null && nameArr.push(sourceName); + targetName != null && nameArr.push(targetName); + return createTooltipMarkup('nameValue', { + name: nameArr.join(' > '), + value: params.value, + noValue: params.value == null + }); + } // dataType === 'node' or empty + + + var nodeMarkup = defaultSeriesFormatTooltip({ + series: this, + dataIndex: dataIndex, + multipleSeries: multipleSeries + }); + return nodeMarkup; + }; + + GraphSeriesModel.prototype._updateCategoriesData = function () { + var categories = map(this.option.categories || [], function (category) { + // Data must has value + return category.value != null ? category : extend({ + value: 0 + }, category); + }); + var categoriesData = new SeriesData(['value'], this); + categoriesData.initData(categories); + this._categoriesData = categoriesData; + this._categoriesModels = categoriesData.mapArray(function (idx) { + return categoriesData.getItemModel(idx); + }); + }; + + GraphSeriesModel.prototype.setZoom = function (zoom) { + this.option.zoom = zoom; + }; + + GraphSeriesModel.prototype.setCenter = function (center) { + this.option.center = center; + }; + + GraphSeriesModel.prototype.isAnimationEnabled = function () { + return _super.prototype.isAnimationEnabled.call(this) // Not enable animation when do force layout + && !(this.get('layout') === 'force' && this.get(['force', 'layoutAnimation'])); + }; + + GraphSeriesModel.type = 'series.graph'; + GraphSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar']; + GraphSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'view', + // Default option for all coordinate systems + // xAxisIndex: 0, + // yAxisIndex: 0, + // polarIndex: 0, + // geoIndex: 0, + legendHoverLink: true, + layout: null, + // Configuration of circular layout + circular: { + rotateLabel: false + }, + // Configuration of force directed layout + force: { + initLayout: null, + // Node repulsion. Can be an array to represent range. + repulsion: [0, 50], + gravity: 0.1, + // Initial friction + friction: 0.6, + // Edge length. Can be an array to represent range. + edgeLength: 30, + layoutAnimation: true + }, + left: 'center', + top: 'center', + // right: null, + // bottom: null, + // width: '80%', + // height: '80%', + symbol: 'circle', + symbolSize: 10, + edgeSymbol: ['none', 'none'], + edgeSymbolSize: 10, + edgeLabel: { + position: 'middle', + distance: 5 + }, + draggable: false, + roam: false, + // Default on center of graph + center: null, + zoom: 1, + // Symbol size scale ratio in roam + nodeScaleRatio: 0.6, + // cursor: null, + // categories: [], + // data: [] + // Or + // nodes: [] + // + // links: [] + // Or + // edges: [] + label: { + show: false, + formatter: '{b}' + }, + itemStyle: {}, + lineStyle: { + color: '#aaa', + width: 1, + opacity: 0.5 + }, + emphasis: { + scale: true, + label: { + show: true + } + }, + select: { + itemStyle: { + borderColor: '#212121' + } + } + }; + return GraphSeriesModel; + }(SeriesModel); + + var actionInfo = { + type: 'graphRoam', + event: 'graphRoam', + update: 'none' + }; + function install$d(registers) { + registers.registerChartView(GraphView); + registers.registerSeriesModel(GraphSeriesModel); + registers.registerProcessor(categoryFilter); + registers.registerVisual(categoryVisual); + registers.registerVisual(graphEdgeVisual); + registers.registerLayout(graphSimpleLayout); + registers.registerLayout(registers.PRIORITY.VISUAL.POST_CHART_LAYOUT, graphCircularLayout); + registers.registerLayout(graphForceLayout); + registers.registerCoordinateSystem('graphView', { + dimensions: View.dimensions, + create: createViewCoordSys + }); // Register legacy focus actions + + registers.registerAction({ + type: 'focusNodeAdjacency', + event: 'focusNodeAdjacency', + update: 'series:focusNodeAdjacency' + }, noop); + registers.registerAction({ + type: 'unfocusNodeAdjacency', + event: 'unfocusNodeAdjacency', + update: 'series:unfocusNodeAdjacency' + }, noop); // Register roam action. + + registers.registerAction(actionInfo, function (payload, ecModel, api) { + ecModel.eachComponent({ + mainType: 'series', + query: payload + }, function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var res = updateCenterAndZoom(coordSys, payload, undefined, api); + seriesModel.setCenter && seriesModel.setCenter(res.center); + seriesModel.setZoom && seriesModel.setZoom(res.zoom); + }); + }); + } + + var PointerShape = + /** @class */ + function () { + function PointerShape() { + this.angle = 0; + this.width = 10; + this.r = 10; + this.x = 0; + this.y = 0; + } + + return PointerShape; + }(); + + var PointerPath = + /** @class */ + function (_super) { + __extends(PointerPath, _super); + + function PointerPath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'pointer'; + return _this; + } + + PointerPath.prototype.getDefaultShape = function () { + return new PointerShape(); + }; + + PointerPath.prototype.buildPath = function (ctx, shape) { + var mathCos = Math.cos; + var mathSin = Math.sin; + var r = shape.r; + var width = shape.width; + var angle = shape.angle; + var x = shape.x - mathCos(angle) * width * (width >= r / 3 ? 1 : 2); + var y = shape.y - mathSin(angle) * width * (width >= r / 3 ? 1 : 2); + angle = shape.angle - Math.PI / 2; + ctx.moveTo(x, y); + ctx.lineTo(shape.x + mathCos(angle) * width, shape.y + mathSin(angle) * width); + ctx.lineTo(shape.x + mathCos(shape.angle) * r, shape.y + mathSin(shape.angle) * r); + ctx.lineTo(shape.x - mathCos(angle) * width, shape.y - mathSin(angle) * width); + ctx.lineTo(x, y); + }; + + return PointerPath; + }(Path); + + function parsePosition(seriesModel, api) { + var center = seriesModel.get('center'); + var width = api.getWidth(); + var height = api.getHeight(); + var size = Math.min(width, height); + var cx = parsePercent$1(center[0], api.getWidth()); + var cy = parsePercent$1(center[1], api.getHeight()); + var r = parsePercent$1(seriesModel.get('radius'), size / 2); + return { + cx: cx, + cy: cy, + r: r + }; + } + + function formatLabel(value, labelFormatter) { + var label = value == null ? '' : value + ''; + + if (labelFormatter) { + if (isString(labelFormatter)) { + label = labelFormatter.replace('{value}', label); + } else if (isFunction(labelFormatter)) { + label = labelFormatter(value); + } + } + + return label; + } + + var GaugeView = + /** @class */ + function (_super) { + __extends(GaugeView, _super); + + function GaugeView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GaugeView.type; + return _this; + } + + GaugeView.prototype.render = function (seriesModel, ecModel, api) { + this.group.removeAll(); + var colorList = seriesModel.get(['axisLine', 'lineStyle', 'color']); + var posInfo = parsePosition(seriesModel, api); + + this._renderMain(seriesModel, ecModel, api, colorList, posInfo); + + this._data = seriesModel.getData(); + }; + + GaugeView.prototype.dispose = function () {}; + + GaugeView.prototype._renderMain = function (seriesModel, ecModel, api, colorList, posInfo) { + var group = this.group; + var clockwise = seriesModel.get('clockwise'); + var startAngle = -seriesModel.get('startAngle') / 180 * Math.PI; + var endAngle = -seriesModel.get('endAngle') / 180 * Math.PI; + var axisLineModel = seriesModel.getModel('axisLine'); + var roundCap = axisLineModel.get('roundCap'); + var MainPath = roundCap ? SausagePath : Sector; + var showAxis = axisLineModel.get('show'); + var lineStyleModel = axisLineModel.getModel('lineStyle'); + var axisLineWidth = lineStyleModel.get('width'); + var angles = [startAngle, endAngle]; + normalizeArcAngles(angles, !clockwise); + startAngle = angles[0]; + endAngle = angles[1]; + var angleRangeSpan = endAngle - startAngle; + var prevEndAngle = startAngle; + + for (var i = 0; showAxis && i < colorList.length; i++) { + // Clamp + var percent = Math.min(Math.max(colorList[i][0], 0), 1); + endAngle = startAngle + angleRangeSpan * percent; + var sector = new MainPath({ + shape: { + startAngle: prevEndAngle, + endAngle: endAngle, + cx: posInfo.cx, + cy: posInfo.cy, + clockwise: clockwise, + r0: posInfo.r - axisLineWidth, + r: posInfo.r + }, + silent: true + }); + sector.setStyle({ + fill: colorList[i][1] + }); + sector.setStyle(lineStyleModel.getLineStyle( // Because we use sector to simulate arc + // so the properties for stroking are useless + ['color', 'width'])); + group.add(sector); + prevEndAngle = endAngle; + } + + var getColor = function (percent) { + // Less than 0 + if (percent <= 0) { + return colorList[0][1]; + } + + var i; + + for (i = 0; i < colorList.length; i++) { + if (colorList[i][0] >= percent && (i === 0 ? 0 : colorList[i - 1][0]) < percent) { + return colorList[i][1]; + } + } // More than 1 + + + return colorList[i - 1][1]; + }; + + this._renderTicks(seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth); + + this._renderTitleAndDetail(seriesModel, ecModel, api, getColor, posInfo); + + this._renderAnchor(seriesModel, posInfo); + + this._renderPointer(seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth); + }; + + GaugeView.prototype._renderTicks = function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth) { + var group = this.group; + var cx = posInfo.cx; + var cy = posInfo.cy; + var r = posInfo.r; + var minVal = +seriesModel.get('min'); + var maxVal = +seriesModel.get('max'); + var splitLineModel = seriesModel.getModel('splitLine'); + var tickModel = seriesModel.getModel('axisTick'); + var labelModel = seriesModel.getModel('axisLabel'); + var splitNumber = seriesModel.get('splitNumber'); + var subSplitNumber = tickModel.get('splitNumber'); + var splitLineLen = parsePercent$1(splitLineModel.get('length'), r); + var tickLen = parsePercent$1(tickModel.get('length'), r); + var angle = startAngle; + var step = (endAngle - startAngle) / splitNumber; + var subStep = step / subSplitNumber; + var splitLineStyle = splitLineModel.getModel('lineStyle').getLineStyle(); + var tickLineStyle = tickModel.getModel('lineStyle').getLineStyle(); + var splitLineDistance = splitLineModel.get('distance'); + var unitX; + var unitY; + + for (var i = 0; i <= splitNumber; i++) { + unitX = Math.cos(angle); + unitY = Math.sin(angle); // Split line + + if (splitLineModel.get('show')) { + var distance = splitLineDistance ? splitLineDistance + axisLineWidth : axisLineWidth; + var splitLine = new Line({ + shape: { + x1: unitX * (r - distance) + cx, + y1: unitY * (r - distance) + cy, + x2: unitX * (r - splitLineLen - distance) + cx, + y2: unitY * (r - splitLineLen - distance) + cy + }, + style: splitLineStyle, + silent: true + }); + + if (splitLineStyle.stroke === 'auto') { + splitLine.setStyle({ + stroke: getColor(i / splitNumber) + }); + } + + group.add(splitLine); + } // Label + + + if (labelModel.get('show')) { + var distance = labelModel.get('distance') + splitLineDistance; + var label = formatLabel(round(i / splitNumber * (maxVal - minVal) + minVal), labelModel.get('formatter')); + var autoColor = getColor(i / splitNumber); + group.add(new ZRText({ + style: createTextStyle(labelModel, { + text: label, + x: unitX * (r - splitLineLen - distance) + cx, + y: unitY * (r - splitLineLen - distance) + cy, + verticalAlign: unitY < -0.8 ? 'top' : unitY > 0.8 ? 'bottom' : 'middle', + align: unitX < -0.4 ? 'left' : unitX > 0.4 ? 'right' : 'center' + }, { + inheritColor: autoColor + }), + silent: true + })); + } // Axis tick + + + if (tickModel.get('show') && i !== splitNumber) { + var distance = tickModel.get('distance'); + distance = distance ? distance + axisLineWidth : axisLineWidth; + + for (var j = 0; j <= subSplitNumber; j++) { + unitX = Math.cos(angle); + unitY = Math.sin(angle); + var tickLine = new Line({ + shape: { + x1: unitX * (r - distance) + cx, + y1: unitY * (r - distance) + cy, + x2: unitX * (r - tickLen - distance) + cx, + y2: unitY * (r - tickLen - distance) + cy + }, + silent: true, + style: tickLineStyle + }); + + if (tickLineStyle.stroke === 'auto') { + tickLine.setStyle({ + stroke: getColor((i + j / subSplitNumber) / splitNumber) + }); + } + + group.add(tickLine); + angle += subStep; + } + + angle -= subStep; + } else { + angle += step; + } + } + }; + + GaugeView.prototype._renderPointer = function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth) { + var group = this.group; + var oldData = this._data; + var oldProgressData = this._progressEls; + var progressList = []; + var showPointer = seriesModel.get(['pointer', 'show']); + var progressModel = seriesModel.getModel('progress'); + var showProgress = progressModel.get('show'); + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var minVal = +seriesModel.get('min'); + var maxVal = +seriesModel.get('max'); + var valueExtent = [minVal, maxVal]; + var angleExtent = [startAngle, endAngle]; + + function createPointer(idx, angle) { + var itemModel = data.getItemModel(idx); + var pointerModel = itemModel.getModel('pointer'); + var pointerWidth = parsePercent$1(pointerModel.get('width'), posInfo.r); + var pointerLength = parsePercent$1(pointerModel.get('length'), posInfo.r); + var pointerStr = seriesModel.get(['pointer', 'icon']); + var pointerOffset = pointerModel.get('offsetCenter'); + var pointerOffsetX = parsePercent$1(pointerOffset[0], posInfo.r); + var pointerOffsetY = parsePercent$1(pointerOffset[1], posInfo.r); + var pointerKeepAspect = pointerModel.get('keepAspect'); + var pointer; // not exist icon type will be set 'rect' + + if (pointerStr) { + pointer = createSymbol(pointerStr, pointerOffsetX - pointerWidth / 2, pointerOffsetY - pointerLength, pointerWidth, pointerLength, null, pointerKeepAspect); + } else { + pointer = new PointerPath({ + shape: { + angle: -Math.PI / 2, + width: pointerWidth, + r: pointerLength, + x: pointerOffsetX, + y: pointerOffsetY + } + }); + } + + pointer.rotation = -(angle + Math.PI / 2); + pointer.x = posInfo.cx; + pointer.y = posInfo.cy; + return pointer; + } + + function createProgress(idx, endAngle) { + var roundCap = progressModel.get('roundCap'); + var ProgressPath = roundCap ? SausagePath : Sector; + var isOverlap = progressModel.get('overlap'); + var progressWidth = isOverlap ? progressModel.get('width') : axisLineWidth / data.count(); + var r0 = isOverlap ? posInfo.r - progressWidth : posInfo.r - (idx + 1) * progressWidth; + var r = isOverlap ? posInfo.r : posInfo.r - idx * progressWidth; + var progress = new ProgressPath({ + shape: { + startAngle: startAngle, + endAngle: endAngle, + cx: posInfo.cx, + cy: posInfo.cy, + clockwise: clockwise, + r0: r0, + r: r + } + }); + isOverlap && (progress.z2 = maxVal - data.get(valueDim, idx) % maxVal); + return progress; + } + + if (showProgress || showPointer) { + data.diff(oldData).add(function (idx) { + var val = data.get(valueDim, idx); + + if (showPointer) { + var pointer = createPointer(idx, startAngle); // TODO hide pointer on NaN value? + + initProps(pointer, { + rotation: -((isNaN(+val) ? angleExtent[0] : linearMap(val, valueExtent, angleExtent, true)) + Math.PI / 2) + }, seriesModel); + group.add(pointer); + data.setItemGraphicEl(idx, pointer); + } + + if (showProgress) { + var progress = createProgress(idx, startAngle); + var isClip = progressModel.get('clip'); + initProps(progress, { + shape: { + endAngle: linearMap(val, valueExtent, angleExtent, isClip) + } + }, seriesModel); + group.add(progress); // Add data index and series index for indexing the data by element + // Useful in tooltip + + setCommonECData(seriesModel.seriesIndex, data.dataType, idx, progress); + progressList[idx] = progress; + } + }).update(function (newIdx, oldIdx) { + var val = data.get(valueDim, newIdx); + + if (showPointer) { + var previousPointer = oldData.getItemGraphicEl(oldIdx); + var previousRotate = previousPointer ? previousPointer.rotation : startAngle; + var pointer = createPointer(newIdx, previousRotate); + pointer.rotation = previousRotate; + updateProps(pointer, { + rotation: -((isNaN(+val) ? angleExtent[0] : linearMap(val, valueExtent, angleExtent, true)) + Math.PI / 2) + }, seriesModel); + group.add(pointer); + data.setItemGraphicEl(newIdx, pointer); + } + + if (showProgress) { + var previousProgress = oldProgressData[oldIdx]; + var previousEndAngle = previousProgress ? previousProgress.shape.endAngle : startAngle; + var progress = createProgress(newIdx, previousEndAngle); + var isClip = progressModel.get('clip'); + updateProps(progress, { + shape: { + endAngle: linearMap(val, valueExtent, angleExtent, isClip) + } + }, seriesModel); + group.add(progress); // Add data index and series index for indexing the data by element + // Useful in tooltip + + setCommonECData(seriesModel.seriesIndex, data.dataType, newIdx, progress); + progressList[newIdx] = progress; + } + }).execute(); + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var emphasisModel = itemModel.getModel('emphasis'); + var focus = emphasisModel.get('focus'); + var blurScope = emphasisModel.get('blurScope'); + var emphasisDisabled = emphasisModel.get('disabled'); + + if (showPointer) { + var pointer = data.getItemGraphicEl(idx); + var symbolStyle = data.getItemVisual(idx, 'style'); + var visualColor = symbolStyle.fill; + + if (pointer instanceof ZRImage) { + var pathStyle = pointer.style; + pointer.useStyle(extend({ + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, symbolStyle)); + } else { + pointer.useStyle(symbolStyle); + pointer.type !== 'pointer' && pointer.setColor(visualColor); + } + + pointer.setStyle(itemModel.getModel(['pointer', 'itemStyle']).getItemStyle()); + + if (pointer.style.fill === 'auto') { + pointer.setStyle('fill', getColor(linearMap(data.get(valueDim, idx), valueExtent, [0, 1], true))); + } + + pointer.z2EmphasisLift = 0; + setStatesStylesFromModel(pointer, itemModel); + toggleHoverEmphasis(pointer, focus, blurScope, emphasisDisabled); + } + + if (showProgress) { + var progress = progressList[idx]; + progress.useStyle(data.getItemVisual(idx, 'style')); + progress.setStyle(itemModel.getModel(['progress', 'itemStyle']).getItemStyle()); + progress.z2EmphasisLift = 0; + setStatesStylesFromModel(progress, itemModel); + toggleHoverEmphasis(progress, focus, blurScope, emphasisDisabled); + } + }); + this._progressEls = progressList; + } + }; + + GaugeView.prototype._renderAnchor = function (seriesModel, posInfo) { + var anchorModel = seriesModel.getModel('anchor'); + var showAnchor = anchorModel.get('show'); + + if (showAnchor) { + var anchorSize = anchorModel.get('size'); + var anchorType = anchorModel.get('icon'); + var offsetCenter = anchorModel.get('offsetCenter'); + var anchorKeepAspect = anchorModel.get('keepAspect'); + var anchor = createSymbol(anchorType, posInfo.cx - anchorSize / 2 + parsePercent$1(offsetCenter[0], posInfo.r), posInfo.cy - anchorSize / 2 + parsePercent$1(offsetCenter[1], posInfo.r), anchorSize, anchorSize, null, anchorKeepAspect); + anchor.z2 = anchorModel.get('showAbove') ? 1 : 0; + anchor.setStyle(anchorModel.getModel('itemStyle').getItemStyle()); + this.group.add(anchor); + } + }; + + GaugeView.prototype._renderTitleAndDetail = function (seriesModel, ecModel, api, getColor, posInfo) { + var _this = this; + + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var minVal = +seriesModel.get('min'); + var maxVal = +seriesModel.get('max'); + var contentGroup = new Group(); + var newTitleEls = []; + var newDetailEls = []; + var hasAnimation = seriesModel.isAnimationEnabled(); + var showPointerAbove = seriesModel.get(['pointer', 'showAbove']); + data.diff(this._data).add(function (idx) { + newTitleEls[idx] = new ZRText({ + silent: true + }); + newDetailEls[idx] = new ZRText({ + silent: true + }); + }).update(function (idx, oldIdx) { + newTitleEls[idx] = _this._titleEls[oldIdx]; + newDetailEls[idx] = _this._detailEls[oldIdx]; + }).execute(); + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var value = data.get(valueDim, idx); + var itemGroup = new Group(); + var autoColor = getColor(linearMap(value, [minVal, maxVal], [0, 1], true)); + var itemTitleModel = itemModel.getModel('title'); + + if (itemTitleModel.get('show')) { + var titleOffsetCenter = itemTitleModel.get('offsetCenter'); + var titleX = posInfo.cx + parsePercent$1(titleOffsetCenter[0], posInfo.r); + var titleY = posInfo.cy + parsePercent$1(titleOffsetCenter[1], posInfo.r); + var labelEl = newTitleEls[idx]; + labelEl.attr({ + z2: showPointerAbove ? 0 : 2, + style: createTextStyle(itemTitleModel, { + x: titleX, + y: titleY, + text: data.getName(idx), + align: 'center', + verticalAlign: 'middle' + }, { + inheritColor: autoColor + }) + }); + itemGroup.add(labelEl); + } + + var itemDetailModel = itemModel.getModel('detail'); + + if (itemDetailModel.get('show')) { + var detailOffsetCenter = itemDetailModel.get('offsetCenter'); + var detailX = posInfo.cx + parsePercent$1(detailOffsetCenter[0], posInfo.r); + var detailY = posInfo.cy + parsePercent$1(detailOffsetCenter[1], posInfo.r); + var width = parsePercent$1(itemDetailModel.get('width'), posInfo.r); + var height = parsePercent$1(itemDetailModel.get('height'), posInfo.r); + var detailColor = seriesModel.get(['progress', 'show']) ? data.getItemVisual(idx, 'style').fill : autoColor; + var labelEl = newDetailEls[idx]; + var formatter_1 = itemDetailModel.get('formatter'); + labelEl.attr({ + z2: showPointerAbove ? 0 : 2, + style: createTextStyle(itemDetailModel, { + x: detailX, + y: detailY, + text: formatLabel(value, formatter_1), + width: isNaN(width) ? null : width, + height: isNaN(height) ? null : height, + align: 'center', + verticalAlign: 'middle' + }, { + inheritColor: detailColor + }) + }); + setLabelValueAnimation(labelEl, { + normal: itemDetailModel + }, value, function (value) { + return formatLabel(value, formatter_1); + }); + hasAnimation && animateLabelValue(labelEl, idx, data, seriesModel, { + getFormattedLabel: function (labelDataIndex, status, dataType, labelDimIndex, fmt, extendParams) { + return formatLabel(extendParams ? extendParams.interpolatedValue : value, formatter_1); + } + }); + itemGroup.add(labelEl); + } + + contentGroup.add(itemGroup); + }); + this.group.add(contentGroup); + this._titleEls = newTitleEls; + this._detailEls = newDetailEls; + }; + + GaugeView.type = 'gauge'; + return GaugeView; + }(ChartView); + + var GaugeSeriesModel = + /** @class */ + function (_super) { + __extends(GaugeSeriesModel, _super); + + function GaugeSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GaugeSeriesModel.type; + _this.visualStyleAccessPath = 'itemStyle'; + return _this; + } + + GaugeSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesDataSimply(this, ['value']); + }; + + GaugeSeriesModel.type = 'series.gauge'; + GaugeSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + colorBy: 'data', + // 默认全局居中 + center: ['50%', '50%'], + legendHoverLink: true, + radius: '75%', + startAngle: 225, + endAngle: -45, + clockwise: true, + // 最小值 + min: 0, + // 最大值 + max: 100, + // 分割段数,默认为10 + splitNumber: 10, + // 坐标轴线 + axisLine: { + // 默认显示,属性show控制显示与否 + show: true, + roundCap: false, + lineStyle: { + color: [[1, '#E6EBF8']], + width: 10 + } + }, + // 坐标轴线 + progress: { + // 默认显示,属性show控制显示与否 + show: false, + overlap: true, + width: 10, + roundCap: false, + clip: true + }, + // 分隔线 + splitLine: { + // 默认显示,属性show控制显示与否 + show: true, + // 属性length控制线长 + length: 10, + distance: 10, + // 属性lineStyle(详见lineStyle)控制线条样式 + lineStyle: { + color: '#63677A', + width: 3, + type: 'solid' + } + }, + // 坐标轴小标记 + axisTick: { + // 属性show控制显示与否,默认不显示 + show: true, + // 每份split细分多少段 + splitNumber: 5, + // 属性length控制线长 + length: 6, + distance: 10, + // 属性lineStyle控制线条样式 + lineStyle: { + color: '#63677A', + width: 1, + type: 'solid' + } + }, + axisLabel: { + show: true, + distance: 15, + // formatter: null, + color: '#464646', + fontSize: 12 + }, + pointer: { + icon: null, + offsetCenter: [0, 0], + show: true, + showAbove: true, + length: '60%', + width: 6, + keepAspect: false + }, + anchor: { + show: false, + showAbove: false, + size: 6, + icon: 'circle', + offsetCenter: [0, 0], + keepAspect: false, + itemStyle: { + color: '#fff', + borderWidth: 0, + borderColor: '#5470c6' + } + }, + title: { + show: true, + // x, y,单位px + offsetCenter: [0, '20%'], + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#464646', + fontSize: 16, + valueAnimation: false + }, + detail: { + show: true, + backgroundColor: 'rgba(0,0,0,0)', + borderWidth: 0, + borderColor: '#ccc', + width: 100, + height: null, + padding: [5, 10], + // x, y,单位px + offsetCenter: [0, '40%'], + // formatter: null, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#464646', + fontSize: 30, + fontWeight: 'bold', + lineHeight: 30, + valueAnimation: false + } + }; + return GaugeSeriesModel; + }(SeriesModel); + + function install$e(registers) { + registers.registerChartView(GaugeView); + registers.registerSeriesModel(GaugeSeriesModel); + } + + var opacityAccessPath = ['itemStyle', 'opacity']; + /** + * Piece of pie including Sector, Label, LabelLine + */ + + var FunnelPiece = + /** @class */ + function (_super) { + __extends(FunnelPiece, _super); + + function FunnelPiece(data, idx) { + var _this = _super.call(this) || this; + + var polygon = _this; + var labelLine = new Polyline(); + var text = new ZRText(); + polygon.setTextContent(text); + + _this.setTextGuideLine(labelLine); + + _this.updateData(data, idx, true); + + return _this; + } + + FunnelPiece.prototype.updateData = function (data, idx, firstCreate) { + var polygon = this; + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var emphasisModel = itemModel.getModel('emphasis'); + var opacity = itemModel.get(opacityAccessPath); + opacity = opacity == null ? 1 : opacity; + + if (!firstCreate) { + saveOldStyle(polygon); + } // Update common style + + + polygon.useStyle(data.getItemVisual(idx, 'style')); + polygon.style.lineJoin = 'round'; + + if (firstCreate) { + polygon.setShape({ + points: layout.points + }); + polygon.style.opacity = 0; + initProps(polygon, { + style: { + opacity: opacity + } + }, seriesModel, idx); + } else { + updateProps(polygon, { + style: { + opacity: opacity + }, + shape: { + points: layout.points + } + }, seriesModel, idx); + } + + setStatesStylesFromModel(polygon, itemModel); + + this._updateLabel(data, idx); + + toggleHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }; + + FunnelPiece.prototype._updateLabel = function (data, idx) { + var polygon = this; + var labelLine = this.getTextGuideLine(); + var labelText = polygon.getTextContent(); + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var labelLayout = layout.label; + var style = data.getItemVisual(idx, 'style'); + var visualColor = style.fill; + setLabelStyle( // position will not be used in setLabelStyle + labelText, getLabelStatesModels(itemModel), { + labelFetcher: data.hostModel, + labelDataIndex: idx, + defaultOpacity: style.opacity, + defaultText: data.getName(idx) + }, { + normal: { + align: labelLayout.textAlign, + verticalAlign: labelLayout.verticalAlign + } + }); + polygon.setTextConfig({ + local: true, + inside: !!labelLayout.inside, + insideStroke: visualColor, + // insideFill: 'auto', + outsideFill: visualColor + }); + var linePoints = labelLayout.linePoints; + labelLine.setShape({ + points: linePoints + }); + polygon.textGuideLineConfig = { + anchor: linePoints ? new Point(linePoints[0][0], linePoints[0][1]) : null + }; // Make sure update style on labelText after setLabelStyle. + // Because setLabelStyle will replace a new style on it. + + updateProps(labelText, { + style: { + x: labelLayout.x, + y: labelLayout.y + } + }, seriesModel, idx); + labelText.attr({ + rotation: labelLayout.rotation, + originX: labelLayout.x, + originY: labelLayout.y, + z2: 10 + }); + setLabelLineStyle(polygon, getLabelLineStatesModels(itemModel), { + // Default use item visual color + stroke: visualColor + }); + }; + + return FunnelPiece; + }(Polygon); + + var FunnelView = + /** @class */ + function (_super) { + __extends(FunnelView, _super); + + function FunnelView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = FunnelView.type; + _this.ignoreLabelLineUpdate = true; + return _this; + } + + FunnelView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var oldData = this._data; + var group = this.group; + data.diff(oldData).add(function (idx) { + var funnelPiece = new FunnelPiece(data, idx); + data.setItemGraphicEl(idx, funnelPiece); + group.add(funnelPiece); + }).update(function (newIdx, oldIdx) { + var piece = oldData.getItemGraphicEl(oldIdx); + piece.updateData(data, newIdx); + group.add(piece); + data.setItemGraphicEl(newIdx, piece); + }).remove(function (idx) { + var piece = oldData.getItemGraphicEl(idx); + removeElementWithFadeOut(piece, seriesModel, idx); + }).execute(); + this._data = data; + }; + + FunnelView.prototype.remove = function () { + this.group.removeAll(); + this._data = null; + }; + + FunnelView.prototype.dispose = function () {}; + + FunnelView.type = 'funnel'; + return FunnelView; + }(ChartView); + + var FunnelSeriesModel = + /** @class */ + function (_super) { + __extends(FunnelSeriesModel, _super); + + function FunnelSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = FunnelSeriesModel.type; + return _this; + } + + FunnelSeriesModel.prototype.init = function (option) { + _super.prototype.init.apply(this, arguments); // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + + + this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this)); // Extend labelLine emphasis + + this._defaultLabelLine(option); + }; + + FunnelSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesDataSimply(this, { + coordDimensions: ['value'], + encodeDefaulter: curry(makeSeriesEncodeForNameBased, this) + }); + }; + + FunnelSeriesModel.prototype._defaultLabelLine = function (option) { + // Extend labelLine emphasis + defaultEmphasis(option, 'labelLine', ['show']); + var labelLineNormalOpt = option.labelLine; + var labelLineEmphasisOpt = option.emphasis.labelLine; // Not show label line if `label.normal.show = false` + + labelLineNormalOpt.show = labelLineNormalOpt.show && option.label.show; + labelLineEmphasisOpt.show = labelLineEmphasisOpt.show && option.emphasis.label.show; + }; // Overwrite + + + FunnelSeriesModel.prototype.getDataParams = function (dataIndex) { + var data = this.getData(); + + var params = _super.prototype.getDataParams.call(this, dataIndex); + + var valueDim = data.mapDimension('value'); + var sum = data.getSum(valueDim); // Percent is 0 if sum is 0 + + params.percent = !sum ? 0 : +(data.get(valueDim, dataIndex) / sum * 100).toFixed(2); + params.$vars.push('percent'); + return params; + }; + + FunnelSeriesModel.type = 'series.funnel'; + FunnelSeriesModel.defaultOption = { + // zlevel: 0, // 一级层叠 + z: 2, + legendHoverLink: true, + colorBy: 'data', + left: 80, + top: 60, + right: 80, + bottom: 60, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + // 默认取数据最小最大值 + // min: 0, + // max: 100, + minSize: '0%', + maxSize: '100%', + sort: 'descending', + orient: 'vertical', + gap: 0, + funnelAlign: 'center', + label: { + show: true, + position: 'outer' // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + + }, + labelLine: { + show: true, + length: 20, + lineStyle: { + // color: 各异, + width: 1 + } + }, + itemStyle: { + // color: 各异, + borderColor: '#fff', + borderWidth: 1 + }, + emphasis: { + label: { + show: true + } + }, + select: { + itemStyle: { + borderColor: '#212121' + } + } + }; + return FunnelSeriesModel; + }(SeriesModel); + + function getViewRect$3(seriesModel, api) { + return getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + } + + function getSortedIndices(data, sort) { + var valueDim = data.mapDimension('value'); + var valueArr = data.mapArray(valueDim, function (val) { + return val; + }); + var indices = []; + var isAscending = sort === 'ascending'; + + for (var i = 0, len = data.count(); i < len; i++) { + indices[i] = i; + } // Add custom sortable function & none sortable opetion by "options.sort" + + + if (isFunction(sort)) { + indices.sort(sort); + } else if (sort !== 'none') { + indices.sort(function (a, b) { + return isAscending ? valueArr[a] - valueArr[b] : valueArr[b] - valueArr[a]; + }); + } + + return indices; + } + + function labelLayout(data) { + var seriesModel = data.hostModel; + var orient = seriesModel.get('orient'); + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var labelModel = itemModel.getModel('label'); + var labelPosition = labelModel.get('position'); + var labelLineModel = itemModel.getModel('labelLine'); + var layout = data.getItemLayout(idx); + var points = layout.points; + var isLabelInside = labelPosition === 'inner' || labelPosition === 'inside' || labelPosition === 'center' || labelPosition === 'insideLeft' || labelPosition === 'insideRight'; + var textAlign; + var textX; + var textY; + var linePoints; + + if (isLabelInside) { + if (labelPosition === 'insideLeft') { + textX = (points[0][0] + points[3][0]) / 2 + 5; + textY = (points[0][1] + points[3][1]) / 2; + textAlign = 'left'; + } else if (labelPosition === 'insideRight') { + textX = (points[1][0] + points[2][0]) / 2 - 5; + textY = (points[1][1] + points[2][1]) / 2; + textAlign = 'right'; + } else { + textX = (points[0][0] + points[1][0] + points[2][0] + points[3][0]) / 4; + textY = (points[0][1] + points[1][1] + points[2][1] + points[3][1]) / 4; + textAlign = 'center'; + } + + linePoints = [[textX, textY], [textX, textY]]; + } else { + var x1 = void 0; + var y1 = void 0; + var x2 = void 0; + var y2 = void 0; + var labelLineLen = labelLineModel.get('length'); + + if ("development" !== 'production') { + if (orient === 'vertical' && ['top', 'bottom'].indexOf(labelPosition) > -1) { + labelPosition = 'left'; + console.warn('Position error: Funnel chart on vertical orient dose not support top and bottom.'); + } + + if (orient === 'horizontal' && ['left', 'right'].indexOf(labelPosition) > -1) { + labelPosition = 'bottom'; + console.warn('Position error: Funnel chart on horizontal orient dose not support left and right.'); + } + } + + if (labelPosition === 'left') { + // Left side + x1 = (points[3][0] + points[0][0]) / 2; + y1 = (points[3][1] + points[0][1]) / 2; + x2 = x1 - labelLineLen; + textX = x2 - 5; + textAlign = 'right'; + } else if (labelPosition === 'right') { + // Right side + x1 = (points[1][0] + points[2][0]) / 2; + y1 = (points[1][1] + points[2][1]) / 2; + x2 = x1 + labelLineLen; + textX = x2 + 5; + textAlign = 'left'; + } else if (labelPosition === 'top') { + // Top side + x1 = (points[3][0] + points[0][0]) / 2; + y1 = (points[3][1] + points[0][1]) / 2; + y2 = y1 - labelLineLen; + textY = y2 - 5; + textAlign = 'center'; + } else if (labelPosition === 'bottom') { + // Bottom side + x1 = (points[1][0] + points[2][0]) / 2; + y1 = (points[1][1] + points[2][1]) / 2; + y2 = y1 + labelLineLen; + textY = y2 + 5; + textAlign = 'center'; + } else if (labelPosition === 'rightTop') { + // RightTop side + x1 = orient === 'horizontal' ? points[3][0] : points[1][0]; + y1 = orient === 'horizontal' ? points[3][1] : points[1][1]; + + if (orient === 'horizontal') { + y2 = y1 - labelLineLen; + textY = y2 - 5; + textAlign = 'center'; + } else { + x2 = x1 + labelLineLen; + textX = x2 + 5; + textAlign = 'top'; + } + } else if (labelPosition === 'rightBottom') { + // RightBottom side + x1 = points[2][0]; + y1 = points[2][1]; + + if (orient === 'horizontal') { + y2 = y1 + labelLineLen; + textY = y2 + 5; + textAlign = 'center'; + } else { + x2 = x1 + labelLineLen; + textX = x2 + 5; + textAlign = 'bottom'; + } + } else if (labelPosition === 'leftTop') { + // LeftTop side + x1 = points[0][0]; + y1 = orient === 'horizontal' ? points[0][1] : points[1][1]; + + if (orient === 'horizontal') { + y2 = y1 - labelLineLen; + textY = y2 - 5; + textAlign = 'center'; + } else { + x2 = x1 - labelLineLen; + textX = x2 - 5; + textAlign = 'right'; + } + } else if (labelPosition === 'leftBottom') { + // LeftBottom side + x1 = orient === 'horizontal' ? points[1][0] : points[3][0]; + y1 = orient === 'horizontal' ? points[1][1] : points[2][1]; + + if (orient === 'horizontal') { + y2 = y1 + labelLineLen; + textY = y2 + 5; + textAlign = 'center'; + } else { + x2 = x1 - labelLineLen; + textX = x2 - 5; + textAlign = 'right'; + } + } else { + // Right side or Bottom side + x1 = (points[1][0] + points[2][0]) / 2; + y1 = (points[1][1] + points[2][1]) / 2; + + if (orient === 'horizontal') { + y2 = y1 + labelLineLen; + textY = y2 + 5; + textAlign = 'center'; + } else { + x2 = x1 + labelLineLen; + textX = x2 + 5; + textAlign = 'left'; + } + } + + if (orient === 'horizontal') { + x2 = x1; + textX = x2; + } else { + y2 = y1; + textY = y2; + } + + linePoints = [[x1, y1], [x2, y2]]; + } + + layout.label = { + linePoints: linePoints, + x: textX, + y: textY, + verticalAlign: 'middle', + textAlign: textAlign, + inside: isLabelInside + }; + }); + } + + function funnelLayout(ecModel, api) { + ecModel.eachSeriesByType('funnel', function (seriesModel) { + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var sort = seriesModel.get('sort'); + var viewRect = getViewRect$3(seriesModel, api); + var orient = seriesModel.get('orient'); + var viewWidth = viewRect.width; + var viewHeight = viewRect.height; + var indices = getSortedIndices(data, sort); + var x = viewRect.x; + var y = viewRect.y; + var sizeExtent = orient === 'horizontal' ? [parsePercent$1(seriesModel.get('minSize'), viewHeight), parsePercent$1(seriesModel.get('maxSize'), viewHeight)] : [parsePercent$1(seriesModel.get('minSize'), viewWidth), parsePercent$1(seriesModel.get('maxSize'), viewWidth)]; + var dataExtent = data.getDataExtent(valueDim); + var min = seriesModel.get('min'); + var max = seriesModel.get('max'); + + if (min == null) { + min = Math.min(dataExtent[0], 0); + } + + if (max == null) { + max = dataExtent[1]; + } + + var funnelAlign = seriesModel.get('funnelAlign'); + var gap = seriesModel.get('gap'); + var viewSize = orient === 'horizontal' ? viewWidth : viewHeight; + var itemSize = (viewSize - gap * (data.count() - 1)) / data.count(); + + var getLinePoints = function (idx, offset) { + // End point index is data.count() and we assign it 0 + if (orient === 'horizontal') { + var val_1 = data.get(valueDim, idx) || 0; + var itemHeight = linearMap(val_1, [min, max], sizeExtent, true); + var y0 = void 0; + + switch (funnelAlign) { + case 'top': + y0 = y; + break; + + case 'center': + y0 = y + (viewHeight - itemHeight) / 2; + break; + + case 'bottom': + y0 = y + (viewHeight - itemHeight); + break; + } + + return [[offset, y0], [offset, y0 + itemHeight]]; + } + + var val = data.get(valueDim, idx) || 0; + var itemWidth = linearMap(val, [min, max], sizeExtent, true); + var x0; + + switch (funnelAlign) { + case 'left': + x0 = x; + break; + + case 'center': + x0 = x + (viewWidth - itemWidth) / 2; + break; + + case 'right': + x0 = x + viewWidth - itemWidth; + break; + } + + return [[x0, offset], [x0 + itemWidth, offset]]; + }; + + if (sort === 'ascending') { + // From bottom to top + itemSize = -itemSize; + gap = -gap; + + if (orient === 'horizontal') { + x += viewWidth; + } else { + y += viewHeight; + } + + indices = indices.reverse(); + } + + for (var i = 0; i < indices.length; i++) { + var idx = indices[i]; + var nextIdx = indices[i + 1]; + var itemModel = data.getItemModel(idx); + + if (orient === 'horizontal') { + var width = itemModel.get(['itemStyle', 'width']); + + if (width == null) { + width = itemSize; + } else { + width = parsePercent$1(width, viewWidth); + + if (sort === 'ascending') { + width = -width; + } + } + + var start = getLinePoints(idx, x); + var end = getLinePoints(nextIdx, x + width); + x += width + gap; + data.setItemLayout(idx, { + points: start.concat(end.slice().reverse()) + }); + } else { + var height = itemModel.get(['itemStyle', 'height']); + + if (height == null) { + height = itemSize; + } else { + height = parsePercent$1(height, viewHeight); + + if (sort === 'ascending') { + height = -height; + } + } + + var start = getLinePoints(idx, y); + var end = getLinePoints(nextIdx, y + height); + y += height + gap; + data.setItemLayout(idx, { + points: start.concat(end.slice().reverse()) + }); + } + } + + labelLayout(data); + }); + } + + function install$f(registers) { + registers.registerChartView(FunnelView); + registers.registerSeriesModel(FunnelSeriesModel); + registers.registerLayout(funnelLayout); + registers.registerProcessor(dataFilter('funnel')); + } + + var DEFAULT_SMOOTH = 0.3; + + var ParallelView = + /** @class */ + function (_super) { + __extends(ParallelView, _super); + + function ParallelView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelView.type; + _this._dataGroup = new Group(); + _this._initialized = false; + return _this; + } + + ParallelView.prototype.init = function () { + this.group.add(this._dataGroup); + }; + /** + * @override + */ + + + ParallelView.prototype.render = function (seriesModel, ecModel, api, payload) { + // Clear previously rendered progressive elements. + this._progressiveEls = null; + var dataGroup = this._dataGroup; + var data = seriesModel.getData(); + var oldData = this._data; + var coordSys = seriesModel.coordinateSystem; + var dimensions = coordSys.dimensions; + var seriesScope = makeSeriesScope$2(seriesModel); + data.diff(oldData).add(add).update(update).remove(remove).execute(); + + function add(newDataIndex) { + var line = addEl(data, dataGroup, newDataIndex, dimensions, coordSys); + updateElCommon(line, data, newDataIndex, seriesScope); + } + + function update(newDataIndex, oldDataIndex) { + var line = oldData.getItemGraphicEl(oldDataIndex); + var points = createLinePoints(data, newDataIndex, dimensions, coordSys); + data.setItemGraphicEl(newDataIndex, line); + updateProps(line, { + shape: { + points: points + } + }, seriesModel, newDataIndex); + saveOldStyle(line); + updateElCommon(line, data, newDataIndex, seriesScope); + } + + function remove(oldDataIndex) { + var line = oldData.getItemGraphicEl(oldDataIndex); + dataGroup.remove(line); + } // First create + + + if (!this._initialized) { + this._initialized = true; + var clipPath = createGridClipShape(coordSys, seriesModel, function () { + // Callback will be invoked immediately if there is no animation + setTimeout(function () { + dataGroup.removeClipPath(); + }); + }); + dataGroup.setClipPath(clipPath); + } + + this._data = data; + }; + + ParallelView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + this._initialized = true; + this._data = null; + + this._dataGroup.removeAll(); + }; + + ParallelView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + var dimensions = coordSys.dimensions; + var seriesScope = makeSeriesScope$2(seriesModel); + var progressiveEls = this._progressiveEls = []; + + for (var dataIndex = taskParams.start; dataIndex < taskParams.end; dataIndex++) { + var line = addEl(data, this._dataGroup, dataIndex, dimensions, coordSys); + line.incremental = true; + updateElCommon(line, data, dataIndex, seriesScope); + progressiveEls.push(line); + } + }; + + ParallelView.prototype.remove = function () { + this._dataGroup && this._dataGroup.removeAll(); + this._data = null; + }; + + ParallelView.type = 'parallel'; + return ParallelView; + }(ChartView); + + function createGridClipShape(coordSys, seriesModel, cb) { + var parallelModel = coordSys.model; + var rect = coordSys.getRect(); + var rectEl = new Rect({ + shape: { + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + } + }); + var dim = parallelModel.get('layout') === 'horizontal' ? 'width' : 'height'; + rectEl.setShape(dim, 0); + initProps(rectEl, { + shape: { + width: rect.width, + height: rect.height + } + }, seriesModel, cb); + return rectEl; + } + + function createLinePoints(data, dataIndex, dimensions, coordSys) { + var points = []; + + for (var i = 0; i < dimensions.length; i++) { + var dimName = dimensions[i]; + var value = data.get(data.mapDimension(dimName), dataIndex); + + if (!isEmptyValue(value, coordSys.getAxis(dimName).type)) { + points.push(coordSys.dataToPoint(value, dimName)); + } + } + + return points; + } + + function addEl(data, dataGroup, dataIndex, dimensions, coordSys) { + var points = createLinePoints(data, dataIndex, dimensions, coordSys); + var line = new Polyline({ + shape: { + points: points + }, + // silent: true, + z2: 10 + }); + dataGroup.add(line); + data.setItemGraphicEl(dataIndex, line); + return line; + } + + function makeSeriesScope$2(seriesModel) { + var smooth = seriesModel.get('smooth', true); + smooth === true && (smooth = DEFAULT_SMOOTH); + smooth = numericToNumber(smooth); + eqNaN(smooth) && (smooth = 0); + return { + smooth: smooth + }; + } + + function updateElCommon(el, data, dataIndex, seriesScope) { + el.useStyle(data.getItemVisual(dataIndex, 'style')); + el.style.fill = null; + el.setShape('smooth', seriesScope.smooth); + var itemModel = data.getItemModel(dataIndex); + var emphasisModel = itemModel.getModel('emphasis'); + setStatesStylesFromModel(el, itemModel, 'lineStyle'); + toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + } // function simpleDiff(oldData, newData, dimensions) { + // let oldLen; + // if (!oldData + // || !oldData.__plProgressive + // || (oldLen = oldData.count()) !== newData.count() + // ) { + // return true; + // } + // let dimLen = dimensions.length; + // for (let i = 0; i < oldLen; i++) { + // for (let j = 0; j < dimLen; j++) { + // if (oldData.get(dimensions[j], i) !== newData.get(dimensions[j], i)) { + // return true; + // } + // } + // } + // return false; + // } + // FIXME put in common util? + + + function isEmptyValue(val, axisType) { + return axisType === 'category' ? val == null : val == null || isNaN(val); // axisType === 'value' + } + + var ParallelSeriesModel = + /** @class */ + function (_super) { + __extends(ParallelSeriesModel, _super); + + function ParallelSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelSeriesModel.type; + _this.visualStyleAccessPath = 'lineStyle'; + _this.visualDrawType = 'stroke'; + return _this; + } + + ParallelSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this, { + useEncodeDefaulter: bind(makeDefaultEncode, null, this) + }); + }; + /** + * User can get data raw indices on 'axisAreaSelected' event received. + * + * @return Raw indices + */ + + + ParallelSeriesModel.prototype.getRawIndicesByActiveState = function (activeState) { + var coordSys = this.coordinateSystem; + var data = this.getData(); + var indices = []; + coordSys.eachActiveState(data, function (theActiveState, dataIndex) { + if (activeState === theActiveState) { + indices.push(data.getRawIndex(dataIndex)); + } + }); + return indices; + }; + + ParallelSeriesModel.type = 'series.parallel'; + ParallelSeriesModel.dependencies = ['parallel']; + ParallelSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'parallel', + parallelIndex: 0, + label: { + show: false + }, + inactiveOpacity: 0.05, + activeOpacity: 1, + lineStyle: { + width: 1, + opacity: 0.45, + type: 'solid' + }, + emphasis: { + label: { + show: false + } + }, + progressive: 500, + smooth: false, + animationEasing: 'linear' + }; + return ParallelSeriesModel; + }(SeriesModel); + + function makeDefaultEncode(seriesModel) { + // The mapping of parallelAxis dimension to data dimension can + // be specified in parallelAxis.option.dim. For example, if + // parallelAxis.option.dim is 'dim3', it mapping to the third + // dimension of data. But `data.encode` has higher priority. + // Moreover, parallelModel.dimension should not be regarded as data + // dimensions. Consider dimensions = ['dim4', 'dim2', 'dim6']; + var parallelModel = seriesModel.ecModel.getComponent('parallel', seriesModel.get('parallelIndex')); + + if (!parallelModel) { + return; + } + + var encodeDefine = {}; + each(parallelModel.dimensions, function (axisDim) { + var dataDimIndex = convertDimNameToNumber(axisDim); + encodeDefine[axisDim] = dataDimIndex; + }); + return encodeDefine; + } + + function convertDimNameToNumber(dimName) { + return +dimName.replace('dim', ''); + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + var opacityAccessPath$1 = ['lineStyle', 'opacity']; + var parallelVisual = { + seriesType: 'parallel', + reset: function (seriesModel, ecModel) { + var coordSys = seriesModel.coordinateSystem; + var opacityMap = { + normal: seriesModel.get(['lineStyle', 'opacity']), + active: seriesModel.get('activeOpacity'), + inactive: seriesModel.get('inactiveOpacity') + }; + return { + progress: function (params, data) { + coordSys.eachActiveState(data, function (activeState, dataIndex) { + var opacity = opacityMap[activeState]; + + if (activeState === 'normal' && data.hasItemOption) { + var itemOpacity = data.getItemModel(dataIndex).get(opacityAccessPath$1, true); + itemOpacity != null && (opacity = itemOpacity); + } + + var existsStyle = data.ensureUniqueItemVisual(dataIndex, 'style'); + existsStyle.opacity = opacity; + }, params.start, params.end); + } + }; + } + }; + + function parallelPreprocessor(option) { + createParallelIfNeeded(option); + mergeAxisOptionFromParallel(option); + } + /** + * Create a parallel coordinate if not exists. + * @inner + */ + + function createParallelIfNeeded(option) { + if (option.parallel) { + return; + } + + var hasParallelSeries = false; + each(option.series, function (seriesOpt) { + if (seriesOpt && seriesOpt.type === 'parallel') { + hasParallelSeries = true; + } + }); + + if (hasParallelSeries) { + option.parallel = [{}]; + } + } + /** + * Merge aixs definition from parallel option (if exists) to axis option. + * @inner + */ + + + function mergeAxisOptionFromParallel(option) { + var axes = normalizeToArray(option.parallelAxis); + each(axes, function (axisOption) { + if (!isObject(axisOption)) { + return; + } + + var parallelIndex = axisOption.parallelIndex || 0; + var parallelOption = normalizeToArray(option.parallel)[parallelIndex]; + + if (parallelOption && parallelOption.parallelAxisDefault) { + merge(axisOption, parallelOption.parallelAxisDefault, false); + } + }); + } + + var CLICK_THRESHOLD = 5; // > 4 + + var ParallelView$1 = + /** @class */ + function (_super) { + __extends(ParallelView, _super); + + function ParallelView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelView.type; + return _this; + } + + ParallelView.prototype.render = function (parallelModel, ecModel, api) { + this._model = parallelModel; + this._api = api; + + if (!this._handlers) { + this._handlers = {}; + each(handlers, function (handler, eventName) { + api.getZr().on(eventName, this._handlers[eventName] = bind(handler, this)); + }, this); + } + + createOrUpdate(this, '_throttledDispatchExpand', parallelModel.get('axisExpandRate'), 'fixRate'); + }; + + ParallelView.prototype.dispose = function (ecModel, api) { + clear(this, '_throttledDispatchExpand'); + each(this._handlers, function (handler, eventName) { + api.getZr().off(eventName, handler); + }); + this._handlers = null; + }; + /** + * @internal + * @param {Object} [opt] If null, cancle the last action triggering for debounce. + */ + + + ParallelView.prototype._throttledDispatchExpand = function (opt) { + this._dispatchExpand(opt); + }; + /** + * @internal + */ + + + ParallelView.prototype._dispatchExpand = function (opt) { + opt && this._api.dispatchAction(extend({ + type: 'parallelAxisExpand' + }, opt)); + }; + + ParallelView.type = 'parallel'; + return ParallelView; + }(ComponentView); + + var handlers = { + mousedown: function (e) { + if (checkTrigger(this, 'click')) { + this._mouseDownPoint = [e.offsetX, e.offsetY]; + } + }, + mouseup: function (e) { + var mouseDownPoint = this._mouseDownPoint; + + if (checkTrigger(this, 'click') && mouseDownPoint) { + var point = [e.offsetX, e.offsetY]; + var dist = Math.pow(mouseDownPoint[0] - point[0], 2) + Math.pow(mouseDownPoint[1] - point[1], 2); + + if (dist > CLICK_THRESHOLD) { + return; + } + + var result = this._model.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX, e.offsetY]); + + result.behavior !== 'none' && this._dispatchExpand({ + axisExpandWindow: result.axisExpandWindow + }); + } + + this._mouseDownPoint = null; + }, + mousemove: function (e) { + // Should do nothing when brushing. + if (this._mouseDownPoint || !checkTrigger(this, 'mousemove')) { + return; + } + + var model = this._model; + var result = model.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX, e.offsetY]); + var behavior = result.behavior; + behavior === 'jump' && this._throttledDispatchExpand.debounceNextCall(model.get('axisExpandDebounce')); + + this._throttledDispatchExpand(behavior === 'none' ? null // Cancle the last trigger, in case that mouse slide out of the area quickly. + : { + axisExpandWindow: result.axisExpandWindow, + // Jumping uses animation, and sliding suppresses animation. + animation: behavior === 'jump' ? null : { + duration: 0 // Disable animation. + + } + }); + } + }; + + function checkTrigger(view, triggerOn) { + var model = view._model; + return model.get('axisExpandable') && model.get('axisExpandTriggerOn') === triggerOn; + } + + var ParallelModel = + /** @class */ + function (_super) { + __extends(ParallelModel, _super); + + function ParallelModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelModel.type; + return _this; + } + + ParallelModel.prototype.init = function () { + _super.prototype.init.apply(this, arguments); + + this.mergeOption({}); + }; + + ParallelModel.prototype.mergeOption = function (newOption) { + var thisOption = this.option; + newOption && merge(thisOption, newOption, true); + + this._initDimensions(); + }; + /** + * Whether series or axis is in this coordinate system. + */ + + + ParallelModel.prototype.contains = function (model, ecModel) { + var parallelIndex = model.get('parallelIndex'); + return parallelIndex != null && ecModel.getComponent('parallel', parallelIndex) === this; + }; + + ParallelModel.prototype.setAxisExpand = function (opt) { + each(['axisExpandable', 'axisExpandCenter', 'axisExpandCount', 'axisExpandWidth', 'axisExpandWindow'], function (name) { + if (opt.hasOwnProperty(name)) { + // @ts-ignore FIXME: why "never" inferred in this.option[name]? + this.option[name] = opt[name]; + } + }, this); + }; + + ParallelModel.prototype._initDimensions = function () { + var dimensions = this.dimensions = []; + var parallelAxisIndex = this.parallelAxisIndex = []; + var axisModels = filter(this.ecModel.queryComponents({ + mainType: 'parallelAxis' + }), function (axisModel) { + // Can not use this.contains here, because + // initialization has not been completed yet. + return (axisModel.get('parallelIndex') || 0) === this.componentIndex; + }, this); + each(axisModels, function (axisModel) { + dimensions.push('dim' + axisModel.get('dim')); + parallelAxisIndex.push(axisModel.componentIndex); + }); + }; + + ParallelModel.type = 'parallel'; + ParallelModel.dependencies = ['parallelAxis']; + ParallelModel.layoutMode = 'box'; + ParallelModel.defaultOption = { + // zlevel: 0, + z: 0, + left: 80, + top: 60, + right: 80, + bottom: 60, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + layout: 'horizontal', + // FIXME + // naming? + axisExpandable: false, + axisExpandCenter: null, + axisExpandCount: 0, + axisExpandWidth: 50, + axisExpandRate: 17, + axisExpandDebounce: 50, + // [out, in, jumpTarget]. In percentage. If use [null, 0.05], null means full. + // Do not doc to user until necessary. + axisExpandSlideTriggerArea: [-0.15, 0.05, 0.4], + axisExpandTriggerOn: 'click', + parallelAxisDefault: null + }; + return ParallelModel; + }(ComponentModel); + + var ParallelAxis = + /** @class */ + function (_super) { + __extends(ParallelAxis, _super); + + function ParallelAxis(dim, scale, coordExtent, axisType, axisIndex) { + var _this = _super.call(this, dim, scale, coordExtent) || this; + + _this.type = axisType || 'value'; + _this.axisIndex = axisIndex; + return _this; + } + + ParallelAxis.prototype.isHorizontal = function () { + return this.coordinateSystem.getModel().get('layout') !== 'horizontal'; + }; + + return ParallelAxis; + }(Axis); + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + + /** + * Calculate slider move result. + * Usage: + * (1) If both handle0 and handle1 are needed to be moved, set minSpan the same as + * maxSpan and the same as `Math.abs(handleEnd[1] - handleEnds[0])`. + * (2) If handle0 is forbidden to cross handle1, set minSpan as `0`. + * + * @param delta Move length. + * @param handleEnds handleEnds[0] can be bigger then handleEnds[1]. + * handleEnds will be modified in this method. + * @param extent handleEnds is restricted by extent. + * extent[0] should less or equals than extent[1]. + * @param handleIndex Can be 'all', means that both move the two handleEnds. + * @param minSpan The range of dataZoom can not be smaller than that. + * If not set, handle0 and cross handle1. If set as a non-negative + * number (including `0`), handles will push each other when reaching + * the minSpan. + * @param maxSpan The range of dataZoom can not be larger than that. + * @return The input handleEnds. + */ + function sliderMove(delta, handleEnds, extent, handleIndex, minSpan, maxSpan) { + delta = delta || 0; + var extentSpan = extent[1] - extent[0]; // Notice maxSpan and minSpan can be null/undefined. + + if (minSpan != null) { + minSpan = restrict(minSpan, [0, extentSpan]); + } + + if (maxSpan != null) { + maxSpan = Math.max(maxSpan, minSpan != null ? minSpan : 0); + } + + if (handleIndex === 'all') { + var handleSpan = Math.abs(handleEnds[1] - handleEnds[0]); + handleSpan = restrict(handleSpan, [0, extentSpan]); + minSpan = maxSpan = restrict(handleSpan, [minSpan, maxSpan]); + handleIndex = 0; + } + + handleEnds[0] = restrict(handleEnds[0], extent); + handleEnds[1] = restrict(handleEnds[1], extent); + var originalDistSign = getSpanSign(handleEnds, handleIndex); + handleEnds[handleIndex] += delta; // Restrict in extent. + + var extentMinSpan = minSpan || 0; + var realExtent = extent.slice(); + originalDistSign.sign < 0 ? realExtent[0] += extentMinSpan : realExtent[1] -= extentMinSpan; + handleEnds[handleIndex] = restrict(handleEnds[handleIndex], realExtent); // Expand span. + + var currDistSign; + currDistSign = getSpanSign(handleEnds, handleIndex); + + if (minSpan != null && (currDistSign.sign !== originalDistSign.sign || currDistSign.span < minSpan)) { + // If minSpan exists, 'cross' is forbidden. + handleEnds[1 - handleIndex] = handleEnds[handleIndex] + originalDistSign.sign * minSpan; + } // Shrink span. + + + currDistSign = getSpanSign(handleEnds, handleIndex); + + if (maxSpan != null && currDistSign.span > maxSpan) { + handleEnds[1 - handleIndex] = handleEnds[handleIndex] + currDistSign.sign * maxSpan; + } + + return handleEnds; + } + + function getSpanSign(handleEnds, handleIndex) { + var dist = handleEnds[handleIndex] - handleEnds[1 - handleIndex]; // If `handleEnds[0] === handleEnds[1]`, always believe that handleEnd[0] + // is at left of handleEnds[1] for non-cross case. + + return { + span: Math.abs(dist), + sign: dist > 0 ? -1 : dist < 0 ? 1 : handleIndex ? -1 : 1 + }; + } + + function restrict(value, extend) { + return Math.min(extend[1] != null ? extend[1] : Infinity, Math.max(extend[0] != null ? extend[0] : -Infinity, value)); + } + + var each$5 = each; + var mathMin$8 = Math.min; + var mathMax$8 = Math.max; + var mathFloor$1 = Math.floor; + var mathCeil$1 = Math.ceil; + var round$3 = round; + var PI$7 = Math.PI; + + var Parallel = + /** @class */ + function () { + function Parallel(parallelModel, ecModel, api) { + this.type = 'parallel'; + /** + * key: dimension + */ + + this._axesMap = createHashMap(); + /** + * key: dimension + * value: {position: [], rotation, } + */ + + this._axesLayout = {}; + this.dimensions = parallelModel.dimensions; + this._model = parallelModel; + + this._init(parallelModel, ecModel, api); + } + + Parallel.prototype._init = function (parallelModel, ecModel, api) { + var dimensions = parallelModel.dimensions; + var parallelAxisIndex = parallelModel.parallelAxisIndex; + each$5(dimensions, function (dim, idx) { + var axisIndex = parallelAxisIndex[idx]; + var axisModel = ecModel.getComponent('parallelAxis', axisIndex); + + var axis = this._axesMap.set(dim, new ParallelAxis(dim, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisIndex)); + + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); // Injection + + axisModel.axis = axis; + axis.model = axisModel; + axis.coordinateSystem = axisModel.coordinateSystem = this; + }, this); + }; + /** + * Update axis scale after data processed + */ + + + Parallel.prototype.update = function (ecModel, api) { + this._updateAxesFromSeries(this._model, ecModel); + }; + + Parallel.prototype.containPoint = function (point) { + var layoutInfo = this._makeLayoutInfo(); + + var axisBase = layoutInfo.axisBase; + var layoutBase = layoutInfo.layoutBase; + var pixelDimIndex = layoutInfo.pixelDimIndex; + var pAxis = point[1 - pixelDimIndex]; + var pLayout = point[pixelDimIndex]; + return pAxis >= axisBase && pAxis <= axisBase + layoutInfo.axisLength && pLayout >= layoutBase && pLayout <= layoutBase + layoutInfo.layoutLength; + }; + + Parallel.prototype.getModel = function () { + return this._model; + }; + /** + * Update properties from series + */ + + + Parallel.prototype._updateAxesFromSeries = function (parallelModel, ecModel) { + ecModel.eachSeries(function (seriesModel) { + if (!parallelModel.contains(seriesModel, ecModel)) { + return; + } + + var data = seriesModel.getData(); + each$5(this.dimensions, function (dim) { + var axis = this._axesMap.get(dim); + + axis.scale.unionExtentFromData(data, data.mapDimension(dim)); + niceScaleExtent(axis.scale, axis.model); + }, this); + }, this); + }; + /** + * Resize the parallel coordinate system. + */ + + + Parallel.prototype.resize = function (parallelModel, api) { + this._rect = getLayoutRect(parallelModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + + this._layoutAxes(); + }; + + Parallel.prototype.getRect = function () { + return this._rect; + }; + + Parallel.prototype._makeLayoutInfo = function () { + var parallelModel = this._model; + var rect = this._rect; + var xy = ['x', 'y']; + var wh = ['width', 'height']; + var layout = parallelModel.get('layout'); + var pixelDimIndex = layout === 'horizontal' ? 0 : 1; + var layoutLength = rect[wh[pixelDimIndex]]; + var layoutExtent = [0, layoutLength]; + var axisCount = this.dimensions.length; + var axisExpandWidth = restrict$1(parallelModel.get('axisExpandWidth'), layoutExtent); + var axisExpandCount = restrict$1(parallelModel.get('axisExpandCount') || 0, [0, axisCount]); + var axisExpandable = parallelModel.get('axisExpandable') && axisCount > 3 && axisCount > axisExpandCount && axisExpandCount > 1 && axisExpandWidth > 0 && layoutLength > 0; // `axisExpandWindow` is According to the coordinates of [0, axisExpandLength], + // for sake of consider the case that axisCollapseWidth is 0 (when screen is narrow), + // where collapsed axes should be overlapped. + + var axisExpandWindow = parallelModel.get('axisExpandWindow'); + var winSize; + + if (!axisExpandWindow) { + winSize = restrict$1(axisExpandWidth * (axisExpandCount - 1), layoutExtent); + var axisExpandCenter = parallelModel.get('axisExpandCenter') || mathFloor$1(axisCount / 2); + axisExpandWindow = [axisExpandWidth * axisExpandCenter - winSize / 2]; + axisExpandWindow[1] = axisExpandWindow[0] + winSize; + } else { + winSize = restrict$1(axisExpandWindow[1] - axisExpandWindow[0], layoutExtent); + axisExpandWindow[1] = axisExpandWindow[0] + winSize; + } + + var axisCollapseWidth = (layoutLength - winSize) / (axisCount - axisExpandCount); // Avoid axisCollapseWidth is too small. + + axisCollapseWidth < 3 && (axisCollapseWidth = 0); // Find the first and last indices > ewin[0] and < ewin[1]. + + var winInnerIndices = [mathFloor$1(round$3(axisExpandWindow[0] / axisExpandWidth, 1)) + 1, mathCeil$1(round$3(axisExpandWindow[1] / axisExpandWidth, 1)) - 1]; // Pos in ec coordinates. + + var axisExpandWindow0Pos = axisCollapseWidth / axisExpandWidth * axisExpandWindow[0]; + return { + layout: layout, + pixelDimIndex: pixelDimIndex, + layoutBase: rect[xy[pixelDimIndex]], + layoutLength: layoutLength, + axisBase: rect[xy[1 - pixelDimIndex]], + axisLength: rect[wh[1 - pixelDimIndex]], + axisExpandable: axisExpandable, + axisExpandWidth: axisExpandWidth, + axisCollapseWidth: axisCollapseWidth, + axisExpandWindow: axisExpandWindow, + axisCount: axisCount, + winInnerIndices: winInnerIndices, + axisExpandWindow0Pos: axisExpandWindow0Pos + }; + }; + + Parallel.prototype._layoutAxes = function () { + var rect = this._rect; + var axes = this._axesMap; + var dimensions = this.dimensions; + + var layoutInfo = this._makeLayoutInfo(); + + var layout = layoutInfo.layout; + axes.each(function (axis) { + var axisExtent = [0, layoutInfo.axisLength]; + var idx = axis.inverse ? 1 : 0; + axis.setExtent(axisExtent[idx], axisExtent[1 - idx]); + }); + each$5(dimensions, function (dim, idx) { + var posInfo = (layoutInfo.axisExpandable ? layoutAxisWithExpand : layoutAxisWithoutExpand)(idx, layoutInfo); + var positionTable = { + horizontal: { + x: posInfo.position, + y: layoutInfo.axisLength + }, + vertical: { + x: 0, + y: posInfo.position + } + }; + var rotationTable = { + horizontal: PI$7 / 2, + vertical: 0 + }; + var position = [positionTable[layout].x + rect.x, positionTable[layout].y + rect.y]; + var rotation = rotationTable[layout]; + var transform = create$1(); + rotate(transform, transform, rotation); + translate(transform, transform, position); // TODO + // tick layout info + // TODO + // update dimensions info based on axis order. + + this._axesLayout[dim] = { + position: position, + rotation: rotation, + transform: transform, + axisNameAvailableWidth: posInfo.axisNameAvailableWidth, + axisLabelShow: posInfo.axisLabelShow, + nameTruncateMaxWidth: posInfo.nameTruncateMaxWidth, + tickDirection: 1, + labelDirection: 1 + }; + }, this); + }; + /** + * Get axis by dim. + */ + + + Parallel.prototype.getAxis = function (dim) { + return this._axesMap.get(dim); + }; + /** + * Convert a dim value of a single item of series data to Point. + */ + + + Parallel.prototype.dataToPoint = function (value, dim) { + return this.axisCoordToPoint(this._axesMap.get(dim).dataToCoord(value), dim); + }; + /** + * Travel data for one time, get activeState of each data item. + * @param start the start dataIndex that travel from. + * @param end the next dataIndex of the last dataIndex will be travel. + */ + + + Parallel.prototype.eachActiveState = function (data, callback, start, end) { + start == null && (start = 0); + end == null && (end = data.count()); + var axesMap = this._axesMap; + var dimensions = this.dimensions; + var dataDimensions = []; + var axisModels = []; + each(dimensions, function (axisDim) { + dataDimensions.push(data.mapDimension(axisDim)); + axisModels.push(axesMap.get(axisDim).model); + }); + var hasActiveSet = this.hasAxisBrushed(); + + for (var dataIndex = start; dataIndex < end; dataIndex++) { + var activeState = void 0; + + if (!hasActiveSet) { + activeState = 'normal'; + } else { + activeState = 'active'; + var values = data.getValues(dataDimensions, dataIndex); + + for (var j = 0, lenj = dimensions.length; j < lenj; j++) { + var state = axisModels[j].getActiveState(values[j]); + + if (state === 'inactive') { + activeState = 'inactive'; + break; + } + } + } + + callback(activeState, dataIndex); + } + }; + /** + * Whether has any activeSet. + */ + + + Parallel.prototype.hasAxisBrushed = function () { + var dimensions = this.dimensions; + var axesMap = this._axesMap; + var hasActiveSet = false; + + for (var j = 0, lenj = dimensions.length; j < lenj; j++) { + if (axesMap.get(dimensions[j]).model.getActiveState() !== 'normal') { + hasActiveSet = true; + } + } + + return hasActiveSet; + }; + /** + * Convert coords of each axis to Point. + * Return point. For example: [10, 20] + */ + + + Parallel.prototype.axisCoordToPoint = function (coord, dim) { + var axisLayout = this._axesLayout[dim]; + return applyTransform$1([coord, 0], axisLayout.transform); + }; + /** + * Get axis layout. + */ + + + Parallel.prototype.getAxisLayout = function (dim) { + return clone(this._axesLayout[dim]); + }; + /** + * @return {Object} {axisExpandWindow, delta, behavior: 'jump' | 'slide' | 'none'}. + */ + + + Parallel.prototype.getSlidedAxisExpandWindow = function (point) { + var layoutInfo = this._makeLayoutInfo(); + + var pixelDimIndex = layoutInfo.pixelDimIndex; + var axisExpandWindow = layoutInfo.axisExpandWindow.slice(); + var winSize = axisExpandWindow[1] - axisExpandWindow[0]; + var extent = [0, layoutInfo.axisExpandWidth * (layoutInfo.axisCount - 1)]; // Out of the area of coordinate system. + + if (!this.containPoint(point)) { + return { + behavior: 'none', + axisExpandWindow: axisExpandWindow + }; + } // Conver the point from global to expand coordinates. + + + var pointCoord = point[pixelDimIndex] - layoutInfo.layoutBase - layoutInfo.axisExpandWindow0Pos; // For dragging operation convenience, the window should not be + // slided when mouse is the center area of the window. + + var delta; + var behavior = 'slide'; + var axisCollapseWidth = layoutInfo.axisCollapseWidth; + + var triggerArea = this._model.get('axisExpandSlideTriggerArea'); // But consider touch device, jump is necessary. + + + var useJump = triggerArea[0] != null; + + if (axisCollapseWidth) { + if (useJump && axisCollapseWidth && pointCoord < winSize * triggerArea[0]) { + behavior = 'jump'; + delta = pointCoord - winSize * triggerArea[2]; + } else if (useJump && axisCollapseWidth && pointCoord > winSize * (1 - triggerArea[0])) { + behavior = 'jump'; + delta = pointCoord - winSize * (1 - triggerArea[2]); + } else { + (delta = pointCoord - winSize * triggerArea[1]) >= 0 && (delta = pointCoord - winSize * (1 - triggerArea[1])) <= 0 && (delta = 0); + } + + delta *= layoutInfo.axisExpandWidth / axisCollapseWidth; + delta ? sliderMove(delta, axisExpandWindow, extent, 'all') // Avoid nonsense triger on mousemove. + : behavior = 'none'; + } // When screen is too narrow, make it visible and slidable, although it is hard to interact. + else { + var winSize2 = axisExpandWindow[1] - axisExpandWindow[0]; + var pos = extent[1] * pointCoord / winSize2; + axisExpandWindow = [mathMax$8(0, pos - winSize2 / 2)]; + axisExpandWindow[1] = mathMin$8(extent[1], axisExpandWindow[0] + winSize2); + axisExpandWindow[0] = axisExpandWindow[1] - winSize2; + } + + return { + axisExpandWindow: axisExpandWindow, + behavior: behavior + }; + }; + + return Parallel; + }(); + + function restrict$1(len, extent) { + return mathMin$8(mathMax$8(len, extent[0]), extent[1]); + } + + function layoutAxisWithoutExpand(axisIndex, layoutInfo) { + var step = layoutInfo.layoutLength / (layoutInfo.axisCount - 1); + return { + position: step * axisIndex, + axisNameAvailableWidth: step, + axisLabelShow: true + }; + } + + function layoutAxisWithExpand(axisIndex, layoutInfo) { + var layoutLength = layoutInfo.layoutLength; + var axisExpandWidth = layoutInfo.axisExpandWidth; + var axisCount = layoutInfo.axisCount; + var axisCollapseWidth = layoutInfo.axisCollapseWidth; + var winInnerIndices = layoutInfo.winInnerIndices; + var position; + var axisNameAvailableWidth = axisCollapseWidth; + var axisLabelShow = false; + var nameTruncateMaxWidth; + + if (axisIndex < winInnerIndices[0]) { + position = axisIndex * axisCollapseWidth; + nameTruncateMaxWidth = axisCollapseWidth; + } else if (axisIndex <= winInnerIndices[1]) { + position = layoutInfo.axisExpandWindow0Pos + axisIndex * axisExpandWidth - layoutInfo.axisExpandWindow[0]; + axisNameAvailableWidth = axisExpandWidth; + axisLabelShow = true; + } else { + position = layoutLength - (axisCount - 1 - axisIndex) * axisCollapseWidth; + nameTruncateMaxWidth = axisCollapseWidth; + } + + return { + position: position, + axisNameAvailableWidth: axisNameAvailableWidth, + axisLabelShow: axisLabelShow, + nameTruncateMaxWidth: nameTruncateMaxWidth + }; + } + + function createParallelCoordSys(ecModel, api) { + var coordSysList = []; + ecModel.eachComponent('parallel', function (parallelModel, idx) { + var coordSys = new Parallel(parallelModel, ecModel, api); + coordSys.name = 'parallel_' + idx; + coordSys.resize(parallelModel, api); + parallelModel.coordinateSystem = coordSys; + coordSys.model = parallelModel; + coordSysList.push(coordSys); + }); // Inject the coordinateSystems into seriesModel + + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'parallel') { + var parallelModel = seriesModel.getReferringComponents('parallel', SINGLE_REFERRING).models[0]; + seriesModel.coordinateSystem = parallelModel.coordinateSystem; + } + }); + return coordSysList; + } + + var parallelCoordSysCreator = { + create: createParallelCoordSys + }; + + var ParallelAxisModel = + /** @class */ + function (_super) { + __extends(ParallelAxisModel, _super); + + function ParallelAxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelAxisModel.type; + /** + * @readOnly + */ + + _this.activeIntervals = []; + return _this; + } + + ParallelAxisModel.prototype.getAreaSelectStyle = function () { + return makeStyleMapper([['fill', 'color'], ['lineWidth', 'borderWidth'], ['stroke', 'borderColor'], ['width', 'width'], ['opacity', 'opacity'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ])(this.getModel('areaSelectStyle')); + }; + /** + * The code of this feature is put on AxisModel but not ParallelAxis, + * because axisModel can be alive after echarts updating but instance of + * ParallelAxis having been disposed. this._activeInterval should be kept + * when action dispatched (i.e. legend click). + * + * @param intervals `interval.length === 0` means set all active. + */ + + + ParallelAxisModel.prototype.setActiveIntervals = function (intervals) { + var activeIntervals = this.activeIntervals = clone(intervals); // Normalize + + if (activeIntervals) { + for (var i = activeIntervals.length - 1; i >= 0; i--) { + asc(activeIntervals[i]); + } + } + }; + /** + * @param value When only attempting detect whether 'no activeIntervals set', + * `value` is not needed to be input. + */ + + + ParallelAxisModel.prototype.getActiveState = function (value) { + var activeIntervals = this.activeIntervals; + + if (!activeIntervals.length) { + return 'normal'; + } + + if (value == null || isNaN(+value)) { + return 'inactive'; + } // Simple optimization + + + if (activeIntervals.length === 1) { + var interval = activeIntervals[0]; + + if (interval[0] <= value && value <= interval[1]) { + return 'active'; + } + } else { + for (var i = 0, len = activeIntervals.length; i < len; i++) { + if (activeIntervals[i][0] <= value && value <= activeIntervals[i][1]) { + return 'active'; + } + } + } + + return 'inactive'; + }; + + return ParallelAxisModel; + }(ComponentModel); + + mixin(ParallelAxisModel, AxisModelCommonMixin); + + var BRUSH_PANEL_GLOBAL = true; + var mathMin$9 = Math.min; + var mathMax$9 = Math.max; + var mathPow$2 = Math.pow; + var COVER_Z = 10000; + var UNSELECT_THRESHOLD = 6; + var MIN_RESIZE_LINE_WIDTH = 6; + var MUTEX_RESOURCE_KEY = 'globalPan'; + var DIRECTION_MAP = { + w: [0, 0], + e: [0, 1], + n: [1, 0], + s: [1, 1] + }; + var CURSOR_MAP = { + w: 'ew', + e: 'ew', + n: 'ns', + s: 'ns', + ne: 'nesw', + sw: 'nesw', + nw: 'nwse', + se: 'nwse' + }; + var DEFAULT_BRUSH_OPT = { + brushStyle: { + lineWidth: 2, + stroke: 'rgba(210,219,238,0.3)', + fill: '#D2DBEE' + }, + transformable: true, + brushMode: 'single', + removeOnClick: false + }; + var baseUID = 0; + /** + * params: + * areas: Array.<Array>, coord relates to container group, + * If no container specified, to global. + * opt { + * isEnd: boolean, + * removeOnClick: boolean + * } + */ + + var BrushController = + /** @class */ + function (_super) { + __extends(BrushController, _super); + + function BrushController(zr) { + var _this = _super.call(this) || this; + /** + * @internal + */ + + + _this._track = []; + /** + * @internal + */ + + _this._covers = []; + _this._handlers = {}; + + if ("development" !== 'production') { + assert(zr); + } + + _this._zr = zr; + _this.group = new Group(); + _this._uid = 'brushController_' + baseUID++; + each(pointerHandlers, function (handler, eventName) { + this._handlers[eventName] = bind(handler, this); + }, _this); + return _this; + } + /** + * If set to `false`, select disabled. + */ + + + BrushController.prototype.enableBrush = function (brushOption) { + if ("development" !== 'production') { + assert(this._mounted); + } + + this._brushType && this._doDisableBrush(); + brushOption.brushType && this._doEnableBrush(brushOption); + return this; + }; + + BrushController.prototype._doEnableBrush = function (brushOption) { + var zr = this._zr; // Consider roam, which takes globalPan too. + + if (!this._enableGlobalPan) { + take(zr, MUTEX_RESOURCE_KEY, this._uid); + } + + each(this._handlers, function (handler, eventName) { + zr.on(eventName, handler); + }); + this._brushType = brushOption.brushType; + this._brushOption = merge(clone(DEFAULT_BRUSH_OPT), brushOption, true); + }; + + BrushController.prototype._doDisableBrush = function () { + var zr = this._zr; + release(zr, MUTEX_RESOURCE_KEY, this._uid); + each(this._handlers, function (handler, eventName) { + zr.off(eventName, handler); + }); + this._brushType = this._brushOption = null; + }; + /** + * @param panelOpts If not pass, it is global brush. + */ + + + BrushController.prototype.setPanels = function (panelOpts) { + if (panelOpts && panelOpts.length) { + var panels_1 = this._panels = {}; + each(panelOpts, function (panelOpts) { + panels_1[panelOpts.panelId] = clone(panelOpts); + }); + } else { + this._panels = null; + } + + return this; + }; + + BrushController.prototype.mount = function (opt) { + opt = opt || {}; + + if ("development" !== 'production') { + this._mounted = true; // should be at first. + } + + this._enableGlobalPan = opt.enableGlobalPan; + var thisGroup = this.group; + + this._zr.add(thisGroup); + + thisGroup.attr({ + x: opt.x || 0, + y: opt.y || 0, + rotation: opt.rotation || 0, + scaleX: opt.scaleX || 1, + scaleY: opt.scaleY || 1 + }); + this._transform = thisGroup.getLocalTransform(); + return this; + }; // eachCover(cb, context): void { + // each(this._covers, cb, context); + // } + + /** + * Update covers. + * @param coverConfigList + * If coverConfigList is null/undefined, all covers removed. + */ + + + BrushController.prototype.updateCovers = function (coverConfigList) { + if ("development" !== 'production') { + assert(this._mounted); + } + + coverConfigList = map(coverConfigList, function (coverConfig) { + return merge(clone(DEFAULT_BRUSH_OPT), coverConfig, true); + }); + var tmpIdPrefix = '\0-brush-index-'; + var oldCovers = this._covers; + var newCovers = this._covers = []; + var controller = this; + var creatingCover = this._creatingCover; + new DataDiffer(oldCovers, coverConfigList, oldGetKey, getKey).add(addOrUpdate).update(addOrUpdate).remove(remove).execute(); + return this; + + function getKey(brushOption, index) { + return (brushOption.id != null ? brushOption.id : tmpIdPrefix + index) + '-' + brushOption.brushType; + } + + function oldGetKey(cover, index) { + return getKey(cover.__brushOption, index); + } + + function addOrUpdate(newIndex, oldIndex) { + var newBrushInternal = coverConfigList[newIndex]; // Consider setOption in event listener of brushSelect, + // where updating cover when creating should be forbiden. + + if (oldIndex != null && oldCovers[oldIndex] === creatingCover) { + newCovers[newIndex] = oldCovers[oldIndex]; + } else { + var cover = newCovers[newIndex] = oldIndex != null ? (oldCovers[oldIndex].__brushOption = newBrushInternal, oldCovers[oldIndex]) : endCreating(controller, createCover(controller, newBrushInternal)); + updateCoverAfterCreation(controller, cover); + } + } + + function remove(oldIndex) { + if (oldCovers[oldIndex] !== creatingCover) { + controller.group.remove(oldCovers[oldIndex]); + } + } + }; + + BrushController.prototype.unmount = function () { + if ("development" !== 'production') { + if (!this._mounted) { + return; + } + } + + this.enableBrush(false); // container may 'removeAll' outside. + + clearCovers(this); + + this._zr.remove(this.group); + + if ("development" !== 'production') { + this._mounted = false; // should be at last. + } + + return this; + }; + + BrushController.prototype.dispose = function () { + this.unmount(); + this.off(); + }; + + return BrushController; + }(Eventful); + + function createCover(controller, brushOption) { + var cover = coverRenderers[brushOption.brushType].createCover(controller, brushOption); + cover.__brushOption = brushOption; + updateZ(cover, brushOption); + controller.group.add(cover); + return cover; + } + + function endCreating(controller, creatingCover) { + var coverRenderer = getCoverRenderer(creatingCover); + + if (coverRenderer.endCreating) { + coverRenderer.endCreating(controller, creatingCover); + updateZ(creatingCover, creatingCover.__brushOption); + } + + return creatingCover; + } + + function updateCoverShape(controller, cover) { + var brushOption = cover.__brushOption; + getCoverRenderer(cover).updateCoverShape(controller, cover, brushOption.range, brushOption); + } + + function updateZ(cover, brushOption) { + var z = brushOption.z; + z == null && (z = COVER_Z); + cover.traverse(function (el) { + el.z = z; + el.z2 = z; // Consider in given container. + }); + } + + function updateCoverAfterCreation(controller, cover) { + getCoverRenderer(cover).updateCommon(controller, cover); + updateCoverShape(controller, cover); + } + + function getCoverRenderer(cover) { + return coverRenderers[cover.__brushOption.brushType]; + } // return target panel or `true` (means global panel) + + + function getPanelByPoint(controller, e, localCursorPoint) { + var panels = controller._panels; + + if (!panels) { + return BRUSH_PANEL_GLOBAL; // Global panel + } + + var panel; + var transform = controller._transform; + each(panels, function (pn) { + pn.isTargetByCursor(e, localCursorPoint, transform) && (panel = pn); + }); + return panel; + } // Return a panel or true + + + function getPanelByCover(controller, cover) { + var panels = controller._panels; + + if (!panels) { + return BRUSH_PANEL_GLOBAL; // Global panel + } + + var panelId = cover.__brushOption.panelId; // User may give cover without coord sys info, + // which is then treated as global panel. + + return panelId != null ? panels[panelId] : BRUSH_PANEL_GLOBAL; + } + + function clearCovers(controller) { + var covers = controller._covers; + var originalLength = covers.length; + each(covers, function (cover) { + controller.group.remove(cover); + }, controller); + covers.length = 0; + return !!originalLength; + } + + function trigger$1(controller, opt) { + var areas = map(controller._covers, function (cover) { + var brushOption = cover.__brushOption; + var range = clone(brushOption.range); + return { + brushType: brushOption.brushType, + panelId: brushOption.panelId, + range: range + }; + }); + controller.trigger('brush', { + areas: areas, + isEnd: !!opt.isEnd, + removeOnClick: !!opt.removeOnClick + }); + } + + function shouldShowCover(controller) { + var track = controller._track; + + if (!track.length) { + return false; + } + + var p2 = track[track.length - 1]; + var p1 = track[0]; + var dx = p2[0] - p1[0]; + var dy = p2[1] - p1[1]; + var dist = mathPow$2(dx * dx + dy * dy, 0.5); + return dist > UNSELECT_THRESHOLD; + } + + function getTrackEnds(track) { + var tail = track.length - 1; + tail < 0 && (tail = 0); + return [track[0], track[tail]]; + } + + function createBaseRectCover(rectRangeConverter, controller, brushOption, edgeNameSequences) { + var cover = new Group(); + cover.add(new Rect({ + name: 'main', + style: makeStyle(brushOption), + silent: true, + draggable: true, + cursor: 'move', + drift: curry(driftRect, rectRangeConverter, controller, cover, ['n', 's', 'w', 'e']), + ondragend: curry(trigger$1, controller, { + isEnd: true + }) + })); + each(edgeNameSequences, function (nameSequence) { + cover.add(new Rect({ + name: nameSequence.join(''), + style: { + opacity: 0 + }, + draggable: true, + silent: true, + invisible: true, + drift: curry(driftRect, rectRangeConverter, controller, cover, nameSequence), + ondragend: curry(trigger$1, controller, { + isEnd: true + }) + })); + }); + return cover; + } + + function updateBaseRect(controller, cover, localRange, brushOption) { + var lineWidth = brushOption.brushStyle.lineWidth || 0; + var handleSize = mathMax$9(lineWidth, MIN_RESIZE_LINE_WIDTH); + var x = localRange[0][0]; + var y = localRange[1][0]; + var xa = x - lineWidth / 2; + var ya = y - lineWidth / 2; + var x2 = localRange[0][1]; + var y2 = localRange[1][1]; + var x2a = x2 - handleSize + lineWidth / 2; + var y2a = y2 - handleSize + lineWidth / 2; + var width = x2 - x; + var height = y2 - y; + var widtha = width + lineWidth; + var heighta = height + lineWidth; + updateRectShape(controller, cover, 'main', x, y, width, height); + + if (brushOption.transformable) { + updateRectShape(controller, cover, 'w', xa, ya, handleSize, heighta); + updateRectShape(controller, cover, 'e', x2a, ya, handleSize, heighta); + updateRectShape(controller, cover, 'n', xa, ya, widtha, handleSize); + updateRectShape(controller, cover, 's', xa, y2a, widtha, handleSize); + updateRectShape(controller, cover, 'nw', xa, ya, handleSize, handleSize); + updateRectShape(controller, cover, 'ne', x2a, ya, handleSize, handleSize); + updateRectShape(controller, cover, 'sw', xa, y2a, handleSize, handleSize); + updateRectShape(controller, cover, 'se', x2a, y2a, handleSize, handleSize); + } + } + + function updateCommon(controller, cover) { + var brushOption = cover.__brushOption; + var transformable = brushOption.transformable; + var mainEl = cover.childAt(0); + mainEl.useStyle(makeStyle(brushOption)); + mainEl.attr({ + silent: !transformable, + cursor: transformable ? 'move' : 'default' + }); + each([['w'], ['e'], ['n'], ['s'], ['s', 'e'], ['s', 'w'], ['n', 'e'], ['n', 'w']], function (nameSequence) { + var el = cover.childOfName(nameSequence.join('')); + var globalDir = nameSequence.length === 1 ? getGlobalDirection1(controller, nameSequence[0]) : getGlobalDirection2(controller, nameSequence); + el && el.attr({ + silent: !transformable, + invisible: !transformable, + cursor: transformable ? CURSOR_MAP[globalDir] + '-resize' : null + }); + }); + } + + function updateRectShape(controller, cover, name, x, y, w, h) { + var el = cover.childOfName(name); + el && el.setShape(pointsToRect(clipByPanel(controller, cover, [[x, y], [x + w, y + h]]))); + } + + function makeStyle(brushOption) { + return defaults({ + strokeNoScale: true + }, brushOption.brushStyle); + } + + function formatRectRange(x, y, x2, y2) { + var min = [mathMin$9(x, x2), mathMin$9(y, y2)]; + var max = [mathMax$9(x, x2), mathMax$9(y, y2)]; + return [[min[0], max[0]], [min[1], max[1]] // y range + ]; + } + + function getTransform$1(controller) { + return getTransform(controller.group); + } + + function getGlobalDirection1(controller, localDirName) { + var map = { + w: 'left', + e: 'right', + n: 'top', + s: 'bottom' + }; + var inverseMap = { + left: 'w', + right: 'e', + top: 'n', + bottom: 's' + }; + var dir = transformDirection(map[localDirName], getTransform$1(controller)); + return inverseMap[dir]; + } + + function getGlobalDirection2(controller, localDirNameSeq) { + var globalDir = [getGlobalDirection1(controller, localDirNameSeq[0]), getGlobalDirection1(controller, localDirNameSeq[1])]; + (globalDir[0] === 'e' || globalDir[0] === 'w') && globalDir.reverse(); + return globalDir.join(''); + } + + function driftRect(rectRangeConverter, controller, cover, dirNameSequence, dx, dy) { + var brushOption = cover.__brushOption; + var rectRange = rectRangeConverter.toRectRange(brushOption.range); + var localDelta = toLocalDelta(controller, dx, dy); + each(dirNameSequence, function (dirName) { + var ind = DIRECTION_MAP[dirName]; + rectRange[ind[0]][ind[1]] += localDelta[ind[0]]; + }); + brushOption.range = rectRangeConverter.fromRectRange(formatRectRange(rectRange[0][0], rectRange[1][0], rectRange[0][1], rectRange[1][1])); + updateCoverAfterCreation(controller, cover); + trigger$1(controller, { + isEnd: false + }); + } + + function driftPolygon(controller, cover, dx, dy) { + var range = cover.__brushOption.range; + var localDelta = toLocalDelta(controller, dx, dy); + each(range, function (point) { + point[0] += localDelta[0]; + point[1] += localDelta[1]; + }); + updateCoverAfterCreation(controller, cover); + trigger$1(controller, { + isEnd: false + }); + } + + function toLocalDelta(controller, dx, dy) { + var thisGroup = controller.group; + var localD = thisGroup.transformCoordToLocal(dx, dy); + var localZero = thisGroup.transformCoordToLocal(0, 0); + return [localD[0] - localZero[0], localD[1] - localZero[1]]; + } + + function clipByPanel(controller, cover, data) { + var panel = getPanelByCover(controller, cover); + return panel && panel !== BRUSH_PANEL_GLOBAL ? panel.clipPath(data, controller._transform) : clone(data); + } + + function pointsToRect(points) { + var xmin = mathMin$9(points[0][0], points[1][0]); + var ymin = mathMin$9(points[0][1], points[1][1]); + var xmax = mathMax$9(points[0][0], points[1][0]); + var ymax = mathMax$9(points[0][1], points[1][1]); + return { + x: xmin, + y: ymin, + width: xmax - xmin, + height: ymax - ymin + }; + } + + function resetCursor(controller, e, localCursorPoint) { + if ( // Check active + !controller._brushType // resetCursor should be always called when mouse is in zr area, + // but not called when mouse is out of zr area to avoid bad influence + // if `mousemove`, `mouseup` are triggered from `document` event. + || isOutsideZrArea(controller, e.offsetX, e.offsetY)) { + return; + } + + var zr = controller._zr; + var covers = controller._covers; + var currPanel = getPanelByPoint(controller, e, localCursorPoint); // Check whether in covers. + + if (!controller._dragging) { + for (var i = 0; i < covers.length; i++) { + var brushOption = covers[i].__brushOption; + + if (currPanel && (currPanel === BRUSH_PANEL_GLOBAL || brushOption.panelId === currPanel.panelId) && coverRenderers[brushOption.brushType].contain(covers[i], localCursorPoint[0], localCursorPoint[1])) { + // Use cursor style set on cover. + return; + } + } + } + + currPanel && zr.setCursorStyle('crosshair'); + } + + function preventDefault(e) { + var rawE = e.event; + rawE.preventDefault && rawE.preventDefault(); + } + + function mainShapeContain(cover, x, y) { + return cover.childOfName('main').contain(x, y); + } + + function updateCoverByMouse(controller, e, localCursorPoint, isEnd) { + var creatingCover = controller._creatingCover; + var panel = controller._creatingPanel; + var thisBrushOption = controller._brushOption; + var eventParams; + + controller._track.push(localCursorPoint.slice()); + + if (shouldShowCover(controller) || creatingCover) { + if (panel && !creatingCover) { + thisBrushOption.brushMode === 'single' && clearCovers(controller); + var brushOption = clone(thisBrushOption); + brushOption.brushType = determineBrushType(brushOption.brushType, panel); + brushOption.panelId = panel === BRUSH_PANEL_GLOBAL ? null : panel.panelId; + creatingCover = controller._creatingCover = createCover(controller, brushOption); + + controller._covers.push(creatingCover); + } + + if (creatingCover) { + var coverRenderer = coverRenderers[determineBrushType(controller._brushType, panel)]; + var coverBrushOption = creatingCover.__brushOption; + coverBrushOption.range = coverRenderer.getCreatingRange(clipByPanel(controller, creatingCover, controller._track)); + + if (isEnd) { + endCreating(controller, creatingCover); + coverRenderer.updateCommon(controller, creatingCover); + } + + updateCoverShape(controller, creatingCover); + eventParams = { + isEnd: isEnd + }; + } + } else if (isEnd && thisBrushOption.brushMode === 'single' && thisBrushOption.removeOnClick) { + // Help user to remove covers easily, only by a tiny drag, in 'single' mode. + // But a single click do not clear covers, because user may have casual + // clicks (for example, click on other component and do not expect covers + // disappear). + // Only some cover removed, trigger action, but not every click trigger action. + if (getPanelByPoint(controller, e, localCursorPoint) && clearCovers(controller)) { + eventParams = { + isEnd: isEnd, + removeOnClick: true + }; + } + } + + return eventParams; + } + + function determineBrushType(brushType, panel) { + if (brushType === 'auto') { + if ("development" !== 'production') { + assert(panel && panel.defaultBrushType, 'MUST have defaultBrushType when brushType is "atuo"'); + } + + return panel.defaultBrushType; + } + + return brushType; + } + + var pointerHandlers = { + mousedown: function (e) { + if (this._dragging) { + // In case some browser do not support globalOut, + // and release mouse out side the browser. + handleDragEnd(this, e); + } else if (!e.target || !e.target.draggable) { + preventDefault(e); + var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY); + this._creatingCover = null; + var panel = this._creatingPanel = getPanelByPoint(this, e, localCursorPoint); + + if (panel) { + this._dragging = true; + this._track = [localCursorPoint.slice()]; + } + } + }, + mousemove: function (e) { + var x = e.offsetX; + var y = e.offsetY; + var localCursorPoint = this.group.transformCoordToLocal(x, y); + resetCursor(this, e, localCursorPoint); + + if (this._dragging) { + preventDefault(e); + var eventParams = updateCoverByMouse(this, e, localCursorPoint, false); + eventParams && trigger$1(this, eventParams); + } + }, + mouseup: function (e) { + handleDragEnd(this, e); + } + }; + + function handleDragEnd(controller, e) { + if (controller._dragging) { + preventDefault(e); + var x = e.offsetX; + var y = e.offsetY; + var localCursorPoint = controller.group.transformCoordToLocal(x, y); + var eventParams = updateCoverByMouse(controller, e, localCursorPoint, true); + controller._dragging = false; + controller._track = []; + controller._creatingCover = null; // trigger event shoule be at final, after procedure will be nested. + + eventParams && trigger$1(controller, eventParams); + } + } + + function isOutsideZrArea(controller, x, y) { + var zr = controller._zr; + return x < 0 || x > zr.getWidth() || y < 0 || y > zr.getHeight(); + } + /** + * key: brushType + */ + + + var coverRenderers = { + lineX: getLineRenderer(0), + lineY: getLineRenderer(1), + rect: { + createCover: function (controller, brushOption) { + function returnInput(range) { + return range; + } + + return createBaseRectCover({ + toRectRange: returnInput, + fromRectRange: returnInput + }, controller, brushOption, [['w'], ['e'], ['n'], ['s'], ['s', 'e'], ['s', 'w'], ['n', 'e'], ['n', 'w']]); + }, + getCreatingRange: function (localTrack) { + var ends = getTrackEnds(localTrack); + return formatRectRange(ends[1][0], ends[1][1], ends[0][0], ends[0][1]); + }, + updateCoverShape: function (controller, cover, localRange, brushOption) { + updateBaseRect(controller, cover, localRange, brushOption); + }, + updateCommon: updateCommon, + contain: mainShapeContain + }, + polygon: { + createCover: function (controller, brushOption) { + var cover = new Group(); // Do not use graphic.Polygon because graphic.Polyline do not close the + // border of the shape when drawing, which is a better experience for user. + + cover.add(new Polyline({ + name: 'main', + style: makeStyle(brushOption), + silent: true + })); + return cover; + }, + getCreatingRange: function (localTrack) { + return localTrack; + }, + endCreating: function (controller, cover) { + cover.remove(cover.childAt(0)); // Use graphic.Polygon close the shape. + + cover.add(new Polygon({ + name: 'main', + draggable: true, + drift: curry(driftPolygon, controller, cover), + ondragend: curry(trigger$1, controller, { + isEnd: true + }) + })); + }, + updateCoverShape: function (controller, cover, localRange, brushOption) { + cover.childAt(0).setShape({ + points: clipByPanel(controller, cover, localRange) + }); + }, + updateCommon: updateCommon, + contain: mainShapeContain + } + }; + + function getLineRenderer(xyIndex) { + return { + createCover: function (controller, brushOption) { + return createBaseRectCover({ + toRectRange: function (range) { + var rectRange = [range, [0, 100]]; + xyIndex && rectRange.reverse(); + return rectRange; + }, + fromRectRange: function (rectRange) { + return rectRange[xyIndex]; + } + }, controller, brushOption, [[['w'], ['e']], [['n'], ['s']]][xyIndex]); + }, + getCreatingRange: function (localTrack) { + var ends = getTrackEnds(localTrack); + var min = mathMin$9(ends[0][xyIndex], ends[1][xyIndex]); + var max = mathMax$9(ends[0][xyIndex], ends[1][xyIndex]); + return [min, max]; + }, + updateCoverShape: function (controller, cover, localRange, brushOption) { + var otherExtent; // If brushWidth not specified, fit the panel. + + var panel = getPanelByCover(controller, cover); + + if (panel !== BRUSH_PANEL_GLOBAL && panel.getLinearBrushOtherExtent) { + otherExtent = panel.getLinearBrushOtherExtent(xyIndex); + } else { + var zr = controller._zr; + otherExtent = [0, [zr.getWidth(), zr.getHeight()][1 - xyIndex]]; + } + + var rectRange = [localRange, otherExtent]; + xyIndex && rectRange.reverse(); + updateBaseRect(controller, cover, rectRange, brushOption); + }, + updateCommon: updateCommon, + contain: mainShapeContain + }; + } + + function makeRectPanelClipPath(rect) { + rect = normalizeRect(rect); + return function (localPoints) { + return clipPointsByRect(localPoints, rect); + }; + } + function makeLinearBrushOtherExtent(rect, specifiedXYIndex) { + rect = normalizeRect(rect); + return function (xyIndex) { + var idx = specifiedXYIndex != null ? specifiedXYIndex : xyIndex; + var brushWidth = idx ? rect.width : rect.height; + var base = idx ? rect.x : rect.y; + return [base, base + (brushWidth || 0)]; + }; + } + function makeRectIsTargetByCursor(rect, api, targetModel) { + var boundingRect = normalizeRect(rect); + return function (e, localCursorPoint) { + return boundingRect.contain(localCursorPoint[0], localCursorPoint[1]) && !onIrrelevantElement(e, api, targetModel); + }; + } // Consider width/height is negative. + + function normalizeRect(rect) { + return BoundingRect.create(rect); + } + + var elementList = ['axisLine', 'axisTickLabel', 'axisName']; + + var ParallelAxisView = + /** @class */ + function (_super) { + __extends(ParallelAxisView, _super); + + function ParallelAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelAxisView.type; + return _this; + } + + ParallelAxisView.prototype.init = function (ecModel, api) { + _super.prototype.init.apply(this, arguments); + + (this._brushController = new BrushController(api.getZr())).on('brush', bind(this._onBrush, this)); + }; + + ParallelAxisView.prototype.render = function (axisModel, ecModel, api, payload) { + if (fromAxisAreaSelect(axisModel, ecModel, payload)) { + return; + } + + this.axisModel = axisModel; + this.api = api; + this.group.removeAll(); + var oldAxisGroup = this._axisGroup; + this._axisGroup = new Group(); + this.group.add(this._axisGroup); + + if (!axisModel.get('show')) { + return; + } + + var coordSysModel = getCoordSysModel(axisModel, ecModel); + var coordSys = coordSysModel.coordinateSystem; + var areaSelectStyle = axisModel.getAreaSelectStyle(); + var areaWidth = areaSelectStyle.width; + var dim = axisModel.axis.dim; + var axisLayout = coordSys.getAxisLayout(dim); + var builderOpt = extend({ + strokeContainThreshold: areaWidth + }, axisLayout); + var axisBuilder = new AxisBuilder(axisModel, builderOpt); + each(elementList, axisBuilder.add, axisBuilder); + + this._axisGroup.add(axisBuilder.getGroup()); + + this._refreshBrushController(builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api); + + groupTransition(oldAxisGroup, this._axisGroup, axisModel); + }; // /** + // * @override + // */ + // updateVisual(axisModel, ecModel, api, payload) { + // this._brushController && this._brushController + // .updateCovers(getCoverInfoList(axisModel)); + // } + + + ParallelAxisView.prototype._refreshBrushController = function (builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api) { + // After filtering, axis may change, select area needs to be update. + var extent = axisModel.axis.getExtent(); + var extentLen = extent[1] - extent[0]; + var extra = Math.min(30, Math.abs(extentLen) * 0.1); // Arbitrary value. + // width/height might be negative, which will be + // normalized in BoundingRect. + + var rect = BoundingRect.create({ + x: extent[0], + y: -areaWidth / 2, + width: extentLen, + height: areaWidth + }); + rect.x -= extra; + rect.width += 2 * extra; + + this._brushController.mount({ + enableGlobalPan: true, + rotation: builderOpt.rotation, + x: builderOpt.position[0], + y: builderOpt.position[1] + }).setPanels([{ + panelId: 'pl', + clipPath: makeRectPanelClipPath(rect), + isTargetByCursor: makeRectIsTargetByCursor(rect, api, coordSysModel), + getLinearBrushOtherExtent: makeLinearBrushOtherExtent(rect, 0) + }]).enableBrush({ + brushType: 'lineX', + brushStyle: areaSelectStyle, + removeOnClick: true + }).updateCovers(getCoverInfoList(axisModel)); + }; + + ParallelAxisView.prototype._onBrush = function (eventParam) { + var coverInfoList = eventParam.areas; // Do not cache these object, because the mey be changed. + + var axisModel = this.axisModel; + var axis = axisModel.axis; + var intervals = map(coverInfoList, function (coverInfo) { + return [axis.coordToData(coverInfo.range[0], true), axis.coordToData(coverInfo.range[1], true)]; + }); // If realtime is true, action is not dispatched on drag end, because + // the drag end emits the same params with the last drag move event, + // and may have some delay when using touch pad. + + if (!axisModel.option.realtime === eventParam.isEnd || eventParam.removeOnClick) { + // jshint ignore:line + this.api.dispatchAction({ + type: 'axisAreaSelect', + parallelAxisId: axisModel.id, + intervals: intervals + }); + } + }; + + ParallelAxisView.prototype.dispose = function () { + this._brushController.dispose(); + }; + + ParallelAxisView.type = 'parallelAxis'; + return ParallelAxisView; + }(ComponentView); + + function fromAxisAreaSelect(axisModel, ecModel, payload) { + return payload && payload.type === 'axisAreaSelect' && ecModel.findComponents({ + mainType: 'parallelAxis', + query: payload + })[0] === axisModel; + } + + function getCoverInfoList(axisModel) { + var axis = axisModel.axis; + return map(axisModel.activeIntervals, function (interval) { + return { + brushType: 'lineX', + panelId: 'pl', + range: [axis.dataToCoord(interval[0], true), axis.dataToCoord(interval[1], true)] + }; + }); + } + + function getCoordSysModel(axisModel, ecModel) { + return ecModel.getComponent('parallel', axisModel.get('parallelIndex')); + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + var actionInfo$1 = { + type: 'axisAreaSelect', + event: 'axisAreaSelected' // update: 'updateVisual' + + }; + function installParallelActions(registers) { + registers.registerAction(actionInfo$1, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'parallelAxis', + query: payload + }, function (parallelAxisModel) { + parallelAxisModel.axis.model.setActiveIntervals(payload.intervals); + }); + }); + /** + * @payload + */ + + registers.registerAction('parallelAxisExpand', function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'parallel', + query: payload + }, function (parallelModel) { + parallelModel.setAxisExpand(payload); + }); + }); + } + + var defaultAxisOption = { + type: 'value', + areaSelectStyle: { + width: 20, + borderWidth: 1, + borderColor: 'rgba(160,197,232)', + color: 'rgba(160,197,232)', + opacity: 0.3 + }, + realtime: true, + z: 10 + }; + function install$g(registers) { + registers.registerComponentView(ParallelView$1); + registers.registerComponentModel(ParallelModel); + registers.registerCoordinateSystem('parallel', parallelCoordSysCreator); + registers.registerPreprocessor(parallelPreprocessor); + registers.registerComponentModel(ParallelAxisModel); + registers.registerComponentView(ParallelAxisView); + axisModelCreator(registers, 'parallel', ParallelAxisModel, defaultAxisOption); + installParallelActions(registers); + } + + function install$h(registers) { + use(install$g); + registers.registerChartView(ParallelView); + registers.registerSeriesModel(ParallelSeriesModel); + registers.registerVisual(registers.PRIORITY.VISUAL.BRUSH, parallelVisual); + } + + var SankeyPathShape = + /** @class */ + function () { + function SankeyPathShape() { + this.x1 = 0; + this.y1 = 0; + this.x2 = 0; + this.y2 = 0; + this.cpx1 = 0; + this.cpy1 = 0; + this.cpx2 = 0; + this.cpy2 = 0; + this.extent = 0; + } + + return SankeyPathShape; + }(); + + var SankeyPath = + /** @class */ + function (_super) { + __extends(SankeyPath, _super); + + function SankeyPath(opts) { + return _super.call(this, opts) || this; + } + + SankeyPath.prototype.getDefaultShape = function () { + return new SankeyPathShape(); + }; + + SankeyPath.prototype.buildPath = function (ctx, shape) { + var extent = shape.extent; + ctx.moveTo(shape.x1, shape.y1); + ctx.bezierCurveTo(shape.cpx1, shape.cpy1, shape.cpx2, shape.cpy2, shape.x2, shape.y2); + + if (shape.orient === 'vertical') { + ctx.lineTo(shape.x2 + extent, shape.y2); + ctx.bezierCurveTo(shape.cpx2 + extent, shape.cpy2, shape.cpx1 + extent, shape.cpy1, shape.x1 + extent, shape.y1); + } else { + ctx.lineTo(shape.x2, shape.y2 + extent); + ctx.bezierCurveTo(shape.cpx2, shape.cpy2 + extent, shape.cpx1, shape.cpy1 + extent, shape.x1, shape.y1 + extent); + } + + ctx.closePath(); + }; + + SankeyPath.prototype.highlight = function () { + enterEmphasis(this); + }; + + SankeyPath.prototype.downplay = function () { + leaveEmphasis(this); + }; + + return SankeyPath; + }(Path); + + var SankeyView = + /** @class */ + function (_super) { + __extends(SankeyView, _super); + + function SankeyView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SankeyView.type; + _this._focusAdjacencyDisabled = false; + return _this; + } + + SankeyView.prototype.render = function (seriesModel, ecModel, api) { + var sankeyView = this; + var graph = seriesModel.getGraph(); + var group = this.group; + var layoutInfo = seriesModel.layoutInfo; // view width + + var width = layoutInfo.width; // view height + + var height = layoutInfo.height; + var nodeData = seriesModel.getData(); + var edgeData = seriesModel.getData('edge'); + var orient = seriesModel.get('orient'); + this._model = seriesModel; + group.removeAll(); + group.x = layoutInfo.x; + group.y = layoutInfo.y; // generate a bezire Curve for each edge + + graph.eachEdge(function (edge) { + var curve = new SankeyPath(); + var ecData = getECData(curve); + ecData.dataIndex = edge.dataIndex; + ecData.seriesIndex = seriesModel.seriesIndex; + ecData.dataType = 'edge'; + var edgeModel = edge.getModel(); + var lineStyleModel = edgeModel.getModel('lineStyle'); + var curvature = lineStyleModel.get('curveness'); + var n1Layout = edge.node1.getLayout(); + var node1Model = edge.node1.getModel(); + var dragX1 = node1Model.get('localX'); + var dragY1 = node1Model.get('localY'); + var n2Layout = edge.node2.getLayout(); + var node2Model = edge.node2.getModel(); + var dragX2 = node2Model.get('localX'); + var dragY2 = node2Model.get('localY'); + var edgeLayout = edge.getLayout(); + var x1; + var y1; + var x2; + var y2; + var cpx1; + var cpy1; + var cpx2; + var cpy2; + curve.shape.extent = Math.max(1, edgeLayout.dy); + curve.shape.orient = orient; + + if (orient === 'vertical') { + x1 = (dragX1 != null ? dragX1 * width : n1Layout.x) + edgeLayout.sy; + y1 = (dragY1 != null ? dragY1 * height : n1Layout.y) + n1Layout.dy; + x2 = (dragX2 != null ? dragX2 * width : n2Layout.x) + edgeLayout.ty; + y2 = dragY2 != null ? dragY2 * height : n2Layout.y; + cpx1 = x1; + cpy1 = y1 * (1 - curvature) + y2 * curvature; + cpx2 = x2; + cpy2 = y1 * curvature + y2 * (1 - curvature); + } else { + x1 = (dragX1 != null ? dragX1 * width : n1Layout.x) + n1Layout.dx; + y1 = (dragY1 != null ? dragY1 * height : n1Layout.y) + edgeLayout.sy; + x2 = dragX2 != null ? dragX2 * width : n2Layout.x; + y2 = (dragY2 != null ? dragY2 * height : n2Layout.y) + edgeLayout.ty; + cpx1 = x1 * (1 - curvature) + x2 * curvature; + cpy1 = y1; + cpx2 = x1 * curvature + x2 * (1 - curvature); + cpy2 = y2; + } + + curve.setShape({ + x1: x1, + y1: y1, + x2: x2, + y2: y2, + cpx1: cpx1, + cpy1: cpy1, + cpx2: cpx2, + cpy2: cpy2 + }); + curve.useStyle(lineStyleModel.getItemStyle()); // Special color, use source node color or target node color + + switch (curve.style.fill) { + case 'source': + curve.style.fill = edge.node1.getVisual('color'); + curve.style.decal = edge.node1.getVisual('style').decal; + break; + + case 'target': + curve.style.fill = edge.node2.getVisual('color'); + curve.style.decal = edge.node2.getVisual('style').decal; + break; + + case 'gradient': + var sourceColor = edge.node1.getVisual('color'); + var targetColor = edge.node2.getVisual('color'); + + if (isString(sourceColor) && isString(targetColor)) { + curve.style.fill = new LinearGradient(0, 0, +(orient === 'horizontal'), +(orient === 'vertical'), [{ + color: sourceColor, + offset: 0 + }, { + color: targetColor, + offset: 1 + }]); + } + + } + + var emphasisModel = edgeModel.getModel('emphasis'); + setStatesStylesFromModel(curve, edgeModel, 'lineStyle', function (model) { + return model.getItemStyle(); + }); + group.add(curve); + edgeData.setItemGraphicEl(edge.dataIndex, curve); + var focus = emphasisModel.get('focus'); + toggleHoverEmphasis(curve, focus === 'adjacency' ? edge.getAdjacentDataIndices() : focus, emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + getECData(curve).dataType = 'edge'; + }); // Generate a rect for each node + + graph.eachNode(function (node) { + var layout = node.getLayout(); + var itemModel = node.getModel(); + var dragX = itemModel.get('localX'); + var dragY = itemModel.get('localY'); + var emphasisModel = itemModel.getModel('emphasis'); + var rect = new Rect({ + shape: { + x: dragX != null ? dragX * width : layout.x, + y: dragY != null ? dragY * height : layout.y, + width: layout.dx, + height: layout.dy + }, + style: itemModel.getModel('itemStyle').getItemStyle(), + z2: 10 + }); + setLabelStyle(rect, getLabelStatesModels(itemModel), { + labelFetcher: seriesModel, + labelDataIndex: node.dataIndex, + defaultText: node.id + }); + rect.disableLabelAnimation = true; + rect.setStyle('fill', node.getVisual('color')); + rect.setStyle('decal', node.getVisual('style').decal); + setStatesStylesFromModel(rect, itemModel); + group.add(rect); + nodeData.setItemGraphicEl(node.dataIndex, rect); + getECData(rect).dataType = 'node'; + var focus = emphasisModel.get('focus'); + toggleHoverEmphasis(rect, focus === 'adjacency' ? node.getAdjacentDataIndices() : focus, emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }); + nodeData.eachItemGraphicEl(function (el, dataIndex) { + var itemModel = nodeData.getItemModel(dataIndex); + + if (itemModel.get('draggable')) { + el.drift = function (dx, dy) { + sankeyView._focusAdjacencyDisabled = true; + this.shape.x += dx; + this.shape.y += dy; + this.dirty(); + api.dispatchAction({ + type: 'dragNode', + seriesId: seriesModel.id, + dataIndex: nodeData.getRawIndex(dataIndex), + localX: this.shape.x / width, + localY: this.shape.y / height + }); + }; + + el.ondragend = function () { + sankeyView._focusAdjacencyDisabled = false; + }; + + el.draggable = true; + el.cursor = 'move'; + } + }); + + if (!this._data && seriesModel.isAnimationEnabled()) { + group.setClipPath(createGridClipShape$1(group.getBoundingRect(), seriesModel, function () { + group.removeClipPath(); + })); + } + + this._data = seriesModel.getData(); + }; + + SankeyView.prototype.dispose = function () {}; + + SankeyView.type = 'sankey'; + return SankeyView; + }(ChartView); // Add animation to the view + + + function createGridClipShape$1(rect, seriesModel, cb) { + var rectEl = new Rect({ + shape: { + x: rect.x - 10, + y: rect.y - 10, + width: 0, + height: rect.height + 20 + } + }); + initProps(rectEl, { + shape: { + width: rect.width + 20 + } + }, seriesModel, cb); + return rectEl; + } + + var SankeySeriesModel = + /** @class */ + function (_super) { + __extends(SankeySeriesModel, _super); + + function SankeySeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SankeySeriesModel.type; + return _this; + } + /** + * Init a graph data structure from data in option series + */ + + + SankeySeriesModel.prototype.getInitialData = function (option, ecModel) { + var links = option.edges || option.links; + var nodes = option.data || option.nodes; + var levels = option.levels; + this.levelModels = []; + var levelModels = this.levelModels; + + for (var i = 0; i < levels.length; i++) { + if (levels[i].depth != null && levels[i].depth >= 0) { + levelModels[levels[i].depth] = new Model(levels[i], this, ecModel); + } else { + if ("development" !== 'production') { + throw new Error('levels[i].depth is mandatory and should be natural number'); + } + } + } + + if (nodes && links) { + var graph = createGraphFromNodeEdge(nodes, links, this, true, beforeLink); + return graph.data; + } + + function beforeLink(nodeData, edgeData) { + nodeData.wrapMethod('getItemModel', function (model, idx) { + var seriesModel = model.parentModel; + var layout = seriesModel.getData().getItemLayout(idx); + + if (layout) { + var nodeDepth = layout.depth; + var levelModel = seriesModel.levelModels[nodeDepth]; + + if (levelModel) { + model.parentModel = levelModel; + } + } + + return model; + }); + edgeData.wrapMethod('getItemModel', function (model, idx) { + var seriesModel = model.parentModel; + var edge = seriesModel.getGraph().getEdgeByIndex(idx); + var layout = edge.node1.getLayout(); + + if (layout) { + var depth = layout.depth; + var levelModel = seriesModel.levelModels[depth]; + + if (levelModel) { + model.parentModel = levelModel; + } + } + + return model; + }); + } + }; + + SankeySeriesModel.prototype.setNodePosition = function (dataIndex, localPosition) { + var nodes = this.option.data || this.option.nodes; + var dataItem = nodes[dataIndex]; + dataItem.localX = localPosition[0]; + dataItem.localY = localPosition[1]; + }; + /** + * Return the graphic data structure + * + * @return graphic data structure + */ + + + SankeySeriesModel.prototype.getGraph = function () { + return this.getData().graph; + }; + /** + * Get edge data of graphic data structure + * + * @return data structure of list + */ + + + SankeySeriesModel.prototype.getEdgeData = function () { + return this.getGraph().edgeData; + }; + + SankeySeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + function noValue(val) { + return isNaN(val) || val == null; + } // dataType === 'node' or empty do not show tooltip by default + + + if (dataType === 'edge') { + var params = this.getDataParams(dataIndex, dataType); + var rawDataOpt = params.data; + var edgeValue = params.value; + var edgeName = rawDataOpt.source + ' -- ' + rawDataOpt.target; + return createTooltipMarkup('nameValue', { + name: edgeName, + value: edgeValue, + noValue: noValue(edgeValue) + }); + } // dataType === 'node' + else { + var node = this.getGraph().getNodeByIndex(dataIndex); + var value = node.getLayout().value; + var name_1 = this.getDataParams(dataIndex, dataType).data.name; + return createTooltipMarkup('nameValue', { + name: name_1 != null ? name_1 + '' : null, + value: value, + noValue: noValue(value) + }); + } + }; + + SankeySeriesModel.prototype.optionUpdated = function () {}; // Override Series.getDataParams() + + + SankeySeriesModel.prototype.getDataParams = function (dataIndex, dataType) { + var params = _super.prototype.getDataParams.call(this, dataIndex, dataType); + + if (params.value == null && dataType === 'node') { + var node = this.getGraph().getNodeByIndex(dataIndex); + var nodeValue = node.getLayout().value; + params.value = nodeValue; + } + + return params; + }; + + SankeySeriesModel.type = 'series.sankey'; + SankeySeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'view', + left: '5%', + top: '5%', + right: '20%', + bottom: '5%', + orient: 'horizontal', + nodeWidth: 20, + nodeGap: 8, + draggable: true, + layoutIterations: 32, + label: { + show: true, + position: 'right', + fontSize: 12 + }, + levels: [], + nodeAlign: 'justify', + lineStyle: { + color: '#314656', + opacity: 0.2, + curveness: 0.5 + }, + emphasis: { + label: { + show: true + }, + lineStyle: { + opacity: 0.5 + } + }, + select: { + itemStyle: { + borderColor: '#212121' + } + }, + animationEasing: 'linear', + animationDuration: 1000 + }; + return SankeySeriesModel; + }(SeriesModel); + + function sankeyLayout(ecModel, api) { + ecModel.eachSeriesByType('sankey', function (seriesModel) { + var nodeWidth = seriesModel.get('nodeWidth'); + var nodeGap = seriesModel.get('nodeGap'); + var layoutInfo = getViewRect$4(seriesModel, api); + seriesModel.layoutInfo = layoutInfo; + var width = layoutInfo.width; + var height = layoutInfo.height; + var graph = seriesModel.getGraph(); + var nodes = graph.nodes; + var edges = graph.edges; + computeNodeValues(nodes); + var filteredNodes = filter(nodes, function (node) { + return node.getLayout().value === 0; + }); + var iterations = filteredNodes.length !== 0 ? 0 : seriesModel.get('layoutIterations'); + var orient = seriesModel.get('orient'); + var nodeAlign = seriesModel.get('nodeAlign'); + layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign); + }); + } + /** + * Get the layout position of the whole view + */ + + function getViewRect$4(seriesModel, api) { + return getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + } + + function layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign) { + computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign); + computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient); + computeEdgeDepths(nodes, orient); + } + /** + * Compute the value of each node by summing the associated edge's value + */ + + + function computeNodeValues(nodes) { + each(nodes, function (node) { + var value1 = sum(node.outEdges, getEdgeValue); + var value2 = sum(node.inEdges, getEdgeValue); + var nodeRawValue = node.getValue() || 0; + var value = Math.max(value1, value2, nodeRawValue); + node.setLayout({ + value: value + }, true); + }); + } + /** + * Compute the x-position for each node. + * + * Here we use Kahn algorithm to detect cycle when we traverse + * the node to computer the initial x position. + */ + + + function computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign) { + // Used to mark whether the edge is deleted. if it is deleted, + // the value is 0, otherwise it is 1. + var remainEdges = []; // Storage each node's indegree. + + var indegreeArr = []; //Used to storage the node with indegree is equal to 0. + + var zeroIndegrees = []; + var nextTargetNode = []; + var x = 0; // let kx = 0; + + for (var i = 0; i < edges.length; i++) { + remainEdges[i] = 1; + } + + for (var i = 0; i < nodes.length; i++) { + indegreeArr[i] = nodes[i].inEdges.length; + + if (indegreeArr[i] === 0) { + zeroIndegrees.push(nodes[i]); + } + } + + var maxNodeDepth = -1; // Traversing nodes using topological sorting to calculate the + // horizontal(if orient === 'horizontal') or vertical(if orient === 'vertical') + // position of the nodes. + + while (zeroIndegrees.length) { + for (var idx = 0; idx < zeroIndegrees.length; idx++) { + var node = zeroIndegrees[idx]; + var item = node.hostGraph.data.getRawDataItem(node.dataIndex); + var isItemDepth = item.depth != null && item.depth >= 0; + + if (isItemDepth && item.depth > maxNodeDepth) { + maxNodeDepth = item.depth; + } + + node.setLayout({ + depth: isItemDepth ? item.depth : x + }, true); + orient === 'vertical' ? node.setLayout({ + dy: nodeWidth + }, true) : node.setLayout({ + dx: nodeWidth + }, true); + + for (var edgeIdx = 0; edgeIdx < node.outEdges.length; edgeIdx++) { + var edge = node.outEdges[edgeIdx]; + var indexEdge = edges.indexOf(edge); + remainEdges[indexEdge] = 0; + var targetNode = edge.node2; + var nodeIndex = nodes.indexOf(targetNode); + + if (--indegreeArr[nodeIndex] === 0 && nextTargetNode.indexOf(targetNode) < 0) { + nextTargetNode.push(targetNode); + } + } + } + + ++x; + zeroIndegrees = nextTargetNode; + nextTargetNode = []; + } + + for (var i = 0; i < remainEdges.length; i++) { + if (remainEdges[i] === 1) { + throw new Error('Sankey is a DAG, the original data has cycle!'); + } + } + + var maxDepth = maxNodeDepth > x - 1 ? maxNodeDepth : x - 1; + + if (nodeAlign && nodeAlign !== 'left') { + adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth); + } + + var kx = orient === 'vertical' ? (height - nodeWidth) / maxDepth : (width - nodeWidth) / maxDepth; + scaleNodeBreadths(nodes, kx, orient); + } + + function isNodeDepth(node) { + var item = node.hostGraph.data.getRawDataItem(node.dataIndex); + return item.depth != null && item.depth >= 0; + } + + function adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth) { + if (nodeAlign === 'right') { + var nextSourceNode = []; + var remainNodes = nodes; + var nodeHeight = 0; + + while (remainNodes.length) { + for (var i = 0; i < remainNodes.length; i++) { + var node = remainNodes[i]; + node.setLayout({ + skNodeHeight: nodeHeight + }, true); + + for (var j = 0; j < node.inEdges.length; j++) { + var edge = node.inEdges[j]; + + if (nextSourceNode.indexOf(edge.node1) < 0) { + nextSourceNode.push(edge.node1); + } + } + } + + remainNodes = nextSourceNode; + nextSourceNode = []; + ++nodeHeight; + } + + each(nodes, function (node) { + if (!isNodeDepth(node)) { + node.setLayout({ + depth: Math.max(0, maxDepth - node.getLayout().skNodeHeight) + }, true); + } + }); + } else if (nodeAlign === 'justify') { + moveSinksRight(nodes, maxDepth); + } + } + /** + * All the node without outEgdes are assigned maximum x-position and + * be aligned in the last column. + * + * @param nodes. node of sankey view. + * @param maxDepth. use to assign to node without outEdges as x-position. + */ + + + function moveSinksRight(nodes, maxDepth) { + each(nodes, function (node) { + if (!isNodeDepth(node) && !node.outEdges.length) { + node.setLayout({ + depth: maxDepth + }, true); + } + }); + } + /** + * Scale node x-position to the width + * + * @param nodes node of sankey view + * @param kx multiple used to scale nodes + */ + + + function scaleNodeBreadths(nodes, kx, orient) { + each(nodes, function (node) { + var nodeDepth = node.getLayout().depth * kx; + orient === 'vertical' ? node.setLayout({ + y: nodeDepth + }, true) : node.setLayout({ + x: nodeDepth + }, true); + }); + } + /** + * Using Gauss-Seidel iterations method to compute the node depth(y-position) + * + * @param nodes node of sankey view + * @param edges edge of sankey view + * @param height the whole height of the area to draw the view + * @param nodeGap the vertical distance between two nodes + * in the same column. + * @param iterations the number of iterations for the algorithm + */ + + + function computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient) { + var nodesByBreadth = prepareNodesByBreadth(nodes, orient); + initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient); + resolveCollisions(nodesByBreadth, nodeGap, height, width, orient); + + for (var alpha = 1; iterations > 0; iterations--) { + // 0.99 is a experience parameter, ensure that each iterations of + // changes as small as possible. + alpha *= 0.99; + relaxRightToLeft(nodesByBreadth, alpha, orient); + resolveCollisions(nodesByBreadth, nodeGap, height, width, orient); + relaxLeftToRight(nodesByBreadth, alpha, orient); + resolveCollisions(nodesByBreadth, nodeGap, height, width, orient); + } + } + + function prepareNodesByBreadth(nodes, orient) { + var nodesByBreadth = []; + var keyAttr = orient === 'vertical' ? 'y' : 'x'; + var groupResult = groupData(nodes, function (node) { + return node.getLayout()[keyAttr]; + }); + groupResult.keys.sort(function (a, b) { + return a - b; + }); + each(groupResult.keys, function (key) { + nodesByBreadth.push(groupResult.buckets.get(key)); + }); + return nodesByBreadth; + } + /** + * Compute the original y-position for each node + */ + + + function initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient) { + var minKy = Infinity; + each(nodesByBreadth, function (nodes) { + var n = nodes.length; + var sum = 0; + each(nodes, function (node) { + sum += node.getLayout().value; + }); + var ky = orient === 'vertical' ? (width - (n - 1) * nodeGap) / sum : (height - (n - 1) * nodeGap) / sum; + + if (ky < minKy) { + minKy = ky; + } + }); + each(nodesByBreadth, function (nodes) { + each(nodes, function (node, i) { + var nodeDy = node.getLayout().value * minKy; + + if (orient === 'vertical') { + node.setLayout({ + x: i + }, true); + node.setLayout({ + dx: nodeDy + }, true); + } else { + node.setLayout({ + y: i + }, true); + node.setLayout({ + dy: nodeDy + }, true); + } + }); + }); + each(edges, function (edge) { + var edgeDy = +edge.getValue() * minKy; + edge.setLayout({ + dy: edgeDy + }, true); + }); + } + /** + * Resolve the collision of initialized depth (y-position) + */ + + + function resolveCollisions(nodesByBreadth, nodeGap, height, width, orient) { + var keyAttr = orient === 'vertical' ? 'x' : 'y'; + each(nodesByBreadth, function (nodes) { + nodes.sort(function (a, b) { + return a.getLayout()[keyAttr] - b.getLayout()[keyAttr]; + }); + var nodeX; + var node; + var dy; + var y0 = 0; + var n = nodes.length; + var nodeDyAttr = orient === 'vertical' ? 'dx' : 'dy'; + + for (var i = 0; i < n; i++) { + node = nodes[i]; + dy = y0 - node.getLayout()[keyAttr]; + + if (dy > 0) { + nodeX = node.getLayout()[keyAttr] + dy; + orient === 'vertical' ? node.setLayout({ + x: nodeX + }, true) : node.setLayout({ + y: nodeX + }, true); + } + + y0 = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap; + } + + var viewWidth = orient === 'vertical' ? width : height; // If the bottommost node goes outside the bounds, push it back up + + dy = y0 - nodeGap - viewWidth; + + if (dy > 0) { + nodeX = node.getLayout()[keyAttr] - dy; + orient === 'vertical' ? node.setLayout({ + x: nodeX + }, true) : node.setLayout({ + y: nodeX + }, true); + y0 = nodeX; + + for (var i = n - 2; i >= 0; --i) { + node = nodes[i]; + dy = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap - y0; + + if (dy > 0) { + nodeX = node.getLayout()[keyAttr] - dy; + orient === 'vertical' ? node.setLayout({ + x: nodeX + }, true) : node.setLayout({ + y: nodeX + }, true); + } + + y0 = node.getLayout()[keyAttr]; + } + } + }); + } + /** + * Change the y-position of the nodes, except most the right side nodes + * @param nodesByBreadth + * @param alpha parameter used to adjust the nodes y-position + */ + + + function relaxRightToLeft(nodesByBreadth, alpha, orient) { + each(nodesByBreadth.slice().reverse(), function (nodes) { + each(nodes, function (node) { + if (node.outEdges.length) { + var y = sum(node.outEdges, weightedTarget, orient) / sum(node.outEdges, getEdgeValue); + + if (isNaN(y)) { + var len = node.outEdges.length; + y = len ? sum(node.outEdges, centerTarget, orient) / len : 0; + } + + if (orient === 'vertical') { + var nodeX = node.getLayout().x + (y - center$1(node, orient)) * alpha; + node.setLayout({ + x: nodeX + }, true); + } else { + var nodeY = node.getLayout().y + (y - center$1(node, orient)) * alpha; + node.setLayout({ + y: nodeY + }, true); + } + } + }); + }); + } + + function weightedTarget(edge, orient) { + return center$1(edge.node2, orient) * edge.getValue(); + } + + function centerTarget(edge, orient) { + return center$1(edge.node2, orient); + } + + function weightedSource(edge, orient) { + return center$1(edge.node1, orient) * edge.getValue(); + } + + function centerSource(edge, orient) { + return center$1(edge.node1, orient); + } + + function center$1(node, orient) { + return orient === 'vertical' ? node.getLayout().x + node.getLayout().dx / 2 : node.getLayout().y + node.getLayout().dy / 2; + } + + function getEdgeValue(edge) { + return edge.getValue(); + } + + function sum(array, cb, orient) { + var sum = 0; + var len = array.length; + var i = -1; + + while (++i < len) { + var value = +cb(array[i], orient); + + if (!isNaN(value)) { + sum += value; + } + } + + return sum; + } + /** + * Change the y-position of the nodes, except most the left side nodes + */ + + + function relaxLeftToRight(nodesByBreadth, alpha, orient) { + each(nodesByBreadth, function (nodes) { + each(nodes, function (node) { + if (node.inEdges.length) { + var y = sum(node.inEdges, weightedSource, orient) / sum(node.inEdges, getEdgeValue); + + if (isNaN(y)) { + var len = node.inEdges.length; + y = len ? sum(node.inEdges, centerSource, orient) / len : 0; + } + + if (orient === 'vertical') { + var nodeX = node.getLayout().x + (y - center$1(node, orient)) * alpha; + node.setLayout({ + x: nodeX + }, true); + } else { + var nodeY = node.getLayout().y + (y - center$1(node, orient)) * alpha; + node.setLayout({ + y: nodeY + }, true); + } + } + }); + }); + } + /** + * Compute the depth(y-position) of each edge + */ + + + function computeEdgeDepths(nodes, orient) { + var keyAttr = orient === 'vertical' ? 'x' : 'y'; + each(nodes, function (node) { + node.outEdges.sort(function (a, b) { + return a.node2.getLayout()[keyAttr] - b.node2.getLayout()[keyAttr]; + }); + node.inEdges.sort(function (a, b) { + return a.node1.getLayout()[keyAttr] - b.node1.getLayout()[keyAttr]; + }); + }); + each(nodes, function (node) { + var sy = 0; + var ty = 0; + each(node.outEdges, function (edge) { + edge.setLayout({ + sy: sy + }, true); + sy += edge.getLayout().dy; + }); + each(node.inEdges, function (edge) { + edge.setLayout({ + ty: ty + }, true); + ty += edge.getLayout().dy; + }); + }); + } + + function sankeyVisual(ecModel) { + ecModel.eachSeriesByType('sankey', function (seriesModel) { + var graph = seriesModel.getGraph(); + var nodes = graph.nodes; + + if (nodes.length) { + var minValue_1 = Infinity; + var maxValue_1 = -Infinity; + each(nodes, function (node) { + var nodeValue = node.getLayout().value; + + if (nodeValue < minValue_1) { + minValue_1 = nodeValue; + } + + if (nodeValue > maxValue_1) { + maxValue_1 = nodeValue; + } + }); + each(nodes, function (node) { + var mapping = new VisualMapping({ + type: 'color', + mappingMethod: 'linear', + dataExtent: [minValue_1, maxValue_1], + visual: seriesModel.get('color') + }); + var mapValueToColor = mapping.mapValueToVisual(node.getLayout().value); + var customColor = node.getModel().get(['itemStyle', 'color']); + + if (customColor != null) { + node.setVisual('color', customColor); + node.setVisual('style', { + fill: customColor + }); + } else { + node.setVisual('color', mapValueToColor); + node.setVisual('style', { + fill: mapValueToColor + }); + } + }); + } + }); + } + + function install$i(registers) { + registers.registerChartView(SankeyView); + registers.registerSeriesModel(SankeySeriesModel); + registers.registerLayout(sankeyLayout); + registers.registerVisual(sankeyVisual); + registers.registerAction({ + type: 'dragNode', + event: 'dragnode', + // here can only use 'update' now, other value is not support in echarts. + update: 'update' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'sankey', + query: payload + }, function (seriesModel) { + seriesModel.setNodePosition(payload.dataIndex, [payload.localX, payload.localY]); + }); + }); + } + + var WhiskerBoxCommonMixin = + /** @class */ + function () { + function WhiskerBoxCommonMixin() {} + /** + * @override + */ + + + WhiskerBoxCommonMixin.prototype.getInitialData = function (option, ecModel) { + // When both types of xAxis and yAxis are 'value', layout is + // needed to be specified by user. Otherwise, layout can be + // judged by which axis is category. + var ordinalMeta; + var xAxisModel = ecModel.getComponent('xAxis', this.get('xAxisIndex')); + var yAxisModel = ecModel.getComponent('yAxis', this.get('yAxisIndex')); + var xAxisType = xAxisModel.get('type'); + var yAxisType = yAxisModel.get('type'); + var addOrdinal; // FIXME + // Consider time axis. + + if (xAxisType === 'category') { + option.layout = 'horizontal'; + ordinalMeta = xAxisModel.getOrdinalMeta(); + addOrdinal = true; + } else if (yAxisType === 'category') { + option.layout = 'vertical'; + ordinalMeta = yAxisModel.getOrdinalMeta(); + addOrdinal = true; + } else { + option.layout = option.layout || 'horizontal'; + } + + var coordDims = ['x', 'y']; + var baseAxisDimIndex = option.layout === 'horizontal' ? 0 : 1; + var baseAxisDim = this._baseAxisDim = coordDims[baseAxisDimIndex]; + var otherAxisDim = coordDims[1 - baseAxisDimIndex]; + var axisModels = [xAxisModel, yAxisModel]; + var baseAxisType = axisModels[baseAxisDimIndex].get('type'); + var otherAxisType = axisModels[1 - baseAxisDimIndex].get('type'); + var data = option.data; // Clone a new data for next setOption({}) usage. + // Avoid modifying current data will affect further update. + + if (data && addOrdinal) { + var newOptionData_1 = []; + each(data, function (item, index) { + var newItem; + + if (isArray(item)) { + newItem = item.slice(); // Modify current using data. + + item.unshift(index); + } else if (isArray(item.value)) { + newItem = extend({}, item); + newItem.value = newItem.value.slice(); // Modify current using data. + + item.value.unshift(index); + } else { + newItem = item; + } + + newOptionData_1.push(newItem); + }); + option.data = newOptionData_1; + } + + var defaultValueDimensions = this.defaultValueDimensions; + var coordDimensions = [{ + name: baseAxisDim, + type: getDimensionTypeByAxis(baseAxisType), + ordinalMeta: ordinalMeta, + otherDims: { + tooltip: false, + itemName: 0 + }, + dimsDef: ['base'] + }, { + name: otherAxisDim, + type: getDimensionTypeByAxis(otherAxisType), + dimsDef: defaultValueDimensions.slice() + }]; + return createSeriesDataSimply(this, { + coordDimensions: coordDimensions, + dimensionsCount: defaultValueDimensions.length + 1, + encodeDefaulter: curry(makeSeriesEncodeForAxisCoordSys, coordDimensions, this) + }); + }; + /** + * If horizontal, base axis is x, otherwise y. + * @override + */ + + + WhiskerBoxCommonMixin.prototype.getBaseAxis = function () { + var dim = this._baseAxisDim; + return this.ecModel.getComponent(dim + 'Axis', this.get(dim + 'AxisIndex')).axis; + }; + + return WhiskerBoxCommonMixin; + }(); + + var BoxplotSeriesModel = + /** @class */ + function (_super) { + __extends(BoxplotSeriesModel, _super); + + function BoxplotSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BoxplotSeriesModel.type; // TODO + // box width represents group size, so dimension should have 'size'. + + /** + * @see <https://en.wikipedia.org/wiki/Box_plot> + * The meanings of 'min' and 'max' depend on user, + * and echarts do not need to know it. + * @readOnly + */ + + _this.defaultValueDimensions = [{ + name: 'min', + defaultTooltip: true + }, { + name: 'Q1', + defaultTooltip: true + }, { + name: 'median', + defaultTooltip: true + }, { + name: 'Q3', + defaultTooltip: true + }, { + name: 'max', + defaultTooltip: true + }]; + _this.visualDrawType = 'stroke'; + return _this; + } + + BoxplotSeriesModel.type = 'series.boxplot'; + BoxplotSeriesModel.dependencies = ['xAxis', 'yAxis', 'grid']; + BoxplotSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + layout: null, + boxWidth: [7, 50], + itemStyle: { + color: '#fff', + borderWidth: 1 + }, + emphasis: { + scale: true, + itemStyle: { + borderWidth: 2, + shadowBlur: 5, + shadowOffsetX: 1, + shadowOffsetY: 1, + shadowColor: 'rgba(0,0,0,0.2)' + } + }, + animationDuration: 800 + }; + return BoxplotSeriesModel; + }(SeriesModel); + + mixin(BoxplotSeriesModel, WhiskerBoxCommonMixin, true); + + var BoxplotView = + /** @class */ + function (_super) { + __extends(BoxplotView, _super); + + function BoxplotView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BoxplotView.type; + return _this; + } + + BoxplotView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var group = this.group; + var oldData = this._data; // There is no old data only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + + if (!this._data) { + group.removeAll(); + } + + var constDim = seriesModel.get('layout') === 'horizontal' ? 1 : 0; + data.diff(oldData).add(function (newIdx) { + if (data.hasValue(newIdx)) { + var itemLayout = data.getItemLayout(newIdx); + var symbolEl = createNormalBox(itemLayout, data, newIdx, constDim, true); + data.setItemGraphicEl(newIdx, symbolEl); + group.add(symbolEl); + } + }).update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); // Empty data + + if (!data.hasValue(newIdx)) { + group.remove(symbolEl); + return; + } + + var itemLayout = data.getItemLayout(newIdx); + + if (!symbolEl) { + symbolEl = createNormalBox(itemLayout, data, newIdx, constDim); + } else { + saveOldStyle(symbolEl); + updateNormalBoxData(itemLayout, symbolEl, data, newIdx); + } + + group.add(symbolEl); + data.setItemGraphicEl(newIdx, symbolEl); + }).remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && group.remove(el); + }).execute(); + this._data = data; + }; + + BoxplotView.prototype.remove = function (ecModel) { + var group = this.group; + var data = this._data; + this._data = null; + data && data.eachItemGraphicEl(function (el) { + el && group.remove(el); + }); + }; + + BoxplotView.type = 'boxplot'; + return BoxplotView; + }(ChartView); + + var BoxPathShape = + /** @class */ + function () { + function BoxPathShape() {} + + return BoxPathShape; + }(); + + var BoxPath = + /** @class */ + function (_super) { + __extends(BoxPath, _super); + + function BoxPath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'boxplotBoxPath'; + return _this; + } + + BoxPath.prototype.getDefaultShape = function () { + return new BoxPathShape(); + }; + + BoxPath.prototype.buildPath = function (ctx, shape) { + var ends = shape.points; + var i = 0; + ctx.moveTo(ends[i][0], ends[i][1]); + i++; + + for (; i < 4; i++) { + ctx.lineTo(ends[i][0], ends[i][1]); + } + + ctx.closePath(); + + for (; i < ends.length; i++) { + ctx.moveTo(ends[i][0], ends[i][1]); + i++; + ctx.lineTo(ends[i][0], ends[i][1]); + } + }; + + return BoxPath; + }(Path); + + function createNormalBox(itemLayout, data, dataIndex, constDim, isInit) { + var ends = itemLayout.ends; + var el = new BoxPath({ + shape: { + points: isInit ? transInit(ends, constDim, itemLayout) : ends + } + }); + updateNormalBoxData(itemLayout, el, data, dataIndex, isInit); + return el; + } + + function updateNormalBoxData(itemLayout, el, data, dataIndex, isInit) { + var seriesModel = data.hostModel; + var updateMethod = graphic[isInit ? 'initProps' : 'updateProps']; + updateMethod(el, { + shape: { + points: itemLayout.ends + } + }, seriesModel, dataIndex); + el.useStyle(data.getItemVisual(dataIndex, 'style')); + el.style.strokeNoScale = true; + el.z2 = 100; + var itemModel = data.getItemModel(dataIndex); + var emphasisModel = itemModel.getModel('emphasis'); + setStatesStylesFromModel(el, itemModel); + toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + } + + function transInit(points, dim, itemLayout) { + return map(points, function (point) { + point = point.slice(); + point[dim] = itemLayout.initBaseline; + return point; + }); + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + function boxplotVisual(ecModel, api) {} + + var each$6 = each; + function boxplotLayout(ecModel) { + var groupResult = groupSeriesByAxis(ecModel); + each$6(groupResult, function (groupItem) { + var seriesModels = groupItem.seriesModels; + + if (!seriesModels.length) { + return; + } + + calculateBase(groupItem); + each$6(seriesModels, function (seriesModel, idx) { + layoutSingleSeries(seriesModel, groupItem.boxOffsetList[idx], groupItem.boxWidthList[idx]); + }); + }); + } + /** + * Group series by axis. + */ + + function groupSeriesByAxis(ecModel) { + var result = []; + var axisList = []; + ecModel.eachSeriesByType('boxplot', function (seriesModel) { + var baseAxis = seriesModel.getBaseAxis(); + var idx = indexOf(axisList, baseAxis); + + if (idx < 0) { + idx = axisList.length; + axisList[idx] = baseAxis; + result[idx] = { + axis: baseAxis, + seriesModels: [] + }; + } + + result[idx].seriesModels.push(seriesModel); + }); + return result; + } + /** + * Calculate offset and box width for each series. + */ + + + function calculateBase(groupItem) { + var baseAxis = groupItem.axis; + var seriesModels = groupItem.seriesModels; + var seriesCount = seriesModels.length; + var boxWidthList = groupItem.boxWidthList = []; + var boxOffsetList = groupItem.boxOffsetList = []; + var boundList = []; + var bandWidth; + + if (baseAxis.type === 'category') { + bandWidth = baseAxis.getBandWidth(); + } else { + var maxDataCount_1 = 0; + each$6(seriesModels, function (seriesModel) { + maxDataCount_1 = Math.max(maxDataCount_1, seriesModel.getData().count()); + }); + var extent = baseAxis.getExtent(); + bandWidth = Math.abs(extent[1] - extent[0]) / maxDataCount_1; + } + + each$6(seriesModels, function (seriesModel) { + var boxWidthBound = seriesModel.get('boxWidth'); + + if (!isArray(boxWidthBound)) { + boxWidthBound = [boxWidthBound, boxWidthBound]; + } + + boundList.push([parsePercent$1(boxWidthBound[0], bandWidth) || 0, parsePercent$1(boxWidthBound[1], bandWidth) || 0]); + }); + var availableWidth = bandWidth * 0.8 - 2; + var boxGap = availableWidth / seriesCount * 0.3; + var boxWidth = (availableWidth - boxGap * (seriesCount - 1)) / seriesCount; + var base = boxWidth / 2 - availableWidth / 2; + each$6(seriesModels, function (seriesModel, idx) { + boxOffsetList.push(base); + base += boxGap + boxWidth; + boxWidthList.push(Math.min(Math.max(boxWidth, boundList[idx][0]), boundList[idx][1])); + }); + } + /** + * Calculate points location for each series. + */ + + + function layoutSingleSeries(seriesModel, offset, boxWidth) { + var coordSys = seriesModel.coordinateSystem; + var data = seriesModel.getData(); + var halfWidth = boxWidth / 2; + var cDimIdx = seriesModel.get('layout') === 'horizontal' ? 0 : 1; + var vDimIdx = 1 - cDimIdx; + var coordDims = ['x', 'y']; + var cDim = data.mapDimension(coordDims[cDimIdx]); + var vDims = data.mapDimensionsAll(coordDims[vDimIdx]); + + if (cDim == null || vDims.length < 5) { + return; + } + + for (var dataIndex = 0; dataIndex < data.count(); dataIndex++) { + var axisDimVal = data.get(cDim, dataIndex); + var median = getPoint(axisDimVal, vDims[2], dataIndex); + var end1 = getPoint(axisDimVal, vDims[0], dataIndex); + var end2 = getPoint(axisDimVal, vDims[1], dataIndex); + var end4 = getPoint(axisDimVal, vDims[3], dataIndex); + var end5 = getPoint(axisDimVal, vDims[4], dataIndex); + var ends = []; + addBodyEnd(ends, end2, false); + addBodyEnd(ends, end4, true); + ends.push(end1, end2, end5, end4); + layEndLine(ends, end1); + layEndLine(ends, end5); + layEndLine(ends, median); + data.setItemLayout(dataIndex, { + initBaseline: median[vDimIdx], + ends: ends + }); + } + + function getPoint(axisDimVal, dim, dataIndex) { + var val = data.get(dim, dataIndex); + var p = []; + p[cDimIdx] = axisDimVal; + p[vDimIdx] = val; + var point; + + if (isNaN(axisDimVal) || isNaN(val)) { + point = [NaN, NaN]; + } else { + point = coordSys.dataToPoint(p); + point[cDimIdx] += offset; + } + + return point; + } + + function addBodyEnd(ends, point, start) { + var point1 = point.slice(); + var point2 = point.slice(); + point1[cDimIdx] += halfWidth; + point2[cDimIdx] -= halfWidth; + start ? ends.push(point1, point2) : ends.push(point2, point1); + } + + function layEndLine(ends, endCenter) { + var from = endCenter.slice(); + var to = endCenter.slice(); + from[cDimIdx] -= halfWidth; + to[cDimIdx] += halfWidth; + ends.push(from, to); + } + } + + /** + * See: + * <https://en.wikipedia.org/wiki/Box_plot#cite_note-frigge_hoaglin_iglewicz-2> + * <http://stat.ethz.ch/R-manual/R-devel/library/grDevices/html/boxplot.stats.html> + * + * Helper method for preparing data. + * + * @param rawData like + * [ + * [12,232,443], (raw data set for the first box) + * [3843,5545,1232], (raw data set for the second box) + * ... + * ] + * @param opt.boundIQR=1.5 Data less than min bound is outlier. + * default 1.5, means Q1 - 1.5 * (Q3 - Q1). + * If 'none'/0 passed, min bound will not be used. + */ + + function prepareBoxplotData(rawData, opt) { + opt = opt || {}; + var boxData = []; + var outliers = []; + var boundIQR = opt.boundIQR; + var useExtreme = boundIQR === 'none' || boundIQR === 0; + + for (var i = 0; i < rawData.length; i++) { + var ascList = asc(rawData[i].slice()); + var Q1 = quantile(ascList, 0.25); + var Q2 = quantile(ascList, 0.5); + var Q3 = quantile(ascList, 0.75); + var min = ascList[0]; + var max = ascList[ascList.length - 1]; + var bound = (boundIQR == null ? 1.5 : boundIQR) * (Q3 - Q1); + var low = useExtreme ? min : Math.max(min, Q1 - bound); + var high = useExtreme ? max : Math.min(max, Q3 + bound); + var itemNameFormatter = opt.itemNameFormatter; + var itemName = isFunction(itemNameFormatter) ? itemNameFormatter({ + value: i + }) : isString(itemNameFormatter) ? itemNameFormatter.replace('{value}', i + '') : i + ''; + boxData.push([itemName, low, Q1, Q2, Q3, high]); + + for (var j = 0; j < ascList.length; j++) { + var dataItem = ascList[j]; + + if (dataItem < low || dataItem > high) { + var outlier = [itemName, dataItem]; + outliers.push(outlier); + } + } + } + + return { + boxData: boxData, + outliers: outliers + }; + } + + var boxplotTransform = { + type: 'echarts:boxplot', + transform: function transform(params) { + var upstream = params.upstream; + + if (upstream.sourceFormat !== SOURCE_FORMAT_ARRAY_ROWS) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('source data is not applicable for this boxplot transform. Expect number[][].'); + } + + throwError(errMsg); + } + + var result = prepareBoxplotData(upstream.getRawData(), params.config); + return [{ + dimensions: ['ItemName', 'Low', 'Q1', 'Q2', 'Q3', 'High'], + data: result.boxData + }, { + data: result.outliers + }]; + } + }; + + function install$j(registers) { + registers.registerSeriesModel(BoxplotSeriesModel); + registers.registerChartView(BoxplotView); + registers.registerVisual(boxplotVisual); + registers.registerLayout(boxplotLayout); + registers.registerTransform(boxplotTransform); + } + + var SKIP_PROPS = ['color', 'borderColor']; + + var CandlestickView = + /** @class */ + function (_super) { + __extends(CandlestickView, _super); + + function CandlestickView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CandlestickView.type; + return _this; + } + + CandlestickView.prototype.render = function (seriesModel, ecModel, api) { + // If there is clipPath created in large mode. Remove it. + this.group.removeClipPath(); // Clear previously rendered progressive elements. + + this._progressiveEls = null; + + this._updateDrawMode(seriesModel); + + this._isLargeDraw ? this._renderLarge(seriesModel) : this._renderNormal(seriesModel); + }; + + CandlestickView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + this._clear(); + + this._updateDrawMode(seriesModel); + }; + + CandlestickView.prototype.incrementalRender = function (params, seriesModel, ecModel, api) { + this._progressiveEls = []; + this._isLargeDraw ? this._incrementalRenderLarge(params, seriesModel) : this._incrementalRenderNormal(params, seriesModel); + }; + + CandlestickView.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + CandlestickView.prototype._updateDrawMode = function (seriesModel) { + var isLargeDraw = seriesModel.pipelineContext.large; + + if (this._isLargeDraw == null || isLargeDraw !== this._isLargeDraw) { + this._isLargeDraw = isLargeDraw; + + this._clear(); + } + }; + + CandlestickView.prototype._renderNormal = function (seriesModel) { + var data = seriesModel.getData(); + var oldData = this._data; + var group = this.group; + var isSimpleBox = data.getLayout('isSimpleBox'); + var needsClip = seriesModel.get('clip', true); + var coord = seriesModel.coordinateSystem; + var clipArea = coord.getArea && coord.getArea(); // There is no old data only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + + if (!this._data) { + group.removeAll(); + } + + data.diff(oldData).add(function (newIdx) { + if (data.hasValue(newIdx)) { + var itemLayout = data.getItemLayout(newIdx); + + if (needsClip && isNormalBoxClipped(clipArea, itemLayout)) { + return; + } + + var el = createNormalBox$1(itemLayout, newIdx, true); + initProps(el, { + shape: { + points: itemLayout.ends + } + }, seriesModel, newIdx); + setBoxCommon(el, data, newIdx, isSimpleBox); + group.add(el); + data.setItemGraphicEl(newIdx, el); + } + }).update(function (newIdx, oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); // Empty data + + if (!data.hasValue(newIdx)) { + group.remove(el); + return; + } + + var itemLayout = data.getItemLayout(newIdx); + + if (needsClip && isNormalBoxClipped(clipArea, itemLayout)) { + group.remove(el); + return; + } + + if (!el) { + el = createNormalBox$1(itemLayout); + } else { + updateProps(el, { + shape: { + points: itemLayout.ends + } + }, seriesModel, newIdx); + saveOldStyle(el); + } + + setBoxCommon(el, data, newIdx, isSimpleBox); + group.add(el); + data.setItemGraphicEl(newIdx, el); + }).remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && group.remove(el); + }).execute(); + this._data = data; + }; + + CandlestickView.prototype._renderLarge = function (seriesModel) { + this._clear(); + + createLarge$1(seriesModel, this.group); + var clipPath = seriesModel.get('clip', true) ? createClipPath(seriesModel.coordinateSystem, false, seriesModel) : null; + + if (clipPath) { + this.group.setClipPath(clipPath); + } else { + this.group.removeClipPath(); + } + }; + + CandlestickView.prototype._incrementalRenderNormal = function (params, seriesModel) { + var data = seriesModel.getData(); + var isSimpleBox = data.getLayout('isSimpleBox'); + var dataIndex; + + while ((dataIndex = params.next()) != null) { + var itemLayout = data.getItemLayout(dataIndex); + var el = createNormalBox$1(itemLayout); + setBoxCommon(el, data, dataIndex, isSimpleBox); + el.incremental = true; + this.group.add(el); + + this._progressiveEls.push(el); + } + }; + + CandlestickView.prototype._incrementalRenderLarge = function (params, seriesModel) { + createLarge$1(seriesModel, this.group, this._progressiveEls, true); + }; + + CandlestickView.prototype.remove = function (ecModel) { + this._clear(); + }; + + CandlestickView.prototype._clear = function () { + this.group.removeAll(); + this._data = null; + }; + + CandlestickView.type = 'candlestick'; + return CandlestickView; + }(ChartView); + + var NormalBoxPathShape = + /** @class */ + function () { + function NormalBoxPathShape() {} + + return NormalBoxPathShape; + }(); + + var NormalBoxPath = + /** @class */ + function (_super) { + __extends(NormalBoxPath, _super); + + function NormalBoxPath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'normalCandlestickBox'; + return _this; + } + + NormalBoxPath.prototype.getDefaultShape = function () { + return new NormalBoxPathShape(); + }; + + NormalBoxPath.prototype.buildPath = function (ctx, shape) { + var ends = shape.points; + + if (this.__simpleBox) { + ctx.moveTo(ends[4][0], ends[4][1]); + ctx.lineTo(ends[6][0], ends[6][1]); + } else { + ctx.moveTo(ends[0][0], ends[0][1]); + ctx.lineTo(ends[1][0], ends[1][1]); + ctx.lineTo(ends[2][0], ends[2][1]); + ctx.lineTo(ends[3][0], ends[3][1]); + ctx.closePath(); + ctx.moveTo(ends[4][0], ends[4][1]); + ctx.lineTo(ends[5][0], ends[5][1]); + ctx.moveTo(ends[6][0], ends[6][1]); + ctx.lineTo(ends[7][0], ends[7][1]); + } + }; + + return NormalBoxPath; + }(Path); + + function createNormalBox$1(itemLayout, dataIndex, isInit) { + var ends = itemLayout.ends; + return new NormalBoxPath({ + shape: { + points: isInit ? transInit$1(ends, itemLayout) : ends + }, + z2: 100 + }); + } + + function isNormalBoxClipped(clipArea, itemLayout) { + var clipped = true; + + for (var i = 0; i < itemLayout.ends.length; i++) { + // If any point are in the region. + if (clipArea.contain(itemLayout.ends[i][0], itemLayout.ends[i][1])) { + clipped = false; + break; + } + } + + return clipped; + } + + function setBoxCommon(el, data, dataIndex, isSimpleBox) { + var itemModel = data.getItemModel(dataIndex); + el.useStyle(data.getItemVisual(dataIndex, 'style')); + el.style.strokeNoScale = true; + el.__simpleBox = isSimpleBox; + setStatesStylesFromModel(el, itemModel); + } + + function transInit$1(points, itemLayout) { + return map(points, function (point) { + point = point.slice(); + point[1] = itemLayout.initBaseline; + return point; + }); + } + + var LargeBoxPathShape = + /** @class */ + function () { + function LargeBoxPathShape() {} + + return LargeBoxPathShape; + }(); + + var LargeBoxPath = + /** @class */ + function (_super) { + __extends(LargeBoxPath, _super); + + function LargeBoxPath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'largeCandlestickBox'; + return _this; + } + + LargeBoxPath.prototype.getDefaultShape = function () { + return new LargeBoxPathShape(); + }; + + LargeBoxPath.prototype.buildPath = function (ctx, shape) { + // Drawing lines is more efficient than drawing + // a whole line or drawing rects. + var points = shape.points; + + for (var i = 0; i < points.length;) { + if (this.__sign === points[i++]) { + var x = points[i++]; + ctx.moveTo(x, points[i++]); + ctx.lineTo(x, points[i++]); + } else { + i += 3; + } + } + }; + + return LargeBoxPath; + }(Path); + + function createLarge$1(seriesModel, group, progressiveEls, incremental) { + var data = seriesModel.getData(); + var largePoints = data.getLayout('largePoints'); + var elP = new LargeBoxPath({ + shape: { + points: largePoints + }, + __sign: 1 + }); + group.add(elP); + var elN = new LargeBoxPath({ + shape: { + points: largePoints + }, + __sign: -1 + }); + group.add(elN); + setLargeStyle(1, elP, seriesModel); + setLargeStyle(-1, elN, seriesModel); + + if (incremental) { + elP.incremental = true; + elN.incremental = true; + } + + if (progressiveEls) { + progressiveEls.push(elP, elN); + } + } + + function setLargeStyle(sign, el, seriesModel, data) { + // TODO put in visual? + var borderColor = seriesModel.get(['itemStyle', sign > 0 ? 'borderColor' : 'borderColor0']) || seriesModel.get(['itemStyle', sign > 0 ? 'color' : 'color0']); // Color must be excluded. + // Because symbol provide setColor individually to set fill and stroke + + var itemStyle = seriesModel.getModel('itemStyle').getItemStyle(SKIP_PROPS); + el.useStyle(itemStyle); + el.style.fill = null; + el.style.stroke = borderColor; + } + + var CandlestickSeriesModel = + /** @class */ + function (_super) { + __extends(CandlestickSeriesModel, _super); + + function CandlestickSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CandlestickSeriesModel.type; + _this.defaultValueDimensions = [{ + name: 'open', + defaultTooltip: true + }, { + name: 'close', + defaultTooltip: true + }, { + name: 'lowest', + defaultTooltip: true + }, { + name: 'highest', + defaultTooltip: true + }]; + return _this; + } + /** + * Get dimension for shadow in dataZoom + * @return dimension name + */ + + + CandlestickSeriesModel.prototype.getShadowDim = function () { + return 'open'; + }; + + CandlestickSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) { + var itemLayout = data.getItemLayout(dataIndex); + return itemLayout && selectors.rect(itemLayout.brushRect); + }; + + CandlestickSeriesModel.type = 'series.candlestick'; + CandlestickSeriesModel.dependencies = ['xAxis', 'yAxis', 'grid']; + CandlestickSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + // xAxisIndex: 0, + // yAxisIndex: 0, + layout: null, + clip: true, + itemStyle: { + color: '#eb5454', + color0: '#47b262', + borderColor: '#eb5454', + borderColor0: '#47b262', + // borderColor: '#d24040', + // borderColor0: '#398f4f', + borderWidth: 1 + }, + emphasis: { + scale: true, + itemStyle: { + borderWidth: 2 + } + }, + barMaxWidth: null, + barMinWidth: null, + barWidth: null, + large: true, + largeThreshold: 600, + progressive: 3e3, + progressiveThreshold: 1e4, + progressiveChunkMode: 'mod', + animationEasing: 'linear', + animationDuration: 300 + }; + return CandlestickSeriesModel; + }(SeriesModel); + + mixin(CandlestickSeriesModel, WhiskerBoxCommonMixin, true); + + function candlestickPreprocessor(option) { + if (!option || !isArray(option.series)) { + return; + } // Translate 'k' to 'candlestick'. + + + each(option.series, function (seriesItem) { + if (isObject(seriesItem) && seriesItem.type === 'k') { + seriesItem.type = 'candlestick'; + } + }); + } + + var positiveBorderColorQuery = ['itemStyle', 'borderColor']; + var negativeBorderColorQuery = ['itemStyle', 'borderColor0']; + var positiveColorQuery = ['itemStyle', 'color']; + var negativeColorQuery = ['itemStyle', 'color0']; + var candlestickVisual = { + seriesType: 'candlestick', + plan: createRenderPlanner(), + // For legend. + performRawSeries: true, + reset: function (seriesModel, ecModel) { + function getColor(sign, model) { + return model.get(sign > 0 ? positiveColorQuery : negativeColorQuery); + } + + function getBorderColor(sign, model) { + return model.get(sign > 0 ? positiveBorderColorQuery : negativeBorderColorQuery); + } // Only visible series has each data be visual encoded + + + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var isLargeRender = seriesModel.pipelineContext.large; + return !isLargeRender && { + progress: function (params, data) { + var dataIndex; + + while ((dataIndex = params.next()) != null) { + var itemModel = data.getItemModel(dataIndex); + var sign = data.getItemLayout(dataIndex).sign; + var style = itemModel.getItemStyle(); + style.fill = getColor(sign, itemModel); + style.stroke = getBorderColor(sign, itemModel) || style.fill; + var existsStyle = data.ensureUniqueItemVisual(dataIndex, 'style'); + extend(existsStyle, style); + } + } + }; + } + }; + + var candlestickLayout = { + seriesType: 'candlestick', + plan: createRenderPlanner(), + reset: function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var data = seriesModel.getData(); + var candleWidth = calculateCandleWidth(seriesModel, data); + var cDimIdx = 0; + var vDimIdx = 1; + var coordDims = ['x', 'y']; + var cDimI = data.getDimensionIndex(data.mapDimension(coordDims[cDimIdx])); + var vDimsI = map(data.mapDimensionsAll(coordDims[vDimIdx]), data.getDimensionIndex, data); + var openDimI = vDimsI[0]; + var closeDimI = vDimsI[1]; + var lowestDimI = vDimsI[2]; + var highestDimI = vDimsI[3]; + data.setLayout({ + candleWidth: candleWidth, + // The value is experimented visually. + isSimpleBox: candleWidth <= 1.3 + }); + + if (cDimI < 0 || vDimsI.length < 4) { + return; + } + + return { + progress: seriesModel.pipelineContext.large ? largeProgress : normalProgress + }; + + function normalProgress(params, data) { + var dataIndex; + var store = data.getStore(); + + while ((dataIndex = params.next()) != null) { + var axisDimVal = store.get(cDimI, dataIndex); + var openVal = store.get(openDimI, dataIndex); + var closeVal = store.get(closeDimI, dataIndex); + var lowestVal = store.get(lowestDimI, dataIndex); + var highestVal = store.get(highestDimI, dataIndex); + var ocLow = Math.min(openVal, closeVal); + var ocHigh = Math.max(openVal, closeVal); + var ocLowPoint = getPoint(ocLow, axisDimVal); + var ocHighPoint = getPoint(ocHigh, axisDimVal); + var lowestPoint = getPoint(lowestVal, axisDimVal); + var highestPoint = getPoint(highestVal, axisDimVal); + var ends = []; + addBodyEnd(ends, ocHighPoint, 0); + addBodyEnd(ends, ocLowPoint, 1); + ends.push(subPixelOptimizePoint(highestPoint), subPixelOptimizePoint(ocHighPoint), subPixelOptimizePoint(lowestPoint), subPixelOptimizePoint(ocLowPoint)); + data.setItemLayout(dataIndex, { + sign: getSign(store, dataIndex, openVal, closeVal, closeDimI), + initBaseline: openVal > closeVal ? ocHighPoint[vDimIdx] : ocLowPoint[vDimIdx], + ends: ends, + brushRect: makeBrushRect(lowestVal, highestVal, axisDimVal) + }); + } + + function getPoint(val, axisDimVal) { + var p = []; + p[cDimIdx] = axisDimVal; + p[vDimIdx] = val; + return isNaN(axisDimVal) || isNaN(val) ? [NaN, NaN] : coordSys.dataToPoint(p); + } + + function addBodyEnd(ends, point, start) { + var point1 = point.slice(); + var point2 = point.slice(); + point1[cDimIdx] = subPixelOptimize$1(point1[cDimIdx] + candleWidth / 2, 1, false); + point2[cDimIdx] = subPixelOptimize$1(point2[cDimIdx] - candleWidth / 2, 1, true); + start ? ends.push(point1, point2) : ends.push(point2, point1); + } + + function makeBrushRect(lowestVal, highestVal, axisDimVal) { + var pmin = getPoint(lowestVal, axisDimVal); + var pmax = getPoint(highestVal, axisDimVal); + pmin[cDimIdx] -= candleWidth / 2; + pmax[cDimIdx] -= candleWidth / 2; + return { + x: pmin[0], + y: pmin[1], + width: candleWidth , + height: pmax[1] - pmin[1] + }; + } + + function subPixelOptimizePoint(point) { + point[cDimIdx] = subPixelOptimize$1(point[cDimIdx], 1); + return point; + } + } + + function largeProgress(params, data) { + // Structure: [sign, x, yhigh, ylow, sign, x, yhigh, ylow, ...] + var points = createFloat32Array(params.count * 4); + var offset = 0; + var point; + var tmpIn = []; + var tmpOut = []; + var dataIndex; + var store = data.getStore(); + + while ((dataIndex = params.next()) != null) { + var axisDimVal = store.get(cDimI, dataIndex); + var openVal = store.get(openDimI, dataIndex); + var closeVal = store.get(closeDimI, dataIndex); + var lowestVal = store.get(lowestDimI, dataIndex); + var highestVal = store.get(highestDimI, dataIndex); + + if (isNaN(axisDimVal) || isNaN(lowestVal) || isNaN(highestVal)) { + points[offset++] = NaN; + offset += 3; + continue; + } + + points[offset++] = getSign(store, dataIndex, openVal, closeVal, closeDimI); + tmpIn[cDimIdx] = axisDimVal; + tmpIn[vDimIdx] = lowestVal; + point = coordSys.dataToPoint(tmpIn, null, tmpOut); + points[offset++] = point ? point[0] : NaN; + points[offset++] = point ? point[1] : NaN; + tmpIn[vDimIdx] = highestVal; + point = coordSys.dataToPoint(tmpIn, null, tmpOut); + points[offset++] = point ? point[1] : NaN; + } + + data.setLayout('largePoints', points); + } + } + }; + + function getSign(store, dataIndex, openVal, closeVal, closeDimI) { + var sign; + + if (openVal > closeVal) { + sign = -1; + } else if (openVal < closeVal) { + sign = 1; + } else { + sign = dataIndex > 0 // If close === open, compare with close of last record + ? store.get(closeDimI, dataIndex - 1) <= closeVal ? 1 : -1 : // No record of previous, set to be positive + 1; + } + + return sign; + } + + function calculateCandleWidth(seriesModel, data) { + var baseAxis = seriesModel.getBaseAxis(); + var extent; + var bandWidth = baseAxis.type === 'category' ? baseAxis.getBandWidth() : (extent = baseAxis.getExtent(), Math.abs(extent[1] - extent[0]) / data.count()); + var barMaxWidth = parsePercent$1(retrieve2(seriesModel.get('barMaxWidth'), bandWidth), bandWidth); + var barMinWidth = parsePercent$1(retrieve2(seriesModel.get('barMinWidth'), 1), bandWidth); + var barWidth = seriesModel.get('barWidth'); + return barWidth != null ? parsePercent$1(barWidth, bandWidth) // Put max outer to ensure bar visible in spite of overlap. + : Math.max(Math.min(bandWidth / 2, barMaxWidth), barMinWidth); + } + + function install$k(registers) { + registers.registerChartView(CandlestickView); + registers.registerSeriesModel(CandlestickSeriesModel); + registers.registerPreprocessor(candlestickPreprocessor); + registers.registerVisual(candlestickVisual); + registers.registerLayout(candlestickLayout); + } + + function updateRipplePath(rippleGroup, effectCfg) { + var color = effectCfg.rippleEffectColor || effectCfg.color; + rippleGroup.eachChild(function (ripplePath) { + ripplePath.attr({ + z: effectCfg.z, + zlevel: effectCfg.zlevel, + style: { + stroke: effectCfg.brushType === 'stroke' ? color : null, + fill: effectCfg.brushType === 'fill' ? color : null + } + }); + }); + } + + var EffectSymbol = + /** @class */ + function (_super) { + __extends(EffectSymbol, _super); + + function EffectSymbol(data, idx) { + var _this = _super.call(this) || this; + + var symbol = new Symbol(data, idx); + var rippleGroup = new Group(); + + _this.add(symbol); + + _this.add(rippleGroup); + + _this.updateData(data, idx); + + return _this; + } + + EffectSymbol.prototype.stopEffectAnimation = function () { + this.childAt(1).removeAll(); + }; + + EffectSymbol.prototype.startEffectAnimation = function (effectCfg) { + var symbolType = effectCfg.symbolType; + var color = effectCfg.color; + var rippleNumber = effectCfg.rippleNumber; + var rippleGroup = this.childAt(1); + + for (var i = 0; i < rippleNumber; i++) { + // If width/height are set too small (e.g., set to 1) on ios10 + // and macOS Sierra, a circle stroke become a rect, no matter what + // the scale is set. So we set width/height as 2. See #4136. + var ripplePath = createSymbol(symbolType, -1, -1, 2, 2, color); + ripplePath.attr({ + style: { + strokeNoScale: true + }, + z2: 99, + silent: true, + scaleX: 0.5, + scaleY: 0.5 + }); + var delay = -i / rippleNumber * effectCfg.period + effectCfg.effectOffset; + ripplePath.animate('', true).when(effectCfg.period, { + scaleX: effectCfg.rippleScale / 2, + scaleY: effectCfg.rippleScale / 2 + }).delay(delay).start(); + ripplePath.animateStyle(true).when(effectCfg.period, { + opacity: 0 + }).delay(delay).start(); + rippleGroup.add(ripplePath); + } + + updateRipplePath(rippleGroup, effectCfg); + }; + /** + * Update effect symbol + */ + + + EffectSymbol.prototype.updateEffectAnimation = function (effectCfg) { + var oldEffectCfg = this._effectCfg; + var rippleGroup = this.childAt(1); // Must reinitialize effect if following configuration changed + + var DIFFICULT_PROPS = ['symbolType', 'period', 'rippleScale', 'rippleNumber']; + + for (var i = 0; i < DIFFICULT_PROPS.length; i++) { + var propName = DIFFICULT_PROPS[i]; + + if (oldEffectCfg[propName] !== effectCfg[propName]) { + this.stopEffectAnimation(); + this.startEffectAnimation(effectCfg); + return; + } + } + + updateRipplePath(rippleGroup, effectCfg); + }; + /** + * Highlight symbol + */ + + + EffectSymbol.prototype.highlight = function () { + enterEmphasis(this); + }; + /** + * Downplay symbol + */ + + + EffectSymbol.prototype.downplay = function () { + leaveEmphasis(this); + }; + + EffectSymbol.prototype.getSymbolType = function () { + var symbol = this.childAt(0); + return symbol && symbol.getSymbolType(); + }; + /** + * Update symbol properties + */ + + + EffectSymbol.prototype.updateData = function (data, idx) { + var _this = this; + + var seriesModel = data.hostModel; + this.childAt(0).updateData(data, idx); + var rippleGroup = this.childAt(1); + var itemModel = data.getItemModel(idx); + var symbolType = data.getItemVisual(idx, 'symbol'); + var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + var symbolStyle = data.getItemVisual(idx, 'style'); + var color = symbolStyle && symbolStyle.fill; + var emphasisModel = itemModel.getModel('emphasis'); + rippleGroup.setScale(symbolSize); + rippleGroup.traverse(function (ripplePath) { + ripplePath.setStyle('fill', color); + }); + var symbolOffset = normalizeSymbolOffset(data.getItemVisual(idx, 'symbolOffset'), symbolSize); + + if (symbolOffset) { + rippleGroup.x = symbolOffset[0]; + rippleGroup.y = symbolOffset[1]; + } + + var symbolRotate = data.getItemVisual(idx, 'symbolRotate'); + rippleGroup.rotation = (symbolRotate || 0) * Math.PI / 180 || 0; + var effectCfg = {}; + effectCfg.showEffectOn = seriesModel.get('showEffectOn'); + effectCfg.rippleScale = itemModel.get(['rippleEffect', 'scale']); + effectCfg.brushType = itemModel.get(['rippleEffect', 'brushType']); + effectCfg.period = itemModel.get(['rippleEffect', 'period']) * 1000; + effectCfg.effectOffset = idx / data.count(); + effectCfg.z = seriesModel.getShallow('z') || 0; + effectCfg.zlevel = seriesModel.getShallow('zlevel') || 0; + effectCfg.symbolType = symbolType; + effectCfg.color = color; + effectCfg.rippleEffectColor = itemModel.get(['rippleEffect', 'color']); + effectCfg.rippleNumber = itemModel.get(['rippleEffect', 'number']); + + if (effectCfg.showEffectOn === 'render') { + this._effectCfg ? this.updateEffectAnimation(effectCfg) : this.startEffectAnimation(effectCfg); + this._effectCfg = effectCfg; + } else { + // Not keep old effect config + this._effectCfg = null; + this.stopEffectAnimation(); + + this.onHoverStateChange = function (toState) { + if (toState === 'emphasis') { + if (effectCfg.showEffectOn !== 'render') { + _this.startEffectAnimation(effectCfg); + } + } else if (toState === 'normal') { + if (effectCfg.showEffectOn !== 'render') { + _this.stopEffectAnimation(); + } + } + }; + } + + this._effectCfg = effectCfg; + toggleHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }; + + EffectSymbol.prototype.fadeOut = function (cb) { + cb && cb(); + }; + return EffectSymbol; + }(Group); + + var EffectScatterView = + /** @class */ + function (_super) { + __extends(EffectScatterView, _super); + + function EffectScatterView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = EffectScatterView.type; + return _this; + } + + EffectScatterView.prototype.init = function () { + this._symbolDraw = new SymbolDraw(EffectSymbol); + }; + + EffectScatterView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var effectSymbolDraw = this._symbolDraw; + effectSymbolDraw.updateData(data, { + clipShape: this._getClipShape(seriesModel) + }); + this.group.add(effectSymbolDraw.group); + }; + + EffectScatterView.prototype._getClipShape = function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var clipArea = coordSys && coordSys.getArea && coordSys.getArea(); + return seriesModel.get('clip', true) ? clipArea : null; + }; + + EffectScatterView.prototype.updateTransform = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + this.group.dirty(); + var res = pointsLayout('').reset(seriesModel, ecModel, api); + + if (res.progress) { + res.progress({ + start: 0, + end: data.count(), + count: data.count() + }, data); + } + + this._symbolDraw.updateLayout(); + }; + + EffectScatterView.prototype._updateGroupTransform = function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.getRoamTransform) { + this.group.transform = clone$2(coordSys.getRoamTransform()); + this.group.decomposeTransform(); + } + }; + + EffectScatterView.prototype.remove = function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(true); + }; + + EffectScatterView.type = 'effectScatter'; + return EffectScatterView; + }(ChartView); + + var EffectScatterSeriesModel = + /** @class */ + function (_super) { + __extends(EffectScatterSeriesModel, _super); + + function EffectScatterSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = EffectScatterSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } + + EffectScatterSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this, { + useEncodeDefaulter: true + }); + }; + + EffectScatterSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) { + return selectors.point(data.getItemLayout(dataIndex)); + }; + + EffectScatterSeriesModel.type = 'series.effectScatter'; + EffectScatterSeriesModel.dependencies = ['grid', 'polar']; + EffectScatterSeriesModel.defaultOption = { + coordinateSystem: 'cartesian2d', + // zlevel: 0, + z: 2, + legendHoverLink: true, + effectType: 'ripple', + progressive: 0, + // When to show the effect, option: 'render'|'emphasis' + showEffectOn: 'render', + clip: true, + // Ripple effect config + rippleEffect: { + period: 4, + // Scale of ripple + scale: 2.5, + // Brush type can be fill or stroke + brushType: 'fill', + // Ripple number + number: 3 + }, + universalTransition: { + divideShape: 'clone' + }, + // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + // Polar coordinate system + // polarIndex: 0, + // Geo coordinate system + // geoIndex: 0, + // symbol: null, // 图形类型 + symbolSize: 10 // 图形大小,半宽(半径)参数,当图形为方向或菱形则总宽度为symbolSize * 2 + // symbolRotate: null, // 图形旋转控制 + // itemStyle: { + // opacity: 1 + // } + + }; + return EffectScatterSeriesModel; + }(SeriesModel); + + function install$l(registers) { + registers.registerChartView(EffectScatterView); + registers.registerSeriesModel(EffectScatterSeriesModel); + registers.registerLayout(pointsLayout('effectScatter')); + } + + var EffectLine = + /** @class */ + function (_super) { + __extends(EffectLine, _super); + + function EffectLine(lineData, idx, seriesScope) { + var _this = _super.call(this) || this; + + _this.add(_this.createLine(lineData, idx, seriesScope)); + + _this._updateEffectSymbol(lineData, idx); + + return _this; + } + + EffectLine.prototype.createLine = function (lineData, idx, seriesScope) { + return new Line$1(lineData, idx, seriesScope); + }; + + EffectLine.prototype._updateEffectSymbol = function (lineData, idx) { + var itemModel = lineData.getItemModel(idx); + var effectModel = itemModel.getModel('effect'); + var size = effectModel.get('symbolSize'); + var symbolType = effectModel.get('symbol'); + + if (!isArray(size)) { + size = [size, size]; + } + + var lineStyle = lineData.getItemVisual(idx, 'style'); + var color = effectModel.get('color') || lineStyle && lineStyle.stroke; + var symbol = this.childAt(1); + + if (this._symbolType !== symbolType) { + // Remove previous + this.remove(symbol); + symbol = createSymbol(symbolType, -0.5, -0.5, 1, 1, color); + symbol.z2 = 100; + symbol.culling = true; + this.add(symbol); + } // Symbol may be removed if loop is false + + + if (!symbol) { + return; + } // Shadow color is same with color in default + + + symbol.setStyle('shadowColor', color); + symbol.setStyle(effectModel.getItemStyle(['color'])); + symbol.scaleX = size[0]; + symbol.scaleY = size[1]; + symbol.setColor(color); + this._symbolType = symbolType; + this._symbolScale = size; + + this._updateEffectAnimation(lineData, effectModel, idx); + }; + + EffectLine.prototype._updateEffectAnimation = function (lineData, effectModel, idx) { + var symbol = this.childAt(1); + + if (!symbol) { + return; + } + + var points = lineData.getItemLayout(idx); + var period = effectModel.get('period') * 1000; + var loop = effectModel.get('loop'); + var constantSpeed = effectModel.get('constantSpeed'); + var delayExpr = retrieve(effectModel.get('delay'), function (idx) { + return idx / lineData.count() * period / 3; + }); // Ignore when updating + + symbol.ignore = true; + + this._updateAnimationPoints(symbol, points); + + if (constantSpeed > 0) { + period = this._getLineLength(symbol) / constantSpeed * 1000; + } + + if (period !== this._period || loop !== this._loop) { + symbol.stopAnimation(); + var delayNum = void 0; + + if (isFunction(delayExpr)) { + delayNum = delayExpr(idx); + } else { + delayNum = delayExpr; + } + + if (symbol.__t > 0) { + delayNum = -period * symbol.__t; + } + + this._animateSymbol(symbol, period, delayNum, loop); + } + + this._period = period; + this._loop = loop; + }; + + EffectLine.prototype._animateSymbol = function (symbol, period, delayNum, loop) { + if (period > 0) { + symbol.__t = 0; + var self_1 = this; + var animator = symbol.animate('', loop).when(period, { + __t: 1 + }).delay(delayNum).during(function () { + self_1._updateSymbolPosition(symbol); + }); + + if (!loop) { + animator.done(function () { + self_1.remove(symbol); + }); + } + + animator.start(); + } + }; + + EffectLine.prototype._getLineLength = function (symbol) { + // Not so accurate + return dist(symbol.__p1, symbol.__cp1) + dist(symbol.__cp1, symbol.__p2); + }; + + EffectLine.prototype._updateAnimationPoints = function (symbol, points) { + symbol.__p1 = points[0]; + symbol.__p2 = points[1]; + symbol.__cp1 = points[2] || [(points[0][0] + points[1][0]) / 2, (points[0][1] + points[1][1]) / 2]; + }; + + EffectLine.prototype.updateData = function (lineData, idx, seriesScope) { + this.childAt(0).updateData(lineData, idx, seriesScope); + + this._updateEffectSymbol(lineData, idx); + }; + + EffectLine.prototype._updateSymbolPosition = function (symbol) { + var p1 = symbol.__p1; + var p2 = symbol.__p2; + var cp1 = symbol.__cp1; + var t = symbol.__t; + var pos = [symbol.x, symbol.y]; + var lastPos = pos.slice(); + var quadraticAt$1 = quadraticAt; + var quadraticDerivativeAt$1 = quadraticDerivativeAt; + pos[0] = quadraticAt$1(p1[0], cp1[0], p2[0], t); + pos[1] = quadraticAt$1(p1[1], cp1[1], p2[1], t); // Tangent + + var tx = quadraticDerivativeAt$1(p1[0], cp1[0], p2[0], t); + var ty = quadraticDerivativeAt$1(p1[1], cp1[1], p2[1], t); + symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2; // enable continuity trail for 'line', 'rect', 'roundRect' symbolType + + if (this._symbolType === 'line' || this._symbolType === 'rect' || this._symbolType === 'roundRect') { + if (symbol.__lastT !== undefined && symbol.__lastT < symbol.__t) { + symbol.scaleY = dist(lastPos, pos) * 1.05; // make sure the last segment render within endPoint + + if (t === 1) { + pos[0] = lastPos[0] + (pos[0] - lastPos[0]) / 2; + pos[1] = lastPos[1] + (pos[1] - lastPos[1]) / 2; + } + } else if (symbol.__lastT === 1) { + // After first loop, symbol.__t does NOT start with 0, so connect p1 to pos directly. + symbol.scaleY = 2 * dist(p1, pos); + } else { + symbol.scaleY = this._symbolScale[1]; + } + } + + symbol.__lastT = symbol.__t; + symbol.ignore = false; + symbol.x = pos[0]; + symbol.y = pos[1]; + }; + + EffectLine.prototype.updateLayout = function (lineData, idx) { + this.childAt(0).updateLayout(lineData, idx); + var effectModel = lineData.getItemModel(idx).getModel('effect'); + + this._updateEffectAnimation(lineData, effectModel, idx); + }; + + return EffectLine; + }(Group); + + var Polyline$1 = + /** @class */ + function (_super) { + __extends(Polyline$1, _super); + + function Polyline$1(lineData, idx, seriesScope) { + var _this = _super.call(this) || this; + + _this._createPolyline(lineData, idx, seriesScope); + + return _this; + } + + Polyline$1.prototype._createPolyline = function (lineData, idx, seriesScope) { + // let seriesModel = lineData.hostModel; + var points = lineData.getItemLayout(idx); + var line = new Polyline({ + shape: { + points: points + } + }); + this.add(line); + + this._updateCommonStl(lineData, idx, seriesScope); + }; + + Polyline$1.prototype.updateData = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + var line = this.childAt(0); + var target = { + shape: { + points: lineData.getItemLayout(idx) + } + }; + updateProps(line, target, seriesModel, idx); + + this._updateCommonStl(lineData, idx, seriesScope); + }; + + Polyline$1.prototype._updateCommonStl = function (lineData, idx, seriesScope) { + var line = this.childAt(0); + var itemModel = lineData.getItemModel(idx); + var emphasisLineStyle = seriesScope && seriesScope.emphasisLineStyle; + var focus = seriesScope && seriesScope.focus; + var blurScope = seriesScope && seriesScope.blurScope; + var emphasisDisabled = seriesScope && seriesScope.emphasisDisabled; + + if (!seriesScope || lineData.hasItemOption) { + var emphasisModel = itemModel.getModel('emphasis'); + emphasisLineStyle = emphasisModel.getModel('lineStyle').getLineStyle(); + emphasisDisabled = emphasisModel.get('disabled'); + focus = emphasisModel.get('focus'); + blurScope = emphasisModel.get('blurScope'); + } + + line.useStyle(lineData.getItemVisual(idx, 'style')); + line.style.fill = null; + line.style.strokeNoScale = true; + var lineEmphasisState = line.ensureState('emphasis'); + lineEmphasisState.style = emphasisLineStyle; + toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled); + }; + + Polyline$1.prototype.updateLayout = function (lineData, idx) { + var polyline = this.childAt(0); + polyline.setShape('points', lineData.getItemLayout(idx)); + }; + return Polyline$1; + }(Group); + + var EffectPolyline = + /** @class */ + function (_super) { + __extends(EffectPolyline, _super); + + function EffectPolyline() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this._lastFrame = 0; + _this._lastFramePercent = 0; + return _this; + } // Override + + + EffectPolyline.prototype.createLine = function (lineData, idx, seriesScope) { + return new Polyline$1(lineData, idx, seriesScope); + }; + + EffectPolyline.prototype._updateAnimationPoints = function (symbol, points) { + this._points = points; + var accLenArr = [0]; + var len = 0; + + for (var i = 1; i < points.length; i++) { + var p1 = points[i - 1]; + var p2 = points[i]; + len += dist(p1, p2); + accLenArr.push(len); + } + + if (len === 0) { + this._length = 0; + return; + } + + for (var i = 0; i < accLenArr.length; i++) { + accLenArr[i] /= len; + } + + this._offsets = accLenArr; + this._length = len; + }; + + EffectPolyline.prototype._getLineLength = function () { + return this._length; + }; + + EffectPolyline.prototype._updateSymbolPosition = function (symbol) { + var t = symbol.__t; + var points = this._points; + var offsets = this._offsets; + var len = points.length; + + if (!offsets) { + // Has length 0 + return; + } + + var lastFrame = this._lastFrame; + var frame; + + if (t < this._lastFramePercent) { + // Start from the next frame + // PENDING start from lastFrame ? + var start = Math.min(lastFrame + 1, len - 1); + + for (frame = start; frame >= 0; frame--) { + if (offsets[frame] <= t) { + break; + } + } // PENDING really need to do this ? + + + frame = Math.min(frame, len - 2); + } else { + for (frame = lastFrame; frame < len; frame++) { + if (offsets[frame] > t) { + break; + } + } + + frame = Math.min(frame - 1, len - 2); + } + + var p = (t - offsets[frame]) / (offsets[frame + 1] - offsets[frame]); + var p0 = points[frame]; + var p1 = points[frame + 1]; + symbol.x = p0[0] * (1 - p) + p * p1[0]; + symbol.y = p0[1] * (1 - p) + p * p1[1]; + var tx = p1[0] - p0[0]; + var ty = p1[1] - p0[1]; + symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2; + this._lastFrame = frame; + this._lastFramePercent = t; + symbol.ignore = false; + }; + return EffectPolyline; + }(EffectLine); + + var LargeLinesPathShape = + /** @class */ + function () { + function LargeLinesPathShape() { + this.polyline = false; + this.curveness = 0; + this.segs = []; + } + + return LargeLinesPathShape; + }(); + + var LargeLinesPath = + /** @class */ + function (_super) { + __extends(LargeLinesPath, _super); + + function LargeLinesPath(opts) { + var _this = _super.call(this, opts) || this; + + _this._off = 0; + _this.hoverDataIdx = -1; + return _this; + } + + LargeLinesPath.prototype.reset = function () { + this.notClear = false; + this._off = 0; + }; + + LargeLinesPath.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + + LargeLinesPath.prototype.getDefaultShape = function () { + return new LargeLinesPathShape(); + }; + + LargeLinesPath.prototype.buildPath = function (ctx, shape) { + var segs = shape.segs; + var curveness = shape.curveness; + var i; + + if (shape.polyline) { + for (i = this._off; i < segs.length;) { + var count = segs[i++]; + + if (count > 0) { + ctx.moveTo(segs[i++], segs[i++]); + + for (var k = 1; k < count; k++) { + ctx.lineTo(segs[i++], segs[i++]); + } + } + } + } else { + for (i = this._off; i < segs.length;) { + var x0 = segs[i++]; + var y0 = segs[i++]; + var x1 = segs[i++]; + var y1 = segs[i++]; + ctx.moveTo(x0, y0); + + if (curveness > 0) { + var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness; + var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness; + ctx.quadraticCurveTo(x2, y2, x1, y1); + } else { + ctx.lineTo(x1, y1); + } + } + } + + if (this.incremental) { + this._off = i; + this.notClear = true; + } + }; + + LargeLinesPath.prototype.findDataIndex = function (x, y) { + var shape = this.shape; + var segs = shape.segs; + var curveness = shape.curveness; + var lineWidth = this.style.lineWidth; + + if (shape.polyline) { + var dataIndex = 0; + + for (var i = 0; i < segs.length;) { + var count = segs[i++]; + + if (count > 0) { + var x0 = segs[i++]; + var y0 = segs[i++]; + + for (var k = 1; k < count; k++) { + var x1 = segs[i++]; + var y1 = segs[i++]; + + if (containStroke(x0, y0, x1, y1, lineWidth, x, y)) { + return dataIndex; + } + } + } + + dataIndex++; + } + } else { + var dataIndex = 0; + + for (var i = 0; i < segs.length;) { + var x0 = segs[i++]; + var y0 = segs[i++]; + var x1 = segs[i++]; + var y1 = segs[i++]; + + if (curveness > 0) { + var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness; + var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness; + + if (containStroke$2(x0, y0, x2, y2, x1, y1, lineWidth, x, y)) { + return dataIndex; + } + } else { + if (containStroke(x0, y0, x1, y1, lineWidth, x, y)) { + return dataIndex; + } + } + + dataIndex++; + } + } + + return -1; + }; + + LargeLinesPath.prototype.contain = function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + x = localPos[0]; + y = localPos[1]; + + if (rect.contain(x, y)) { + // Cache found data index. + var dataIdx = this.hoverDataIdx = this.findDataIndex(x, y); + return dataIdx >= 0; + } + + this.hoverDataIdx = -1; + return false; + }; + + LargeLinesPath.prototype.getBoundingRect = function () { + // Ignore stroke for large symbol draw. + var rect = this._rect; + + if (!rect) { + var shape = this.shape; + var points = shape.segs; + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + + for (var i = 0; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + minX = Math.min(x, minX); + maxX = Math.max(x, maxX); + minY = Math.min(y, minY); + maxY = Math.max(y, maxY); + } + + rect = this._rect = new BoundingRect(minX, minY, maxX, maxY); + } + + return rect; + }; + + return LargeLinesPath; + }(Path); + + var LargeLineDraw = + /** @class */ + function () { + function LargeLineDraw() { + this.group = new Group(); + } + /** + * Update symbols draw by new data + */ + + + LargeLineDraw.prototype.updateData = function (data) { + this._clear(); + + var lineEl = this._create(); + + lineEl.setShape({ + segs: data.getLayout('linesPoints') + }); + + this._setCommon(lineEl, data); + }; + /** + * @override + */ + + LargeLineDraw.prototype.incrementalPrepareUpdate = function (data) { + this.group.removeAll(); + + this._clear(); + }; + /** + * @override + */ + + LargeLineDraw.prototype.incrementalUpdate = function (taskParams, data) { + var lastAdded = this._newAdded[0]; + var linePoints = data.getLayout('linesPoints'); + var oldSegs = lastAdded && lastAdded.shape.segs; // Merging the exists. Each element has 1e4 points. + // Consider the performance balance between too much elements and too much points in one shape(may affect hover optimization) + + if (oldSegs && oldSegs.length < 2e4) { + var oldLen = oldSegs.length; + var newSegs = new Float32Array(oldLen + linePoints.length); // Concat two array + + newSegs.set(oldSegs); + newSegs.set(linePoints, oldLen); + lastAdded.setShape({ + segs: newSegs + }); + } else { + // Clear + this._newAdded = []; + + var lineEl = this._create(); + + lineEl.incremental = true; + lineEl.setShape({ + segs: linePoints + }); + + this._setCommon(lineEl, data); + + lineEl.__startIndex = taskParams.start; + } + }; + /** + * @override + */ + + + LargeLineDraw.prototype.remove = function () { + this._clear(); + }; + + LargeLineDraw.prototype.eachRendered = function (cb) { + this._newAdded[0] && cb(this._newAdded[0]); + }; + + LargeLineDraw.prototype._create = function () { + var lineEl = new LargeLinesPath({ + cursor: 'default' + }); + + this._newAdded.push(lineEl); + + this.group.add(lineEl); + return lineEl; + }; + + LargeLineDraw.prototype._setCommon = function (lineEl, data, isIncremental) { + var hostModel = data.hostModel; + lineEl.setShape({ + polyline: hostModel.get('polyline'), + curveness: hostModel.get(['lineStyle', 'curveness']) + }); + lineEl.useStyle(hostModel.getModel('lineStyle').getLineStyle()); + lineEl.style.strokeNoScale = true; + var style = data.getVisual('style'); + + if (style && style.stroke) { + lineEl.setStyle('stroke', style.stroke); + } + + lineEl.setStyle('fill', null); + var ecData = getECData(lineEl); // Enable tooltip + // PENDING May have performance issue when path is extremely large + + ecData.seriesIndex = hostModel.seriesIndex; + lineEl.on('mousemove', function (e) { + ecData.dataIndex = null; + var dataIndex = lineEl.hoverDataIdx; + + if (dataIndex > 0) { + // Provide dataIndex for tooltip + ecData.dataIndex = dataIndex + lineEl.__startIndex; + } + }); + }; + + LargeLineDraw.prototype._clear = function () { + this._newAdded = []; + this.group.removeAll(); + }; + return LargeLineDraw; + }(); + + var linesLayout = { + seriesType: 'lines', + plan: createRenderPlanner(), + reset: function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (!coordSys) { + if ("development" !== 'production') { + error('The lines series must have a coordinate system.'); + } + + return; + } + + var isPolyline = seriesModel.get('polyline'); + var isLarge = seriesModel.pipelineContext.large; + return { + progress: function (params, lineData) { + var lineCoords = []; + + if (isLarge) { + var points = void 0; + var segCount = params.end - params.start; + + if (isPolyline) { + var totalCoordsCount = 0; + + for (var i = params.start; i < params.end; i++) { + totalCoordsCount += seriesModel.getLineCoordsCount(i); + } + + points = new Float32Array(segCount + totalCoordsCount * 2); + } else { + points = new Float32Array(segCount * 4); + } + + var offset = 0; + var pt = []; + + for (var i = params.start; i < params.end; i++) { + var len = seriesModel.getLineCoords(i, lineCoords); + + if (isPolyline) { + points[offset++] = len; + } + + for (var k = 0; k < len; k++) { + pt = coordSys.dataToPoint(lineCoords[k], false, pt); + points[offset++] = pt[0]; + points[offset++] = pt[1]; + } + } + + lineData.setLayout('linesPoints', points); + } else { + for (var i = params.start; i < params.end; i++) { + var itemModel = lineData.getItemModel(i); + var len = seriesModel.getLineCoords(i, lineCoords); + var pts = []; + + if (isPolyline) { + for (var j = 0; j < len; j++) { + pts.push(coordSys.dataToPoint(lineCoords[j])); + } + } else { + pts[0] = coordSys.dataToPoint(lineCoords[0]); + pts[1] = coordSys.dataToPoint(lineCoords[1]); + var curveness = itemModel.get(['lineStyle', 'curveness']); + + if (+curveness) { + pts[2] = [(pts[0][0] + pts[1][0]) / 2 - (pts[0][1] - pts[1][1]) * curveness, (pts[0][1] + pts[1][1]) / 2 - (pts[1][0] - pts[0][0]) * curveness]; + } + } + + lineData.setItemLayout(i, pts); + } + } + } + }; + } + }; + + var LinesView = + /** @class */ + function (_super) { + __extends(LinesView, _super); + + function LinesView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LinesView.type; + return _this; + } + + LinesView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var lineDraw = this._updateLineDraw(data, seriesModel); + + var zlevel = seriesModel.get('zlevel'); + var trailLength = seriesModel.get(['effect', 'trailLength']); + var zr = api.getZr(); // Avoid the drag cause ghost shadow + // FIXME Better way ? + // SVG doesn't support + + var isSvg = zr.painter.getType() === 'svg'; + + if (!isSvg) { + zr.painter.getLayer(zlevel).clear(true); + } // Config layer with motion blur + + + if (this._lastZlevel != null && !isSvg) { + zr.configLayer(this._lastZlevel, { + motionBlur: false + }); + } + + if (this._showEffect(seriesModel) && trailLength > 0) { + if (!isSvg) { + zr.configLayer(zlevel, { + motionBlur: true, + lastFrameAlpha: Math.max(Math.min(trailLength / 10 + 0.9, 1), 0) + }); + } else if ("development" !== 'production') { + console.warn('SVG render mode doesn\'t support lines with trail effect'); + } + } + + lineDraw.updateData(data); + var clipPath = seriesModel.get('clip', true) && createClipPath(seriesModel.coordinateSystem, false, seriesModel); + + if (clipPath) { + this.group.setClipPath(clipPath); + } else { + this.group.removeClipPath(); + } + + this._lastZlevel = zlevel; + this._finished = true; + }; + + LinesView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var lineDraw = this._updateLineDraw(data, seriesModel); + + lineDraw.incrementalPrepareUpdate(data); + + this._clearLayer(api); + + this._finished = false; + }; + + LinesView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) { + this._lineDraw.incrementalUpdate(taskParams, seriesModel.getData()); + + this._finished = taskParams.end === seriesModel.getData().count(); + }; + + LinesView.prototype.eachRendered = function (cb) { + this._lineDraw && this._lineDraw.eachRendered(cb); + }; + + LinesView.prototype.updateTransform = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var pipelineContext = seriesModel.pipelineContext; + + if (!this._finished || pipelineContext.large || pipelineContext.progressiveRender) { + // TODO Don't have to do update in large mode. Only do it when there are millions of data. + return { + update: true + }; + } else { + // TODO Use same logic with ScatterView. + // Manually update layout + var res = linesLayout.reset(seriesModel, ecModel, api); + + if (res.progress) { + res.progress({ + start: 0, + end: data.count(), + count: data.count() + }, data); + } // Not in large mode + + + this._lineDraw.updateLayout(); + + this._clearLayer(api); + } + }; + + LinesView.prototype._updateLineDraw = function (data, seriesModel) { + var lineDraw = this._lineDraw; + + var hasEffect = this._showEffect(seriesModel); + + var isPolyline = !!seriesModel.get('polyline'); + var pipelineContext = seriesModel.pipelineContext; + var isLargeDraw = pipelineContext.large; + + if ("development" !== 'production') { + if (hasEffect && isLargeDraw) { + console.warn('Large lines not support effect'); + } + } + + if (!lineDraw || hasEffect !== this._hasEffet || isPolyline !== this._isPolyline || isLargeDraw !== this._isLargeDraw) { + if (lineDraw) { + lineDraw.remove(); + } + + lineDraw = this._lineDraw = isLargeDraw ? new LargeLineDraw() : new LineDraw(isPolyline ? hasEffect ? EffectPolyline : Polyline$1 : hasEffect ? EffectLine : Line$1); + this._hasEffet = hasEffect; + this._isPolyline = isPolyline; + this._isLargeDraw = isLargeDraw; + } + + this.group.add(lineDraw.group); + return lineDraw; + }; + + LinesView.prototype._showEffect = function (seriesModel) { + return !!seriesModel.get(['effect', 'show']); + }; + + LinesView.prototype._clearLayer = function (api) { + // Not use motion when dragging or zooming + var zr = api.getZr(); + var isSvg = zr.painter.getType() === 'svg'; + + if (!isSvg && this._lastZlevel != null) { + zr.painter.getLayer(this._lastZlevel).clear(true); + } + }; + + LinesView.prototype.remove = function (ecModel, api) { + this._lineDraw && this._lineDraw.remove(); + this._lineDraw = null; // Clear motion when lineDraw is removed + + this._clearLayer(api); + }; + + LinesView.prototype.dispose = function (ecModel, api) { + this.remove(ecModel, api); + }; + + LinesView.type = 'lines'; + return LinesView; + }(ChartView); + + var Uint32Arr = typeof Uint32Array === 'undefined' ? Array : Uint32Array; + var Float64Arr = typeof Float64Array === 'undefined' ? Array : Float64Array; + + function compatEc2(seriesOpt) { + var data = seriesOpt.data; + + if (data && data[0] && data[0][0] && data[0][0].coord) { + if ("development" !== 'production') { + console.warn('Lines data configuration has been changed to' + ' { coords:[[1,2],[2,3]] }'); + } + + seriesOpt.data = map(data, function (itemOpt) { + var coords = [itemOpt[0].coord, itemOpt[1].coord]; + var target = { + coords: coords + }; + + if (itemOpt[0].name) { + target.fromName = itemOpt[0].name; + } + + if (itemOpt[1].name) { + target.toName = itemOpt[1].name; + } + + return mergeAll([target, itemOpt[0], itemOpt[1]]); + }); + } + } + + var LinesSeriesModel = + /** @class */ + function (_super) { + __extends(LinesSeriesModel, _super); + + function LinesSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LinesSeriesModel.type; + _this.visualStyleAccessPath = 'lineStyle'; + _this.visualDrawType = 'stroke'; + return _this; + } + + LinesSeriesModel.prototype.init = function (option) { + // The input data may be null/undefined. + option.data = option.data || []; // Not using preprocessor because mergeOption may not have series.type + + compatEc2(option); + + var result = this._processFlatCoordsArray(option.data); + + this._flatCoords = result.flatCoords; + this._flatCoordsOffset = result.flatCoordsOffset; + + if (result.flatCoords) { + option.data = new Float32Array(result.count); + } + + _super.prototype.init.apply(this, arguments); + }; + + LinesSeriesModel.prototype.mergeOption = function (option) { + compatEc2(option); + + if (option.data) { + // Only update when have option data to merge. + var result = this._processFlatCoordsArray(option.data); + + this._flatCoords = result.flatCoords; + this._flatCoordsOffset = result.flatCoordsOffset; + + if (result.flatCoords) { + option.data = new Float32Array(result.count); + } + } + + _super.prototype.mergeOption.apply(this, arguments); + }; + + LinesSeriesModel.prototype.appendData = function (params) { + var result = this._processFlatCoordsArray(params.data); + + if (result.flatCoords) { + if (!this._flatCoords) { + this._flatCoords = result.flatCoords; + this._flatCoordsOffset = result.flatCoordsOffset; + } else { + this._flatCoords = concatArray(this._flatCoords, result.flatCoords); + this._flatCoordsOffset = concatArray(this._flatCoordsOffset, result.flatCoordsOffset); + } + + params.data = new Float32Array(result.count); + } + + this.getRawData().appendData(params.data); + }; + + LinesSeriesModel.prototype._getCoordsFromItemModel = function (idx) { + var itemModel = this.getData().getItemModel(idx); + var coords = itemModel.option instanceof Array ? itemModel.option : itemModel.getShallow('coords'); + + if ("development" !== 'production') { + if (!(coords instanceof Array && coords.length > 0 && coords[0] instanceof Array)) { + throw new Error('Invalid coords ' + JSON.stringify(coords) + '. Lines must have 2d coords array in data item.'); + } + } + + return coords; + }; + + LinesSeriesModel.prototype.getLineCoordsCount = function (idx) { + if (this._flatCoordsOffset) { + return this._flatCoordsOffset[idx * 2 + 1]; + } else { + return this._getCoordsFromItemModel(idx).length; + } + }; + + LinesSeriesModel.prototype.getLineCoords = function (idx, out) { + if (this._flatCoordsOffset) { + var offset = this._flatCoordsOffset[idx * 2]; + var len = this._flatCoordsOffset[idx * 2 + 1]; + + for (var i = 0; i < len; i++) { + out[i] = out[i] || []; + out[i][0] = this._flatCoords[offset + i * 2]; + out[i][1] = this._flatCoords[offset + i * 2 + 1]; + } + + return len; + } else { + var coords = this._getCoordsFromItemModel(idx); + + for (var i = 0; i < coords.length; i++) { + out[i] = out[i] || []; + out[i][0] = coords[i][0]; + out[i][1] = coords[i][1]; + } + + return coords.length; + } + }; + + LinesSeriesModel.prototype._processFlatCoordsArray = function (data) { + var startOffset = 0; + + if (this._flatCoords) { + startOffset = this._flatCoords.length; + } // Stored as a typed array. In format + // Points Count(2) | x | y | x | y | Points Count(3) | x | y | x | y | x | y | + + + if (isNumber(data[0])) { + var len = data.length; // Store offset and len of each segment + + var coordsOffsetAndLenStorage = new Uint32Arr(len); + var coordsStorage = new Float64Arr(len); + var coordsCursor = 0; + var offsetCursor = 0; + var dataCount = 0; + + for (var i = 0; i < len;) { + dataCount++; + var count = data[i++]; // Offset + + coordsOffsetAndLenStorage[offsetCursor++] = coordsCursor + startOffset; // Len + + coordsOffsetAndLenStorage[offsetCursor++] = count; + + for (var k = 0; k < count; k++) { + var x = data[i++]; + var y = data[i++]; + coordsStorage[coordsCursor++] = x; + coordsStorage[coordsCursor++] = y; + + if (i > len) { + if ("development" !== 'production') { + throw new Error('Invalid data format.'); + } + } + } + } + + return { + flatCoordsOffset: new Uint32Array(coordsOffsetAndLenStorage.buffer, 0, offsetCursor), + flatCoords: coordsStorage, + count: dataCount + }; + } + + return { + flatCoordsOffset: null, + flatCoords: null, + count: data.length + }; + }; + + LinesSeriesModel.prototype.getInitialData = function (option, ecModel) { + if ("development" !== 'production') { + var CoordSys = CoordinateSystemManager.get(option.coordinateSystem); + + if (!CoordSys) { + throw new Error('Unkown coordinate system ' + option.coordinateSystem); + } + } + + var lineData = new SeriesData(['value'], this); + lineData.hasItemOption = false; + lineData.initData(option.data, [], function (dataItem, dimName, dataIndex, dimIndex) { + // dataItem is simply coords + if (dataItem instanceof Array) { + return NaN; + } else { + lineData.hasItemOption = true; + var value = dataItem.value; + + if (value != null) { + return value instanceof Array ? value[dimIndex] : value; + } + } + }); + return lineData; + }; + + LinesSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var itemModel = data.getItemModel(dataIndex); + var name = itemModel.get('name'); + + if (name) { + return name; + } + + var fromName = itemModel.get('fromName'); + var toName = itemModel.get('toName'); + var nameArr = []; + fromName != null && nameArr.push(fromName); + toName != null && nameArr.push(toName); + return createTooltipMarkup('nameValue', { + name: nameArr.join(' > ') + }); + }; + + LinesSeriesModel.prototype.preventIncremental = function () { + return !!this.get(['effect', 'show']); + }; + + LinesSeriesModel.prototype.getProgressive = function () { + var progressive = this.option.progressive; + + if (progressive == null) { + return this.option.large ? 1e4 : this.get('progressive'); + } + + return progressive; + }; + + LinesSeriesModel.prototype.getProgressiveThreshold = function () { + var progressiveThreshold = this.option.progressiveThreshold; + + if (progressiveThreshold == null) { + return this.option.large ? 2e4 : this.get('progressiveThreshold'); + } + + return progressiveThreshold; + }; + + LinesSeriesModel.prototype.getZLevelKey = function () { + var effectModel = this.getModel('effect'); + var trailLength = effectModel.get('trailLength'); + return this.getData().count() > this.getProgressiveThreshold() // Each progressive series has individual key. + ? this.id : effectModel.get('show') && trailLength > 0 ? trailLength + '' : ''; + }; + + LinesSeriesModel.type = 'series.lines'; + LinesSeriesModel.dependencies = ['grid', 'polar', 'geo', 'calendar']; + LinesSeriesModel.defaultOption = { + coordinateSystem: 'geo', + // zlevel: 0, + z: 2, + legendHoverLink: true, + // Cartesian coordinate system + xAxisIndex: 0, + yAxisIndex: 0, + symbol: ['none', 'none'], + symbolSize: [10, 10], + // Geo coordinate system + geoIndex: 0, + effect: { + show: false, + period: 4, + constantSpeed: 0, + symbol: 'circle', + symbolSize: 3, + loop: true, + trailLength: 0.2 + }, + large: false, + // Available when large is true + largeThreshold: 2000, + polyline: false, + clip: true, + label: { + show: false, + position: 'end' // distance: 5, + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + + }, + lineStyle: { + opacity: 0.5 + } + }; + return LinesSeriesModel; + }(SeriesModel); + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + function normalize$3(a) { + if (!(a instanceof Array)) { + a = [a, a]; + } + + return a; + } + + var linesVisual = { + seriesType: 'lines', + reset: function (seriesModel) { + var symbolType = normalize$3(seriesModel.get('symbol')); + var symbolSize = normalize$3(seriesModel.get('symbolSize')); + var data = seriesModel.getData(); + data.setVisual('fromSymbol', symbolType && symbolType[0]); + data.setVisual('toSymbol', symbolType && symbolType[1]); + data.setVisual('fromSymbolSize', symbolSize && symbolSize[0]); + data.setVisual('toSymbolSize', symbolSize && symbolSize[1]); + + function dataEach(data, idx) { + var itemModel = data.getItemModel(idx); + var symbolType = normalize$3(itemModel.getShallow('symbol', true)); + var symbolSize = normalize$3(itemModel.getShallow('symbolSize', true)); + symbolType[0] && data.setItemVisual(idx, 'fromSymbol', symbolType[0]); + symbolType[1] && data.setItemVisual(idx, 'toSymbol', symbolType[1]); + symbolSize[0] && data.setItemVisual(idx, 'fromSymbolSize', symbolSize[0]); + symbolSize[1] && data.setItemVisual(idx, 'toSymbolSize', symbolSize[1]); + } + + return { + dataEach: data.hasItemOption ? dataEach : null + }; + } + }; + + function install$m(registers) { + registers.registerChartView(LinesView); + registers.registerSeriesModel(LinesSeriesModel); + registers.registerLayout(linesLayout); + registers.registerVisual(linesVisual); + } + + var GRADIENT_LEVELS = 256; + + var HeatmapLayer = + /** @class */ + function () { + function HeatmapLayer() { + this.blurSize = 30; + this.pointSize = 20; + this.maxOpacity = 1; + this.minOpacity = 0; + this._gradientPixels = { + inRange: null, + outOfRange: null + }; + var canvas = platformApi.createCanvas(); + this.canvas = canvas; + } + /** + * Renders Heatmap and returns the rendered canvas + * @param data array of data, each has x, y, value + * @param width canvas width + * @param height canvas height + */ + + + HeatmapLayer.prototype.update = function (data, width, height, normalize, colorFunc, isInRange) { + var brush = this._getBrush(); + + var gradientInRange = this._getGradient(colorFunc, 'inRange'); + + var gradientOutOfRange = this._getGradient(colorFunc, 'outOfRange'); + + var r = this.pointSize + this.blurSize; + var canvas = this.canvas; + var ctx = canvas.getContext('2d'); + var len = data.length; + canvas.width = width; + canvas.height = height; + + for (var i = 0; i < len; ++i) { + var p = data[i]; + var x = p[0]; + var y = p[1]; + var value = p[2]; // calculate alpha using value + + var alpha = normalize(value); // draw with the circle brush with alpha + + ctx.globalAlpha = alpha; + ctx.drawImage(brush, x - r, y - r); + } + + if (!canvas.width || !canvas.height) { + // Avoid "Uncaught DOMException: Failed to execute 'getImageData' on + // 'CanvasRenderingContext2D': The source height is 0." + return canvas; + } // colorize the canvas using alpha value and set with gradient + + + var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + var pixels = imageData.data; + var offset = 0; + var pixelLen = pixels.length; + var minOpacity = this.minOpacity; + var maxOpacity = this.maxOpacity; + var diffOpacity = maxOpacity - minOpacity; + + while (offset < pixelLen) { + var alpha = pixels[offset + 3] / 256; + var gradientOffset = Math.floor(alpha * (GRADIENT_LEVELS - 1)) * 4; // Simple optimize to ignore the empty data + + if (alpha > 0) { + var gradient = isInRange(alpha) ? gradientInRange : gradientOutOfRange; // Any alpha > 0 will be mapped to [minOpacity, maxOpacity] + + alpha > 0 && (alpha = alpha * diffOpacity + minOpacity); + pixels[offset++] = gradient[gradientOffset]; + pixels[offset++] = gradient[gradientOffset + 1]; + pixels[offset++] = gradient[gradientOffset + 2]; + pixels[offset++] = gradient[gradientOffset + 3] * alpha * 256; + } else { + offset += 4; + } + } + + ctx.putImageData(imageData, 0, 0); + return canvas; + }; + /** + * get canvas of a black circle brush used for canvas to draw later + */ + + + HeatmapLayer.prototype._getBrush = function () { + var brushCanvas = this._brushCanvas || (this._brushCanvas = platformApi.createCanvas()); // set brush size + + var r = this.pointSize + this.blurSize; + var d = r * 2; + brushCanvas.width = d; + brushCanvas.height = d; + var ctx = brushCanvas.getContext('2d'); + ctx.clearRect(0, 0, d, d); // in order to render shadow without the distinct circle, + // draw the distinct circle in an invisible place, + // and use shadowOffset to draw shadow in the center of the canvas + + ctx.shadowOffsetX = d; + ctx.shadowBlur = this.blurSize; // draw the shadow in black, and use alpha and shadow blur to generate + // color in color map + + ctx.shadowColor = '#000'; // draw circle in the left to the canvas + + ctx.beginPath(); + ctx.arc(-r, r, this.pointSize, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + return brushCanvas; + }; + /** + * get gradient color map + * @private + */ + + + HeatmapLayer.prototype._getGradient = function (colorFunc, state) { + var gradientPixels = this._gradientPixels; + var pixelsSingleState = gradientPixels[state] || (gradientPixels[state] = new Uint8ClampedArray(256 * 4)); + var color = [0, 0, 0, 0]; + var off = 0; + + for (var i = 0; i < 256; i++) { + colorFunc[state](i / 255, true, color); + pixelsSingleState[off++] = color[0]; + pixelsSingleState[off++] = color[1]; + pixelsSingleState[off++] = color[2]; + pixelsSingleState[off++] = color[3]; + } + + return pixelsSingleState; + }; + + return HeatmapLayer; + }(); + + function getIsInPiecewiseRange(dataExtent, pieceList, selected) { + var dataSpan = dataExtent[1] - dataExtent[0]; + pieceList = map(pieceList, function (piece) { + return { + interval: [(piece.interval[0] - dataExtent[0]) / dataSpan, (piece.interval[1] - dataExtent[0]) / dataSpan] + }; + }); + var len = pieceList.length; + var lastIndex = 0; + return function (val) { + var i; // Try to find in the location of the last found + + for (i = lastIndex; i < len; i++) { + var interval = pieceList[i].interval; + + if (interval[0] <= val && val <= interval[1]) { + lastIndex = i; + break; + } + } + + if (i === len) { + // Not found, back interation + for (i = lastIndex - 1; i >= 0; i--) { + var interval = pieceList[i].interval; + + if (interval[0] <= val && val <= interval[1]) { + lastIndex = i; + break; + } + } + } + + return i >= 0 && i < len && selected[i]; + }; + } + + function getIsInContinuousRange(dataExtent, range) { + var dataSpan = dataExtent[1] - dataExtent[0]; + range = [(range[0] - dataExtent[0]) / dataSpan, (range[1] - dataExtent[0]) / dataSpan]; + return function (val) { + return val >= range[0] && val <= range[1]; + }; + } + + function isGeoCoordSys(coordSys) { + var dimensions = coordSys.dimensions; // Not use coorSys.type === 'geo' because coordSys maybe extended + + return dimensions[0] === 'lng' && dimensions[1] === 'lat'; + } + + var HeatmapView = + /** @class */ + function (_super) { + __extends(HeatmapView, _super); + + function HeatmapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = HeatmapView.type; + return _this; + } + + HeatmapView.prototype.render = function (seriesModel, ecModel, api) { + var visualMapOfThisSeries; + ecModel.eachComponent('visualMap', function (visualMap) { + visualMap.eachTargetSeries(function (targetSeries) { + if (targetSeries === seriesModel) { + visualMapOfThisSeries = visualMap; + } + }); + }); + + if ("development" !== 'production') { + if (!visualMapOfThisSeries) { + throw new Error('Heatmap must use with visualMap'); + } + } // Clear previously rendered progressive elements. + + + this._progressiveEls = null; + this.group.removeAll(); + var coordSys = seriesModel.coordinateSystem; + + if (coordSys.type === 'cartesian2d' || coordSys.type === 'calendar') { + this._renderOnCartesianAndCalendar(seriesModel, api, 0, seriesModel.getData().count()); + } else if (isGeoCoordSys(coordSys)) { + this._renderOnGeo(coordSys, seriesModel, visualMapOfThisSeries, api); + } + }; + + HeatmapView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + this.group.removeAll(); + }; + + HeatmapView.prototype.incrementalRender = function (params, seriesModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys) { + // geo does not support incremental rendering? + if (isGeoCoordSys(coordSys)) { + this.render(seriesModel, ecModel, api); + } else { + this._progressiveEls = []; + + this._renderOnCartesianAndCalendar(seriesModel, api, params.start, params.end, true); + } + } + }; + + HeatmapView.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + HeatmapView.prototype._renderOnCartesianAndCalendar = function (seriesModel, api, start, end, incremental) { + var coordSys = seriesModel.coordinateSystem; + var isCartesian2d = isCoordinateSystemType(coordSys, 'cartesian2d'); + var width; + var height; + var xAxisExtent; + var yAxisExtent; + + if (isCartesian2d) { + var xAxis = coordSys.getAxis('x'); + var yAxis = coordSys.getAxis('y'); + + if ("development" !== 'production') { + if (!(xAxis.type === 'category' && yAxis.type === 'category')) { + throw new Error('Heatmap on cartesian must have two category axes'); + } + + if (!(xAxis.onBand && yAxis.onBand)) { + throw new Error('Heatmap on cartesian must have two axes with boundaryGap true'); + } + } // add 0.5px to avoid the gaps + + + width = xAxis.getBandWidth() + .5; + height = yAxis.getBandWidth() + .5; + xAxisExtent = xAxis.scale.getExtent(); + yAxisExtent = yAxis.scale.getExtent(); + } + + var group = this.group; + var data = seriesModel.getData(); + var emphasisStyle = seriesModel.getModel(['emphasis', 'itemStyle']).getItemStyle(); + var blurStyle = seriesModel.getModel(['blur', 'itemStyle']).getItemStyle(); + var selectStyle = seriesModel.getModel(['select', 'itemStyle']).getItemStyle(); + var borderRadius = seriesModel.get(['itemStyle', 'borderRadius']); + var labelStatesModels = getLabelStatesModels(seriesModel); + var emphasisModel = seriesModel.getModel('emphasis'); + var focus = emphasisModel.get('focus'); + var blurScope = emphasisModel.get('blurScope'); + var emphasisDisabled = emphasisModel.get('disabled'); + var dataDims = isCartesian2d ? [data.mapDimension('x'), data.mapDimension('y'), data.mapDimension('value')] : [data.mapDimension('time'), data.mapDimension('value')]; + + for (var idx = start; idx < end; idx++) { + var rect = void 0; + var style = data.getItemVisual(idx, 'style'); + + if (isCartesian2d) { + var dataDimX = data.get(dataDims[0], idx); + var dataDimY = data.get(dataDims[1], idx); // Ignore empty data and out of extent data + + if (isNaN(data.get(dataDims[2], idx)) || dataDimX < xAxisExtent[0] || dataDimX > xAxisExtent[1] || dataDimY < yAxisExtent[0] || dataDimY > yAxisExtent[1]) { + continue; + } + + var point = coordSys.dataToPoint([dataDimX, dataDimY]); + rect = new Rect({ + shape: { + x: point[0] - width / 2, + y: point[1] - height / 2, + width: width, + height: height + }, + style: style + }); + } else { + // Ignore empty data + if (isNaN(data.get(dataDims[1], idx))) { + continue; + } + + rect = new Rect({ + z2: 1, + shape: coordSys.dataToRect([data.get(dataDims[0], idx)]).contentShape, + style: style + }); + } // Optimization for large datset + + + if (data.hasItemOption) { + var itemModel = data.getItemModel(idx); + var emphasisModel_1 = itemModel.getModel('emphasis'); + emphasisStyle = emphasisModel_1.getModel('itemStyle').getItemStyle(); + blurStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle(); + selectStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle(); // Each item value struct in the data would be firstly + // { + // itemStyle: { borderRadius: [30, 30] }, + // value: [2022, 02, 22] + // } + + borderRadius = itemModel.get(['itemStyle', 'borderRadius']); + focus = emphasisModel_1.get('focus'); + blurScope = emphasisModel_1.get('blurScope'); + emphasisDisabled = emphasisModel_1.get('disabled'); + labelStatesModels = getLabelStatesModels(itemModel); + } + + rect.shape.r = borderRadius; + var rawValue = seriesModel.getRawValue(idx); + var defaultText = '-'; + + if (rawValue && rawValue[2] != null) { + defaultText = rawValue[2] + ''; + } + + setLabelStyle(rect, labelStatesModels, { + labelFetcher: seriesModel, + labelDataIndex: idx, + defaultOpacity: style.opacity, + defaultText: defaultText + }); + rect.ensureState('emphasis').style = emphasisStyle; + rect.ensureState('blur').style = blurStyle; + rect.ensureState('select').style = selectStyle; + toggleHoverEmphasis(rect, focus, blurScope, emphasisDisabled); + rect.incremental = incremental; // PENDING + + if (incremental) { + // Rect must use hover layer if it's incremental. + rect.states.emphasis.hoverLayer = true; + } + + group.add(rect); + data.setItemGraphicEl(idx, rect); + + if (this._progressiveEls) { + this._progressiveEls.push(rect); + } + } + }; + + HeatmapView.prototype._renderOnGeo = function (geo, seriesModel, visualMapModel, api) { + var inRangeVisuals = visualMapModel.targetVisuals.inRange; + var outOfRangeVisuals = visualMapModel.targetVisuals.outOfRange; // if (!visualMapping) { + // throw new Error('Data range must have color visuals'); + // } + + var data = seriesModel.getData(); + var hmLayer = this._hmLayer || this._hmLayer || new HeatmapLayer(); + hmLayer.blurSize = seriesModel.get('blurSize'); + hmLayer.pointSize = seriesModel.get('pointSize'); + hmLayer.minOpacity = seriesModel.get('minOpacity'); + hmLayer.maxOpacity = seriesModel.get('maxOpacity'); + var rect = geo.getViewRect().clone(); + var roamTransform = geo.getRoamTransform(); + rect.applyTransform(roamTransform); // Clamp on viewport + + var x = Math.max(rect.x, 0); + var y = Math.max(rect.y, 0); + var x2 = Math.min(rect.width + rect.x, api.getWidth()); + var y2 = Math.min(rect.height + rect.y, api.getHeight()); + var width = x2 - x; + var height = y2 - y; + var dims = [data.mapDimension('lng'), data.mapDimension('lat'), data.mapDimension('value')]; + var points = data.mapArray(dims, function (lng, lat, value) { + var pt = geo.dataToPoint([lng, lat]); + pt[0] -= x; + pt[1] -= y; + pt.push(value); + return pt; + }); + var dataExtent = visualMapModel.getExtent(); + var isInRange = visualMapModel.type === 'visualMap.continuous' ? getIsInContinuousRange(dataExtent, visualMapModel.option.range) : getIsInPiecewiseRange(dataExtent, visualMapModel.getPieceList(), visualMapModel.option.selected); + hmLayer.update(points, width, height, inRangeVisuals.color.getNormalizer(), { + inRange: inRangeVisuals.color.getColorMapper(), + outOfRange: outOfRangeVisuals.color.getColorMapper() + }, isInRange); + var img = new ZRImage({ + style: { + width: width, + height: height, + x: x, + y: y, + image: hmLayer.canvas + }, + silent: true + }); + this.group.add(img); + }; + + HeatmapView.type = 'heatmap'; + return HeatmapView; + }(ChartView); + + var HeatmapSeriesModel = + /** @class */ + function (_super) { + __extends(HeatmapSeriesModel, _super); + + function HeatmapSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = HeatmapSeriesModel.type; + return _this; + } + + HeatmapSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this, { + generateCoord: 'value' + }); + }; + + HeatmapSeriesModel.prototype.preventIncremental = function () { + var coordSysCreator = CoordinateSystemManager.get(this.get('coordinateSystem')); + + if (coordSysCreator && coordSysCreator.dimensions) { + return coordSysCreator.dimensions[0] === 'lng' && coordSysCreator.dimensions[1] === 'lat'; + } + }; + + HeatmapSeriesModel.type = 'series.heatmap'; + HeatmapSeriesModel.dependencies = ['grid', 'geo', 'calendar']; + HeatmapSeriesModel.defaultOption = { + coordinateSystem: 'cartesian2d', + // zlevel: 0, + z: 2, + // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + // Geo coordinate system + geoIndex: 0, + blurSize: 30, + pointSize: 20, + maxOpacity: 1, + minOpacity: 0, + select: { + itemStyle: { + borderColor: '#212121' + } + } + }; + return HeatmapSeriesModel; + }(SeriesModel); + + function install$n(registers) { + registers.registerChartView(HeatmapView); + registers.registerSeriesModel(HeatmapSeriesModel); + } + + var BAR_BORDER_WIDTH_QUERY = ['itemStyle', 'borderWidth']; // index: +isHorizontal + + var LAYOUT_ATTRS = [{ + xy: 'x', + wh: 'width', + index: 0, + posDesc: ['left', 'right'] + }, { + xy: 'y', + wh: 'height', + index: 1, + posDesc: ['top', 'bottom'] + }]; + var pathForLineWidth = new Circle(); + + var PictorialBarView = + /** @class */ + function (_super) { + __extends(PictorialBarView, _super); + + function PictorialBarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PictorialBarView.type; + return _this; + } + + PictorialBarView.prototype.render = function (seriesModel, ecModel, api) { + var group = this.group; + var data = seriesModel.getData(); + var oldData = this._data; + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var coordSysRect = cartesian.master.getRect(); + var opt = { + ecSize: { + width: api.getWidth(), + height: api.getHeight() + }, + seriesModel: seriesModel, + coordSys: cartesian, + coordSysExtent: [[coordSysRect.x, coordSysRect.x + coordSysRect.width], [coordSysRect.y, coordSysRect.y + coordSysRect.height]], + isHorizontal: isHorizontal, + valueDim: LAYOUT_ATTRS[+isHorizontal], + categoryDim: LAYOUT_ATTRS[1 - +isHorizontal] + }; + data.diff(oldData).add(function (dataIndex) { + if (!data.hasValue(dataIndex)) { + return; + } + + var itemModel = getItemModel(data, dataIndex); + var symbolMeta = getSymbolMeta(data, dataIndex, itemModel, opt); + var bar = createBar(data, opt, symbolMeta); + data.setItemGraphicEl(dataIndex, bar); + group.add(bar); + updateCommon$1(bar, opt, symbolMeta); + }).update(function (newIndex, oldIndex) { + var bar = oldData.getItemGraphicEl(oldIndex); + + if (!data.hasValue(newIndex)) { + group.remove(bar); + return; + } + + var itemModel = getItemModel(data, newIndex); + var symbolMeta = getSymbolMeta(data, newIndex, itemModel, opt); + var pictorialShapeStr = getShapeStr(data, symbolMeta); + + if (bar && pictorialShapeStr !== bar.__pictorialShapeStr) { + group.remove(bar); + data.setItemGraphicEl(newIndex, null); + bar = null; + } + + if (bar) { + updateBar(bar, opt, symbolMeta); + } else { + bar = createBar(data, opt, symbolMeta, true); + } + + data.setItemGraphicEl(newIndex, bar); + bar.__pictorialSymbolMeta = symbolMeta; // Add back + + group.add(bar); + updateCommon$1(bar, opt, symbolMeta); + }).remove(function (dataIndex) { + var bar = oldData.getItemGraphicEl(dataIndex); + bar && removeBar(oldData, dataIndex, bar.__pictorialSymbolMeta.animationModel, bar); + }).execute(); + this._data = data; + return this.group; + }; + + PictorialBarView.prototype.remove = function (ecModel, api) { + var group = this.group; + var data = this._data; + + if (ecModel.get('animation')) { + if (data) { + data.eachItemGraphicEl(function (bar) { + removeBar(data, getECData(bar).dataIndex, ecModel, bar); + }); + } + } else { + group.removeAll(); + } + }; + + PictorialBarView.type = 'pictorialBar'; + return PictorialBarView; + }(ChartView); // Set or calculate default value about symbol, and calculate layout info. + + + function getSymbolMeta(data, dataIndex, itemModel, opt) { + var layout = data.getItemLayout(dataIndex); + var symbolRepeat = itemModel.get('symbolRepeat'); + var symbolClip = itemModel.get('symbolClip'); + var symbolPosition = itemModel.get('symbolPosition') || 'start'; + var symbolRotate = itemModel.get('symbolRotate'); + var rotation = (symbolRotate || 0) * Math.PI / 180 || 0; + var symbolPatternSize = itemModel.get('symbolPatternSize') || 2; + var isAnimationEnabled = itemModel.isAnimationEnabled(); + var symbolMeta = { + dataIndex: dataIndex, + layout: layout, + itemModel: itemModel, + symbolType: data.getItemVisual(dataIndex, 'symbol') || 'circle', + style: data.getItemVisual(dataIndex, 'style'), + symbolClip: symbolClip, + symbolRepeat: symbolRepeat, + symbolRepeatDirection: itemModel.get('symbolRepeatDirection'), + symbolPatternSize: symbolPatternSize, + rotation: rotation, + animationModel: isAnimationEnabled ? itemModel : null, + hoverScale: isAnimationEnabled && itemModel.get(['emphasis', 'scale']), + z2: itemModel.getShallow('z', true) || 0 + }; + prepareBarLength(itemModel, symbolRepeat, layout, opt, symbolMeta); + prepareSymbolSize(data, dataIndex, layout, symbolRepeat, symbolClip, symbolMeta.boundingLength, symbolMeta.pxSign, symbolPatternSize, opt, symbolMeta); + prepareLineWidth(itemModel, symbolMeta.symbolScale, rotation, opt, symbolMeta); + var symbolSize = symbolMeta.symbolSize; + var symbolOffset = normalizeSymbolOffset(itemModel.get('symbolOffset'), symbolSize); + prepareLayoutInfo(itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset, symbolPosition, symbolMeta.valueLineWidth, symbolMeta.boundingLength, symbolMeta.repeatCutLength, opt, symbolMeta); + return symbolMeta; + } // bar length can be negative. + + + function prepareBarLength(itemModel, symbolRepeat, layout, opt, outputSymbolMeta) { + var valueDim = opt.valueDim; + var symbolBoundingData = itemModel.get('symbolBoundingData'); + var valueAxis = opt.coordSys.getOtherAxis(opt.coordSys.getBaseAxis()); + var zeroPx = valueAxis.toGlobalCoord(valueAxis.dataToCoord(0)); + var pxSignIdx = 1 - +(layout[valueDim.wh] <= 0); + var boundingLength; + + if (isArray(symbolBoundingData)) { + var symbolBoundingExtent = [convertToCoordOnAxis(valueAxis, symbolBoundingData[0]) - zeroPx, convertToCoordOnAxis(valueAxis, symbolBoundingData[1]) - zeroPx]; + symbolBoundingExtent[1] < symbolBoundingExtent[0] && symbolBoundingExtent.reverse(); + boundingLength = symbolBoundingExtent[pxSignIdx]; + } else if (symbolBoundingData != null) { + boundingLength = convertToCoordOnAxis(valueAxis, symbolBoundingData) - zeroPx; + } else if (symbolRepeat) { + boundingLength = opt.coordSysExtent[valueDim.index][pxSignIdx] - zeroPx; + } else { + boundingLength = layout[valueDim.wh]; + } + + outputSymbolMeta.boundingLength = boundingLength; + + if (symbolRepeat) { + outputSymbolMeta.repeatCutLength = layout[valueDim.wh]; + } // if 'pxSign' means sign of pixel, it can't be zero, or symbolScale will be zero + // and when borderWidth be settled, the actual linewidth will be NaN + + + outputSymbolMeta.pxSign = boundingLength > 0 ? 1 : -1; + } + + function convertToCoordOnAxis(axis, value) { + return axis.toGlobalCoord(axis.dataToCoord(axis.scale.parse(value))); + } // Support ['100%', '100%'] + + + function prepareSymbolSize(data, dataIndex, layout, symbolRepeat, symbolClip, boundingLength, pxSign, symbolPatternSize, opt, outputSymbolMeta) { + var valueDim = opt.valueDim; + var categoryDim = opt.categoryDim; + var categorySize = Math.abs(layout[categoryDim.wh]); + var symbolSize = data.getItemVisual(dataIndex, 'symbolSize'); + var parsedSymbolSize; + + if (isArray(symbolSize)) { + parsedSymbolSize = symbolSize.slice(); + } else { + if (symbolSize == null) { + // will parse to number below + parsedSymbolSize = ['100%', '100%']; + } else { + parsedSymbolSize = [symbolSize, symbolSize]; + } + } // Note: percentage symbolSize (like '100%') do not consider lineWidth, because it is + // to complicated to calculate real percent value if considering scaled lineWidth. + // So the actual size will bigger than layout size if lineWidth is bigger than zero, + // which can be tolerated in pictorial chart. + + + parsedSymbolSize[categoryDim.index] = parsePercent$1(parsedSymbolSize[categoryDim.index], categorySize); + parsedSymbolSize[valueDim.index] = parsePercent$1(parsedSymbolSize[valueDim.index], symbolRepeat ? categorySize : Math.abs(boundingLength)); + outputSymbolMeta.symbolSize = parsedSymbolSize; // If x or y is less than zero, show reversed shape. + + var symbolScale = outputSymbolMeta.symbolScale = [parsedSymbolSize[0] / symbolPatternSize, parsedSymbolSize[1] / symbolPatternSize]; // Follow convention, 'right' and 'top' is the normal scale. + + symbolScale[valueDim.index] *= (opt.isHorizontal ? -1 : 1) * pxSign; + } + + function prepareLineWidth(itemModel, symbolScale, rotation, opt, outputSymbolMeta) { + // In symbols are drawn with scale, so do not need to care about the case that width + // or height are too small. But symbol use strokeNoScale, where acture lineWidth should + // be calculated. + var valueLineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY) || 0; + + if (valueLineWidth) { + pathForLineWidth.attr({ + scaleX: symbolScale[0], + scaleY: symbolScale[1], + rotation: rotation + }); + pathForLineWidth.updateTransform(); + valueLineWidth /= pathForLineWidth.getLineScale(); + valueLineWidth *= symbolScale[opt.valueDim.index]; + } + + outputSymbolMeta.valueLineWidth = valueLineWidth || 0; + } + + function prepareLayoutInfo(itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset, symbolPosition, valueLineWidth, boundingLength, repeatCutLength, opt, outputSymbolMeta) { + var categoryDim = opt.categoryDim; + var valueDim = opt.valueDim; + var pxSign = outputSymbolMeta.pxSign; + var unitLength = Math.max(symbolSize[valueDim.index] + valueLineWidth, 0); + var pathLen = unitLength; // Note: rotation will not effect the layout of symbols, because user may + // want symbols to rotate on its center, which should not be translated + // when rotating. + + if (symbolRepeat) { + var absBoundingLength = Math.abs(boundingLength); + var symbolMargin = retrieve(itemModel.get('symbolMargin'), '15%') + ''; + var hasEndGap = false; + + if (symbolMargin.lastIndexOf('!') === symbolMargin.length - 1) { + hasEndGap = true; + symbolMargin = symbolMargin.slice(0, symbolMargin.length - 1); + } + + var symbolMarginNumeric = parsePercent$1(symbolMargin, symbolSize[valueDim.index]); + var uLenWithMargin = Math.max(unitLength + symbolMarginNumeric * 2, 0); // When symbol margin is less than 0, margin at both ends will be subtracted + // to ensure that all of the symbols will not be overflow the given area. + + var endFix = hasEndGap ? 0 : symbolMarginNumeric * 2; // Both final repeatTimes and final symbolMarginNumeric area calculated based on + // boundingLength. + + var repeatSpecified = isNumeric(symbolRepeat); + var repeatTimes = repeatSpecified ? symbolRepeat : toIntTimes((absBoundingLength + endFix) / uLenWithMargin); // Adjust calculate margin, to ensure each symbol is displayed + // entirely in the given layout area. + + var mDiff = absBoundingLength - repeatTimes * unitLength; + symbolMarginNumeric = mDiff / 2 / (hasEndGap ? repeatTimes : Math.max(repeatTimes - 1, 1)); + uLenWithMargin = unitLength + symbolMarginNumeric * 2; + endFix = hasEndGap ? 0 : symbolMarginNumeric * 2; // Update repeatTimes when not all symbol will be shown. + + if (!repeatSpecified && symbolRepeat !== 'fixed') { + repeatTimes = repeatCutLength ? toIntTimes((Math.abs(repeatCutLength) + endFix) / uLenWithMargin) : 0; + } + + pathLen = repeatTimes * uLenWithMargin - endFix; + outputSymbolMeta.repeatTimes = repeatTimes; + outputSymbolMeta.symbolMargin = symbolMarginNumeric; + } + + var sizeFix = pxSign * (pathLen / 2); + var pathPosition = outputSymbolMeta.pathPosition = []; + pathPosition[categoryDim.index] = layout[categoryDim.wh] / 2; + pathPosition[valueDim.index] = symbolPosition === 'start' ? sizeFix : symbolPosition === 'end' ? boundingLength - sizeFix : boundingLength / 2; // 'center' + + if (symbolOffset) { + pathPosition[0] += symbolOffset[0]; + pathPosition[1] += symbolOffset[1]; + } + + var bundlePosition = outputSymbolMeta.bundlePosition = []; + bundlePosition[categoryDim.index] = layout[categoryDim.xy]; + bundlePosition[valueDim.index] = layout[valueDim.xy]; + var barRectShape = outputSymbolMeta.barRectShape = extend({}, layout); + barRectShape[valueDim.wh] = pxSign * Math.max(Math.abs(layout[valueDim.wh]), Math.abs(pathPosition[valueDim.index] + sizeFix)); + barRectShape[categoryDim.wh] = layout[categoryDim.wh]; + var clipShape = outputSymbolMeta.clipShape = {}; // Consider that symbol may be overflow layout rect. + + clipShape[categoryDim.xy] = -layout[categoryDim.xy]; + clipShape[categoryDim.wh] = opt.ecSize[categoryDim.wh]; + clipShape[valueDim.xy] = 0; + clipShape[valueDim.wh] = layout[valueDim.wh]; + } + + function createPath(symbolMeta) { + var symbolPatternSize = symbolMeta.symbolPatternSize; + var path = createSymbol( // Consider texture img, make a big size. + symbolMeta.symbolType, -symbolPatternSize / 2, -symbolPatternSize / 2, symbolPatternSize, symbolPatternSize); + path.attr({ + culling: true + }); + path.type !== 'image' && path.setStyle({ + strokeNoScale: true + }); + return path; + } + + function createOrUpdateRepeatSymbols(bar, opt, symbolMeta, isUpdate) { + var bundle = bar.__pictorialBundle; + var symbolSize = symbolMeta.symbolSize; + var valueLineWidth = symbolMeta.valueLineWidth; + var pathPosition = symbolMeta.pathPosition; + var valueDim = opt.valueDim; + var repeatTimes = symbolMeta.repeatTimes || 0; + var index = 0; + var unit = symbolSize[opt.valueDim.index] + valueLineWidth + symbolMeta.symbolMargin * 2; + eachPath(bar, function (path) { + path.__pictorialAnimationIndex = index; + path.__pictorialRepeatTimes = repeatTimes; + + if (index < repeatTimes) { + updateAttr(path, null, makeTarget(index), symbolMeta, isUpdate); + } else { + updateAttr(path, null, { + scaleX: 0, + scaleY: 0 + }, symbolMeta, isUpdate, function () { + bundle.remove(path); + }); + } // updateHoverAnimation(path, symbolMeta); + + + index++; + }); + + for (; index < repeatTimes; index++) { + var path = createPath(symbolMeta); + path.__pictorialAnimationIndex = index; + path.__pictorialRepeatTimes = repeatTimes; + bundle.add(path); + var target = makeTarget(index); + updateAttr(path, { + x: target.x, + y: target.y, + scaleX: 0, + scaleY: 0 + }, { + scaleX: target.scaleX, + scaleY: target.scaleY, + rotation: target.rotation + }, symbolMeta, isUpdate); + } + + function makeTarget(index) { + var position = pathPosition.slice(); // (start && pxSign > 0) || (end && pxSign < 0): i = repeatTimes - index + // Otherwise: i = index; + + var pxSign = symbolMeta.pxSign; + var i = index; + + if (symbolMeta.symbolRepeatDirection === 'start' ? pxSign > 0 : pxSign < 0) { + i = repeatTimes - 1 - index; + } + + position[valueDim.index] = unit * (i - repeatTimes / 2 + 0.5) + pathPosition[valueDim.index]; + return { + x: position[0], + y: position[1], + scaleX: symbolMeta.symbolScale[0], + scaleY: symbolMeta.symbolScale[1], + rotation: symbolMeta.rotation + }; + } + } + + function createOrUpdateSingleSymbol(bar, opt, symbolMeta, isUpdate) { + var bundle = bar.__pictorialBundle; + var mainPath = bar.__pictorialMainPath; + + if (!mainPath) { + mainPath = bar.__pictorialMainPath = createPath(symbolMeta); + bundle.add(mainPath); + updateAttr(mainPath, { + x: symbolMeta.pathPosition[0], + y: symbolMeta.pathPosition[1], + scaleX: 0, + scaleY: 0, + rotation: symbolMeta.rotation + }, { + scaleX: symbolMeta.symbolScale[0], + scaleY: symbolMeta.symbolScale[1] + }, symbolMeta, isUpdate); + } else { + updateAttr(mainPath, null, { + x: symbolMeta.pathPosition[0], + y: symbolMeta.pathPosition[1], + scaleX: symbolMeta.symbolScale[0], + scaleY: symbolMeta.symbolScale[1], + rotation: symbolMeta.rotation + }, symbolMeta, isUpdate); + } + } // bar rect is used for label. + + + function createOrUpdateBarRect(bar, symbolMeta, isUpdate) { + var rectShape = extend({}, symbolMeta.barRectShape); + var barRect = bar.__pictorialBarRect; + + if (!barRect) { + barRect = bar.__pictorialBarRect = new Rect({ + z2: 2, + shape: rectShape, + silent: true, + style: { + stroke: 'transparent', + fill: 'transparent', + lineWidth: 0 + } + }); + barRect.disableMorphing = true; + bar.add(barRect); + } else { + updateAttr(barRect, null, { + shape: rectShape + }, symbolMeta, isUpdate); + } + } + + function createOrUpdateClip(bar, opt, symbolMeta, isUpdate) { + // If not clip, symbol will be remove and rebuilt. + if (symbolMeta.symbolClip) { + var clipPath = bar.__pictorialClipPath; + var clipShape = extend({}, symbolMeta.clipShape); + var valueDim = opt.valueDim; + var animationModel = symbolMeta.animationModel; + var dataIndex = symbolMeta.dataIndex; + + if (clipPath) { + updateProps(clipPath, { + shape: clipShape + }, animationModel, dataIndex); + } else { + clipShape[valueDim.wh] = 0; + clipPath = new Rect({ + shape: clipShape + }); + + bar.__pictorialBundle.setClipPath(clipPath); + + bar.__pictorialClipPath = clipPath; + var target = {}; + target[valueDim.wh] = symbolMeta.clipShape[valueDim.wh]; + graphic[isUpdate ? 'updateProps' : 'initProps'](clipPath, { + shape: target + }, animationModel, dataIndex); + } + } + } + + function getItemModel(data, dataIndex) { + var itemModel = data.getItemModel(dataIndex); + itemModel.getAnimationDelayParams = getAnimationDelayParams; + itemModel.isAnimationEnabled = isAnimationEnabled; + return itemModel; + } + + function getAnimationDelayParams(path) { + // The order is the same as the z-order, see `symbolRepeatDiretion`. + return { + index: path.__pictorialAnimationIndex, + count: path.__pictorialRepeatTimes + }; + } + + function isAnimationEnabled() { + // `animation` prop can be set on itemModel in pictorial bar chart. + return this.parentModel.isAnimationEnabled() && !!this.getShallow('animation'); + } + + function createBar(data, opt, symbolMeta, isUpdate) { + // bar is the main element for each data. + var bar = new Group(); // bundle is used for location and clip. + + var bundle = new Group(); + bar.add(bundle); + bar.__pictorialBundle = bundle; + bundle.x = symbolMeta.bundlePosition[0]; + bundle.y = symbolMeta.bundlePosition[1]; + + if (symbolMeta.symbolRepeat) { + createOrUpdateRepeatSymbols(bar, opt, symbolMeta); + } else { + createOrUpdateSingleSymbol(bar, opt, symbolMeta); + } + + createOrUpdateBarRect(bar, symbolMeta, isUpdate); + createOrUpdateClip(bar, opt, symbolMeta, isUpdate); + bar.__pictorialShapeStr = getShapeStr(data, symbolMeta); + bar.__pictorialSymbolMeta = symbolMeta; + return bar; + } + + function updateBar(bar, opt, symbolMeta) { + var animationModel = symbolMeta.animationModel; + var dataIndex = symbolMeta.dataIndex; + var bundle = bar.__pictorialBundle; + updateProps(bundle, { + x: symbolMeta.bundlePosition[0], + y: symbolMeta.bundlePosition[1] + }, animationModel, dataIndex); + + if (symbolMeta.symbolRepeat) { + createOrUpdateRepeatSymbols(bar, opt, symbolMeta, true); + } else { + createOrUpdateSingleSymbol(bar, opt, symbolMeta, true); + } + + createOrUpdateBarRect(bar, symbolMeta, true); + createOrUpdateClip(bar, opt, symbolMeta, true); + } + + function removeBar(data, dataIndex, animationModel, bar) { + // Not show text when animating + var labelRect = bar.__pictorialBarRect; + labelRect && labelRect.removeTextContent(); + var paths = []; + eachPath(bar, function (path) { + paths.push(path); + }); + bar.__pictorialMainPath && paths.push(bar.__pictorialMainPath); // I do not find proper remove animation for clip yet. + + bar.__pictorialClipPath && (animationModel = null); + each(paths, function (path) { + removeElement(path, { + scaleX: 0, + scaleY: 0 + }, animationModel, dataIndex, function () { + bar.parent && bar.parent.remove(bar); + }); + }); + data.setItemGraphicEl(dataIndex, null); + } + + function getShapeStr(data, symbolMeta) { + return [data.getItemVisual(symbolMeta.dataIndex, 'symbol') || 'none', !!symbolMeta.symbolRepeat, !!symbolMeta.symbolClip].join(':'); + } + + function eachPath(bar, cb, context) { + // Do not use Group#eachChild, because it do not support remove. + each(bar.__pictorialBundle.children(), function (el) { + el !== bar.__pictorialBarRect && cb.call(context, el); + }); + } + + function updateAttr(el, immediateAttrs, animationAttrs, symbolMeta, isUpdate, cb) { + immediateAttrs && el.attr(immediateAttrs); // when symbolCip used, only clip path has init animation, otherwise it would be weird effect. + + if (symbolMeta.symbolClip && !isUpdate) { + animationAttrs && el.attr(animationAttrs); + } else { + animationAttrs && graphic[isUpdate ? 'updateProps' : 'initProps'](el, animationAttrs, symbolMeta.animationModel, symbolMeta.dataIndex, cb); + } + } + + function updateCommon$1(bar, opt, symbolMeta) { + var dataIndex = symbolMeta.dataIndex; + var itemModel = symbolMeta.itemModel; // Color must be excluded. + // Because symbol provide setColor individually to set fill and stroke + + var emphasisModel = itemModel.getModel('emphasis'); + var emphasisStyle = emphasisModel.getModel('itemStyle').getItemStyle(); + var blurStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle(); + var selectStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle(); + var cursorStyle = itemModel.getShallow('cursor'); + var focus = emphasisModel.get('focus'); + var blurScope = emphasisModel.get('blurScope'); + var hoverScale = emphasisModel.get('scale'); + eachPath(bar, function (path) { + if (path instanceof ZRImage) { + var pathStyle = path.style; + path.useStyle(extend({ + // TODO other properties like dx, dy ? + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, symbolMeta.style)); + } else { + path.useStyle(symbolMeta.style); + } + + var emphasisState = path.ensureState('emphasis'); + emphasisState.style = emphasisStyle; + + if (hoverScale) { + // NOTE: Must after scale is set after updateAttr + emphasisState.scaleX = path.scaleX * 1.1; + emphasisState.scaleY = path.scaleY * 1.1; + } + + path.ensureState('blur').style = blurStyle; + path.ensureState('select').style = selectStyle; + cursorStyle && (path.cursor = cursorStyle); + path.z2 = symbolMeta.z2; + }); + var barPositionOutside = opt.valueDim.posDesc[+(symbolMeta.boundingLength > 0)]; + var barRect = bar.__pictorialBarRect; + setLabelStyle(barRect, getLabelStatesModels(itemModel), { + labelFetcher: opt.seriesModel, + labelDataIndex: dataIndex, + defaultText: getDefaultLabel(opt.seriesModel.getData(), dataIndex), + inheritColor: symbolMeta.style.fill, + defaultOpacity: symbolMeta.style.opacity, + defaultOutsidePosition: barPositionOutside + }); + toggleHoverEmphasis(bar, focus, blurScope, emphasisModel.get('disabled')); + } + + function toIntTimes(times) { + var roundedTimes = Math.round(times); // Escapse accurate error + + return Math.abs(times - roundedTimes) < 1e-4 ? roundedTimes : Math.ceil(times); + } + + var PictorialBarSeriesModel = + /** @class */ + function (_super) { + __extends(PictorialBarSeriesModel, _super); + + function PictorialBarSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PictorialBarSeriesModel.type; + _this.hasSymbolVisual = true; + _this.defaultSymbol = 'roundRect'; + return _this; + } + + PictorialBarSeriesModel.prototype.getInitialData = function (option) { + // Disable stack. + option.stack = null; + return _super.prototype.getInitialData.apply(this, arguments); + }; + + PictorialBarSeriesModel.type = 'series.pictorialBar'; + PictorialBarSeriesModel.dependencies = ['grid']; + PictorialBarSeriesModel.defaultOption = inheritDefaultOption(BaseBarSeriesModel.defaultOption, { + symbol: 'circle', + symbolSize: null, + symbolRotate: null, + symbolPosition: null, + symbolOffset: null, + symbolMargin: null, + symbolRepeat: false, + symbolRepeatDirection: 'end', + symbolClip: false, + symbolBoundingData: null, + symbolPatternSize: 400, + barGap: '-100%', + // z can be set in data item, which is z2 actually. + // Disable progressive + progressive: 0, + emphasis: { + // By default pictorialBar do not hover scale. Hover scale is not suitable + // for the case that both has foreground and background. + scale: false + }, + select: { + itemStyle: { + borderColor: '#212121' + } + } + }); + return PictorialBarSeriesModel; + }(BaseBarSeriesModel); + + function install$o(registers) { + registers.registerChartView(PictorialBarView); + registers.registerSeriesModel(PictorialBarSeriesModel); + registers.registerLayout(registers.PRIORITY.VISUAL.LAYOUT, curry(layout, 'pictorialBar')); // Do layout after other overall layout, which can preapre some informations. + + registers.registerLayout(registers.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, createProgressiveLayout('pictorialBar')); + } + + var ThemeRiverView = + /** @class */ + function (_super) { + __extends(ThemeRiverView, _super); + + function ThemeRiverView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ThemeRiverView.type; + _this._layers = []; + return _this; + } + + ThemeRiverView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var self = this; + var group = this.group; + var layersSeries = seriesModel.getLayerSeries(); + var layoutInfo = data.getLayout('layoutInfo'); + var rect = layoutInfo.rect; + var boundaryGap = layoutInfo.boundaryGap; + group.x = 0; + group.y = rect.y + boundaryGap[0]; + + function keyGetter(item) { + return item.name; + } + + var dataDiffer = new DataDiffer(this._layersSeries || [], layersSeries, keyGetter, keyGetter); + var newLayersGroups = []; + dataDiffer.add(bind(process, this, 'add')).update(bind(process, this, 'update')).remove(bind(process, this, 'remove')).execute(); + + function process(status, idx, oldIdx) { + var oldLayersGroups = self._layers; + + if (status === 'remove') { + group.remove(oldLayersGroups[idx]); + return; + } + + var points0 = []; + var points1 = []; + var style; + var indices = layersSeries[idx].indices; + var j = 0; + + for (; j < indices.length; j++) { + var layout = data.getItemLayout(indices[j]); + var x = layout.x; + var y0 = layout.y0; + var y = layout.y; + points0.push(x, y0); + points1.push(x, y0 + y); + style = data.getItemVisual(indices[j], 'style'); + } + + var polygon; + var textLayout = data.getItemLayout(indices[0]); + var labelModel = seriesModel.getModel('label'); + var margin = labelModel.get('margin'); + var emphasisModel = seriesModel.getModel('emphasis'); + + if (status === 'add') { + var layerGroup = newLayersGroups[idx] = new Group(); + polygon = new ECPolygon({ + shape: { + points: points0, + stackedOnPoints: points1, + smooth: 0.4, + stackedOnSmooth: 0.4, + smoothConstraint: false + }, + z2: 0 + }); + layerGroup.add(polygon); + group.add(layerGroup); + + if (seriesModel.isAnimationEnabled()) { + polygon.setClipPath(createGridClipShape$2(polygon.getBoundingRect(), seriesModel, function () { + polygon.removeClipPath(); + })); + } + } else { + var layerGroup = oldLayersGroups[oldIdx]; + polygon = layerGroup.childAt(0); + group.add(layerGroup); + newLayersGroups[idx] = layerGroup; + updateProps(polygon, { + shape: { + points: points0, + stackedOnPoints: points1 + } + }, seriesModel); + saveOldStyle(polygon); + } + + setLabelStyle(polygon, getLabelStatesModels(seriesModel), { + labelDataIndex: indices[j - 1], + defaultText: data.getName(indices[j - 1]), + inheritColor: style.fill + }, { + normal: { + verticalAlign: 'middle' // align: 'right' + + } + }); + polygon.setTextConfig({ + position: null, + local: true + }); + var labelEl = polygon.getTextContent(); // TODO More label position options. + + if (labelEl) { + labelEl.x = textLayout.x - margin; + labelEl.y = textLayout.y0 + textLayout.y / 2; + } + + polygon.useStyle(style); + data.setItemGraphicEl(idx, polygon); + setStatesStylesFromModel(polygon, seriesModel); + toggleHoverEmphasis(polygon, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + } + + this._layersSeries = layersSeries; + this._layers = newLayersGroups; + }; + + ThemeRiverView.type = 'themeRiver'; + return ThemeRiverView; + }(ChartView); + + function createGridClipShape$2(rect, seriesModel, cb) { + var rectEl = new Rect({ + shape: { + x: rect.x - 10, + y: rect.y - 10, + width: 0, + height: rect.height + 20 + } + }); + initProps(rectEl, { + shape: { + x: rect.x - 50, + width: rect.width + 100, + height: rect.height + 20 + } + }, seriesModel, cb); + return rectEl; + } + + var DATA_NAME_INDEX = 2; + + var ThemeRiverSeriesModel = + /** @class */ + function (_super) { + __extends(ThemeRiverSeriesModel, _super); + + function ThemeRiverSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ThemeRiverSeriesModel.type; + return _this; + } + /** + * @override + */ + + + ThemeRiverSeriesModel.prototype.init = function (option) { + // eslint-disable-next-line + _super.prototype.init.apply(this, arguments); // Put this function here is for the sake of consistency of code style. + // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + + + this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this)); + }; + /** + * If there is no value of a certain point in the time for some event,set it value to 0. + * + * @param {Array} data initial data in the option + * @return {Array} + */ + + + ThemeRiverSeriesModel.prototype.fixData = function (data) { + var rawDataLength = data.length; + /** + * Make sure every layer data get the same keys. + * The value index tells which layer has visited. + * { + * 2014/01/01: -1 + * } + */ + + var timeValueKeys = {}; // grouped data by name + + var groupResult = groupData(data, function (item) { + if (!timeValueKeys.hasOwnProperty(item[0] + '')) { + timeValueKeys[item[0] + ''] = -1; + } + + return item[2]; + }); + var layerData = []; + groupResult.buckets.each(function (items, key) { + layerData.push({ + name: key, + dataList: items + }); + }); + var layerNum = layerData.length; + + for (var k = 0; k < layerNum; ++k) { + var name_1 = layerData[k].name; + + for (var j = 0; j < layerData[k].dataList.length; ++j) { + var timeValue = layerData[k].dataList[j][0] + ''; + timeValueKeys[timeValue] = k; + } + + for (var timeValue in timeValueKeys) { + if (timeValueKeys.hasOwnProperty(timeValue) && timeValueKeys[timeValue] !== k) { + timeValueKeys[timeValue] = k; + data[rawDataLength] = [timeValue, 0, name_1]; + rawDataLength++; + } + } + } + + return data; + }; + /** + * @override + * @param option the initial option that user gived + * @param ecModel the model object for themeRiver option + */ + + + ThemeRiverSeriesModel.prototype.getInitialData = function (option, ecModel) { + var singleAxisModel = this.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0]; + var axisType = singleAxisModel.get('type'); // filter the data item with the value of label is undefined + + var filterData = filter(option.data, function (dataItem) { + return dataItem[2] !== undefined; + }); // ??? TODO design a stage to transfer data for themeRiver and lines? + + var data = this.fixData(filterData || []); + var nameList = []; + var nameMap = this.nameMap = createHashMap(); + var count = 0; + + for (var i = 0; i < data.length; ++i) { + nameList.push(data[i][DATA_NAME_INDEX]); + + if (!nameMap.get(data[i][DATA_NAME_INDEX])) { + nameMap.set(data[i][DATA_NAME_INDEX], count); + count++; + } + } + + var dimensions = prepareSeriesDataSchema(data, { + coordDimensions: ['single'], + dimensionsDefine: [{ + name: 'time', + type: getDimensionTypeByAxis(axisType) + }, { + name: 'value', + type: 'float' + }, { + name: 'name', + type: 'ordinal' + }], + encodeDefine: { + single: 0, + value: 1, + itemName: 2 + } + }).dimensions; + var list = new SeriesData(dimensions, this); + list.initData(data); + return list; + }; + /** + * The raw data is divided into multiple layers and each layer + * has same name. + */ + + + ThemeRiverSeriesModel.prototype.getLayerSeries = function () { + var data = this.getData(); + var lenCount = data.count(); + var indexArr = []; + + for (var i = 0; i < lenCount; ++i) { + indexArr[i] = i; + } + + var timeDim = data.mapDimension('single'); // data group by name + + var groupResult = groupData(indexArr, function (index) { + return data.get('name', index); + }); + var layerSeries = []; + groupResult.buckets.each(function (items, key) { + items.sort(function (index1, index2) { + return data.get(timeDim, index1) - data.get(timeDim, index2); + }); + layerSeries.push({ + name: key, + indices: items + }); + }); + return layerSeries; + }; + /** + * Get data indices for show tooltip content + */ + + + ThemeRiverSeriesModel.prototype.getAxisTooltipData = function (dim, value, baseAxis) { + if (!isArray(dim)) { + dim = dim ? [dim] : []; + } + + var data = this.getData(); + var layerSeries = this.getLayerSeries(); + var indices = []; + var layerNum = layerSeries.length; + var nestestValue; + + for (var i = 0; i < layerNum; ++i) { + var minDist = Number.MAX_VALUE; + var nearestIdx = -1; + var pointNum = layerSeries[i].indices.length; + + for (var j = 0; j < pointNum; ++j) { + var theValue = data.get(dim[0], layerSeries[i].indices[j]); + var dist = Math.abs(theValue - value); + + if (dist <= minDist) { + nestestValue = theValue; + minDist = dist; + nearestIdx = layerSeries[i].indices[j]; + } + } + + indices.push(nearestIdx); + } + + return { + dataIndices: indices, + nestestValue: nestestValue + }; + }; + + ThemeRiverSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var name = data.getName(dataIndex); + var value = data.get(data.mapDimension('value'), dataIndex); + return createTooltipMarkup('nameValue', { + name: name, + value: value + }); + }; + + ThemeRiverSeriesModel.type = 'series.themeRiver'; + ThemeRiverSeriesModel.dependencies = ['singleAxis']; + ThemeRiverSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + colorBy: 'data', + coordinateSystem: 'singleAxis', + // gap in axis's orthogonal orientation + boundaryGap: ['10%', '10%'], + // legendHoverLink: true, + singleAxisIndex: 0, + animationEasing: 'linear', + label: { + margin: 4, + show: true, + position: 'left', + fontSize: 11 + }, + emphasis: { + label: { + show: true + } + } + }; + return ThemeRiverSeriesModel; + }(SeriesModel); + + function themeRiverLayout(ecModel, api) { + ecModel.eachSeriesByType('themeRiver', function (seriesModel) { + var data = seriesModel.getData(); + var single = seriesModel.coordinateSystem; + var layoutInfo = {}; // use the axis boundingRect for view + + var rect = single.getRect(); + layoutInfo.rect = rect; + var boundaryGap = seriesModel.get('boundaryGap'); + var axis = single.getAxis(); + layoutInfo.boundaryGap = boundaryGap; + + if (axis.orient === 'horizontal') { + boundaryGap[0] = parsePercent$1(boundaryGap[0], rect.height); + boundaryGap[1] = parsePercent$1(boundaryGap[1], rect.height); + var height = rect.height - boundaryGap[0] - boundaryGap[1]; + doThemeRiverLayout(data, seriesModel, height); + } else { + boundaryGap[0] = parsePercent$1(boundaryGap[0], rect.width); + boundaryGap[1] = parsePercent$1(boundaryGap[1], rect.width); + var width = rect.width - boundaryGap[0] - boundaryGap[1]; + doThemeRiverLayout(data, seriesModel, width); + } + + data.setLayout('layoutInfo', layoutInfo); + }); + } + /** + * The layout information about themeriver + * + * @param data data in the series + * @param seriesModel the model object of themeRiver series + * @param height value used to compute every series height + */ + + function doThemeRiverLayout(data, seriesModel, height) { + if (!data.count()) { + return; + } + + var coordSys = seriesModel.coordinateSystem; // the data in each layer are organized into a series. + + var layerSeries = seriesModel.getLayerSeries(); // the points in each layer. + + var timeDim = data.mapDimension('single'); + var valueDim = data.mapDimension('value'); + var layerPoints = map(layerSeries, function (singleLayer) { + return map(singleLayer.indices, function (idx) { + var pt = coordSys.dataToPoint(data.get(timeDim, idx)); + pt[1] = data.get(valueDim, idx); + return pt; + }); + }); + var base = computeBaseline(layerPoints); + var baseLine = base.y0; + var ky = height / base.max; // set layout information for each item. + + var n = layerSeries.length; + var m = layerSeries[0].indices.length; + var baseY0; + + for (var j = 0; j < m; ++j) { + baseY0 = baseLine[j] * ky; + data.setItemLayout(layerSeries[0].indices[j], { + layerIndex: 0, + x: layerPoints[0][j][0], + y0: baseY0, + y: layerPoints[0][j][1] * ky + }); + + for (var i = 1; i < n; ++i) { + baseY0 += layerPoints[i - 1][j][1] * ky; + data.setItemLayout(layerSeries[i].indices[j], { + layerIndex: i, + x: layerPoints[i][j][0], + y0: baseY0, + y: layerPoints[i][j][1] * ky + }); + } + } + } + /** + * Compute the baseLine of the rawdata + * Inspired by Lee Byron's paper Stacked Graphs - Geometry & Aesthetics + * + * @param data the points in each layer + */ + + + function computeBaseline(data) { + var layerNum = data.length; + var pointNum = data[0].length; + var sums = []; + var y0 = []; + var max = 0; + + for (var i = 0; i < pointNum; ++i) { + var temp = 0; + + for (var j = 0; j < layerNum; ++j) { + temp += data[j][i][1]; + } + + if (temp > max) { + max = temp; + } + + sums.push(temp); + } + + for (var k = 0; k < pointNum; ++k) { + y0[k] = (max - sums[k]) / 2; + } + + max = 0; + + for (var l = 0; l < pointNum; ++l) { + var sum = sums[l] + y0[l]; + + if (sum > max) { + max = sum; + } + } + + return { + y0: y0, + max: max + }; + } + + function install$p(registers) { + registers.registerChartView(ThemeRiverView); + registers.registerSeriesModel(ThemeRiverSeriesModel); + registers.registerLayout(themeRiverLayout); + registers.registerProcessor(dataFilter('themeRiver')); + } + + var DEFAULT_SECTOR_Z = 2; + var DEFAULT_TEXT_Z = 4; + /** + * Sunburstce of Sunburst including Sector, Label, LabelLine + */ + + var SunburstPiece = + /** @class */ + function (_super) { + __extends(SunburstPiece, _super); + + function SunburstPiece(node, seriesModel, ecModel, api) { + var _this = _super.call(this) || this; + + _this.z2 = DEFAULT_SECTOR_Z; + _this.textConfig = { + inside: true + }; + getECData(_this).seriesIndex = seriesModel.seriesIndex; + var text = new ZRText({ + z2: DEFAULT_TEXT_Z, + silent: node.getModel().get(['label', 'silent']) + }); + + _this.setTextContent(text); + + _this.updateData(true, node, seriesModel, ecModel, api); + + return _this; + } + + SunburstPiece.prototype.updateData = function (firstCreate, node, // state: 'emphasis' | 'normal' | 'highlight' | 'downplay', + seriesModel, ecModel, api) { + this.node = node; + node.piece = this; + seriesModel = seriesModel || this._seriesModel; + ecModel = ecModel || this._ecModel; + var sector = this; + getECData(sector).dataIndex = node.dataIndex; + var itemModel = node.getModel(); + var emphasisModel = itemModel.getModel('emphasis'); + var layout = node.getLayout(); + var sectorShape = extend({}, layout); + sectorShape.label = null; + var normalStyle = node.getVisual('style'); + normalStyle.lineJoin = 'bevel'; + var decal = node.getVisual('decal'); + + if (decal) { + normalStyle.decal = createOrUpdatePatternFromDecal(decal, api); + } + + var cornerRadius = getSectorCornerRadius(itemModel.getModel('itemStyle'), sectorShape, true); + extend(sectorShape, cornerRadius); + each(SPECIAL_STATES, function (stateName) { + var state = sector.ensureState(stateName); + var itemStyleModel = itemModel.getModel([stateName, 'itemStyle']); + state.style = itemStyleModel.getItemStyle(); // border radius + + var cornerRadius = getSectorCornerRadius(itemStyleModel, sectorShape); + + if (cornerRadius) { + state.shape = cornerRadius; + } + }); + + if (firstCreate) { + sector.setShape(sectorShape); + sector.shape.r = layout.r0; + updateProps(sector, { + shape: { + r: layout.r + } + }, seriesModel, node.dataIndex); + } else { + // Disable animation for gradient since no interpolation method + // is supported for gradient + updateProps(sector, { + shape: sectorShape + }, seriesModel); + saveOldStyle(sector); + } + + sector.useStyle(normalStyle); + + this._updateLabel(seriesModel); + + var cursorStyle = itemModel.getShallow('cursor'); + cursorStyle && sector.attr('cursor', cursorStyle); + this._seriesModel = seriesModel || this._seriesModel; + this._ecModel = ecModel || this._ecModel; + var focus = emphasisModel.get('focus'); + var focusOrIndices = focus === 'ancestor' ? node.getAncestorsIndices() : focus === 'descendant' ? node.getDescendantIndices() : focus; + toggleHoverEmphasis(this, focusOrIndices, emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }; + + SunburstPiece.prototype._updateLabel = function (seriesModel) { + var _this = this; + + var itemModel = this.node.getModel(); + var normalLabelModel = itemModel.getModel('label'); + var layout = this.node.getLayout(); + var angle = layout.endAngle - layout.startAngle; + var midAngle = (layout.startAngle + layout.endAngle) / 2; + var dx = Math.cos(midAngle); + var dy = Math.sin(midAngle); + var sector = this; + var label = sector.getTextContent(); + var dataIndex = this.node.dataIndex; + var labelMinAngle = normalLabelModel.get('minAngle') / 180 * Math.PI; + var isNormalShown = normalLabelModel.get('show') && !(labelMinAngle != null && Math.abs(angle) < labelMinAngle); + label.ignore = !isNormalShown; // TODO use setLabelStyle + + each(DISPLAY_STATES, function (stateName) { + var labelStateModel = stateName === 'normal' ? itemModel.getModel('label') : itemModel.getModel([stateName, 'label']); + var isNormal = stateName === 'normal'; + var state = isNormal ? label : label.ensureState(stateName); + var text = seriesModel.getFormattedLabel(dataIndex, stateName); + + if (isNormal) { + text = text || _this.node.name; + } + + state.style = createTextStyle(labelStateModel, {}, null, stateName !== 'normal', true); + + if (text) { + state.style.text = text; + } // Not displaying text when angle is too small + + + var isShown = labelStateModel.get('show'); + + if (isShown != null && !isNormal) { + state.ignore = !isShown; + } + + var labelPosition = getLabelAttr(labelStateModel, 'position'); + var sectorState = isNormal ? sector : sector.states[stateName]; + var labelColor = sectorState.style.fill; + sectorState.textConfig = { + outsideFill: labelStateModel.get('color') === 'inherit' ? labelColor : null, + inside: labelPosition !== 'outside' + }; + var r; + var labelPadding = getLabelAttr(labelStateModel, 'distance') || 0; + var textAlign = getLabelAttr(labelStateModel, 'align'); + + if (labelPosition === 'outside') { + r = layout.r + labelPadding; + textAlign = midAngle > Math.PI / 2 ? 'right' : 'left'; + } else { + if (!textAlign || textAlign === 'center') { + // Put label in the center if it's a circle + if (angle === 2 * Math.PI && layout.r0 === 0) { + r = 0; + } else { + r = (layout.r + layout.r0) / 2; + } + + textAlign = 'center'; + } else if (textAlign === 'left') { + r = layout.r0 + labelPadding; + + if (midAngle > Math.PI / 2) { + textAlign = 'right'; + } + } else if (textAlign === 'right') { + r = layout.r - labelPadding; + + if (midAngle > Math.PI / 2) { + textAlign = 'left'; + } + } + } + + state.style.align = textAlign; + state.style.verticalAlign = getLabelAttr(labelStateModel, 'verticalAlign') || 'middle'; + state.x = r * dx + layout.cx; + state.y = r * dy + layout.cy; + var rotateType = getLabelAttr(labelStateModel, 'rotate'); + var rotate = 0; + + if (rotateType === 'radial') { + rotate = -midAngle; + + if (rotate < -Math.PI / 2) { + rotate += Math.PI; + } + } else if (rotateType === 'tangential') { + rotate = Math.PI / 2 - midAngle; + + if (rotate > Math.PI / 2) { + rotate -= Math.PI; + } else if (rotate < -Math.PI / 2) { + rotate += Math.PI; + } + } else if (isNumber(rotateType)) { + rotate = rotateType * Math.PI / 180; + } + + state.rotation = rotate; + }); + + function getLabelAttr(model, name) { + var stateAttr = model.get(name); + + if (stateAttr == null) { + return normalLabelModel.get(name); + } + + return stateAttr; + } + + label.dirtyStyle(); + }; + + return SunburstPiece; + }(Sector); + + var ROOT_TO_NODE_ACTION = 'sunburstRootToNode'; + var HIGHLIGHT_ACTION = 'sunburstHighlight'; + var UNHIGHLIGHT_ACTION = 'sunburstUnhighlight'; + function installSunburstAction(registers) { + registers.registerAction({ + type: ROOT_TO_NODE_ACTION, + update: 'updateView' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'sunburst', + query: payload + }, handleRootToNode); + + function handleRootToNode(model, index) { + var targetInfo = retrieveTargetInfo(payload, [ROOT_TO_NODE_ACTION], model); + + if (targetInfo) { + var originViewRoot = model.getViewRoot(); + + if (originViewRoot) { + payload.direction = aboveViewRoot(originViewRoot, targetInfo.node) ? 'rollUp' : 'drillDown'; + } + + model.resetViewRoot(targetInfo.node); + } + } + }); + registers.registerAction({ + type: HIGHLIGHT_ACTION, + update: 'none' + }, function (payload, ecModel, api) { + // Clone + payload = extend({}, payload); + ecModel.eachComponent({ + mainType: 'series', + subType: 'sunburst', + query: payload + }, handleHighlight); + + function handleHighlight(model) { + var targetInfo = retrieveTargetInfo(payload, [HIGHLIGHT_ACTION], model); + + if (targetInfo) { + payload.dataIndex = targetInfo.node.dataIndex; + } + } + + if ("development" !== 'production') { + deprecateReplaceLog('highlight', 'sunburstHighlight'); + } // Fast forward action + + + api.dispatchAction(extend(payload, { + type: 'highlight' + })); + }); + registers.registerAction({ + type: UNHIGHLIGHT_ACTION, + update: 'updateView' + }, function (payload, ecModel, api) { + payload = extend({}, payload); + + if ("development" !== 'production') { + deprecateReplaceLog('downplay', 'sunburstUnhighlight'); + } + + api.dispatchAction(extend(payload, { + type: 'downplay' + })); + }); + } + + var SunburstView = + /** @class */ + function (_super) { + __extends(SunburstView, _super); + + function SunburstView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SunburstView.type; + return _this; + } + + SunburstView.prototype.render = function (seriesModel, ecModel, api, // @ts-ignore + payload) { + var self = this; + this.seriesModel = seriesModel; + this.api = api; + this.ecModel = ecModel; + var data = seriesModel.getData(); + var virtualRoot = data.tree.root; + var newRoot = seriesModel.getViewRoot(); + var group = this.group; + var renderLabelForZeroData = seriesModel.get('renderLabelForZeroData'); + var newChildren = []; + newRoot.eachNode(function (node) { + newChildren.push(node); + }); + var oldChildren = this._oldChildren || []; + dualTravel(newChildren, oldChildren); + renderRollUp(virtualRoot, newRoot); + + this._initEvents(); + + this._oldChildren = newChildren; + + function dualTravel(newChildren, oldChildren) { + if (newChildren.length === 0 && oldChildren.length === 0) { + return; + } + + new DataDiffer(oldChildren, newChildren, getKey, getKey).add(processNode).update(processNode).remove(curry(processNode, null)).execute(); + + function getKey(node) { + return node.getId(); + } + + function processNode(newIdx, oldIdx) { + var newNode = newIdx == null ? null : newChildren[newIdx]; + var oldNode = oldIdx == null ? null : oldChildren[oldIdx]; + doRenderNode(newNode, oldNode); + } + } + + function doRenderNode(newNode, oldNode) { + if (!renderLabelForZeroData && newNode && !newNode.getValue()) { + // Not render data with value 0 + newNode = null; + } + + if (newNode !== virtualRoot && oldNode !== virtualRoot) { + if (oldNode && oldNode.piece) { + if (newNode) { + // Update + oldNode.piece.updateData(false, newNode, seriesModel, ecModel, api); // For tooltip + + data.setItemGraphicEl(newNode.dataIndex, oldNode.piece); + } else { + // Remove + removeNode(oldNode); + } + } else if (newNode) { + // Add + var piece = new SunburstPiece(newNode, seriesModel, ecModel, api); + group.add(piece); // For tooltip + + data.setItemGraphicEl(newNode.dataIndex, piece); + } + } + } + + function removeNode(node) { + if (!node) { + return; + } + + if (node.piece) { + group.remove(node.piece); + node.piece = null; + } + } + + function renderRollUp(virtualRoot, viewRoot) { + if (viewRoot.depth > 0) { + // Render + if (self.virtualPiece) { + // Update + self.virtualPiece.updateData(false, virtualRoot, seriesModel, ecModel, api); + } else { + // Add + self.virtualPiece = new SunburstPiece(virtualRoot, seriesModel, ecModel, api); + group.add(self.virtualPiece); + } // TODO event scope + + + viewRoot.piece.off('click'); + self.virtualPiece.on('click', function (e) { + self._rootToNode(viewRoot.parentNode); + }); + } else if (self.virtualPiece) { + // Remove + group.remove(self.virtualPiece); + self.virtualPiece = null; + } + } + }; + /** + * @private + */ + + + SunburstView.prototype._initEvents = function () { + var _this = this; + + this.group.off('click'); + this.group.on('click', function (e) { + var targetFound = false; + + var viewRoot = _this.seriesModel.getViewRoot(); + + viewRoot.eachNode(function (node) { + if (!targetFound && node.piece && node.piece === e.target) { + var nodeClick = node.getModel().get('nodeClick'); + + if (nodeClick === 'rootToNode') { + _this._rootToNode(node); + } else if (nodeClick === 'link') { + var itemModel = node.getModel(); + var link = itemModel.get('link'); + + if (link) { + var linkTarget = itemModel.get('target', true) || '_blank'; + windowOpen(link, linkTarget); + } + } + + targetFound = true; + } + }); + }); + }; + /** + * @private + */ + + + SunburstView.prototype._rootToNode = function (node) { + if (node !== this.seriesModel.getViewRoot()) { + this.api.dispatchAction({ + type: ROOT_TO_NODE_ACTION, + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: node + }); + } + }; + /** + * @implement + */ + + + SunburstView.prototype.containPoint = function (point, seriesModel) { + var treeRoot = seriesModel.getData(); + var itemLayout = treeRoot.getItemLayout(0); + + if (itemLayout) { + var dx = point[0] - itemLayout.cx; + var dy = point[1] - itemLayout.cy; + var radius = Math.sqrt(dx * dx + dy * dy); + return radius <= itemLayout.r && radius >= itemLayout.r0; + } + }; + + SunburstView.type = 'sunburst'; + return SunburstView; + }(ChartView); + + var SunburstSeriesModel = + /** @class */ + function (_super) { + __extends(SunburstSeriesModel, _super); + + function SunburstSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SunburstSeriesModel.type; + _this.ignoreStyleOnData = true; + return _this; + } + + SunburstSeriesModel.prototype.getInitialData = function (option, ecModel) { + // Create a virtual root. + var root = { + name: option.name, + children: option.data + }; + completeTreeValue$1(root); + var levelModels = this._levelModels = map(option.levels || [], function (levelDefine) { + return new Model(levelDefine, this, ecModel); + }, this); // Make sure always a new tree is created when setOption, + // in TreemapView, we check whether oldTree === newTree + // to choose mappings approach among old shapes and new shapes. + + var tree = Tree.createTree(root, this, beforeLink); + + function beforeLink(nodeData) { + nodeData.wrapMethod('getItemModel', function (model, idx) { + var node = tree.getNodeByDataIndex(idx); + var levelModel = levelModels[node.depth]; + levelModel && (model.parentModel = levelModel); + return model; + }); + } + + return tree.data; + }; + + SunburstSeriesModel.prototype.optionUpdated = function () { + this.resetViewRoot(); + }; + /* + * @override + */ + + + SunburstSeriesModel.prototype.getDataParams = function (dataIndex) { + var params = _super.prototype.getDataParams.apply(this, arguments); + + var node = this.getData().tree.getNodeByDataIndex(dataIndex); + params.treePathInfo = wrapTreePathInfo(node, this); + return params; + }; + + SunburstSeriesModel.prototype.getLevelModel = function (node) { + return this._levelModels && this._levelModels[node.depth]; + }; + + SunburstSeriesModel.prototype.getViewRoot = function () { + return this._viewRoot; + }; + + SunburstSeriesModel.prototype.resetViewRoot = function (viewRoot) { + viewRoot ? this._viewRoot = viewRoot : viewRoot = this._viewRoot; + var root = this.getRawData().tree.root; + + if (!viewRoot || viewRoot !== root && !root.contains(viewRoot)) { + this._viewRoot = root; + } + }; + + SunburstSeriesModel.prototype.enableAriaDecal = function () { + enableAriaDecalForTree(this); + }; + + SunburstSeriesModel.type = 'series.sunburst'; + SunburstSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + // 默认全局居中 + center: ['50%', '50%'], + radius: [0, '75%'], + // 默认顺时针 + clockwise: true, + startAngle: 90, + // 最小角度改为0 + minAngle: 0, + // If still show when all data zero. + stillShowZeroSum: true, + // 'rootToNode', 'link', or false + nodeClick: 'rootToNode', + renderLabelForZeroData: false, + label: { + // could be: 'radial', 'tangential', or 'none' + rotate: 'radial', + show: true, + opacity: 1, + // 'left' is for inner side of inside, and 'right' is for outter + // side for inside + align: 'center', + position: 'inside', + distance: 5, + silent: true + }, + itemStyle: { + borderWidth: 1, + borderColor: 'white', + borderType: 'solid', + shadowBlur: 0, + shadowColor: 'rgba(0, 0, 0, 0.2)', + shadowOffsetX: 0, + shadowOffsetY: 0, + opacity: 1 + }, + emphasis: { + focus: 'descendant' + }, + blur: { + itemStyle: { + opacity: 0.2 + }, + label: { + opacity: 0.1 + } + }, + // Animation type canbe expansion, scale + animationType: 'expansion', + animationDuration: 1000, + animationDurationUpdate: 500, + data: [], + + /** + * Sort order. + * + * Valid values: 'desc', 'asc', null, or callback function. + * 'desc' and 'asc' for descend and ascendant order; + * null for not sorting; + * example of callback function: + * function(nodeA, nodeB) { + * return nodeA.getValue() - nodeB.getValue(); + * } + */ + sort: 'desc' + }; + return SunburstSeriesModel; + }(SeriesModel); + + function completeTreeValue$1(dataNode) { + // Postorder travel tree. + // If value of none-leaf node is not set, + // calculate it by suming up the value of all children. + var sum = 0; + each(dataNode.children, function (child) { + completeTreeValue$1(child); + var childValue = child.value; // TODO First value of array must be a number + + isArray(childValue) && (childValue = childValue[0]); + sum += childValue; + }); + var thisValue = dataNode.value; + + if (isArray(thisValue)) { + thisValue = thisValue[0]; + } + + if (thisValue == null || isNaN(thisValue)) { + thisValue = sum; + } // Value should not less than 0. + + + if (thisValue < 0) { + thisValue = 0; + } + + isArray(dataNode.value) ? dataNode.value[0] = thisValue : dataNode.value = thisValue; + } + + var RADIAN$2 = Math.PI / 180; + function sunburstLayout(seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var center = seriesModel.get('center'); + var radius = seriesModel.get('radius'); + + if (!isArray(radius)) { + radius = [0, radius]; + } + + if (!isArray(center)) { + center = [center, center]; + } + + var width = api.getWidth(); + var height = api.getHeight(); + var size = Math.min(width, height); + var cx = parsePercent$1(center[0], width); + var cy = parsePercent$1(center[1], height); + var r0 = parsePercent$1(radius[0], size / 2); + var r = parsePercent$1(radius[1], size / 2); + var startAngle = -seriesModel.get('startAngle') * RADIAN$2; + var minAngle = seriesModel.get('minAngle') * RADIAN$2; + var virtualRoot = seriesModel.getData().tree.root; + var treeRoot = seriesModel.getViewRoot(); + var rootDepth = treeRoot.depth; + var sort = seriesModel.get('sort'); + + if (sort != null) { + initChildren$1(treeRoot, sort); + } + + var validDataCount = 0; + each(treeRoot.children, function (child) { + !isNaN(child.getValue()) && validDataCount++; + }); + var sum = treeRoot.getValue(); // Sum may be 0 + + var unitRadian = Math.PI / (sum || validDataCount) * 2; + var renderRollupNode = treeRoot.depth > 0; + var levels = treeRoot.height - (renderRollupNode ? -1 : 1); + var rPerLevel = (r - r0) / (levels || 1); + var clockwise = seriesModel.get('clockwise'); + var stillShowZeroSum = seriesModel.get('stillShowZeroSum'); // In the case some sector angle is smaller than minAngle + // let restAngle = PI2; + // let valueSumLargerThanMinAngle = 0; + + var dir = clockwise ? 1 : -1; + /** + * Render a tree + * @return increased angle + */ + + var renderNode = function (node, startAngle) { + if (!node) { + return; + } + + var endAngle = startAngle; // Render self + + if (node !== virtualRoot) { + // Tree node is virtual, so it doesn't need to be drawn + var value = node.getValue(); + var angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian; + + if (angle < minAngle) { + angle = minAngle; // restAngle -= minAngle; + } // else { + // valueSumLargerThanMinAngle += value; + // } + + + endAngle = startAngle + dir * angle; + var depth = node.depth - rootDepth - (renderRollupNode ? -1 : 1); + var rStart = r0 + rPerLevel * depth; + var rEnd = r0 + rPerLevel * (depth + 1); + var levelModel = seriesModel.getLevelModel(node); + + if (levelModel) { + var r0_1 = levelModel.get('r0', true); + var r_1 = levelModel.get('r', true); + var radius_1 = levelModel.get('radius', true); + + if (radius_1 != null) { + r0_1 = radius_1[0]; + r_1 = radius_1[1]; + } + + r0_1 != null && (rStart = parsePercent$1(r0_1, size / 2)); + r_1 != null && (rEnd = parsePercent$1(r_1, size / 2)); + } + + node.setLayout({ + angle: angle, + startAngle: startAngle, + endAngle: endAngle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: rStart, + r: rEnd + }); + } // Render children + + + if (node.children && node.children.length) { + // currentAngle = startAngle; + var siblingAngle_1 = 0; + each(node.children, function (node) { + siblingAngle_1 += renderNode(node, startAngle + siblingAngle_1); + }); + } + + return endAngle - startAngle; + }; // Virtual root node for roll up + + + if (renderRollupNode) { + var rStart = r0; + var rEnd = r0 + rPerLevel; + var angle = Math.PI * 2; + virtualRoot.setLayout({ + angle: angle, + startAngle: startAngle, + endAngle: startAngle + angle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: rStart, + r: rEnd + }); + } + + renderNode(treeRoot, startAngle); + }); + } + /** + * Init node children by order and update visual + */ + + function initChildren$1(node, sortOrder) { + var children = node.children || []; + node.children = sort$2(children, sortOrder); // Init children recursively + + if (children.length) { + each(node.children, function (child) { + initChildren$1(child, sortOrder); + }); + } + } + /** + * Sort children nodes + * + * @param {TreeNode[]} children children of node to be sorted + * @param {string | function | null} sort sort method + * See SunburstSeries.js for details. + */ + + + function sort$2(children, sortOrder) { + if (isFunction(sortOrder)) { + var sortTargets = map(children, function (child, idx) { + var value = child.getValue(); + return { + params: { + depth: child.depth, + height: child.height, + dataIndex: child.dataIndex, + getValue: function () { + return value; + } + }, + index: idx + }; + }); + sortTargets.sort(function (a, b) { + return sortOrder(a.params, b.params); + }); + return map(sortTargets, function (target) { + return children[target.index]; + }); + } else { + var isAsc_1 = sortOrder === 'asc'; + return children.sort(function (a, b) { + var diff = (a.getValue() - b.getValue()) * (isAsc_1 ? 1 : -1); + return diff === 0 ? (a.dataIndex - b.dataIndex) * (isAsc_1 ? -1 : 1) : diff; + }); + } + } + + function sunburstVisual(ecModel) { + var paletteScope = {}; // Default color strategy + + function pickColor(node, seriesModel, treeHeight) { + // Choose color from palette based on the first level. + var current = node; + + while (current && current.depth > 1) { + current = current.parentNode; + } + + var color = seriesModel.getColorFromPalette(current.name || current.dataIndex + '', paletteScope); + + if (node.depth > 1 && isString(color)) { + // Lighter on the deeper level. + color = lift(color, (node.depth - 1) / (treeHeight - 1) * 0.5); + } + + return color; + } + + ecModel.eachSeriesByType('sunburst', function (seriesModel) { + var data = seriesModel.getData(); + var tree = data.tree; + tree.eachNode(function (node) { + var model = node.getModel(); + var style = model.getModel('itemStyle').getItemStyle(); + + if (!style.fill) { + style.fill = pickColor(node, seriesModel, tree.root.height); + } + + var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style'); + extend(existsStyle, style); + }); + }); + } + + function install$q(registers) { + registers.registerChartView(SunburstView); + registers.registerSeriesModel(SunburstSeriesModel); + registers.registerLayout(curry(sunburstLayout, 'sunburst')); + registers.registerProcessor(curry(dataFilter, 'sunburst')); + registers.registerVisual(sunburstVisual); + installSunburstAction(registers); + } + + // `visual('color') visual('borderColor')` is supported. + + var STYLE_VISUAL_TYPE = { + color: 'fill', + borderColor: 'stroke' + }; + var NON_STYLE_VISUAL_PROPS = { + symbol: 1, + symbolSize: 1, + symbolKeepAspect: 1, + legendIcon: 1, + visualMeta: 1, + liftZ: 1, + decal: 1 + }; + var customInnerStore = makeInner(); + + var CustomSeriesModel = + /** @class */ + function (_super) { + __extends(CustomSeriesModel, _super); + + function CustomSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CustomSeriesModel.type; + return _this; + } + + CustomSeriesModel.prototype.optionUpdated = function () { + this.currentZLevel = this.get('zlevel', true); + this.currentZ = this.get('z', true); + }; + + CustomSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this); + }; + + CustomSeriesModel.prototype.getDataParams = function (dataIndex, dataType, el) { + var params = _super.prototype.getDataParams.call(this, dataIndex, dataType); + + el && (params.info = customInnerStore(el).info); + return params; + }; + + CustomSeriesModel.type = 'series.custom'; + CustomSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar']; + CustomSeriesModel.defaultOption = { + coordinateSystem: 'cartesian2d', + // zlevel: 0, + z: 2, + legendHoverLink: true, + // Custom series will not clip by default. + // Some case will use custom series to draw label + // For example https://echarts.apache.org/examples/en/editor.html?c=custom-gantt-flight + clip: false // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + // Polar coordinate system + // polarIndex: 0, + // Geo coordinate system + // geoIndex: 0, + + }; + return CustomSeriesModel; + }(SeriesModel); + + function dataToCoordSize(dataSize, dataItem) { + // dataItem is necessary in log axis. + dataItem = dataItem || [0, 0]; + return map(['x', 'y'], function (dim, dimIdx) { + var axis = this.getAxis(dim); + var val = dataItem[dimIdx]; + var halfSize = dataSize[dimIdx] / 2; + return axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize)); + }, this); + } + + function cartesianPrepareCustom(coordSys) { + var rect = coordSys.master.getRect(); + return { + coordSys: { + // The name exposed to user is always 'cartesian2d' but not 'grid'. + type: 'cartesian2d', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + api: { + coord: function (data) { + // do not provide "out" param + return coordSys.dataToPoint(data); + }, + size: bind(dataToCoordSize, coordSys) + } + }; + } + + function dataToCoordSize$1(dataSize, dataItem) { + dataItem = dataItem || [0, 0]; + return map([0, 1], function (dimIdx) { + var val = dataItem[dimIdx]; + var halfSize = dataSize[dimIdx] / 2; + var p1 = []; + var p2 = []; + p1[dimIdx] = val - halfSize; + p2[dimIdx] = val + halfSize; + p1[1 - dimIdx] = p2[1 - dimIdx] = dataItem[1 - dimIdx]; + return Math.abs(this.dataToPoint(p1)[dimIdx] - this.dataToPoint(p2)[dimIdx]); + }, this); + } + + function geoPrepareCustom(coordSys) { + var rect = coordSys.getBoundingRect(); + return { + coordSys: { + type: 'geo', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height, + zoom: coordSys.getZoom() + }, + api: { + coord: function (data) { + // do not provide "out" and noRoam param, + // Compatible with this usage: + // echarts.util.map(item.points, api.coord) + return coordSys.dataToPoint(data); + }, + size: bind(dataToCoordSize$1, coordSys) + } + }; + } + + function dataToCoordSize$2(dataSize, dataItem) { + // dataItem is necessary in log axis. + var axis = this.getAxis(); + var val = dataItem instanceof Array ? dataItem[0] : dataItem; + var halfSize = (dataSize instanceof Array ? dataSize[0] : dataSize) / 2; + return axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize)); + } + + function singlePrepareCustom(coordSys) { + var rect = coordSys.getRect(); + return { + coordSys: { + type: 'singleAxis', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + api: { + coord: function (val) { + // do not provide "out" param + return coordSys.dataToPoint(val); + }, + size: bind(dataToCoordSize$2, coordSys) + } + }; + } + + function dataToCoordSize$3(dataSize, dataItem) { + // dataItem is necessary in log axis. + dataItem = dataItem || [0, 0]; + return map(['Radius', 'Angle'], function (dim, dimIdx) { + var getterName = 'get' + dim + 'Axis'; // TODO: TYPE Check Angle Axis + + var axis = this[getterName](); + var val = dataItem[dimIdx]; + var halfSize = dataSize[dimIdx] / 2; + var result = axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize)); + + if (dim === 'Angle') { + result = result * Math.PI / 180; + } + + return result; + }, this); + } + + function polarPrepareCustom(coordSys) { + var radiusAxis = coordSys.getRadiusAxis(); + var angleAxis = coordSys.getAngleAxis(); + var radius = radiusAxis.getExtent(); + radius[0] > radius[1] && radius.reverse(); + return { + coordSys: { + type: 'polar', + cx: coordSys.cx, + cy: coordSys.cy, + r: radius[1], + r0: radius[0] + }, + api: { + coord: function (data) { + var radius = radiusAxis.dataToRadius(data[0]); + var angle = angleAxis.dataToAngle(data[1]); + var coord = coordSys.coordToPoint([radius, angle]); + coord.push(radius, angle * Math.PI / 180); + return coord; + }, + size: bind(dataToCoordSize$3, coordSys) + } + }; + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + function calendarPrepareCustom(coordSys) { + var rect = coordSys.getRect(); + var rangeInfo = coordSys.getRangeInfo(); + return { + coordSys: { + type: 'calendar', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height, + cellWidth: coordSys.getCellWidth(), + cellHeight: coordSys.getCellHeight(), + rangeInfo: { + start: rangeInfo.start, + end: rangeInfo.end, + weeks: rangeInfo.weeks, + dayCount: rangeInfo.allDay + } + }, + api: { + coord: function (data, clamp) { + return coordSys.dataToPoint(data, clamp); + } + } + }; + } + + var deprecatedLogs = {}; + /** + * Whether need to call `convertEC4CompatibleStyle`. + */ + + function isEC4CompatibleStyle(style, elType, hasOwnTextContentOption, hasOwnTextConfig) { + // Since echarts5, `RectText` is separated from its host element and style.text + // does not exist any more. The compat work brings some extra burden on performance. + // So we provide: + // `legacy: true` force make compat. + // `legacy: false`, force do not compat. + // `legacy` not set: auto detect wheter legacy. + // But in this case we do not compat (difficult to detect and rare case): + // Becuse custom series and graphic component support "merge", users may firstly + // only set `textStrokeWidth` style or secondly only set `text`. + return style && (style.legacy || style.legacy !== false && !hasOwnTextContentOption && !hasOwnTextConfig && elType !== 'tspan' // Difficult to detect whether legacy for a "text" el. + && (elType === 'text' || hasOwn(style, 'text'))); + } + /** + * `EC4CompatibleStyle` is style that might be in echarts4 format or echarts5 format. + * @param hostStyle The properties might be modified. + * @return If be text el, `textContentStyle` and `textConfig` will not be retured. + * Otherwise a `textContentStyle` and `textConfig` will be created, whose props area + * retried from the `hostStyle`. + */ + + function convertFromEC4CompatibleStyle(hostStyle, elType, isNormal) { + var srcStyle = hostStyle; + var textConfig; + var textContent; + var textContentStyle; + + if (elType === 'text') { + textContentStyle = srcStyle; + } else { + textContentStyle = {}; + hasOwn(srcStyle, 'text') && (textContentStyle.text = srcStyle.text); + hasOwn(srcStyle, 'rich') && (textContentStyle.rich = srcStyle.rich); + hasOwn(srcStyle, 'textFill') && (textContentStyle.fill = srcStyle.textFill); + hasOwn(srcStyle, 'textStroke') && (textContentStyle.stroke = srcStyle.textStroke); + hasOwn(srcStyle, 'fontFamily') && (textContentStyle.fontFamily = srcStyle.fontFamily); + hasOwn(srcStyle, 'fontSize') && (textContentStyle.fontSize = srcStyle.fontSize); + hasOwn(srcStyle, 'fontStyle') && (textContentStyle.fontStyle = srcStyle.fontStyle); + hasOwn(srcStyle, 'fontWeight') && (textContentStyle.fontWeight = srcStyle.fontWeight); + textContent = { + type: 'text', + style: textContentStyle, + // ec4 do not support rectText trigger. + // And when text postion is different in normal and emphasis + // => hover text trigger emphasis; + // => text position changed, leave mouse pointer immediately; + // That might cause state incorrect. + silent: true + }; + textConfig = {}; + var hasOwnPos = hasOwn(srcStyle, 'textPosition'); + + if (isNormal) { + textConfig.position = hasOwnPos ? srcStyle.textPosition : 'inside'; + } else { + hasOwnPos && (textConfig.position = srcStyle.textPosition); + } + + hasOwn(srcStyle, 'textPosition') && (textConfig.position = srcStyle.textPosition); + hasOwn(srcStyle, 'textOffset') && (textConfig.offset = srcStyle.textOffset); + hasOwn(srcStyle, 'textRotation') && (textConfig.rotation = srcStyle.textRotation); + hasOwn(srcStyle, 'textDistance') && (textConfig.distance = srcStyle.textDistance); + } + + convertEC4CompatibleRichItem(textContentStyle, hostStyle); + each(textContentStyle.rich, function (richItem) { + convertEC4CompatibleRichItem(richItem, richItem); + }); + return { + textConfig: textConfig, + textContent: textContent + }; + } + /** + * The result will be set to `out`. + */ + + function convertEC4CompatibleRichItem(out, richItem) { + if (!richItem) { + return; + } // (1) For simplicity, make textXXX properties (deprecated since ec5) has + // higher priority. For example, consider in ec4 `borderColor: 5, textBorderColor: 10` + // on a rect means `borderColor: 4` on the rect and `borderColor: 10` on an attached + // richText in ec5. + // (2) `out === richItem` if and only if `out` is text el or rich item. + // So we can overwite existing props in `out` since textXXX has higher priority. + + + richItem.font = richItem.textFont || richItem.font; + hasOwn(richItem, 'textStrokeWidth') && (out.lineWidth = richItem.textStrokeWidth); + hasOwn(richItem, 'textAlign') && (out.align = richItem.textAlign); + hasOwn(richItem, 'textVerticalAlign') && (out.verticalAlign = richItem.textVerticalAlign); + hasOwn(richItem, 'textLineHeight') && (out.lineHeight = richItem.textLineHeight); + hasOwn(richItem, 'textWidth') && (out.width = richItem.textWidth); + hasOwn(richItem, 'textHeight') && (out.height = richItem.textHeight); + hasOwn(richItem, 'textBackgroundColor') && (out.backgroundColor = richItem.textBackgroundColor); + hasOwn(richItem, 'textPadding') && (out.padding = richItem.textPadding); + hasOwn(richItem, 'textBorderColor') && (out.borderColor = richItem.textBorderColor); + hasOwn(richItem, 'textBorderWidth') && (out.borderWidth = richItem.textBorderWidth); + hasOwn(richItem, 'textBorderRadius') && (out.borderRadius = richItem.textBorderRadius); + hasOwn(richItem, 'textBoxShadowColor') && (out.shadowColor = richItem.textBoxShadowColor); + hasOwn(richItem, 'textBoxShadowBlur') && (out.shadowBlur = richItem.textBoxShadowBlur); + hasOwn(richItem, 'textBoxShadowOffsetX') && (out.shadowOffsetX = richItem.textBoxShadowOffsetX); + hasOwn(richItem, 'textBoxShadowOffsetY') && (out.shadowOffsetY = richItem.textBoxShadowOffsetY); + } + /** + * Convert to pure echarts4 format style. + * `itemStyle` will be modified, added with ec4 style properties from + * `textStyle` and `textConfig`. + * + * [Caveat]: For simplicity, `insideRollback` in ec4 does not compat, where + * `styleEmphasis: {textFill: 'red'}` will remove the normal auto added stroke. + */ + + + function convertToEC4StyleForCustomSerise(itemStl, txStl, txCfg) { + var out = itemStl; // See `custom.ts`, a trick to set extra `textPosition` firstly. + + out.textPosition = out.textPosition || txCfg.position || 'inside'; + txCfg.offset != null && (out.textOffset = txCfg.offset); + txCfg.rotation != null && (out.textRotation = txCfg.rotation); + txCfg.distance != null && (out.textDistance = txCfg.distance); + var isInside = out.textPosition.indexOf('inside') >= 0; + var hostFill = itemStl.fill || '#000'; + convertToEC4RichItem(out, txStl); + var textFillNotSet = out.textFill == null; + + if (isInside) { + if (textFillNotSet) { + out.textFill = txCfg.insideFill || '#fff'; + !out.textStroke && txCfg.insideStroke && (out.textStroke = txCfg.insideStroke); + !out.textStroke && (out.textStroke = hostFill); + out.textStrokeWidth == null && (out.textStrokeWidth = 2); + } + } else { + if (textFillNotSet) { + out.textFill = itemStl.fill || txCfg.outsideFill || '#000'; + } + + !out.textStroke && txCfg.outsideStroke && (out.textStroke = txCfg.outsideStroke); + } + + out.text = txStl.text; + out.rich = txStl.rich; + each(txStl.rich, function (richItem) { + convertToEC4RichItem(richItem, richItem); + }); + return out; + } + + function convertToEC4RichItem(out, richItem) { + if (!richItem) { + return; + } + + hasOwn(richItem, 'fill') && (out.textFill = richItem.fill); + hasOwn(richItem, 'stroke') && (out.textStroke = richItem.fill); + hasOwn(richItem, 'lineWidth') && (out.textStrokeWidth = richItem.lineWidth); + hasOwn(richItem, 'font') && (out.font = richItem.font); + hasOwn(richItem, 'fontStyle') && (out.fontStyle = richItem.fontStyle); + hasOwn(richItem, 'fontWeight') && (out.fontWeight = richItem.fontWeight); + hasOwn(richItem, 'fontSize') && (out.fontSize = richItem.fontSize); + hasOwn(richItem, 'fontFamily') && (out.fontFamily = richItem.fontFamily); + hasOwn(richItem, 'align') && (out.textAlign = richItem.align); + hasOwn(richItem, 'verticalAlign') && (out.textVerticalAlign = richItem.verticalAlign); + hasOwn(richItem, 'lineHeight') && (out.textLineHeight = richItem.lineHeight); + hasOwn(richItem, 'width') && (out.textWidth = richItem.width); + hasOwn(richItem, 'height') && (out.textHeight = richItem.height); + hasOwn(richItem, 'backgroundColor') && (out.textBackgroundColor = richItem.backgroundColor); + hasOwn(richItem, 'padding') && (out.textPadding = richItem.padding); + hasOwn(richItem, 'borderColor') && (out.textBorderColor = richItem.borderColor); + hasOwn(richItem, 'borderWidth') && (out.textBorderWidth = richItem.borderWidth); + hasOwn(richItem, 'borderRadius') && (out.textBorderRadius = richItem.borderRadius); + hasOwn(richItem, 'shadowColor') && (out.textBoxShadowColor = richItem.shadowColor); + hasOwn(richItem, 'shadowBlur') && (out.textBoxShadowBlur = richItem.shadowBlur); + hasOwn(richItem, 'shadowOffsetX') && (out.textBoxShadowOffsetX = richItem.shadowOffsetX); + hasOwn(richItem, 'shadowOffsetY') && (out.textBoxShadowOffsetY = richItem.shadowOffsetY); + hasOwn(richItem, 'textShadowColor') && (out.textShadowColor = richItem.textShadowColor); + hasOwn(richItem, 'textShadowBlur') && (out.textShadowBlur = richItem.textShadowBlur); + hasOwn(richItem, 'textShadowOffsetX') && (out.textShadowOffsetX = richItem.textShadowOffsetX); + hasOwn(richItem, 'textShadowOffsetY') && (out.textShadowOffsetY = richItem.textShadowOffsetY); + } + + function warnDeprecated(deprecated, insteadApproach) { + if ("development" !== 'production') { + var key = deprecated + '^_^' + insteadApproach; + + if (!deprecatedLogs[key]) { + console.warn("[ECharts] DEPRECATED: \"" + deprecated + "\" has been deprecated. " + insteadApproach); + deprecatedLogs[key] = true; + } + } + } + + var LEGACY_TRANSFORM_PROPS_MAP = { + position: ['x', 'y'], + scale: ['scaleX', 'scaleY'], + origin: ['originX', 'originY'] + }; + var LEGACY_TRANSFORM_PROPS = keys(LEGACY_TRANSFORM_PROPS_MAP); + var TRANSFORM_PROPS_MAP = reduce(TRANSFORMABLE_PROPS, function (obj, key) { + obj[key] = 1; + return obj; + }, {}); + var transformPropNamesStr = TRANSFORMABLE_PROPS.join(', '); // '' means root + + var ELEMENT_ANIMATABLE_PROPS = ['', 'style', 'shape', 'extra']; + var transitionInnerStore = makeInner(); + + function getElementAnimationConfig(animationType, el, elOption, parentModel, dataIndex) { + var animationProp = animationType + "Animation"; + var config = getAnimationConfig(animationType, parentModel, dataIndex) || {}; + var userDuring = transitionInnerStore(el).userDuring; // Only set when duration is > 0 and it's need to be animated. + + if (config.duration > 0) { + // For simplicity, if during not specified, the previous during will not work any more. + config.during = userDuring ? bind(duringCall, { + el: el, + userDuring: userDuring + }) : null; + config.setToFinal = true; + config.scope = animationType; + } + + extend(config, elOption[animationProp]); + return config; + } + + function applyUpdateTransition(el, elOption, animatableModel, opts) { + opts = opts || {}; + var dataIndex = opts.dataIndex, + isInit = opts.isInit, + clearStyle = opts.clearStyle; + var hasAnimation = animatableModel.isAnimationEnabled(); // Save the meta info for further morphing. Like apply on the sub morphing elements. + + var store = transitionInnerStore(el); + var styleOpt = elOption.style; + store.userDuring = elOption.during; + var transFromProps = {}; + var propsToSet = {}; + prepareTransformAllPropsFinal(el, elOption, propsToSet); + prepareShapeOrExtraAllPropsFinal('shape', elOption, propsToSet); + prepareShapeOrExtraAllPropsFinal('extra', elOption, propsToSet); + + if (!isInit && hasAnimation) { + prepareTransformTransitionFrom(el, elOption, transFromProps); + prepareShapeOrExtraTransitionFrom('shape', el, elOption, transFromProps); + prepareShapeOrExtraTransitionFrom('extra', el, elOption, transFromProps); + prepareStyleTransitionFrom(el, elOption, styleOpt, transFromProps); + } + + propsToSet.style = styleOpt; + applyPropsDirectly(el, propsToSet, clearStyle); + applyMiscProps(el, elOption); + + if (hasAnimation) { + if (isInit) { + var enterFromProps_1 = {}; + each(ELEMENT_ANIMATABLE_PROPS, function (propName) { + var prop = propName ? elOption[propName] : elOption; + + if (prop && prop.enterFrom) { + if (propName) { + enterFromProps_1[propName] = enterFromProps_1[propName] || {}; + } + + extend(propName ? enterFromProps_1[propName] : enterFromProps_1, prop.enterFrom); + } + }); + var config = getElementAnimationConfig('enter', el, elOption, animatableModel, dataIndex); + + if (config.duration > 0) { + el.animateFrom(enterFromProps_1, config); + } + } else { + applyPropsTransition(el, elOption, dataIndex || 0, animatableModel, transFromProps); + } + } // Store leave to be used in leave transition. + + + updateLeaveTo(el, elOption); + styleOpt ? el.dirty() : el.markRedraw(); + } + function updateLeaveTo(el, elOption) { + // Try merge to previous set leaveTo + var leaveToProps = transitionInnerStore(el).leaveToProps; + + for (var i = 0; i < ELEMENT_ANIMATABLE_PROPS.length; i++) { + var propName = ELEMENT_ANIMATABLE_PROPS[i]; + var prop = propName ? elOption[propName] : elOption; + + if (prop && prop.leaveTo) { + if (!leaveToProps) { + leaveToProps = transitionInnerStore(el).leaveToProps = {}; + } + + if (propName) { + leaveToProps[propName] = leaveToProps[propName] || {}; + } + + extend(propName ? leaveToProps[propName] : leaveToProps, prop.leaveTo); + } + } + } + function applyLeaveTransition(el, elOption, animatableModel, onRemove) { + if (el) { + var parent_1 = el.parent; + var leaveToProps = transitionInnerStore(el).leaveToProps; + + if (leaveToProps) { + // TODO TODO use leave after leaveAnimation in series is introduced + // TODO Data index? + var config = getElementAnimationConfig('update', el, elOption, animatableModel, 0); + + config.done = function () { + parent_1.remove(el); + onRemove && onRemove(); + }; + + el.animateTo(leaveToProps, config); + } else { + parent_1.remove(el); + onRemove && onRemove(); + } + } + } + function isTransitionAll(transition) { + return transition === 'all'; + } + + function applyPropsDirectly(el, // Can be null/undefined + allPropsFinal, clearStyle) { + var styleOpt = allPropsFinal.style; + + if (!el.isGroup && styleOpt) { + if (clearStyle) { + el.useStyle({}); // When style object changed, how to trade the existing animation? + // It is probably complicated and not needed to cover all the cases. + // But still need consider the case: + // (1) When using init animation on `style.opacity`, and before the animation + // ended users triggers an update by mousewhel. At that time the init + // animation should better be continued rather than terminated. + // So after `useStyle` called, we should change the animation target manually + // to continue the effect of the init animation. + // (2) PENDING: If the previous animation targeted at a `val1`, and currently we need + // to update the value to `val2` and no animation declared, should be terminate + // the previous animation or just modify the target of the animation? + // Therotically That will happen not only on `style` but also on `shape` and + // `transfrom` props. But we haven't handle this case at present yet. + // (3) PENDING: Is it proper to visit `animators` and `targetName`? + + var animators = el.animators; + + for (var i = 0; i < animators.length; i++) { + var animator = animators[i]; // targetName is the "topKey". + + if (animator.targetName === 'style') { + animator.changeTarget(el.style); + } + } + } + + el.setStyle(styleOpt); + } + + if (allPropsFinal) { + // Not set style here. + allPropsFinal.style = null; // Set el to the final state firstly. + + allPropsFinal && el.attr(allPropsFinal); + allPropsFinal.style = styleOpt; + } + } + + function applyPropsTransition(el, elOption, dataIndex, model, // Can be null/undefined + transFromProps) { + if (transFromProps) { + var config = getElementAnimationConfig('update', el, elOption, model, dataIndex); + + if (config.duration > 0) { + el.animateFrom(transFromProps, config); + } + } + } + + function applyMiscProps(el, elOption) { + // Merge by default. + hasOwn(elOption, 'silent') && (el.silent = elOption.silent); + hasOwn(elOption, 'ignore') && (el.ignore = elOption.ignore); + + if (el instanceof Displayable) { + hasOwn(elOption, 'invisible') && (el.invisible = elOption.invisible); + } + + if (el instanceof Path) { + hasOwn(elOption, 'autoBatch') && (el.autoBatch = elOption.autoBatch); + } + } // Use it to avoid it be exposed to user. + + + var tmpDuringScope = {}; + var transitionDuringAPI = { + // Usually other props do not need to be changed in animation during. + setTransform: function (key, val) { + if ("development" !== 'production') { + assert(hasOwn(TRANSFORM_PROPS_MAP, key), 'Only ' + transformPropNamesStr + ' available in `setTransform`.'); + } + + tmpDuringScope.el[key] = val; + return this; + }, + getTransform: function (key) { + if ("development" !== 'production') { + assert(hasOwn(TRANSFORM_PROPS_MAP, key), 'Only ' + transformPropNamesStr + ' available in `getTransform`.'); + } + + return tmpDuringScope.el[key]; + }, + setShape: function (key, val) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var el = tmpDuringScope.el; + var shape = el.shape || (el.shape = {}); + shape[key] = val; + el.dirtyShape && el.dirtyShape(); + return this; + }, + getShape: function (key) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var shape = tmpDuringScope.el.shape; + + if (shape) { + return shape[key]; + } + }, + setStyle: function (key, val) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var el = tmpDuringScope.el; + var style = el.style; + + if (style) { + if ("development" !== 'production') { + if (eqNaN(val)) { + warn('style.' + key + ' must not be assigned with NaN.'); + } + } + + style[key] = val; + el.dirtyStyle && el.dirtyStyle(); + } + + return this; + }, + getStyle: function (key) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var style = tmpDuringScope.el.style; + + if (style) { + return style[key]; + } + }, + setExtra: function (key, val) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var extra = tmpDuringScope.el.extra || (tmpDuringScope.el.extra = {}); + extra[key] = val; + return this; + }, + getExtra: function (key) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var extra = tmpDuringScope.el.extra; + + if (extra) { + return extra[key]; + } + } + }; + + function assertNotReserved(key) { + if ("development" !== 'production') { + if (key === 'transition' || key === 'enterFrom' || key === 'leaveTo') { + throw new Error('key must not be "' + key + '"'); + } + } + } + + function duringCall() { + // Do not provide "percent" until some requirements come. + // Because consider thies case: + // enterFrom: {x: 100, y: 30}, transition: 'x'. + // And enter duration is different from update duration. + // Thus it might be confused about the meaning of "percent" in during callback. + var scope = this; + var el = scope.el; + + if (!el) { + return; + } // If el is remove from zr by reason like legend, during still need to called, + // becuase el will be added back to zr and the prop value should not be incorrect. + + + var latestUserDuring = transitionInnerStore(el).userDuring; + var scopeUserDuring = scope.userDuring; // Ensured a during is only called once in each animation frame. + // If a during is called multiple times in one frame, maybe some users' calulation logic + // might be wrong (not sure whether this usage exists). + // The case of a during might be called twice can be: by default there is a animator for + // 'x', 'y' when init. Before the init animation finished, call `setOption` to start + // another animators for 'style'/'shape'/'extra'. + + if (latestUserDuring !== scopeUserDuring) { + // release + scope.el = scope.userDuring = null; + return; + } + + tmpDuringScope.el = el; // Give no `this` to user in "during" calling. + + scopeUserDuring(transitionDuringAPI); // FIXME: if in future meet the case that some prop will be both modified in `during` and `state`, + // consider the issue that the prop might be incorrect when return to "normal" state. + } + + function prepareShapeOrExtraTransitionFrom(mainAttr, fromEl, elOption, transFromProps) { + var attrOpt = elOption[mainAttr]; + + if (!attrOpt) { + return; + } + + var elPropsInAttr = fromEl[mainAttr]; + var transFromPropsInAttr; + + if (elPropsInAttr) { + var transition = elOption.transition; + var attrTransition = attrOpt.transition; + + if (attrTransition) { + !transFromPropsInAttr && (transFromPropsInAttr = transFromProps[mainAttr] = {}); + + if (isTransitionAll(attrTransition)) { + extend(transFromPropsInAttr, elPropsInAttr); + } else { + var transitionKeys = normalizeToArray(attrTransition); + + for (var i = 0; i < transitionKeys.length; i++) { + var key = transitionKeys[i]; + var elVal = elPropsInAttr[key]; + transFromPropsInAttr[key] = elVal; + } + } + } else if (isTransitionAll(transition) || indexOf(transition, mainAttr) >= 0) { + !transFromPropsInAttr && (transFromPropsInAttr = transFromProps[mainAttr] = {}); + var elPropsInAttrKeys = keys(elPropsInAttr); + + for (var i = 0; i < elPropsInAttrKeys.length; i++) { + var key = elPropsInAttrKeys[i]; + var elVal = elPropsInAttr[key]; + + if (isNonStyleTransitionEnabled(attrOpt[key], elVal)) { + transFromPropsInAttr[key] = elVal; + } + } + } + } + } + + function prepareShapeOrExtraAllPropsFinal(mainAttr, elOption, allProps) { + var attrOpt = elOption[mainAttr]; + + if (!attrOpt) { + return; + } + + var allPropsInAttr = allProps[mainAttr] = {}; + var keysInAttr = keys(attrOpt); + + for (var i = 0; i < keysInAttr.length; i++) { + var key = keysInAttr[i]; // To avoid share one object with different element, and + // to avoid user modify the object inexpectedly, have to clone. + + allPropsInAttr[key] = cloneValue(attrOpt[key]); + } + } + + function prepareTransformTransitionFrom(el, elOption, transFromProps) { + var transition = elOption.transition; + var transitionKeys = isTransitionAll(transition) ? TRANSFORMABLE_PROPS : normalizeToArray(transition || []); + + for (var i = 0; i < transitionKeys.length; i++) { + var key = transitionKeys[i]; + + if (key === 'style' || key === 'shape' || key === 'extra') { + continue; + } + + var elVal = el[key]; + + if ("development" !== 'production') { + checkTransformPropRefer(key, 'el.transition'); + } // Do not clone, animator will perform that clone. + + + transFromProps[key] = elVal; + } + } + + function prepareTransformAllPropsFinal(el, elOption, allProps) { + for (var i = 0; i < LEGACY_TRANSFORM_PROPS.length; i++) { + var legacyName = LEGACY_TRANSFORM_PROPS[i]; + var xyName = LEGACY_TRANSFORM_PROPS_MAP[legacyName]; + var legacyArr = elOption[legacyName]; + + if (legacyArr) { + allProps[xyName[0]] = legacyArr[0]; + allProps[xyName[1]] = legacyArr[1]; + } + } + + for (var i = 0; i < TRANSFORMABLE_PROPS.length; i++) { + var key = TRANSFORMABLE_PROPS[i]; + + if (elOption[key] != null) { + allProps[key] = elOption[key]; + } + } + } + + function prepareStyleTransitionFrom(fromEl, elOption, styleOpt, transFromProps) { + if (!styleOpt) { + return; + } + + var fromElStyle = fromEl.style; + var transFromStyleProps; + + if (fromElStyle) { + var styleTransition = styleOpt.transition; + var elTransition = elOption.transition; + + if (styleTransition && !isTransitionAll(styleTransition)) { + var transitionKeys = normalizeToArray(styleTransition); + !transFromStyleProps && (transFromStyleProps = transFromProps.style = {}); + + for (var i = 0; i < transitionKeys.length; i++) { + var key = transitionKeys[i]; + var elVal = fromElStyle[key]; // Do not clone, see `checkNonStyleTansitionRefer`. + + transFromStyleProps[key] = elVal; + } + } else if (fromEl.getAnimationStyleProps && (isTransitionAll(elTransition) || isTransitionAll(styleTransition) || indexOf(elTransition, 'style') >= 0)) { + var animationProps = fromEl.getAnimationStyleProps(); + var animationStyleProps = animationProps ? animationProps.style : null; + + if (animationStyleProps) { + !transFromStyleProps && (transFromStyleProps = transFromProps.style = {}); + var styleKeys = keys(styleOpt); + + for (var i = 0; i < styleKeys.length; i++) { + var key = styleKeys[i]; + + if (animationStyleProps[key]) { + var elVal = fromElStyle[key]; + transFromStyleProps[key] = elVal; + } + } + } + } + } + } + + function isNonStyleTransitionEnabled(optVal, elVal) { + // The same as `checkNonStyleTansitionRefer`. + return !isArrayLike(optVal) ? optVal != null && isFinite(optVal) : optVal !== elVal; + } + + var checkTransformPropRefer; + + if ("development" !== 'production') { + checkTransformPropRefer = function (key, usedIn) { + if (!hasOwn(TRANSFORM_PROPS_MAP, key)) { + warn('Prop `' + key + '` is not a permitted in `' + usedIn + '`. ' + 'Only `' + keys(TRANSFORM_PROPS_MAP).join('`, `') + '` are permitted.'); + } + }; + } + + var getStateToRestore = makeInner(); + var KEYFRAME_EXCLUDE_KEYS = ['percent', 'easing', 'shape', 'style', 'extra']; + /** + * Stop previous keyframe animation and restore the attributes. + * Avoid new keyframe animation starts with wrong internal state when the percent: 0 is not set. + */ + + function stopPreviousKeyframeAnimationAndRestore(el) { + // Stop previous keyframe animation. + el.stopAnimation('keyframe'); // Restore + + el.attr(getStateToRestore(el)); + } + function applyKeyframeAnimation(el, animationOpts, animatableModel) { + if (!animatableModel.isAnimationEnabled() || !animationOpts) { + return; + } + + if (isArray(animationOpts)) { + each(animationOpts, function (singleAnimationOpts) { + applyKeyframeAnimation(el, singleAnimationOpts, animatableModel); + }); + return; + } + + var keyframes = animationOpts.keyframes; + var duration = animationOpts.duration; + + if (animatableModel && duration == null) { + // Default to use duration of config. + // NOTE: animation config from payload will be ignored because they are mainly for transitions. + var config = getAnimationConfig('enter', animatableModel, 0); + duration = config && config.duration; + } + + if (!keyframes || !duration) { + return; + } + + var stateToRestore = getStateToRestore(el); + each(ELEMENT_ANIMATABLE_PROPS, function (targetPropName) { + if (targetPropName && !el[targetPropName]) { + return; + } + + var animator; + var endFrameIsSet = false; // Sort keyframes by percent. + + keyframes.sort(function (a, b) { + return a.percent - b.percent; + }); + each(keyframes, function (kf) { + // Stop current animation. + var animators = el.animators; + var kfValues = targetPropName ? kf[targetPropName] : kf; + + if ("development" !== 'production') { + if (kf.percent >= 1) { + endFrameIsSet = true; + } + } + + if (!kfValues) { + return; + } + + var propKeys = keys(kfValues); + + if (!targetPropName) { + // PENDING performance? + propKeys = filter(propKeys, function (key) { + return indexOf(KEYFRAME_EXCLUDE_KEYS, key) < 0; + }); + } + + if (!propKeys.length) { + return; + } + + if (!animator) { + animator = el.animate(targetPropName, animationOpts.loop, true); + animator.scope = 'keyframe'; + } + + for (var i = 0; i < animators.length; i++) { + // Stop all other animation that is not keyframe. + if (animators[i] !== animator && animators[i].targetName === animator.targetName) { + animators[i].stopTracks(propKeys); + } + } + + targetPropName && (stateToRestore[targetPropName] = stateToRestore[targetPropName] || {}); + var savedTarget = targetPropName ? stateToRestore[targetPropName] : stateToRestore; + each(propKeys, function (key) { + // Save original value. + savedTarget[key] = ((targetPropName ? el[targetPropName] : el) || {})[key]; + }); + animator.whenWithKeys(duration * kf.percent, kfValues, propKeys, kf.easing); + }); + + if (!animator) { + return; + } + + if ("development" !== 'production') { + if (!endFrameIsSet) { + warn('End frame with percent: 1 is missing in the keyframeAnimation.', true); + } + } + + animator.delay(animationOpts.delay || 0).duration(duration).start(animationOpts.easing); + }); + } + + var EMPHASIS = 'emphasis'; + var NORMAL = 'normal'; + var BLUR = 'blur'; + var SELECT = 'select'; + var STATES = [NORMAL, EMPHASIS, BLUR, SELECT]; + var PATH_ITEM_STYLE = { + normal: ['itemStyle'], + emphasis: [EMPHASIS, 'itemStyle'], + blur: [BLUR, 'itemStyle'], + select: [SELECT, 'itemStyle'] + }; + var PATH_LABEL = { + normal: ['label'], + emphasis: [EMPHASIS, 'label'], + blur: [BLUR, 'label'], + select: [SELECT, 'label'] + }; + var DEFAULT_TRANSITION = ['x', 'y']; // Use prefix to avoid index to be the same as el.name, + // which will cause weird update animation. + + var GROUP_DIFF_PREFIX = 'e\0\0'; + var attachedTxInfoTmp = { + normal: {}, + emphasis: {}, + blur: {}, + select: {} + }; + /** + * To reduce total package size of each coordinate systems, the modules `prepareCustom` + * of each coordinate systems are not required by each coordinate systems directly, but + * required by the module `custom`. + * + * prepareInfoForCustomSeries {Function}: optional + * @return {Object} {coordSys: {...}, api: { + * coord: function (data, clamp) {}, // return point in global. + * size: function (dataSize, dataItem) {} // return size of each axis in coordSys. + * }} + */ + + var prepareCustoms = { + cartesian2d: cartesianPrepareCustom, + geo: geoPrepareCustom, + single: singlePrepareCustom, + polar: polarPrepareCustom, + calendar: calendarPrepareCustom + }; + + function isPath$1(el) { + return el instanceof Path; + } + + function isDisplayable(el) { + return el instanceof Displayable; + } + + function copyElement(sourceEl, targetEl) { + targetEl.copyTransform(sourceEl); + + if (isDisplayable(targetEl) && isDisplayable(sourceEl)) { + targetEl.setStyle(sourceEl.style); + targetEl.z = sourceEl.z; + targetEl.z2 = sourceEl.z2; + targetEl.zlevel = sourceEl.zlevel; + targetEl.invisible = sourceEl.invisible; + targetEl.ignore = sourceEl.ignore; + + if (isPath$1(targetEl) && isPath$1(sourceEl)) { + targetEl.setShape(sourceEl.shape); + } + } + } + + var CustomChartView = + /** @class */ + function (_super) { + __extends(CustomChartView, _super); + + function CustomChartView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CustomChartView.type; + return _this; + } + + CustomChartView.prototype.render = function (customSeries, ecModel, api, payload) { + // Clear previously rendered progressive elements. + this._progressiveEls = null; + var oldData = this._data; + var data = customSeries.getData(); + var group = this.group; + var renderItem = makeRenderItem(customSeries, data, ecModel, api); + + if (!oldData) { + // Previous render is incremental render or first render. + // Needs remove the incremental rendered elements. + group.removeAll(); + } + + data.diff(oldData).add(function (newIdx) { + createOrUpdateItem(api, null, newIdx, renderItem(newIdx, payload), customSeries, group, data); + }).remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + applyLeaveTransition(el, customInnerStore(el).option, customSeries); + }).update(function (newIdx, oldIdx) { + var oldEl = oldData.getItemGraphicEl(oldIdx); + createOrUpdateItem(api, oldEl, newIdx, renderItem(newIdx, payload), customSeries, group, data); + }).execute(); // Do clipping + + var clipPath = customSeries.get('clip', true) ? createClipPath(customSeries.coordinateSystem, false, customSeries) : null; + + if (clipPath) { + group.setClipPath(clipPath); + } else { + group.removeClipPath(); + } + + this._data = data; + }; + + CustomChartView.prototype.incrementalPrepareRender = function (customSeries, ecModel, api) { + this.group.removeAll(); + this._data = null; + }; + + CustomChartView.prototype.incrementalRender = function (params, customSeries, ecModel, api, payload) { + var data = customSeries.getData(); + var renderItem = makeRenderItem(customSeries, data, ecModel, api); + var progressiveEls = this._progressiveEls = []; + + function setIncrementalAndHoverLayer(el) { + if (!el.isGroup) { + el.incremental = true; + el.ensureState('emphasis').hoverLayer = true; + } + } + + for (var idx = params.start; idx < params.end; idx++) { + var el = createOrUpdateItem(null, null, idx, renderItem(idx, payload), customSeries, this.group, data); + + if (el) { + el.traverse(setIncrementalAndHoverLayer); + progressiveEls.push(el); + } + } + }; + + CustomChartView.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + CustomChartView.prototype.filterForExposedEvent = function (eventType, query, targetEl, packedEvent) { + var elementName = query.element; + + if (elementName == null || targetEl.name === elementName) { + return true; + } // Enable to give a name on a group made by `renderItem`, and listen + // events that triggerd by its descendents. + + + while ((targetEl = targetEl.__hostTarget || targetEl.parent) && targetEl !== this.group) { + if (targetEl.name === elementName) { + return true; + } + } + + return false; + }; + + CustomChartView.type = 'custom'; + return CustomChartView; + }(ChartView); + + function createEl(elOption) { + var graphicType = elOption.type; + var el; // Those graphic elements are not shapes. They should not be + // overwritten by users, so do them first. + + if (graphicType === 'path') { + var shape = elOption.shape; // Using pathRect brings convenience to users sacle svg path. + + var pathRect = shape.width != null && shape.height != null ? { + x: shape.x || 0, + y: shape.y || 0, + width: shape.width, + height: shape.height + } : null; + var pathData = getPathData(shape); // Path is also used for icon, so layout 'center' by default. + + el = makePath(pathData, null, pathRect, shape.layout || 'center'); + customInnerStore(el).customPathData = pathData; + } else if (graphicType === 'image') { + el = new ZRImage({}); + customInnerStore(el).customImagePath = elOption.style.image; + } else if (graphicType === 'text') { + el = new ZRText({}); // customInnerStore(el).customText = (elOption.style as TextStyleProps).text; + } else if (graphicType === 'group') { + el = new Group(); + } else if (graphicType === 'compoundPath') { + throw new Error('"compoundPath" is not supported yet.'); + } else { + var Clz = getShapeClass(graphicType); + + if (!Clz) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = 'graphic type "' + graphicType + '" can not be found.'; + } + + throwError(errMsg); + } + + el = new Clz(); + } + + customInnerStore(el).customGraphicType = graphicType; + el.name = elOption.name; // Compat ec4: the default z2 lift is 1. If changing the number, + // some cases probably be broken: hierarchy layout along z, like circle packing, + // where emphasis only intending to modify color/border rather than lift z2. + + el.z2EmphasisLift = 1; + el.z2SelectLift = 1; + return el; + } + + function updateElNormal( // Can be null/undefined + api, el, dataIndex, elOption, attachedTxInfo, seriesModel, isInit) { + // Stop and restore before update any other attributes. + stopPreviousKeyframeAnimationAndRestore(el); + var txCfgOpt = attachedTxInfo && attachedTxInfo.normal.cfg; + + if (txCfgOpt) { + // PENDING: whether use user object directly rather than clone? + // TODO:5.0 textConfig transition animation? + el.setTextConfig(txCfgOpt); + } // Default transition ['x', 'y'] + + + if (elOption && elOption.transition == null) { + elOption.transition = DEFAULT_TRANSITION; + } // Do some normalization on style. + + + var styleOpt = elOption && elOption.style; + + if (styleOpt) { + if (el.type === 'text') { + var textOptionStyle = styleOpt; // Compatible with ec4: if `textFill` or `textStroke` exists use them. + + hasOwn(textOptionStyle, 'textFill') && (textOptionStyle.fill = textOptionStyle.textFill); + hasOwn(textOptionStyle, 'textStroke') && (textOptionStyle.stroke = textOptionStyle.textStroke); + } + + var decalPattern = void 0; + var decalObj = isPath$1(el) ? styleOpt.decal : null; + + if (api && decalObj) { + decalObj.dirty = true; + decalPattern = createOrUpdatePatternFromDecal(decalObj, api); + } // Always overwrite in case user specify this prop. + + + styleOpt.__decalPattern = decalPattern; + } + + if (isDisplayable(el)) { + if (styleOpt) { + var decalPattern = styleOpt.__decalPattern; + + if (decalPattern) { + styleOpt.decal = decalPattern; + } + } + } + + applyUpdateTransition(el, elOption, seriesModel, { + dataIndex: dataIndex, + isInit: isInit, + clearStyle: true + }); + applyKeyframeAnimation(el, elOption.keyframeAnimation, seriesModel); + } + + function updateElOnState(state, el, elStateOpt, styleOpt, attachedTxInfo) { + var elDisplayable = el.isGroup ? null : el; + var txCfgOpt = attachedTxInfo && attachedTxInfo[state].cfg; // PENDING:5.0 support customize scale change and transition animation? + + if (elDisplayable) { + // By default support auto lift color when hover whether `emphasis` specified. + var stateObj = elDisplayable.ensureState(state); + + if (styleOpt === false) { + var existingEmphasisState = elDisplayable.getState(state); + + if (existingEmphasisState) { + existingEmphasisState.style = null; + } + } else { + // style is needed to enable defaut emphasis. + stateObj.style = styleOpt || null; + } // If `elOption.styleEmphasis` or `elOption.emphasis.style` is `false`, + // remove hover style. + // If `elOption.textConfig` or `elOption.emphasis.textConfig` is null/undefined, it does not + // make sense. So for simplicity, we do not ditinguish `hasOwnProperty` and null/undefined. + + + if (txCfgOpt) { + stateObj.textConfig = txCfgOpt; + } + + setDefaultStateProxy(elDisplayable); + } + } + + function updateZ$1(el, elOption, seriesModel) { + // Group not support textContent and not support z yet. + if (el.isGroup) { + return; + } + + var elDisplayable = el; + var currentZ = seriesModel.currentZ; + var currentZLevel = seriesModel.currentZLevel; // Always erase. + + elDisplayable.z = currentZ; + elDisplayable.zlevel = currentZLevel; // z2 must not be null/undefined, otherwise sort error may occur. + + var optZ2 = elOption.z2; + optZ2 != null && (elDisplayable.z2 = optZ2 || 0); + + for (var i = 0; i < STATES.length; i++) { + updateZForEachState(elDisplayable, elOption, STATES[i]); + } + } + + function updateZForEachState(elDisplayable, elOption, state) { + var isNormal = state === NORMAL; + var elStateOpt = isNormal ? elOption : retrieveStateOption(elOption, state); + var optZ2 = elStateOpt ? elStateOpt.z2 : null; + var stateObj; + + if (optZ2 != null) { + // Do not `ensureState` until required. + stateObj = isNormal ? elDisplayable : elDisplayable.ensureState(state); + stateObj.z2 = optZ2 || 0; + } + } + + function makeRenderItem(customSeries, data, ecModel, api) { + var renderItem = customSeries.get('renderItem'); + var coordSys = customSeries.coordinateSystem; + var prepareResult = {}; + + if (coordSys) { + if ("development" !== 'production') { + assert(renderItem, 'series.render is required.'); + assert(coordSys.prepareCustoms || prepareCustoms[coordSys.type], 'This coordSys does not support custom series.'); + } // `coordSys.prepareCustoms` is used for external coord sys like bmap. + + + prepareResult = coordSys.prepareCustoms ? coordSys.prepareCustoms(coordSys) : prepareCustoms[coordSys.type](coordSys); + } + + var userAPI = defaults({ + getWidth: api.getWidth, + getHeight: api.getHeight, + getZr: api.getZr, + getDevicePixelRatio: api.getDevicePixelRatio, + value: value, + style: style, + ordinalRawValue: ordinalRawValue, + styleEmphasis: styleEmphasis, + visual: visual, + barLayout: barLayout, + currentSeriesIndices: currentSeriesIndices, + font: font + }, prepareResult.api || {}); + var userParams = { + // The life cycle of context: current round of rendering. + // The global life cycle is probably not necessary, because + // user can store global status by themselves. + context: {}, + seriesId: customSeries.id, + seriesName: customSeries.name, + seriesIndex: customSeries.seriesIndex, + coordSys: prepareResult.coordSys, + dataInsideLength: data.count(), + encode: wrapEncodeDef(customSeries.getData()) + }; // If someday intending to refactor them to a class, should consider do not + // break change: currently these attribute member are encapsulated in a closure + // so that do not need to force user to call these method with a scope. + // Do not support call `api` asynchronously without dataIndexInside input. + + var currDataIndexInside; + var currItemModel; + var currItemStyleModels = {}; + var currLabelModels = {}; + var seriesItemStyleModels = {}; + var seriesLabelModels = {}; + + for (var i = 0; i < STATES.length; i++) { + var stateName = STATES[i]; + seriesItemStyleModels[stateName] = customSeries.getModel(PATH_ITEM_STYLE[stateName]); + seriesLabelModels[stateName] = customSeries.getModel(PATH_LABEL[stateName]); + } + + function getItemModel(dataIndexInside) { + return dataIndexInside === currDataIndexInside ? currItemModel || (currItemModel = data.getItemModel(dataIndexInside)) : data.getItemModel(dataIndexInside); + } + + function getItemStyleModel(dataIndexInside, state) { + return !data.hasItemOption ? seriesItemStyleModels[state] : dataIndexInside === currDataIndexInside ? currItemStyleModels[state] || (currItemStyleModels[state] = getItemModel(dataIndexInside).getModel(PATH_ITEM_STYLE[state])) : getItemModel(dataIndexInside).getModel(PATH_ITEM_STYLE[state]); + } + + function getLabelModel(dataIndexInside, state) { + return !data.hasItemOption ? seriesLabelModels[state] : dataIndexInside === currDataIndexInside ? currLabelModels[state] || (currLabelModels[state] = getItemModel(dataIndexInside).getModel(PATH_LABEL[state])) : getItemModel(dataIndexInside).getModel(PATH_LABEL[state]); + } + + return function (dataIndexInside, payload) { + currDataIndexInside = dataIndexInside; + currItemModel = null; + currItemStyleModels = {}; + currLabelModels = {}; + return renderItem && renderItem(defaults({ + dataIndexInside: dataIndexInside, + dataIndex: data.getRawIndex(dataIndexInside), + // Can be used for optimization when zoom or roam. + actionType: payload ? payload.type : null + }, userParams), userAPI); + }; + /** + * @public + * @param dim by default 0. + * @param dataIndexInside by default `currDataIndexInside`. + */ + + function value(dim, dataIndexInside) { + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + return data.getStore().get(data.getDimensionIndex(dim || 0), dataIndexInside); + } + /** + * @public + * @param dim by default 0. + * @param dataIndexInside by default `currDataIndexInside`. + */ + + + function ordinalRawValue(dim, dataIndexInside) { + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + dim = dim || 0; + var dimInfo = data.getDimensionInfo(dim); + + if (!dimInfo) { + var dimIndex = data.getDimensionIndex(dim); + return dimIndex >= 0 ? data.getStore().get(dimIndex, dataIndexInside) : undefined; + } + + var val = data.get(dimInfo.name, dataIndexInside); + var ordinalMeta = dimInfo && dimInfo.ordinalMeta; + return ordinalMeta ? ordinalMeta.categories[val] : val; + } + /** + * @deprecated The orgininal intention of `api.style` is enable to set itemStyle + * like other series. But it not necessary and not easy to give a strict definition + * of what it return. And since echarts5 it needs to be make compat work. So + * deprecates it since echarts5. + * + * By default, `visual` is applied to style (to support visualMap). + * `visual.color` is applied at `fill`. If user want apply visual.color on `stroke`, + * it can be implemented as: + * `api.style({stroke: api.visual('color'), fill: null})`; + * + * [Compat]: since ec5, RectText has been separated from its hosts el. + * so `api.style()` will only return the style from `itemStyle` but not handle `label` + * any more. But `series.label` config is never published in doc. + * We still compat it in `api.style()`. But not encourage to use it and will still not + * to pulish it to doc. + * @public + * @param dataIndexInside by default `currDataIndexInside`. + */ + + + function style(userProps, dataIndexInside) { + if ("development" !== 'production') { + warnDeprecated('api.style', 'Please write literal style directly instead.'); + } + + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + var style = data.getItemVisual(dataIndexInside, 'style'); + var visualColor = style && style.fill; + var opacity = style && style.opacity; + var itemStyle = getItemStyleModel(dataIndexInside, NORMAL).getItemStyle(); + visualColor != null && (itemStyle.fill = visualColor); + opacity != null && (itemStyle.opacity = opacity); + var opt = { + inheritColor: isString(visualColor) ? visualColor : '#000' + }; + var labelModel = getLabelModel(dataIndexInside, NORMAL); // Now that the feture of "auto adjust text fill/stroke" has been migrated to zrender + // since ec5, we should set `isAttached` as `false` here and make compat in + // `convertToEC4StyleForCustomSerise`. + + var textStyle = createTextStyle(labelModel, null, opt, false, true); + textStyle.text = labelModel.getShallow('show') ? retrieve2(customSeries.getFormattedLabel(dataIndexInside, NORMAL), getDefaultLabel(data, dataIndexInside)) : null; + var textConfig = createTextConfig(labelModel, opt, false); + preFetchFromExtra(userProps, itemStyle); + itemStyle = convertToEC4StyleForCustomSerise(itemStyle, textStyle, textConfig); + userProps && applyUserPropsAfter(itemStyle, userProps); + itemStyle.legacy = true; + return itemStyle; + } + /** + * @deprecated The reason see `api.style()` + * @public + * @param dataIndexInside by default `currDataIndexInside`. + */ + + + function styleEmphasis(userProps, dataIndexInside) { + if ("development" !== 'production') { + warnDeprecated('api.styleEmphasis', 'Please write literal style directly instead.'); + } + + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + var itemStyle = getItemStyleModel(dataIndexInside, EMPHASIS).getItemStyle(); + var labelModel = getLabelModel(dataIndexInside, EMPHASIS); + var textStyle = createTextStyle(labelModel, null, null, true, true); + textStyle.text = labelModel.getShallow('show') ? retrieve3(customSeries.getFormattedLabel(dataIndexInside, EMPHASIS), customSeries.getFormattedLabel(dataIndexInside, NORMAL), getDefaultLabel(data, dataIndexInside)) : null; + var textConfig = createTextConfig(labelModel, null, true); + preFetchFromExtra(userProps, itemStyle); + itemStyle = convertToEC4StyleForCustomSerise(itemStyle, textStyle, textConfig); + userProps && applyUserPropsAfter(itemStyle, userProps); + itemStyle.legacy = true; + return itemStyle; + } + + function applyUserPropsAfter(itemStyle, extra) { + for (var key in extra) { + if (hasOwn(extra, key)) { + itemStyle[key] = extra[key]; + } + } + } + + function preFetchFromExtra(extra, itemStyle) { + // A trick to retrieve those props firstly, which are used to + // apply auto inside fill/stroke in `convertToEC4StyleForCustomSerise`. + // (It's not reasonable but only for a degree of compat) + if (extra) { + extra.textFill && (itemStyle.textFill = extra.textFill); + extra.textPosition && (itemStyle.textPosition = extra.textPosition); + } + } + /** + * @public + * @param dataIndexInside by default `currDataIndexInside`. + */ + + + function visual(visualType, dataIndexInside) { + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + + if (hasOwn(STYLE_VISUAL_TYPE, visualType)) { + var style_1 = data.getItemVisual(dataIndexInside, 'style'); + return style_1 ? style_1[STYLE_VISUAL_TYPE[visualType]] : null; + } // Only support these visuals. Other visual might be inner tricky + // for performance (like `style`), do not expose to users. + + + if (hasOwn(NON_STYLE_VISUAL_PROPS, visualType)) { + return data.getItemVisual(dataIndexInside, visualType); + } + } + /** + * @public + * @return If not support, return undefined. + */ + + + function barLayout(opt) { + if (coordSys.type === 'cartesian2d') { + var baseAxis = coordSys.getBaseAxis(); + return getLayoutOnAxis(defaults({ + axis: baseAxis + }, opt)); + } + } + /** + * @public + */ + + + function currentSeriesIndices() { + return ecModel.getCurrentSeriesIndices(); + } + /** + * @public + * @return font string + */ + + + function font(opt) { + return getFont(opt, ecModel); + } + } + + function wrapEncodeDef(data) { + var encodeDef = {}; + each(data.dimensions, function (dimName) { + var dimInfo = data.getDimensionInfo(dimName); + + if (!dimInfo.isExtraCoord) { + var coordDim = dimInfo.coordDim; + var dataDims = encodeDef[coordDim] = encodeDef[coordDim] || []; + dataDims[dimInfo.coordDimIndex] = data.getDimensionIndex(dimName); + } + }); + return encodeDef; + } + + function createOrUpdateItem(api, existsEl, dataIndex, elOption, seriesModel, group, data) { + // [Rule] + // If `renderItem` returns `null`/`undefined`/`false`, remove the previous el if existing. + // (It seems that violate the "merge" principle, but most of users probably intuitively + // regard "return;" as "show nothing element whatever", so make a exception to meet the + // most cases.) + // The rule or "merge" see [STRATEGY_MERGE]. + // If `elOption` is `null`/`undefined`/`false` (when `renderItem` returns nothing). + if (!elOption) { + group.remove(existsEl); + return; + } + + var el = doCreateOrUpdateEl(api, existsEl, dataIndex, elOption, seriesModel, group); + el && data.setItemGraphicEl(dataIndex, el); + el && toggleHoverEmphasis(el, elOption.focus, elOption.blurScope, elOption.emphasisDisabled); + return el; + } + + function doCreateOrUpdateEl(api, existsEl, dataIndex, elOption, seriesModel, group) { + if ("development" !== 'production') { + assert(elOption, 'should not have an null/undefined element setting'); + } + + var toBeReplacedIdx = -1; + var oldEl = existsEl; + + if (existsEl && doesElNeedRecreate(existsEl, elOption, seriesModel) // || ( + // // PENDING: even in one-to-one mapping case, if el is marked as morph, + // // do not sure whether the el will be mapped to another el with different + // // hierarchy in Group tree. So always recreate el rather than reuse the el. + // morphHelper && morphHelper.isOneToOneFrom(el) + // ) + ) { + // Should keep at the original index, otherwise "merge by index" will be incorrect. + toBeReplacedIdx = indexOf(group.childrenRef(), existsEl); + existsEl = null; + } + + var isInit = !existsEl; + var el = existsEl; + + if (!el) { + el = createEl(elOption); + + if (oldEl) { + copyElement(oldEl, el); + } + } else { + // FIMXE:NEXT unified clearState? + // If in some case the performance issue arised, consider + // do not clearState but update cached normal state directly. + el.clearStates(); + } // Need to set morph: false explictly to disable automatically morphing. + + + if (elOption.morph === false) { + el.disableMorphing = true; + } else if (el.disableMorphing) { + el.disableMorphing = false; + } + + attachedTxInfoTmp.normal.cfg = attachedTxInfoTmp.normal.conOpt = attachedTxInfoTmp.emphasis.cfg = attachedTxInfoTmp.emphasis.conOpt = attachedTxInfoTmp.blur.cfg = attachedTxInfoTmp.blur.conOpt = attachedTxInfoTmp.select.cfg = attachedTxInfoTmp.select.conOpt = null; + attachedTxInfoTmp.isLegacy = false; + doCreateOrUpdateAttachedTx(el, dataIndex, elOption, seriesModel, isInit, attachedTxInfoTmp); + doCreateOrUpdateClipPath(el, dataIndex, elOption, seriesModel, isInit); + updateElNormal(api, el, dataIndex, elOption, attachedTxInfoTmp, seriesModel, isInit); // `elOption.info` enables user to mount some info on + // elements and use them in event handlers. + // Update them only when user specified, otherwise, remain. + + hasOwn(elOption, 'info') && (customInnerStore(el).info = elOption.info); + + for (var i = 0; i < STATES.length; i++) { + var stateName = STATES[i]; + + if (stateName !== NORMAL) { + var otherStateOpt = retrieveStateOption(elOption, stateName); + var otherStyleOpt = retrieveStyleOptionOnState(elOption, otherStateOpt, stateName); + updateElOnState(stateName, el, otherStateOpt, otherStyleOpt, attachedTxInfoTmp); + } + } + + updateZ$1(el, elOption, seriesModel); + + if (elOption.type === 'group') { + mergeChildren(api, el, dataIndex, elOption, seriesModel); + } + + if (toBeReplacedIdx >= 0) { + group.replaceAt(el, toBeReplacedIdx); + } else { + group.add(el); + } + + return el; + } // `el` must not be null/undefined. + + + function doesElNeedRecreate(el, elOption, seriesModel) { + var elInner = customInnerStore(el); + var elOptionType = elOption.type; + var elOptionShape = elOption.shape; + var elOptionStyle = elOption.style; + return (// Always create new if universal transition is enabled. + // Because we do transition after render. It needs to know what old element is. Replacement will loose it. + seriesModel.isUniversalTransitionEnabled() // If `elOptionType` is `null`, follow the merge principle. + || elOptionType != null && elOptionType !== elInner.customGraphicType || elOptionType === 'path' && hasOwnPathData(elOptionShape) && getPathData(elOptionShape) !== elInner.customPathData || elOptionType === 'image' && hasOwn(elOptionStyle, 'image') && elOptionStyle.image !== elInner.customImagePath // // FIXME test and remove this restriction? + // || (elOptionType === 'text' + // && hasOwn(elOptionStyle, 'text') + // && (elOptionStyle as TextStyleProps).text !== elInner.customText + // ) + + ); + } + + function doCreateOrUpdateClipPath(el, dataIndex, elOption, seriesModel, isInit) { + // Based on the "merge" principle, if no clipPath provided, + // do nothing. The exists clip will be totally removed only if + // `el.clipPath` is `false`. Otherwise it will be merged/replaced. + var clipPathOpt = elOption.clipPath; + + if (clipPathOpt === false) { + if (el && el.getClipPath()) { + el.removeClipPath(); + } + } else if (clipPathOpt) { + var clipPath = el.getClipPath(); + + if (clipPath && doesElNeedRecreate(clipPath, clipPathOpt, seriesModel)) { + clipPath = null; + } + + if (!clipPath) { + clipPath = createEl(clipPathOpt); + + if ("development" !== 'production') { + assert(isPath$1(clipPath), 'Only any type of `path` can be used in `clipPath`, rather than ' + clipPath.type + '.'); + } + + el.setClipPath(clipPath); + } + + updateElNormal(null, clipPath, dataIndex, clipPathOpt, null, seriesModel, isInit); + } // If not define `clipPath` in option, do nothing unnecessary. + + } + + function doCreateOrUpdateAttachedTx(el, dataIndex, elOption, seriesModel, isInit, attachedTxInfo) { + // group do not support textContent temporarily untill necessary. + if (el.isGroup) { + return; + } // Normal must be called before emphasis, for `isLegacy` detection. + + + processTxInfo(elOption, null, attachedTxInfo); + processTxInfo(elOption, EMPHASIS, attachedTxInfo); // If `elOption.textConfig` or `elOption.textContent` is null/undefined, it does not make sence. + // So for simplicity, if "elOption hasOwnProperty of them but be null/undefined", we do not + // trade them as set to null to el. + // Especially: + // `elOption.textContent: false` means remove textContent. + // `elOption.textContent.emphasis.style: false` means remove the style from emphasis state. + + var txConOptNormal = attachedTxInfo.normal.conOpt; + var txConOptEmphasis = attachedTxInfo.emphasis.conOpt; + var txConOptBlur = attachedTxInfo.blur.conOpt; + var txConOptSelect = attachedTxInfo.select.conOpt; + + if (txConOptNormal != null || txConOptEmphasis != null || txConOptSelect != null || txConOptBlur != null) { + var textContent = el.getTextContent(); + + if (txConOptNormal === false) { + textContent && el.removeTextContent(); + } else { + txConOptNormal = attachedTxInfo.normal.conOpt = txConOptNormal || { + type: 'text' + }; + + if (!textContent) { + textContent = createEl(txConOptNormal); + el.setTextContent(textContent); + } else { + // If in some case the performance issue arised, consider + // do not clearState but update cached normal state directly. + textContent.clearStates(); + } + + updateElNormal(null, textContent, dataIndex, txConOptNormal, null, seriesModel, isInit); + var txConStlOptNormal = txConOptNormal && txConOptNormal.style; + + for (var i = 0; i < STATES.length; i++) { + var stateName = STATES[i]; + + if (stateName !== NORMAL) { + var txConOptOtherState = attachedTxInfo[stateName].conOpt; + updateElOnState(stateName, textContent, txConOptOtherState, retrieveStyleOptionOnState(txConOptNormal, txConOptOtherState, stateName), null); + } + } + + txConStlOptNormal ? textContent.dirty() : textContent.markRedraw(); + } + } + } + + function processTxInfo(elOption, state, attachedTxInfo) { + var stateOpt = !state ? elOption : retrieveStateOption(elOption, state); + var styleOpt = !state ? elOption.style : retrieveStyleOptionOnState(elOption, stateOpt, EMPHASIS); + var elType = elOption.type; + var txCfg = stateOpt ? stateOpt.textConfig : null; + var txConOptNormal = elOption.textContent; + var txConOpt = !txConOptNormal ? null : !state ? txConOptNormal : retrieveStateOption(txConOptNormal, state); + + if (styleOpt && ( // Because emphasis style has little info to detect legacy, + // if normal is legacy, emphasis is trade as legacy. + attachedTxInfo.isLegacy || isEC4CompatibleStyle(styleOpt, elType, !!txCfg, !!txConOpt))) { + attachedTxInfo.isLegacy = true; + var convertResult = convertFromEC4CompatibleStyle(styleOpt, elType, !state); // Explicitly specified `textConfig` and `textContent` has higher priority than + // the ones generated by legacy style. Otherwise if users use them and `api.style` + // at the same time, they not both work and hardly to known why. + + if (!txCfg && convertResult.textConfig) { + txCfg = convertResult.textConfig; + } + + if (!txConOpt && convertResult.textContent) { + txConOpt = convertResult.textContent; + } + } + + if (!state && txConOpt) { + var txConOptNormal_1 = txConOpt; // `textContent: {type: 'text'}`, the "type" is easy to be missing. So we tolerate it. + + !txConOptNormal_1.type && (txConOptNormal_1.type = 'text'); + + if ("development" !== 'production') { + // Do not tolerate incorret type for forward compat. + assert(txConOptNormal_1.type === 'text', 'textContent.type must be "text"'); + } + } + + var info = !state ? attachedTxInfo.normal : attachedTxInfo[state]; + info.cfg = txCfg; + info.conOpt = txConOpt; + } + + function retrieveStateOption(elOption, state) { + return !state ? elOption : elOption ? elOption[state] : null; + } + + function retrieveStyleOptionOnState(stateOptionNormal, stateOption, state) { + var style = stateOption && stateOption.style; + + if (style == null && state === EMPHASIS && stateOptionNormal) { + style = stateOptionNormal.styleEmphasis; + } + + return style; + } // Usage: + // (1) By default, `elOption.$mergeChildren` is `'byIndex'`, which indicates that + // the existing children will not be removed, and enables the feature that + // update some of the props of some of the children simply by construct + // the returned children of `renderItem` like: + // `var children = group.children = []; children[3] = {opacity: 0.5};` + // (2) If `elOption.$mergeChildren` is `'byName'`, add/update/remove children + // by child.name. But that might be lower performance. + // (3) If `elOption.$mergeChildren` is `false`, the existing children will be + // replaced totally. + // (4) If `!elOption.children`, following the "merge" principle, nothing will happen. + // + // For implementation simpleness, do not provide a direct way to remove sinlge + // child (otherwise the total indicies of the children array have to be modified). + // User can remove a single child by set its `ignore` as `true`. + + + function mergeChildren(api, el, dataIndex, elOption, seriesModel) { + var newChildren = elOption.children; + var newLen = newChildren ? newChildren.length : 0; + var mergeChildren = elOption.$mergeChildren; // `diffChildrenByName` has been deprecated. + + var byName = mergeChildren === 'byName' || elOption.diffChildrenByName; + var notMerge = mergeChildren === false; // For better performance on roam update, only enter if necessary. + + if (!newLen && !byName && !notMerge) { + return; + } + + if (byName) { + diffGroupChildren({ + api: api, + oldChildren: el.children() || [], + newChildren: newChildren || [], + dataIndex: dataIndex, + seriesModel: seriesModel, + group: el + }); + return; + } + + notMerge && el.removeAll(); // Mapping children of a group simply by index, which + // might be better performance. + + var index = 0; + + for (; index < newLen; index++) { + newChildren[index] && doCreateOrUpdateEl(api, el.childAt(index), dataIndex, newChildren[index], seriesModel, el); + } + + for (var i = el.childCount() - 1; i >= index; i--) { + // Do not supprot leave elements that are not mentioned in the latest + // `renderItem` return. Otherwise users may not have a clear and simple + // concept that how to contorl all of the elements. + var child = el.childAt(i); + applyLeaveTransition(child, customInnerStore(el).option, seriesModel); + } + } + + function diffGroupChildren(context) { + new DataDiffer(context.oldChildren, context.newChildren, getKey, getKey, context).add(processAddUpdate).update(processAddUpdate).remove(processRemove).execute(); + } + + function getKey(item, idx) { + var name = item && item.name; + return name != null ? name : GROUP_DIFF_PREFIX + idx; + } + + function processAddUpdate(newIndex, oldIndex) { + var context = this.context; + var childOption = newIndex != null ? context.newChildren[newIndex] : null; + var child = oldIndex != null ? context.oldChildren[oldIndex] : null; + doCreateOrUpdateEl(context.api, child, context.dataIndex, childOption, context.seriesModel, context.group); + } + + function processRemove(oldIndex) { + var context = this.context; + var child = context.oldChildren[oldIndex]; + applyLeaveTransition(child, customInnerStore(child).option, context.seriesModel); + } + /** + * @return SVG Path data. + */ + + + function getPathData(shape) { + // "d" follows the SVG convention. + return shape && (shape.pathData || shape.d); + } + + function hasOwnPathData(shape) { + return shape && (hasOwn(shape, 'pathData') || hasOwn(shape, 'd')); + } + + function install$r(registers) { + registers.registerChartView(CustomChartView); + registers.registerSeriesModel(CustomSeriesModel); + } + + var inner$a = makeInner(); + var clone$3 = clone; + var bind$1 = bind; + /** + * Base axis pointer class in 2D. + */ + + var BaseAxisPointer = + /** @class */ + function () { + function BaseAxisPointer() { + this._dragging = false; + /** + * In px, arbitrary value. Do not set too small, + * no animation is ok for most cases. + */ + + this.animationThreshold = 15; + } + /** + * @implement + */ + + + BaseAxisPointer.prototype.render = function (axisModel, axisPointerModel, api, forceRender) { + var value = axisPointerModel.get('value'); + var status = axisPointerModel.get('status'); // Bind them to `this`, not in closure, otherwise they will not + // be replaced when user calling setOption in not merge mode. + + this._axisModel = axisModel; + this._axisPointerModel = axisPointerModel; + this._api = api; // Optimize: `render` will be called repeatly during mouse move. + // So it is power consuming if performing `render` each time, + // especially on mobile device. + + if (!forceRender && this._lastValue === value && this._lastStatus === status) { + return; + } + + this._lastValue = value; + this._lastStatus = status; + var group = this._group; + var handle = this._handle; + + if (!status || status === 'hide') { + // Do not clear here, for animation better. + group && group.hide(); + handle && handle.hide(); + return; + } + + group && group.show(); + handle && handle.show(); // Otherwise status is 'show' + + var elOption = {}; + this.makeElOption(elOption, value, axisModel, axisPointerModel, api); // Enable change axis pointer type. + + var graphicKey = elOption.graphicKey; + + if (graphicKey !== this._lastGraphicKey) { + this.clear(api); + } + + this._lastGraphicKey = graphicKey; + var moveAnimation = this._moveAnimation = this.determineAnimation(axisModel, axisPointerModel); + + if (!group) { + group = this._group = new Group(); + this.createPointerEl(group, elOption, axisModel, axisPointerModel); + this.createLabelEl(group, elOption, axisModel, axisPointerModel); + api.getZr().add(group); + } else { + var doUpdateProps = curry(updateProps$1, axisPointerModel, moveAnimation); + this.updatePointerEl(group, elOption, doUpdateProps); + this.updateLabelEl(group, elOption, doUpdateProps, axisPointerModel); + } + + updateMandatoryProps(group, axisPointerModel, true); + + this._renderHandle(value); + }; + /** + * @implement + */ + + + BaseAxisPointer.prototype.remove = function (api) { + this.clear(api); + }; + /** + * @implement + */ + + + BaseAxisPointer.prototype.dispose = function (api) { + this.clear(api); + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.determineAnimation = function (axisModel, axisPointerModel) { + var animation = axisPointerModel.get('animation'); + var axis = axisModel.axis; + var isCategoryAxis = axis.type === 'category'; + var useSnap = axisPointerModel.get('snap'); // Value axis without snap always do not snap. + + if (!useSnap && !isCategoryAxis) { + return false; + } + + if (animation === 'auto' || animation == null) { + var animationThreshold = this.animationThreshold; + + if (isCategoryAxis && axis.getBandWidth() > animationThreshold) { + return true; + } // It is important to auto animation when snap used. Consider if there is + // a dataZoom, animation will be disabled when too many points exist, while + // it will be enabled for better visual effect when little points exist. + + + if (useSnap) { + var seriesDataCount = getAxisInfo(axisModel).seriesDataCount; + var axisExtent = axis.getExtent(); // Approximate band width + + return Math.abs(axisExtent[0] - axisExtent[1]) / seriesDataCount > animationThreshold; + } + + return false; + } + + return animation === true; + }; + /** + * add {pointer, label, graphicKey} to elOption + * @protected + */ + + + BaseAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) {// Shoule be implemenented by sub-class. + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.createPointerEl = function (group, elOption, axisModel, axisPointerModel) { + var pointerOption = elOption.pointer; + + if (pointerOption) { + var pointerEl = inner$a(group).pointerEl = new graphic[pointerOption.type](clone$3(elOption.pointer)); + group.add(pointerEl); + } + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.createLabelEl = function (group, elOption, axisModel, axisPointerModel) { + if (elOption.label) { + var labelEl = inner$a(group).labelEl = new ZRText(clone$3(elOption.label)); + group.add(labelEl); + updateLabelShowHide(labelEl, axisPointerModel); + } + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.updatePointerEl = function (group, elOption, updateProps) { + var pointerEl = inner$a(group).pointerEl; + + if (pointerEl && elOption.pointer) { + pointerEl.setStyle(elOption.pointer.style); + updateProps(pointerEl, { + shape: elOption.pointer.shape + }); + } + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.updateLabelEl = function (group, elOption, updateProps, axisPointerModel) { + var labelEl = inner$a(group).labelEl; + + if (labelEl) { + labelEl.setStyle(elOption.label.style); + updateProps(labelEl, { + // Consider text length change in vertical axis, animation should + // be used on shape, otherwise the effect will be weird. + // TODOTODO + // shape: elOption.label.shape, + x: elOption.label.x, + y: elOption.label.y + }); + updateLabelShowHide(labelEl, axisPointerModel); + } + }; + /** + * @private + */ + + + BaseAxisPointer.prototype._renderHandle = function (value) { + if (this._dragging || !this.updateHandleTransform) { + return; + } + + var axisPointerModel = this._axisPointerModel; + + var zr = this._api.getZr(); + + var handle = this._handle; + var handleModel = axisPointerModel.getModel('handle'); + var status = axisPointerModel.get('status'); + + if (!handleModel.get('show') || !status || status === 'hide') { + handle && zr.remove(handle); + this._handle = null; + return; + } + + var isInit; + + if (!this._handle) { + isInit = true; + handle = this._handle = createIcon(handleModel.get('icon'), { + cursor: 'move', + draggable: true, + onmousemove: function (e) { + // Fot mobile devicem, prevent screen slider on the button. + stop(e.event); + }, + onmousedown: bind$1(this._onHandleDragMove, this, 0, 0), + drift: bind$1(this._onHandleDragMove, this), + ondragend: bind$1(this._onHandleDragEnd, this) + }); + zr.add(handle); + } + + updateMandatoryProps(handle, axisPointerModel, false); // update style + + handle.setStyle(handleModel.getItemStyle(null, ['color', 'borderColor', 'borderWidth', 'opacity', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'])); // update position + + var handleSize = handleModel.get('size'); + + if (!isArray(handleSize)) { + handleSize = [handleSize, handleSize]; + } + + handle.scaleX = handleSize[0] / 2; + handle.scaleY = handleSize[1] / 2; + createOrUpdate(this, '_doDispatchAxisPointer', handleModel.get('throttle') || 0, 'fixRate'); + + this._moveHandleToValue(value, isInit); + }; + + BaseAxisPointer.prototype._moveHandleToValue = function (value, isInit) { + updateProps$1(this._axisPointerModel, !isInit && this._moveAnimation, this._handle, getHandleTransProps(this.getHandleTransform(value, this._axisModel, this._axisPointerModel))); + }; + + BaseAxisPointer.prototype._onHandleDragMove = function (dx, dy) { + var handle = this._handle; + + if (!handle) { + return; + } + + this._dragging = true; // Persistent for throttle. + + var trans = this.updateHandleTransform(getHandleTransProps(handle), [dx, dy], this._axisModel, this._axisPointerModel); + this._payloadInfo = trans; + handle.stopAnimation(); + handle.attr(getHandleTransProps(trans)); + inner$a(handle).lastProp = null; + + this._doDispatchAxisPointer(); + }; + /** + * Throttled method. + */ + + + BaseAxisPointer.prototype._doDispatchAxisPointer = function () { + var handle = this._handle; + + if (!handle) { + return; + } + + var payloadInfo = this._payloadInfo; + var axisModel = this._axisModel; + + this._api.dispatchAction({ + type: 'updateAxisPointer', + x: payloadInfo.cursorPoint[0], + y: payloadInfo.cursorPoint[1], + tooltipOption: payloadInfo.tooltipOption, + axesInfo: [{ + axisDim: axisModel.axis.dim, + axisIndex: axisModel.componentIndex + }] + }); + }; + + BaseAxisPointer.prototype._onHandleDragEnd = function () { + this._dragging = false; + var handle = this._handle; + + if (!handle) { + return; + } + + var value = this._axisPointerModel.get('value'); // Consider snap or categroy axis, handle may be not consistent with + // axisPointer. So move handle to align the exact value position when + // drag ended. + + + this._moveHandleToValue(value); // For the effect: tooltip will be shown when finger holding on handle + // button, and will be hidden after finger left handle button. + + + this._api.dispatchAction({ + type: 'hideTip' + }); + }; + /** + * @private + */ + + + BaseAxisPointer.prototype.clear = function (api) { + this._lastValue = null; + this._lastStatus = null; + var zr = api.getZr(); + var group = this._group; + var handle = this._handle; + + if (zr && group) { + this._lastGraphicKey = null; + group && zr.remove(group); + handle && zr.remove(handle); + this._group = null; + this._handle = null; + this._payloadInfo = null; + } + + clear(this, '_doDispatchAxisPointer'); + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.doClear = function () {// Implemented by sub-class if necessary. + }; + + BaseAxisPointer.prototype.buildLabel = function (xy, wh, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x: xy[xDimIndex], + y: xy[1 - xDimIndex], + width: wh[xDimIndex], + height: wh[1 - xDimIndex] + }; + }; + + return BaseAxisPointer; + }(); + + function updateProps$1(animationModel, moveAnimation, el, props) { + // Animation optimize. + if (!propsEqual(inner$a(el).lastProp, props)) { + inner$a(el).lastProp = props; + moveAnimation ? updateProps(el, props, animationModel) : (el.stopAnimation(), el.attr(props)); + } + } + + function propsEqual(lastProps, newProps) { + if (isObject(lastProps) && isObject(newProps)) { + var equals_1 = true; + each(newProps, function (item, key) { + equals_1 = equals_1 && propsEqual(lastProps[key], item); + }); + return !!equals_1; + } else { + return lastProps === newProps; + } + } + + function updateLabelShowHide(labelEl, axisPointerModel) { + labelEl[axisPointerModel.get(['label', 'show']) ? 'show' : 'hide'](); + } + + function getHandleTransProps(trans) { + return { + x: trans.x || 0, + y: trans.y || 0, + rotation: trans.rotation || 0 + }; + } + + function updateMandatoryProps(group, axisPointerModel, silent) { + var z = axisPointerModel.get('z'); + var zlevel = axisPointerModel.get('zlevel'); + group && group.traverse(function (el) { + if (el.type !== 'group') { + z != null && (el.z = z); + zlevel != null && (el.zlevel = zlevel); + el.silent = silent; + } + }); + } + + function buildElStyle(axisPointerModel) { + var axisPointerType = axisPointerModel.get('type'); + var styleModel = axisPointerModel.getModel(axisPointerType + 'Style'); + var style; + + if (axisPointerType === 'line') { + style = styleModel.getLineStyle(); + style.fill = null; + } else if (axisPointerType === 'shadow') { + style = styleModel.getAreaStyle(); + style.stroke = null; + } + + return style; + } + /** + * @param {Function} labelPos {align, verticalAlign, position} + */ + + function buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos) { + var value = axisPointerModel.get('value'); + var text = getValueLabel(value, axisModel.axis, axisModel.ecModel, axisPointerModel.get('seriesDataIndices'), { + precision: axisPointerModel.get(['label', 'precision']), + formatter: axisPointerModel.get(['label', 'formatter']) + }); + var labelModel = axisPointerModel.getModel('label'); + var paddings = normalizeCssArray$1(labelModel.get('padding') || 0); + var font = labelModel.getFont(); + var textRect = getBoundingRect(text, font); + var position = labelPos.position; + var width = textRect.width + paddings[1] + paddings[3]; + var height = textRect.height + paddings[0] + paddings[2]; // Adjust by align. + + var align = labelPos.align; + align === 'right' && (position[0] -= width); + align === 'center' && (position[0] -= width / 2); + var verticalAlign = labelPos.verticalAlign; + verticalAlign === 'bottom' && (position[1] -= height); + verticalAlign === 'middle' && (position[1] -= height / 2); // Not overflow ec container + + confineInContainer(position, width, height, api); + var bgColor = labelModel.get('backgroundColor'); + + if (!bgColor || bgColor === 'auto') { + bgColor = axisModel.get(['axisLine', 'lineStyle', 'color']); + } + + elOption.label = { + // shape: {x: 0, y: 0, width: width, height: height, r: labelModel.get('borderRadius')}, + x: position[0], + y: position[1], + style: createTextStyle(labelModel, { + text: text, + font: font, + fill: labelModel.getTextColor(), + padding: paddings, + backgroundColor: bgColor + }), + // Lable should be over axisPointer. + z2: 10 + }; + } // Do not overflow ec container + + function confineInContainer(position, width, height, api) { + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + position[0] = Math.min(position[0] + width, viewWidth) - width; + position[1] = Math.min(position[1] + height, viewHeight) - height; + position[0] = Math.max(position[0], 0); + position[1] = Math.max(position[1], 0); + } + + function getValueLabel(value, axis, ecModel, seriesDataIndices, opt) { + value = axis.scale.parse(value); + var text = axis.scale.getLabel({ + value: value + }, { + // If `precision` is set, width can be fixed (like '12.00500'), which + // helps to debounce when when moving label. + precision: opt.precision + }); + var formatter = opt.formatter; + + if (formatter) { + var params_1 = { + value: getAxisRawValue(axis, { + value: value + }), + axisDimension: axis.dim, + axisIndex: axis.index, + seriesData: [] + }; + each(seriesDataIndices, function (idxItem) { + var series = ecModel.getSeriesByIndex(idxItem.seriesIndex); + var dataIndex = idxItem.dataIndexInside; + var dataParams = series && series.getDataParams(dataIndex); + dataParams && params_1.seriesData.push(dataParams); + }); + + if (isString(formatter)) { + text = formatter.replace('{value}', text); + } else if (isFunction(formatter)) { + text = formatter(params_1); + } + } + + return text; + } + function getTransformedPosition(axis, value, layoutInfo) { + var transform = create$1(); + rotate(transform, transform, layoutInfo.rotation); + translate(transform, transform, layoutInfo.position); + return applyTransform$1([axis.dataToCoord(value), (layoutInfo.labelOffset || 0) + (layoutInfo.labelDirection || 1) * (layoutInfo.labelMargin || 0)], transform); + } + function buildCartesianSingleLabelElOption(value, elOption, layoutInfo, axisModel, axisPointerModel, api) { + // @ts-ignore + var textLayout = AxisBuilder.innerTextLayout(layoutInfo.rotation, 0, layoutInfo.labelDirection); + layoutInfo.labelMargin = axisPointerModel.get(['label', 'margin']); + buildLabelElOption(elOption, axisModel, axisPointerModel, api, { + position: getTransformedPosition(axisModel.axis, value, layoutInfo), + align: textLayout.textAlign, + verticalAlign: textLayout.textVerticalAlign + }); + } + function makeLineShape(p1, p2, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x1: p1[xDimIndex], + y1: p1[1 - xDimIndex], + x2: p2[xDimIndex], + y2: p2[1 - xDimIndex] + }; + } + function makeRectShape(xy, wh, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x: xy[xDimIndex], + y: xy[1 - xDimIndex], + width: wh[xDimIndex], + height: wh[1 - xDimIndex] + }; + } + function makeSectorShape(cx, cy, r0, r, startAngle, endAngle) { + return { + cx: cx, + cy: cy, + r0: r0, + r: r, + startAngle: startAngle, + endAngle: endAngle, + clockwise: true + }; + } + + var CartesianAxisPointer = + /** @class */ + function (_super) { + __extends(CartesianAxisPointer, _super); + + function CartesianAxisPointer() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @override + */ + + + CartesianAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) { + var axis = axisModel.axis; + var grid = axis.grid; + var axisPointerType = axisPointerModel.get('type'); + var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent(); + var pixelValue = axis.toGlobalCoord(axis.dataToCoord(value, true)); + + if (axisPointerType && axisPointerType !== 'none') { + var elStyle = buildElStyle(axisPointerModel); + var pointerOption = pointerShapeBuilder[axisPointerType](axis, pixelValue, otherExtent); + pointerOption.style = elStyle; + elOption.graphicKey = pointerOption.type; + elOption.pointer = pointerOption; + } + + var layoutInfo = layout$1(grid.model, axisModel); + buildCartesianSingleLabelElOption( // @ts-ignore + value, elOption, layoutInfo, axisModel, axisPointerModel, api); + }; + /** + * @override + */ + + + CartesianAxisPointer.prototype.getHandleTransform = function (value, axisModel, axisPointerModel) { + var layoutInfo = layout$1(axisModel.axis.grid.model, axisModel, { + labelInside: false + }); // @ts-ignore + + layoutInfo.labelMargin = axisPointerModel.get(['handle', 'margin']); + var pos = getTransformedPosition(axisModel.axis, value, layoutInfo); + return { + x: pos[0], + y: pos[1], + rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0) + }; + }; + /** + * @override + */ + + + CartesianAxisPointer.prototype.updateHandleTransform = function (transform, delta, axisModel, axisPointerModel) { + var axis = axisModel.axis; + var grid = axis.grid; + var axisExtent = axis.getGlobalExtent(true); + var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent(); + var dimIndex = axis.dim === 'x' ? 0 : 1; + var currPosition = [transform.x, transform.y]; + currPosition[dimIndex] += delta[dimIndex]; + currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]); + currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]); + var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2; + var cursorPoint = [cursorOtherValue, cursorOtherValue]; + cursorPoint[dimIndex] = currPosition[dimIndex]; // Make tooltip do not overlap axisPointer and in the middle of the grid. + + var tooltipOptions = [{ + verticalAlign: 'middle' + }, { + align: 'center' + }]; + return { + x: currPosition[0], + y: currPosition[1], + rotation: transform.rotation, + cursorPoint: cursorPoint, + tooltipOption: tooltipOptions[dimIndex] + }; + }; + + return CartesianAxisPointer; + }(BaseAxisPointer); + + function getCartesian(grid, axis) { + var opt = {}; + opt[axis.dim + 'AxisIndex'] = axis.index; + return grid.getCartesian(opt); + } + + var pointerShapeBuilder = { + line: function (axis, pixelValue, otherExtent) { + var targetShape = makeLineShape([pixelValue, otherExtent[0]], [pixelValue, otherExtent[1]], getAxisDimIndex(axis)); + return { + type: 'Line', + subPixelOptimize: true, + shape: targetShape + }; + }, + shadow: function (axis, pixelValue, otherExtent) { + var bandWidth = Math.max(1, axis.getBandWidth()); + var span = otherExtent[1] - otherExtent[0]; + return { + type: 'Rect', + shape: makeRectShape([pixelValue - bandWidth / 2, otherExtent[0]], [bandWidth, span], getAxisDimIndex(axis)) + }; + } + }; + + function getAxisDimIndex(axis) { + return axis.dim === 'x' ? 0 : 1; + } + + var AxisPointerModel = + /** @class */ + function (_super) { + __extends(AxisPointerModel, _super); + + function AxisPointerModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AxisPointerModel.type; + return _this; + } + + AxisPointerModel.type = 'axisPointer'; + AxisPointerModel.defaultOption = { + // 'auto' means that show when triggered by tooltip or handle. + show: 'auto', + // zlevel: 0, + z: 50, + type: 'line', + // axispointer triggered by tootip determine snap automatically, + // see `modelHelper`. + snap: false, + triggerTooltip: true, + value: null, + status: null, + link: [], + // Do not set 'auto' here, otherwise global animation: false + // will not effect at this axispointer. + animation: null, + animationDurationUpdate: 200, + lineStyle: { + color: '#B9BEC9', + width: 1, + type: 'dashed' + }, + shadowStyle: { + color: 'rgba(210,219,238,0.2)' + }, + label: { + show: true, + formatter: null, + precision: 'auto', + margin: 3, + color: '#fff', + padding: [5, 7, 5, 7], + backgroundColor: 'auto', + borderColor: null, + borderWidth: 0, + borderRadius: 3 + }, + handle: { + show: false, + // eslint-disable-next-line + icon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z', + size: 45, + // handle margin is from symbol center to axis, which is stable when circular move. + margin: 50, + // color: '#1b8bbd' + // color: '#2f4554' + color: '#333', + shadowBlur: 3, + shadowColor: '#aaa', + shadowOffsetX: 0, + shadowOffsetY: 2, + // For mobile performance + throttle: 40 + } + }; + return AxisPointerModel; + }(ComponentModel); + + var inner$b = makeInner(); + var each$7 = each; + /** + * @param {string} key + * @param {module:echarts/ExtensionAPI} api + * @param {Function} handler + * param: {string} currTrigger + * param: {Array.<number>} point + */ + + function register(key, api, handler) { + if (env.node) { + return; + } + + var zr = api.getZr(); + inner$b(zr).records || (inner$b(zr).records = {}); + initGlobalListeners(zr, api); + var record = inner$b(zr).records[key] || (inner$b(zr).records[key] = {}); + record.handler = handler; + } + + function initGlobalListeners(zr, api) { + if (inner$b(zr).initialized) { + return; + } + + inner$b(zr).initialized = true; + useHandler('click', curry(doEnter, 'click')); + useHandler('mousemove', curry(doEnter, 'mousemove')); // useHandler('mouseout', onLeave); + + useHandler('globalout', onLeave); + + function useHandler(eventType, cb) { + zr.on(eventType, function (e) { + var dis = makeDispatchAction(api); + each$7(inner$b(zr).records, function (record) { + record && cb(record, e, dis.dispatchAction); + }); + dispatchTooltipFinally(dis.pendings, api); + }); + } + } + + function dispatchTooltipFinally(pendings, api) { + var showLen = pendings.showTip.length; + var hideLen = pendings.hideTip.length; + var actuallyPayload; + + if (showLen) { + actuallyPayload = pendings.showTip[showLen - 1]; + } else if (hideLen) { + actuallyPayload = pendings.hideTip[hideLen - 1]; + } + + if (actuallyPayload) { + actuallyPayload.dispatchAction = null; + api.dispatchAction(actuallyPayload); + } + } + + function onLeave(record, e, dispatchAction) { + record.handler('leave', null, dispatchAction); + } + + function doEnter(currTrigger, record, e, dispatchAction) { + record.handler(currTrigger, e, dispatchAction); + } + + function makeDispatchAction(api) { + var pendings = { + showTip: [], + hideTip: [] + }; // FIXME + // better approach? + // 'showTip' and 'hideTip' can be triggered by axisPointer and tooltip, + // which may be conflict, (axisPointer call showTip but tooltip call hideTip); + // So we have to add "final stage" to merge those dispatched actions. + + var dispatchAction = function (payload) { + var pendingList = pendings[payload.type]; + + if (pendingList) { + pendingList.push(payload); + } else { + payload.dispatchAction = dispatchAction; + api.dispatchAction(payload); + } + }; + + return { + dispatchAction: dispatchAction, + pendings: pendings + }; + } + + function unregister(key, api) { + if (env.node) { + return; + } + + var zr = api.getZr(); + var record = (inner$b(zr).records || {})[key]; + + if (record) { + inner$b(zr).records[key] = null; + } + } + + var AxisPointerView = + /** @class */ + function (_super) { + __extends(AxisPointerView, _super); + + function AxisPointerView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AxisPointerView.type; + return _this; + } + + AxisPointerView.prototype.render = function (globalAxisPointerModel, ecModel, api) { + var globalTooltipModel = ecModel.getComponent('tooltip'); + var triggerOn = globalAxisPointerModel.get('triggerOn') || globalTooltipModel && globalTooltipModel.get('triggerOn') || 'mousemove|click'; // Register global listener in AxisPointerView to enable + // AxisPointerView to be independent to Tooltip. + + register('axisPointer', api, function (currTrigger, e, dispatchAction) { + // If 'none', it is not controlled by mouse totally. + if (triggerOn !== 'none' && (currTrigger === 'leave' || triggerOn.indexOf(currTrigger) >= 0)) { + dispatchAction({ + type: 'updateAxisPointer', + currTrigger: currTrigger, + x: e && e.offsetX, + y: e && e.offsetY + }); + } + }); + }; + + AxisPointerView.prototype.remove = function (ecModel, api) { + unregister('axisPointer', api); + }; + + AxisPointerView.prototype.dispose = function (ecModel, api) { + unregister('axisPointer', api); + }; + + AxisPointerView.type = 'axisPointer'; + return AxisPointerView; + }(ComponentView); + + /** + * @param finder contains {seriesIndex, dataIndex, dataIndexInside} + * @param ecModel + * @return {point: [x, y], el: ...} point Will not be null. + */ + + function findPointFromSeries(finder, ecModel) { + var point = []; + var seriesIndex = finder.seriesIndex; + var seriesModel; + + if (seriesIndex == null || !(seriesModel = ecModel.getSeriesByIndex(seriesIndex))) { + return { + point: [] + }; + } + + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, finder); + + if (dataIndex == null || dataIndex < 0 || isArray(dataIndex)) { + return { + point: [] + }; + } + + var el = data.getItemGraphicEl(dataIndex); + var coordSys = seriesModel.coordinateSystem; + + if (seriesModel.getTooltipPosition) { + point = seriesModel.getTooltipPosition(dataIndex) || []; + } else if (coordSys && coordSys.dataToPoint) { + if (finder.isStacked) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var valueAxisDim = valueAxis.dim; + var baseAxisDim = baseAxis.dim; + var baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0; + var baseDim = data.mapDimension(baseAxisDim); + var stackedData = []; + stackedData[baseDataOffset] = data.get(baseDim, dataIndex); + stackedData[1 - baseDataOffset] = data.get(data.getCalculationInfo('stackResultDimension'), dataIndex); + point = coordSys.dataToPoint(stackedData) || []; + } else { + point = coordSys.dataToPoint(data.getValues(map(coordSys.dimensions, function (dim) { + return data.mapDimension(dim); + }), dataIndex)) || []; + } + } else if (el) { + // Use graphic bounding rect + var rect = el.getBoundingRect().clone(); + rect.applyTransform(el.transform); + point = [rect.x + rect.width / 2, rect.y + rect.height / 2]; + } + + return { + point: point, + el: el + }; + } + + var inner$c = makeInner(); + /** + * Basic logic: check all axis, if they do not demand show/highlight, + * then hide/downplay them. + * + * @return content of event obj for echarts.connect. + */ + + function axisTrigger(payload, ecModel, api) { + var currTrigger = payload.currTrigger; + var point = [payload.x, payload.y]; + var finder = payload; + var dispatchAction = payload.dispatchAction || bind(api.dispatchAction, api); + var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo; // Pending + // See #6121. But we are not able to reproduce it yet. + + if (!coordSysAxesInfo) { + return; + } + + if (illegalPoint(point)) { + // Used in the default behavior of `connection`: use the sample seriesIndex + // and dataIndex. And also used in the tooltipView trigger. + point = findPointFromSeries({ + seriesIndex: finder.seriesIndex, + // Do not use dataIndexInside from other ec instance. + // FIXME: auto detect it? + dataIndex: finder.dataIndex + }, ecModel).point; + } + + var isIllegalPoint = illegalPoint(point); // Axis and value can be specified when calling dispatchAction({type: 'updateAxisPointer'}). + // Notice: In this case, it is difficult to get the `point` (which is necessary to show + // tooltip, so if point is not given, we just use the point found by sample seriesIndex + // and dataIndex. + + var inputAxesInfo = finder.axesInfo; + var axesInfo = coordSysAxesInfo.axesInfo; + var shouldHide = currTrigger === 'leave' || illegalPoint(point); + var outputPayload = {}; + var showValueMap = {}; + var dataByCoordSys = { + list: [], + map: {} + }; + var updaters = { + showPointer: curry(showPointer, showValueMap), + showTooltip: curry(showTooltip, dataByCoordSys) + }; // Process for triggered axes. + + each(coordSysAxesInfo.coordSysMap, function (coordSys, coordSysKey) { + // If a point given, it must be contained by the coordinate system. + var coordSysContainsPoint = isIllegalPoint || coordSys.containPoint(point); + each(coordSysAxesInfo.coordSysAxesInfo[coordSysKey], function (axisInfo, key) { + var axis = axisInfo.axis; + var inputAxisInfo = findInputAxisInfo(inputAxesInfo, axisInfo); // If no inputAxesInfo, no axis is restricted. + + if (!shouldHide && coordSysContainsPoint && (!inputAxesInfo || inputAxisInfo)) { + var val = inputAxisInfo && inputAxisInfo.value; + + if (val == null && !isIllegalPoint) { + val = axis.pointToData(point); + } + + val != null && processOnAxis(axisInfo, val, updaters, false, outputPayload); + } + }); + }); // Process for linked axes. + + var linkTriggers = {}; + each(axesInfo, function (tarAxisInfo, tarKey) { + var linkGroup = tarAxisInfo.linkGroup; // If axis has been triggered in the previous stage, it should not be triggered by link. + + if (linkGroup && !showValueMap[tarKey]) { + each(linkGroup.axesInfo, function (srcAxisInfo, srcKey) { + var srcValItem = showValueMap[srcKey]; // If srcValItem exist, source axis is triggered, so link to target axis. + + if (srcAxisInfo !== tarAxisInfo && srcValItem) { + var val = srcValItem.value; + linkGroup.mapper && (val = tarAxisInfo.axis.scale.parse(linkGroup.mapper(val, makeMapperParam(srcAxisInfo), makeMapperParam(tarAxisInfo)))); + linkTriggers[tarAxisInfo.key] = val; + } + }); + } + }); + each(linkTriggers, function (val, tarKey) { + processOnAxis(axesInfo[tarKey], val, updaters, true, outputPayload); + }); + updateModelActually(showValueMap, axesInfo, outputPayload); + dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction); + dispatchHighDownActually(axesInfo, dispatchAction, api); + return outputPayload; + } + + function processOnAxis(axisInfo, newValue, updaters, noSnap, outputFinder) { + var axis = axisInfo.axis; + + if (axis.scale.isBlank() || !axis.containData(newValue)) { + return; + } + + if (!axisInfo.involveSeries) { + updaters.showPointer(axisInfo, newValue); + return; + } // Heavy calculation. So put it after axis.containData checking. + + + var payloadInfo = buildPayloadsBySeries(newValue, axisInfo); + var payloadBatch = payloadInfo.payloadBatch; + var snapToValue = payloadInfo.snapToValue; // Fill content of event obj for echarts.connect. + // By default use the first involved series data as a sample to connect. + + if (payloadBatch[0] && outputFinder.seriesIndex == null) { + extend(outputFinder, payloadBatch[0]); + } // If no linkSource input, this process is for collecting link + // target, where snap should not be accepted. + + + if (!noSnap && axisInfo.snap) { + if (axis.containData(snapToValue) && snapToValue != null) { + newValue = snapToValue; + } + } + + updaters.showPointer(axisInfo, newValue, payloadBatch); // Tooltip should always be snapToValue, otherwise there will be + // incorrect "axis value ~ series value" mapping displayed in tooltip. + + updaters.showTooltip(axisInfo, payloadInfo, snapToValue); + } + + function buildPayloadsBySeries(value, axisInfo) { + var axis = axisInfo.axis; + var dim = axis.dim; + var snapToValue = value; + var payloadBatch = []; + var minDist = Number.MAX_VALUE; + var minDiff = -1; + each(axisInfo.seriesModels, function (series, idx) { + var dataDim = series.getData().mapDimensionsAll(dim); + var seriesNestestValue; + var dataIndices; + + if (series.getAxisTooltipData) { + var result = series.getAxisTooltipData(dataDim, value, axis); + dataIndices = result.dataIndices; + seriesNestestValue = result.nestestValue; + } else { + dataIndices = series.getData().indicesOfNearest(dataDim[0], value, // Add a threshold to avoid find the wrong dataIndex + // when data length is not same. + // false, + axis.type === 'category' ? 0.5 : null); + + if (!dataIndices.length) { + return; + } + + seriesNestestValue = series.getData().get(dataDim[0], dataIndices[0]); + } + + if (seriesNestestValue == null || !isFinite(seriesNestestValue)) { + return; + } + + var diff = value - seriesNestestValue; + var dist = Math.abs(diff); // Consider category case + + if (dist <= minDist) { + if (dist < minDist || diff >= 0 && minDiff < 0) { + minDist = dist; + minDiff = diff; + snapToValue = seriesNestestValue; + payloadBatch.length = 0; + } + + each(dataIndices, function (dataIndex) { + payloadBatch.push({ + seriesIndex: series.seriesIndex, + dataIndexInside: dataIndex, + dataIndex: series.getData().getRawIndex(dataIndex) + }); + }); + } + }); + return { + payloadBatch: payloadBatch, + snapToValue: snapToValue + }; + } + + function showPointer(showValueMap, axisInfo, value, payloadBatch) { + showValueMap[axisInfo.key] = { + value: value, + payloadBatch: payloadBatch + }; + } + + function showTooltip(dataByCoordSys, axisInfo, payloadInfo, value) { + var payloadBatch = payloadInfo.payloadBatch; + var axis = axisInfo.axis; + var axisModel = axis.model; + var axisPointerModel = axisInfo.axisPointerModel; // If no data, do not create anything in dataByCoordSys, + // whose length will be used to judge whether dispatch action. + + if (!axisInfo.triggerTooltip || !payloadBatch.length) { + return; + } + + var coordSysModel = axisInfo.coordSys.model; + var coordSysKey = makeKey(coordSysModel); + var coordSysItem = dataByCoordSys.map[coordSysKey]; + + if (!coordSysItem) { + coordSysItem = dataByCoordSys.map[coordSysKey] = { + coordSysId: coordSysModel.id, + coordSysIndex: coordSysModel.componentIndex, + coordSysType: coordSysModel.type, + coordSysMainType: coordSysModel.mainType, + dataByAxis: [] + }; + dataByCoordSys.list.push(coordSysItem); + } + + coordSysItem.dataByAxis.push({ + axisDim: axis.dim, + axisIndex: axisModel.componentIndex, + axisType: axisModel.type, + axisId: axisModel.id, + value: value, + // Caustion: viewHelper.getValueLabel is actually on "view stage", which + // depends that all models have been updated. So it should not be performed + // here. Considering axisPointerModel used here is volatile, which is hard + // to be retrieve in TooltipView, we prepare parameters here. + valueLabelOpt: { + precision: axisPointerModel.get(['label', 'precision']), + formatter: axisPointerModel.get(['label', 'formatter']) + }, + seriesDataIndices: payloadBatch.slice() + }); + } + + function updateModelActually(showValueMap, axesInfo, outputPayload) { + var outputAxesInfo = outputPayload.axesInfo = []; // Basic logic: If no 'show' required, 'hide' this axisPointer. + + each(axesInfo, function (axisInfo, key) { + var option = axisInfo.axisPointerModel.option; + var valItem = showValueMap[key]; + + if (valItem) { + !axisInfo.useHandle && (option.status = 'show'); + option.value = valItem.value; // For label formatter param and highlight. + + option.seriesDataIndices = (valItem.payloadBatch || []).slice(); + } // When always show (e.g., handle used), remain + // original value and status. + else { + // If hide, value still need to be set, consider + // click legend to toggle axis blank. + !axisInfo.useHandle && (option.status = 'hide'); + } // If status is 'hide', should be no info in payload. + + + option.status === 'show' && outputAxesInfo.push({ + axisDim: axisInfo.axis.dim, + axisIndex: axisInfo.axis.model.componentIndex, + value: option.value + }); + }); + } + + function dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction) { + // Basic logic: If no showTip required, hideTip will be dispatched. + if (illegalPoint(point) || !dataByCoordSys.list.length) { + dispatchAction({ + type: 'hideTip' + }); + return; + } // In most case only one axis (or event one series is used). It is + // convinient to fetch payload.seriesIndex and payload.dataIndex + // dirtectly. So put the first seriesIndex and dataIndex of the first + // axis on the payload. + + + var sampleItem = ((dataByCoordSys.list[0].dataByAxis[0] || {}).seriesDataIndices || [])[0] || {}; + dispatchAction({ + type: 'showTip', + escapeConnect: true, + x: point[0], + y: point[1], + tooltipOption: payload.tooltipOption, + position: payload.position, + dataIndexInside: sampleItem.dataIndexInside, + dataIndex: sampleItem.dataIndex, + seriesIndex: sampleItem.seriesIndex, + dataByCoordSys: dataByCoordSys.list + }); + } + + function dispatchHighDownActually(axesInfo, dispatchAction, api) { + // FIXME + // highlight status modification shoule be a stage of main process? + // (Consider confilct (e.g., legend and axisPointer) and setOption) + var zr = api.getZr(); + var highDownKey = 'axisPointerLastHighlights'; + var lastHighlights = inner$c(zr)[highDownKey] || {}; + var newHighlights = inner$c(zr)[highDownKey] = {}; // Update highlight/downplay status according to axisPointer model. + // Build hash map and remove duplicate incidentally. + + each(axesInfo, function (axisInfo, key) { + var option = axisInfo.axisPointerModel.option; + option.status === 'show' && each(option.seriesDataIndices, function (batchItem) { + var key = batchItem.seriesIndex + ' | ' + batchItem.dataIndex; + newHighlights[key] = batchItem; + }); + }); // Diff. + + var toHighlight = []; + var toDownplay = []; + each(lastHighlights, function (batchItem, key) { + !newHighlights[key] && toDownplay.push(batchItem); + }); + each(newHighlights, function (batchItem, key) { + !lastHighlights[key] && toHighlight.push(batchItem); + }); + toDownplay.length && api.dispatchAction({ + type: 'downplay', + escapeConnect: true, + // Not blur others when highlight in axisPointer. + notBlur: true, + batch: toDownplay + }); + toHighlight.length && api.dispatchAction({ + type: 'highlight', + escapeConnect: true, + // Not blur others when highlight in axisPointer. + notBlur: true, + batch: toHighlight + }); + } + + function findInputAxisInfo(inputAxesInfo, axisInfo) { + for (var i = 0; i < (inputAxesInfo || []).length; i++) { + var inputAxisInfo = inputAxesInfo[i]; + + if (axisInfo.axis.dim === inputAxisInfo.axisDim && axisInfo.axis.model.componentIndex === inputAxisInfo.axisIndex) { + return inputAxisInfo; + } + } + } + + function makeMapperParam(axisInfo) { + var axisModel = axisInfo.axis.model; + var item = {}; + var dim = item.axisDim = axisInfo.axis.dim; + item.axisIndex = item[dim + 'AxisIndex'] = axisModel.componentIndex; + item.axisName = item[dim + 'AxisName'] = axisModel.name; + item.axisId = item[dim + 'AxisId'] = axisModel.id; + return item; + } + + function illegalPoint(point) { + return !point || point[0] == null || isNaN(point[0]) || point[1] == null || isNaN(point[1]); + } + + function install$s(registers) { + // CartesianAxisPointer is not supposed to be required here. But consider + // echarts.simple.js and online build tooltip, which only require gridSimple, + // CartesianAxisPointer should be able to required somewhere. + AxisView.registerAxisPointerClass('CartesianAxisPointer', CartesianAxisPointer); + registers.registerComponentModel(AxisPointerModel); + registers.registerComponentView(AxisPointerView); + registers.registerPreprocessor(function (option) { + // Always has a global axisPointerModel for default setting. + if (option) { + (!option.axisPointer || option.axisPointer.length === 0) && (option.axisPointer = {}); + var link = option.axisPointer.link; // Normalize to array to avoid object mergin. But if link + // is not set, remain null/undefined, otherwise it will + // override existent link setting. + + if (link && !isArray(link)) { + option.axisPointer.link = [link]; + } + } + }); // This process should proformed after coordinate systems created + // and series data processed. So put it on statistic processing stage. + + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, function (ecModel, api) { + // Build axisPointerModel, mergin tooltip.axisPointer model for each axis. + // allAxesInfo should be updated when setOption performed. + ecModel.getComponent('axisPointer').coordSysAxesInfo = collect(ecModel, api); + }); // Broadcast to all views. + + registers.registerAction({ + type: 'updateAxisPointer', + event: 'updateAxisPointer', + update: ':updateAxisPointer' + }, axisTrigger); + } + + function install$t(registers) { + use(install$5); + use(install$s); + } + + var PolarAxisPointer = + /** @class */ + function (_super) { + __extends(PolarAxisPointer, _super); + + function PolarAxisPointer() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @override + */ + + + PolarAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) { + var axis = axisModel.axis; + + if (axis.dim === 'angle') { + this.animationThreshold = Math.PI / 18; + } + + var polar = axis.polar; + var otherAxis = polar.getOtherAxis(axis); + var otherExtent = otherAxis.getExtent(); + var coordValue = axis.dataToCoord(value); + var axisPointerType = axisPointerModel.get('type'); + + if (axisPointerType && axisPointerType !== 'none') { + var elStyle = buildElStyle(axisPointerModel); + var pointerOption = pointerShapeBuilder$1[axisPointerType](axis, polar, coordValue, otherExtent); + pointerOption.style = elStyle; + elOption.graphicKey = pointerOption.type; + elOption.pointer = pointerOption; + } + + var labelMargin = axisPointerModel.get(['label', 'margin']); + var labelPos = getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin); + buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos); + }; + + return PolarAxisPointer; + }(BaseAxisPointer); + + function getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin) { + var axis = axisModel.axis; + var coord = axis.dataToCoord(value); + var axisAngle = polar.getAngleAxis().getExtent()[0]; + axisAngle = axisAngle / 180 * Math.PI; + var radiusExtent = polar.getRadiusAxis().getExtent(); + var position; + var align; + var verticalAlign; + + if (axis.dim === 'radius') { + var transform = create$1(); + rotate(transform, transform, axisAngle); + translate(transform, transform, [polar.cx, polar.cy]); + position = applyTransform$1([coord, -labelMargin], transform); + var labelRotation = axisModel.getModel('axisLabel').get('rotate') || 0; // @ts-ignore + + var labelLayout = AxisBuilder.innerTextLayout(axisAngle, labelRotation * Math.PI / 180, -1); + align = labelLayout.textAlign; + verticalAlign = labelLayout.textVerticalAlign; + } else { + // angle axis + var r = radiusExtent[1]; + position = polar.coordToPoint([r + labelMargin, coord]); + var cx = polar.cx; + var cy = polar.cy; + align = Math.abs(position[0] - cx) / r < 0.3 ? 'center' : position[0] > cx ? 'left' : 'right'; + verticalAlign = Math.abs(position[1] - cy) / r < 0.3 ? 'middle' : position[1] > cy ? 'top' : 'bottom'; + } + + return { + position: position, + align: align, + verticalAlign: verticalAlign + }; + } + + var pointerShapeBuilder$1 = { + line: function (axis, polar, coordValue, otherExtent) { + return axis.dim === 'angle' ? { + type: 'Line', + shape: makeLineShape(polar.coordToPoint([otherExtent[0], coordValue]), polar.coordToPoint([otherExtent[1], coordValue])) + } : { + type: 'Circle', + shape: { + cx: polar.cx, + cy: polar.cy, + r: coordValue + } + }; + }, + shadow: function (axis, polar, coordValue, otherExtent) { + var bandWidth = Math.max(1, axis.getBandWidth()); + var radian = Math.PI / 180; + return axis.dim === 'angle' ? { + type: 'Sector', + shape: makeSectorShape(polar.cx, polar.cy, otherExtent[0], otherExtent[1], // In ECharts y is negative if angle is positive + (-coordValue - bandWidth / 2) * radian, (-coordValue + bandWidth / 2) * radian) + } : { + type: 'Sector', + shape: makeSectorShape(polar.cx, polar.cy, coordValue - bandWidth / 2, coordValue + bandWidth / 2, 0, Math.PI * 2) + }; + } + }; + + var PolarModel = + /** @class */ + function (_super) { + __extends(PolarModel, _super); + + function PolarModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PolarModel.type; + return _this; + } + + PolarModel.prototype.findAxisModel = function (axisType) { + var foundAxisModel; + var ecModel = this.ecModel; + ecModel.eachComponent(axisType, function (axisModel) { + if (axisModel.getCoordSysModel() === this) { + foundAxisModel = axisModel; + } + }, this); + return foundAxisModel; + }; + + PolarModel.type = 'polar'; + PolarModel.dependencies = ['radiusAxis', 'angleAxis']; + PolarModel.defaultOption = { + // zlevel: 0, + z: 0, + center: ['50%', '50%'], + radius: '80%' + }; + return PolarModel; + }(ComponentModel); + + var PolarAxisModel = + /** @class */ + function (_super) { + __extends(PolarAxisModel, _super); + + function PolarAxisModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + + PolarAxisModel.prototype.getCoordSysModel = function () { + return this.getReferringComponents('polar', SINGLE_REFERRING).models[0]; + }; + + PolarAxisModel.type = 'polarAxis'; + return PolarAxisModel; + }(ComponentModel); + + mixin(PolarAxisModel, AxisModelCommonMixin); + + var AngleAxisModel = + /** @class */ + function (_super) { + __extends(AngleAxisModel, _super); + + function AngleAxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AngleAxisModel.type; + return _this; + } + + AngleAxisModel.type = 'angleAxis'; + return AngleAxisModel; + }(PolarAxisModel); + + var RadiusAxisModel = + /** @class */ + function (_super) { + __extends(RadiusAxisModel, _super); + + function RadiusAxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadiusAxisModel.type; + return _this; + } + + RadiusAxisModel.type = 'radiusAxis'; + return RadiusAxisModel; + }(PolarAxisModel); + + var RadiusAxis = + /** @class */ + function (_super) { + __extends(RadiusAxis, _super); + + function RadiusAxis(scale, radiusExtent) { + return _super.call(this, 'radius', scale, radiusExtent) || this; + } + + RadiusAxis.prototype.pointToData = function (point, clamp) { + return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1]; + }; + + return RadiusAxis; + }(Axis); + + RadiusAxis.prototype.dataToRadius = Axis.prototype.dataToCoord; + RadiusAxis.prototype.radiusToData = Axis.prototype.coordToData; + + var inner$d = makeInner(); + + var AngleAxis = + /** @class */ + function (_super) { + __extends(AngleAxis, _super); + + function AngleAxis(scale, angleExtent) { + return _super.call(this, 'angle', scale, angleExtent || [0, 360]) || this; + } + + AngleAxis.prototype.pointToData = function (point, clamp) { + return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1]; + }; + /** + * Only be called in category axis. + * Angle axis uses text height to decide interval + * + * @override + * @return {number} Auto interval for cateogry axis tick and label + */ + + + AngleAxis.prototype.calculateCategoryInterval = function () { + var axis = this; + var labelModel = axis.getLabelModel(); + var ordinalScale = axis.scale; + var ordinalExtent = ordinalScale.getExtent(); // Providing this method is for optimization: + // avoid generating a long array by `getTicks` + // in large category data case. + + var tickCount = ordinalScale.count(); + + if (ordinalExtent[1] - ordinalExtent[0] < 1) { + return 0; + } + + var tickValue = ordinalExtent[0]; + var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue); + var unitH = Math.abs(unitSpan); // Not precise, just use height as text width + // and each distance from axis line yet. + + var rect = getBoundingRect(tickValue == null ? '' : tickValue + '', labelModel.getFont(), 'center', 'top'); + var maxH = Math.max(rect.height, 7); + var dh = maxH / unitH; // 0/0 is NaN, 1/0 is Infinity. + + isNaN(dh) && (dh = Infinity); + var interval = Math.max(0, Math.floor(dh)); + var cache = inner$d(axis.model); + var lastAutoInterval = cache.lastAutoInterval; + var lastTickCount = cache.lastTickCount; // Use cache to keep interval stable while moving zoom window, + // otherwise the calculated interval might jitter when the zoom + // window size is close to the interval-changing size. + + if (lastAutoInterval != null && lastTickCount != null && Math.abs(lastAutoInterval - interval) <= 1 && Math.abs(lastTickCount - tickCount) <= 1 // Always choose the bigger one, otherwise the critical + // point is not the same when zooming in or zooming out. + && lastAutoInterval > interval) { + interval = lastAutoInterval; + } // Only update cache if cache not used, otherwise the + // changing of interval is too insensitive. + else { + cache.lastTickCount = tickCount; + cache.lastAutoInterval = interval; + } + + return interval; + }; + + return AngleAxis; + }(Axis); + + AngleAxis.prototype.dataToAngle = Axis.prototype.dataToCoord; + AngleAxis.prototype.angleToData = Axis.prototype.coordToData; + + var polarDimensions = ['radius', 'angle']; + + var Polar = + /** @class */ + function () { + function Polar(name) { + this.dimensions = polarDimensions; + this.type = 'polar'; + /** + * x of polar center + */ + + this.cx = 0; + /** + * y of polar center + */ + + this.cy = 0; + this._radiusAxis = new RadiusAxis(); + this._angleAxis = new AngleAxis(); + this.axisPointerEnabled = true; + this.name = name || ''; + this._radiusAxis.polar = this._angleAxis.polar = this; + } + /** + * If contain coord + */ + + + Polar.prototype.containPoint = function (point) { + var coord = this.pointToCoord(point); + return this._radiusAxis.contain(coord[0]) && this._angleAxis.contain(coord[1]); + }; + /** + * If contain data + */ + + + Polar.prototype.containData = function (data) { + return this._radiusAxis.containData(data[0]) && this._angleAxis.containData(data[1]); + }; + + Polar.prototype.getAxis = function (dim) { + var key = '_' + dim + 'Axis'; + return this[key]; + }; + + Polar.prototype.getAxes = function () { + return [this._radiusAxis, this._angleAxis]; + }; + /** + * Get axes by type of scale + */ + + + Polar.prototype.getAxesByScale = function (scaleType) { + var axes = []; + var angleAxis = this._angleAxis; + var radiusAxis = this._radiusAxis; + angleAxis.scale.type === scaleType && axes.push(angleAxis); + radiusAxis.scale.type === scaleType && axes.push(radiusAxis); + return axes; + }; + + Polar.prototype.getAngleAxis = function () { + return this._angleAxis; + }; + + Polar.prototype.getRadiusAxis = function () { + return this._radiusAxis; + }; + + Polar.prototype.getOtherAxis = function (axis) { + var angleAxis = this._angleAxis; + return axis === angleAxis ? this._radiusAxis : angleAxis; + }; + /** + * Base axis will be used on stacking. + * + */ + + + Polar.prototype.getBaseAxis = function () { + return this.getAxesByScale('ordinal')[0] || this.getAxesByScale('time')[0] || this.getAngleAxis(); + }; + + Polar.prototype.getTooltipAxes = function (dim) { + var baseAxis = dim != null && dim !== 'auto' ? this.getAxis(dim) : this.getBaseAxis(); + return { + baseAxes: [baseAxis], + otherAxes: [this.getOtherAxis(baseAxis)] + }; + }; + /** + * Convert a single data item to (x, y) point. + * Parameter data is an array which the first element is radius and the second is angle + */ + + + Polar.prototype.dataToPoint = function (data, clamp) { + return this.coordToPoint([this._radiusAxis.dataToRadius(data[0], clamp), this._angleAxis.dataToAngle(data[1], clamp)]); + }; + /** + * Convert a (x, y) point to data + */ + + + Polar.prototype.pointToData = function (point, clamp) { + var coord = this.pointToCoord(point); + return [this._radiusAxis.radiusToData(coord[0], clamp), this._angleAxis.angleToData(coord[1], clamp)]; + }; + /** + * Convert a (x, y) point to (radius, angle) coord + */ + + + Polar.prototype.pointToCoord = function (point) { + var dx = point[0] - this.cx; + var dy = point[1] - this.cy; + var angleAxis = this.getAngleAxis(); + var extent = angleAxis.getExtent(); + var minAngle = Math.min(extent[0], extent[1]); + var maxAngle = Math.max(extent[0], extent[1]); // Fix fixed extent in polarCreator + // FIXME + + angleAxis.inverse ? minAngle = maxAngle - 360 : maxAngle = minAngle + 360; + var radius = Math.sqrt(dx * dx + dy * dy); + dx /= radius; + dy /= radius; + var radian = Math.atan2(-dy, dx) / Math.PI * 180; // move to angleExtent + + var dir = radian < minAngle ? 1 : -1; + + while (radian < minAngle || radian > maxAngle) { + radian += dir * 360; + } + + return [radius, radian]; + }; + /** + * Convert a (radius, angle) coord to (x, y) point + */ + + + Polar.prototype.coordToPoint = function (coord) { + var radius = coord[0]; + var radian = coord[1] / 180 * Math.PI; + var x = Math.cos(radian) * radius + this.cx; // Inverse the y + + var y = -Math.sin(radian) * radius + this.cy; + return [x, y]; + }; + /** + * Get ring area of cartesian. + * Area will have a contain function to determine if a point is in the coordinate system. + */ + + + Polar.prototype.getArea = function () { + var angleAxis = this.getAngleAxis(); + var radiusAxis = this.getRadiusAxis(); + var radiusExtent = radiusAxis.getExtent().slice(); + radiusExtent[0] > radiusExtent[1] && radiusExtent.reverse(); + var angleExtent = angleAxis.getExtent(); + var RADIAN = Math.PI / 180; + return { + cx: this.cx, + cy: this.cy, + r0: radiusExtent[0], + r: radiusExtent[1], + startAngle: -angleExtent[0] * RADIAN, + endAngle: -angleExtent[1] * RADIAN, + clockwise: angleAxis.inverse, + contain: function (x, y) { + // It's a ring shape. + // Start angle and end angle don't matter + var dx = x - this.cx; + var dy = y - this.cy; // minus a tiny value 1e-4 to avoid being clipped unexpectedly + + var d2 = dx * dx + dy * dy - 1e-4; + var r = this.r; + var r0 = this.r0; + return d2 <= r * r && d2 >= r0 * r0; + } + }; + }; + + Polar.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys$2(finder); + return coordSys === this ? this.dataToPoint(value) : null; + }; + + Polar.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys$2(finder); + return coordSys === this ? this.pointToData(pixel) : null; + }; + + return Polar; + }(); + + function getCoordSys$2(finder) { + var seriesModel = finder.seriesModel; + var polarModel = finder.polarModel; + return polarModel && polarModel.coordinateSystem || seriesModel && seriesModel.coordinateSystem; + } + + /** + * Resize method bound to the polar + */ + + function resizePolar(polar, polarModel, api) { + var center = polarModel.get('center'); + var width = api.getWidth(); + var height = api.getHeight(); + polar.cx = parsePercent$1(center[0], width); + polar.cy = parsePercent$1(center[1], height); + var radiusAxis = polar.getRadiusAxis(); + var size = Math.min(width, height) / 2; + var radius = polarModel.get('radius'); + + if (radius == null) { + radius = [0, '100%']; + } else if (!isArray(radius)) { + // r0 = 0 + radius = [0, radius]; + } + + var parsedRadius = [parsePercent$1(radius[0], size), parsePercent$1(radius[1], size)]; + radiusAxis.inverse ? radiusAxis.setExtent(parsedRadius[1], parsedRadius[0]) : radiusAxis.setExtent(parsedRadius[0], parsedRadius[1]); + } + /** + * Update polar + */ + + + function updatePolarScale(ecModel, api) { + var polar = this; + var angleAxis = polar.getAngleAxis(); + var radiusAxis = polar.getRadiusAxis(); // Reset scale + + angleAxis.scale.setExtent(Infinity, -Infinity); + radiusAxis.scale.setExtent(Infinity, -Infinity); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.coordinateSystem === polar) { + var data_1 = seriesModel.getData(); + each(getDataDimensionsOnAxis(data_1, 'radius'), function (dim) { + radiusAxis.scale.unionExtentFromData(data_1, dim); + }); + each(getDataDimensionsOnAxis(data_1, 'angle'), function (dim) { + angleAxis.scale.unionExtentFromData(data_1, dim); + }); + } + }); + niceScaleExtent(angleAxis.scale, angleAxis.model); + niceScaleExtent(radiusAxis.scale, radiusAxis.model); // Fix extent of category angle axis + + if (angleAxis.type === 'category' && !angleAxis.onBand) { + var extent = angleAxis.getExtent(); + var diff = 360 / angleAxis.scale.count(); + angleAxis.inverse ? extent[1] += diff : extent[1] -= diff; + angleAxis.setExtent(extent[0], extent[1]); + } + } + + function isAngleAxisModel(axisModel) { + return axisModel.mainType === 'angleAxis'; + } + /** + * Set common axis properties + */ + + + function setAxis(axis, axisModel) { + axis.type = axisModel.get('type'); + axis.scale = createScaleByModel(axisModel); + axis.onBand = axisModel.get('boundaryGap') && axis.type === 'category'; + axis.inverse = axisModel.get('inverse'); + + if (isAngleAxisModel(axisModel)) { + axis.inverse = axis.inverse !== axisModel.get('clockwise'); + var startAngle = axisModel.get('startAngle'); + axis.setExtent(startAngle, startAngle + (axis.inverse ? -360 : 360)); + } // Inject axis instance + + + axisModel.axis = axis; + axis.model = axisModel; + } + + var polarCreator = { + dimensions: polarDimensions, + create: function (ecModel, api) { + var polarList = []; + ecModel.eachComponent('polar', function (polarModel, idx) { + var polar = new Polar(idx + ''); // Inject resize and update method + + polar.update = updatePolarScale; + var radiusAxis = polar.getRadiusAxis(); + var angleAxis = polar.getAngleAxis(); + var radiusAxisModel = polarModel.findAxisModel('radiusAxis'); + var angleAxisModel = polarModel.findAxisModel('angleAxis'); + setAxis(radiusAxis, radiusAxisModel); + setAxis(angleAxis, angleAxisModel); + resizePolar(polar, polarModel, api); + polarList.push(polar); + polarModel.coordinateSystem = polar; + polar.model = polarModel; + }); // Inject coordinateSystem to series + + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'polar') { + var polarModel = seriesModel.getReferringComponents('polar', SINGLE_REFERRING).models[0]; + + if ("development" !== 'production') { + if (!polarModel) { + throw new Error('Polar "' + retrieve(seriesModel.get('polarIndex'), seriesModel.get('polarId'), 0) + '" not found'); + } + } + + seriesModel.coordinateSystem = polarModel.coordinateSystem; + } + }); + return polarList; + } + }; + + var elementList$1 = ['axisLine', 'axisLabel', 'axisTick', 'minorTick', 'splitLine', 'minorSplitLine', 'splitArea']; + + function getAxisLineShape(polar, rExtent, angle) { + rExtent[1] > rExtent[0] && (rExtent = rExtent.slice().reverse()); + var start = polar.coordToPoint([rExtent[0], angle]); + var end = polar.coordToPoint([rExtent[1], angle]); + return { + x1: start[0], + y1: start[1], + x2: end[0], + y2: end[1] + }; + } + + function getRadiusIdx(polar) { + var radiusAxis = polar.getRadiusAxis(); + return radiusAxis.inverse ? 0 : 1; + } // Remove the last tick which will overlap the first tick + + + function fixAngleOverlap(list) { + var firstItem = list[0]; + var lastItem = list[list.length - 1]; + + if (firstItem && lastItem && Math.abs(Math.abs(firstItem.coord - lastItem.coord) - 360) < 1e-4) { + list.pop(); + } + } + + var AngleAxisView = + /** @class */ + function (_super) { + __extends(AngleAxisView, _super); + + function AngleAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AngleAxisView.type; + _this.axisPointerClass = 'PolarAxisPointer'; + return _this; + } + + AngleAxisView.prototype.render = function (angleAxisModel, ecModel) { + this.group.removeAll(); + + if (!angleAxisModel.get('show')) { + return; + } + + var angleAxis = angleAxisModel.axis; + var polar = angleAxis.polar; + var radiusExtent = polar.getRadiusAxis().getExtent(); + var ticksAngles = angleAxis.getTicksCoords(); + var minorTickAngles = angleAxis.getMinorTicksCoords(); + var labels = map(angleAxis.getViewLabels(), function (labelItem) { + labelItem = clone(labelItem); + var scale = angleAxis.scale; + var tickValue = scale.type === 'ordinal' ? scale.getRawOrdinalNumber(labelItem.tickValue) : labelItem.tickValue; + labelItem.coord = angleAxis.dataToCoord(tickValue); + return labelItem; + }); + fixAngleOverlap(labels); + fixAngleOverlap(ticksAngles); + each(elementList$1, function (name) { + if (angleAxisModel.get([name, 'show']) && (!angleAxis.scale.isBlank() || name === 'axisLine')) { + angelAxisElementsBuilders[name](this.group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels); + } + }, this); + }; + + AngleAxisView.type = 'angleAxis'; + return AngleAxisView; + }(AxisView); + + var angelAxisElementsBuilders = { + axisLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + var lineStyleModel = angleAxisModel.getModel(['axisLine', 'lineStyle']); // extent id of the axis radius (r0 and r) + + var rId = getRadiusIdx(polar); + var r0Id = rId ? 0 : 1; + var shape; + + if (radiusExtent[r0Id] === 0) { + shape = new Circle({ + shape: { + cx: polar.cx, + cy: polar.cy, + r: radiusExtent[rId] + }, + style: lineStyleModel.getLineStyle(), + z2: 1, + silent: true + }); + } else { + shape = new Ring({ + shape: { + cx: polar.cx, + cy: polar.cy, + r: radiusExtent[rId], + r0: radiusExtent[r0Id] + }, + style: lineStyleModel.getLineStyle(), + z2: 1, + silent: true + }); + } + + shape.style.fill = null; + group.add(shape); + }, + axisTick: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + var tickModel = angleAxisModel.getModel('axisTick'); + var tickLen = (tickModel.get('inside') ? -1 : 1) * tickModel.get('length'); + var radius = radiusExtent[getRadiusIdx(polar)]; + var lines = map(ticksAngles, function (tickAngleItem) { + return new Line({ + shape: getAxisLineShape(polar, [radius, radius + tickLen], tickAngleItem.coord) + }); + }); + group.add(mergePath$1(lines, { + style: defaults(tickModel.getModel('lineStyle').getLineStyle(), { + stroke: angleAxisModel.get(['axisLine', 'lineStyle', 'color']) + }) + })); + }, + minorTick: function (group, angleAxisModel, polar, tickAngles, minorTickAngles, radiusExtent) { + if (!minorTickAngles.length) { + return; + } + + var tickModel = angleAxisModel.getModel('axisTick'); + var minorTickModel = angleAxisModel.getModel('minorTick'); + var tickLen = (tickModel.get('inside') ? -1 : 1) * minorTickModel.get('length'); + var radius = radiusExtent[getRadiusIdx(polar)]; + var lines = []; + + for (var i = 0; i < minorTickAngles.length; i++) { + for (var k = 0; k < minorTickAngles[i].length; k++) { + lines.push(new Line({ + shape: getAxisLineShape(polar, [radius, radius + tickLen], minorTickAngles[i][k].coord) + })); + } + } + + group.add(mergePath$1(lines, { + style: defaults(minorTickModel.getModel('lineStyle').getLineStyle(), defaults(tickModel.getLineStyle(), { + stroke: angleAxisModel.get(['axisLine', 'lineStyle', 'color']) + })) + })); + }, + axisLabel: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels) { + var rawCategoryData = angleAxisModel.getCategories(true); + var commonLabelModel = angleAxisModel.getModel('axisLabel'); + var labelMargin = commonLabelModel.get('margin'); + var triggerEvent = angleAxisModel.get('triggerEvent'); // Use length of ticksAngles because it may remove the last tick to avoid overlapping + + each(labels, function (labelItem, idx) { + var labelModel = commonLabelModel; + var tickValue = labelItem.tickValue; + var r = radiusExtent[getRadiusIdx(polar)]; + var p = polar.coordToPoint([r + labelMargin, labelItem.coord]); + var cx = polar.cx; + var cy = polar.cy; + var labelTextAlign = Math.abs(p[0] - cx) / r < 0.3 ? 'center' : p[0] > cx ? 'left' : 'right'; + var labelTextVerticalAlign = Math.abs(p[1] - cy) / r < 0.3 ? 'middle' : p[1] > cy ? 'top' : 'bottom'; + + if (rawCategoryData && rawCategoryData[tickValue]) { + var rawCategoryItem = rawCategoryData[tickValue]; + + if (isObject(rawCategoryItem) && rawCategoryItem.textStyle) { + labelModel = new Model(rawCategoryItem.textStyle, commonLabelModel, commonLabelModel.ecModel); + } + } + + var textEl = new ZRText({ + silent: AxisBuilder.isLabelSilent(angleAxisModel), + style: createTextStyle(labelModel, { + x: p[0], + y: p[1], + fill: labelModel.getTextColor() || angleAxisModel.get(['axisLine', 'lineStyle', 'color']), + text: labelItem.formattedLabel, + align: labelTextAlign, + verticalAlign: labelTextVerticalAlign + }) + }); + group.add(textEl); // Pack data for mouse event + + if (triggerEvent) { + var eventData = AxisBuilder.makeAxisEventDataBase(angleAxisModel); + eventData.targetType = 'axisLabel'; + eventData.value = labelItem.rawLabel; + getECData(textEl).eventData = eventData; + } + }, this); + }, + splitLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + var splitLineModel = angleAxisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + var lineCount = 0; + lineColors = lineColors instanceof Array ? lineColors : [lineColors]; + var splitLines = []; + + for (var i = 0; i < ticksAngles.length; i++) { + var colorIndex = lineCount++ % lineColors.length; + splitLines[colorIndex] = splitLines[colorIndex] || []; + splitLines[colorIndex].push(new Line({ + shape: getAxisLineShape(polar, radiusExtent, ticksAngles[i].coord) + })); + } // Simple optimization + // Batching the lines if color are the same + + + for (var i = 0; i < splitLines.length; i++) { + group.add(mergePath$1(splitLines[i], { + style: defaults({ + stroke: lineColors[i % lineColors.length] + }, lineStyleModel.getLineStyle()), + silent: true, + z: angleAxisModel.get('z') + })); + } + }, + minorSplitLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + if (!minorTickAngles.length) { + return; + } + + var minorSplitLineModel = angleAxisModel.getModel('minorSplitLine'); + var lineStyleModel = minorSplitLineModel.getModel('lineStyle'); + var lines = []; + + for (var i = 0; i < minorTickAngles.length; i++) { + for (var k = 0; k < minorTickAngles[i].length; k++) { + lines.push(new Line({ + shape: getAxisLineShape(polar, radiusExtent, minorTickAngles[i][k].coord) + })); + } + } + + group.add(mergePath$1(lines, { + style: lineStyleModel.getLineStyle(), + silent: true, + z: angleAxisModel.get('z') + })); + }, + splitArea: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + if (!ticksAngles.length) { + return; + } + + var splitAreaModel = angleAxisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + var lineCount = 0; + areaColors = areaColors instanceof Array ? areaColors : [areaColors]; + var splitAreas = []; + var RADIAN = Math.PI / 180; + var prevAngle = -ticksAngles[0].coord * RADIAN; + var r0 = Math.min(radiusExtent[0], radiusExtent[1]); + var r1 = Math.max(radiusExtent[0], radiusExtent[1]); + var clockwise = angleAxisModel.get('clockwise'); + + for (var i = 1, len = ticksAngles.length; i <= len; i++) { + var coord = i === len ? ticksAngles[0].coord : ticksAngles[i].coord; + var colorIndex = lineCount++ % areaColors.length; + splitAreas[colorIndex] = splitAreas[colorIndex] || []; + splitAreas[colorIndex].push(new Sector({ + shape: { + cx: polar.cx, + cy: polar.cy, + r0: r0, + r: r1, + startAngle: prevAngle, + endAngle: -coord * RADIAN, + clockwise: clockwise + }, + silent: true + })); + prevAngle = -coord * RADIAN; + } // Simple optimization + // Batching the lines if color are the same + + + for (var i = 0; i < splitAreas.length; i++) { + group.add(mergePath$1(splitAreas[i], { + style: defaults({ + fill: areaColors[i % areaColors.length] + }, areaStyleModel.getAreaStyle()), + silent: true + })); + } + } + }; + + var axisBuilderAttrs$2 = ['axisLine', 'axisTickLabel', 'axisName']; + var selfBuilderAttrs$1 = ['splitLine', 'splitArea', 'minorSplitLine']; + + var RadiusAxisView = + /** @class */ + function (_super) { + __extends(RadiusAxisView, _super); + + function RadiusAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadiusAxisView.type; + _this.axisPointerClass = 'PolarAxisPointer'; + return _this; + } + + RadiusAxisView.prototype.render = function (radiusAxisModel, ecModel) { + this.group.removeAll(); + + if (!radiusAxisModel.get('show')) { + return; + } + + var oldAxisGroup = this._axisGroup; + var newAxisGroup = this._axisGroup = new Group(); + this.group.add(newAxisGroup); + var radiusAxis = radiusAxisModel.axis; + var polar = radiusAxis.polar; + var angleAxis = polar.getAngleAxis(); + var ticksCoords = radiusAxis.getTicksCoords(); + var minorTicksCoords = radiusAxis.getMinorTicksCoords(); + var axisAngle = angleAxis.getExtent()[0]; + var radiusExtent = radiusAxis.getExtent(); + var layout = layoutAxis(polar, radiusAxisModel, axisAngle); + var axisBuilder = new AxisBuilder(radiusAxisModel, layout); + each(axisBuilderAttrs$2, axisBuilder.add, axisBuilder); + newAxisGroup.add(axisBuilder.getGroup()); + groupTransition(oldAxisGroup, newAxisGroup, radiusAxisModel); + each(selfBuilderAttrs$1, function (name) { + if (radiusAxisModel.get([name, 'show']) && !radiusAxis.scale.isBlank()) { + axisElementBuilders$1[name](this.group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords, minorTicksCoords); + } + }, this); + }; + + RadiusAxisView.type = 'radiusAxis'; + return RadiusAxisView; + }(AxisView); + + var axisElementBuilders$1 = { + splitLine: function (group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) { + var splitLineModel = radiusAxisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + var lineCount = 0; + lineColors = lineColors instanceof Array ? lineColors : [lineColors]; + var splitLines = []; + + for (var i = 0; i < ticksCoords.length; i++) { + var colorIndex = lineCount++ % lineColors.length; + splitLines[colorIndex] = splitLines[colorIndex] || []; + splitLines[colorIndex].push(new Circle({ + shape: { + cx: polar.cx, + cy: polar.cy, + // ensure circle radius >= 0 + r: Math.max(ticksCoords[i].coord, 0) + } + })); + } // Simple optimization + // Batching the lines if color are the same + + + for (var i = 0; i < splitLines.length; i++) { + group.add(mergePath$1(splitLines[i], { + style: defaults({ + stroke: lineColors[i % lineColors.length], + fill: null + }, lineStyleModel.getLineStyle()), + silent: true + })); + } + }, + minorSplitLine: function (group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords, minorTicksCoords) { + if (!minorTicksCoords.length) { + return; + } + + var minorSplitLineModel = radiusAxisModel.getModel('minorSplitLine'); + var lineStyleModel = minorSplitLineModel.getModel('lineStyle'); + var lines = []; + + for (var i = 0; i < minorTicksCoords.length; i++) { + for (var k = 0; k < minorTicksCoords[i].length; k++) { + lines.push(new Circle({ + shape: { + cx: polar.cx, + cy: polar.cy, + r: minorTicksCoords[i][k].coord + } + })); + } + } + + group.add(mergePath$1(lines, { + style: defaults({ + fill: null + }, lineStyleModel.getLineStyle()), + silent: true + })); + }, + splitArea: function (group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) { + if (!ticksCoords.length) { + return; + } + + var splitAreaModel = radiusAxisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + var lineCount = 0; + areaColors = areaColors instanceof Array ? areaColors : [areaColors]; + var splitAreas = []; + var prevRadius = ticksCoords[0].coord; + + for (var i = 1; i < ticksCoords.length; i++) { + var colorIndex = lineCount++ % areaColors.length; + splitAreas[colorIndex] = splitAreas[colorIndex] || []; + splitAreas[colorIndex].push(new Sector({ + shape: { + cx: polar.cx, + cy: polar.cy, + r0: prevRadius, + r: ticksCoords[i].coord, + startAngle: 0, + endAngle: Math.PI * 2 + }, + silent: true + })); + prevRadius = ticksCoords[i].coord; + } // Simple optimization + // Batching the lines if color are the same + + + for (var i = 0; i < splitAreas.length; i++) { + group.add(mergePath$1(splitAreas[i], { + style: defaults({ + fill: areaColors[i % areaColors.length] + }, areaStyleModel.getAreaStyle()), + silent: true + })); + } + } + }; + /** + * @inner + */ + + function layoutAxis(polar, radiusAxisModel, axisAngle) { + return { + position: [polar.cx, polar.cy], + rotation: axisAngle / 180 * Math.PI, + labelDirection: -1, + tickDirection: -1, + nameDirection: 1, + labelRotate: radiusAxisModel.getModel('axisLabel').get('rotate'), + // Over splitLine and splitArea + z2: 1 + }; + } + + function getSeriesStackId$1(seriesModel) { + return seriesModel.get('stack') || '__ec_stack_' + seriesModel.seriesIndex; + } + + function getAxisKey$1(polar, axis) { + return axis.dim + polar.model.componentIndex; + } + + function barLayoutPolar(seriesType, ecModel, api) { + var lastStackCoords = {}; + var barWidthAndOffset = calRadialBar(filter(ecModel.getSeriesByType(seriesType), function (seriesModel) { + return !ecModel.isSeriesFiltered(seriesModel) && seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'polar'; + })); + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + // Check series coordinate, do layout for polar only + if (seriesModel.coordinateSystem.type !== 'polar') { + return; + } + + var data = seriesModel.getData(); + var polar = seriesModel.coordinateSystem; + var baseAxis = polar.getBaseAxis(); + var axisKey = getAxisKey$1(polar, baseAxis); + var stackId = getSeriesStackId$1(seriesModel); + var columnLayoutInfo = barWidthAndOffset[axisKey][stackId]; + var columnOffset = columnLayoutInfo.offset; + var columnWidth = columnLayoutInfo.width; + var valueAxis = polar.getOtherAxis(baseAxis); + var cx = seriesModel.coordinateSystem.cx; + var cy = seriesModel.coordinateSystem.cy; + var barMinHeight = seriesModel.get('barMinHeight') || 0; + var barMinAngle = seriesModel.get('barMinAngle') || 0; + lastStackCoords[stackId] = lastStackCoords[stackId] || []; + var valueDim = data.mapDimension(valueAxis.dim); + var baseDim = data.mapDimension(baseAxis.dim); + var stacked = isDimensionStacked(data, valueDim + /*, baseDim*/ + ); + var clampLayout = baseAxis.dim !== 'radius' || !seriesModel.get('roundCap', true); + var valueAxisStart = valueAxis.dataToCoord(0); + + for (var idx = 0, len = data.count(); idx < len; idx++) { + var value = data.get(valueDim, idx); + var baseValue = data.get(baseDim, idx); + var sign = value >= 0 ? 'p' : 'n'; + var baseCoord = valueAxisStart; // Because of the barMinHeight, we can not use the value in + // stackResultDimension directly. + // Only ordinal axis can be stacked. + + if (stacked) { + if (!lastStackCoords[stackId][baseValue]) { + lastStackCoords[stackId][baseValue] = { + p: valueAxisStart, + n: valueAxisStart // Negative stack + + }; + } // Should also consider #4243 + + + baseCoord = lastStackCoords[stackId][baseValue][sign]; + } + + var r0 = void 0; + var r = void 0; + var startAngle = void 0; + var endAngle = void 0; // radial sector + + if (valueAxis.dim === 'radius') { + var radiusSpan = valueAxis.dataToCoord(value) - valueAxisStart; + var angle = baseAxis.dataToCoord(baseValue); + + if (Math.abs(radiusSpan) < barMinHeight) { + radiusSpan = (radiusSpan < 0 ? -1 : 1) * barMinHeight; + } + + r0 = baseCoord; + r = baseCoord + radiusSpan; + startAngle = angle - columnOffset; + endAngle = startAngle - columnWidth; + stacked && (lastStackCoords[stackId][baseValue][sign] = r); + } // tangential sector + else { + var angleSpan = valueAxis.dataToCoord(value, clampLayout) - valueAxisStart; + var radius = baseAxis.dataToCoord(baseValue); + + if (Math.abs(angleSpan) < barMinAngle) { + angleSpan = (angleSpan < 0 ? -1 : 1) * barMinAngle; + } + + r0 = radius + columnOffset; + r = r0 + columnWidth; + startAngle = baseCoord; + endAngle = baseCoord + angleSpan; // if the previous stack is at the end of the ring, + // add a round to differentiate it from origin + // let extent = angleAxis.getExtent(); + // let stackCoord = angle; + // if (stackCoord === extent[0] && value > 0) { + // stackCoord = extent[1]; + // } + // else if (stackCoord === extent[1] && value < 0) { + // stackCoord = extent[0]; + // } + + stacked && (lastStackCoords[stackId][baseValue][sign] = endAngle); + } + + data.setItemLayout(idx, { + cx: cx, + cy: cy, + r0: r0, + r: r, + // Consider that positive angle is anti-clockwise, + // while positive radian of sector is clockwise + startAngle: -startAngle * Math.PI / 180, + endAngle: -endAngle * Math.PI / 180, + + /** + * Keep the same logic with bar in catesion: use end value to + * control direction. Notice that if clockwise is true (by + * default), the sector will always draw clockwisely, no matter + * whether endAngle is greater or less than startAngle. + */ + clockwise: startAngle >= endAngle + }); + } + }); + } + /** + * Calculate bar width and offset for radial bar charts + */ + + + function calRadialBar(barSeries) { + // Columns info on each category axis. Key is polar name + var columnsMap = {}; + each(barSeries, function (seriesModel, idx) { + var data = seriesModel.getData(); + var polar = seriesModel.coordinateSystem; + var baseAxis = polar.getBaseAxis(); + var axisKey = getAxisKey$1(polar, baseAxis); + var axisExtent = baseAxis.getExtent(); + var bandWidth = baseAxis.type === 'category' ? baseAxis.getBandWidth() : Math.abs(axisExtent[1] - axisExtent[0]) / data.count(); + var columnsOnAxis = columnsMap[axisKey] || { + bandWidth: bandWidth, + remainedWidth: bandWidth, + autoWidthCount: 0, + categoryGap: '20%', + gap: '30%', + stacks: {} + }; + var stacks = columnsOnAxis.stacks; + columnsMap[axisKey] = columnsOnAxis; + var stackId = getSeriesStackId$1(seriesModel); + + if (!stacks[stackId]) { + columnsOnAxis.autoWidthCount++; + } + + stacks[stackId] = stacks[stackId] || { + width: 0, + maxWidth: 0 + }; + var barWidth = parsePercent$1(seriesModel.get('barWidth'), bandWidth); + var barMaxWidth = parsePercent$1(seriesModel.get('barMaxWidth'), bandWidth); + var barGap = seriesModel.get('barGap'); + var barCategoryGap = seriesModel.get('barCategoryGap'); + + if (barWidth && !stacks[stackId].width) { + barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth); + stacks[stackId].width = barWidth; + columnsOnAxis.remainedWidth -= barWidth; + } + + barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth); + barGap != null && (columnsOnAxis.gap = barGap); + barCategoryGap != null && (columnsOnAxis.categoryGap = barCategoryGap); + }); + var result = {}; + each(columnsMap, function (columnsOnAxis, coordSysName) { + result[coordSysName] = {}; + var stacks = columnsOnAxis.stacks; + var bandWidth = columnsOnAxis.bandWidth; + var categoryGap = parsePercent$1(columnsOnAxis.categoryGap, bandWidth); + var barGapPercent = parsePercent$1(columnsOnAxis.gap, 1); + var remainedWidth = columnsOnAxis.remainedWidth; + var autoWidthCount = columnsOnAxis.autoWidthCount; + var autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); // Find if any auto calculated bar exceeded maxBarWidth + + each(stacks, function (column, stack) { + var maxWidth = column.maxWidth; + + if (maxWidth && maxWidth < autoWidth) { + maxWidth = Math.min(maxWidth, remainedWidth); + + if (column.width) { + maxWidth = Math.min(maxWidth, column.width); + } + + remainedWidth -= maxWidth; + column.width = maxWidth; + autoWidthCount--; + } + }); // Recalculate width again + + autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + var widthSum = 0; + var lastColumn; + each(stacks, function (column, idx) { + if (!column.width) { + column.width = autoWidth; + } + + lastColumn = column; + widthSum += column.width * (1 + barGapPercent); + }); + + if (lastColumn) { + widthSum -= lastColumn.width * barGapPercent; + } + + var offset = -widthSum / 2; + each(stacks, function (column, stackId) { + result[coordSysName][stackId] = result[coordSysName][stackId] || { + offset: offset, + width: column.width + }; + offset += column.width * (1 + barGapPercent); + }); + }); + return result; + } + + var angleAxisExtraOption = { + startAngle: 90, + clockwise: true, + splitNumber: 12, + axisLabel: { + rotate: 0 + } + }; + var radiusAxisExtraOption = { + splitNumber: 5 + }; + + var PolarView = + /** @class */ + function (_super) { + __extends(PolarView, _super); + + function PolarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PolarView.type; + return _this; + } + + PolarView.type = 'polar'; + return PolarView; + }(ComponentView); + + function install$u(registers) { + use(install$s); + AxisView.registerAxisPointerClass('PolarAxisPointer', PolarAxisPointer); + registers.registerCoordinateSystem('polar', polarCreator); + registers.registerComponentModel(PolarModel); + registers.registerComponentView(PolarView); // Model and view for angleAxis and radiusAxis + + axisModelCreator(registers, 'angle', AngleAxisModel, angleAxisExtraOption); + axisModelCreator(registers, 'radius', RadiusAxisModel, radiusAxisExtraOption); + registers.registerComponentView(AngleAxisView); + registers.registerComponentView(RadiusAxisView); + registers.registerLayout(curry(barLayoutPolar, 'bar')); + } + + function layout$2(axisModel, opt) { + opt = opt || {}; + var single = axisModel.coordinateSystem; + var axis = axisModel.axis; + var layout = {}; + var axisPosition = axis.position; + var orient = axis.orient; + var rect = single.getRect(); + var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height]; + var positionMap = { + horizontal: { + top: rectBound[2], + bottom: rectBound[3] + }, + vertical: { + left: rectBound[0], + right: rectBound[1] + } + }; + layout.position = [orient === 'vertical' ? positionMap.vertical[axisPosition] : rectBound[0], orient === 'horizontal' ? positionMap.horizontal[axisPosition] : rectBound[3]]; + var r = { + horizontal: 0, + vertical: 1 + }; + layout.rotation = Math.PI / 2 * r[orient]; + var directionMap = { + top: -1, + bottom: 1, + right: 1, + left: -1 + }; + layout.labelDirection = layout.tickDirection = layout.nameDirection = directionMap[axisPosition]; + + if (axisModel.get(['axisTick', 'inside'])) { + layout.tickDirection = -layout.tickDirection; + } + + if (retrieve(opt.labelInside, axisModel.get(['axisLabel', 'inside']))) { + layout.labelDirection = -layout.labelDirection; + } + + var labelRotation = opt.rotate; + labelRotation == null && (labelRotation = axisModel.get(['axisLabel', 'rotate'])); + layout.labelRotation = axisPosition === 'top' ? -labelRotation : labelRotation; + layout.z2 = 1; + return layout; + } + + var axisBuilderAttrs$3 = ['axisLine', 'axisTickLabel', 'axisName']; + var selfBuilderAttrs$2 = ['splitArea', 'splitLine']; + + var SingleAxisView = + /** @class */ + function (_super) { + __extends(SingleAxisView, _super); + + function SingleAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SingleAxisView.type; + _this.axisPointerClass = 'SingleAxisPointer'; + return _this; + } + + SingleAxisView.prototype.render = function (axisModel, ecModel, api, payload) { + var group = this.group; + group.removeAll(); + var oldAxisGroup = this._axisGroup; + this._axisGroup = new Group(); + var layout = layout$2(axisModel); + var axisBuilder = new AxisBuilder(axisModel, layout); + each(axisBuilderAttrs$3, axisBuilder.add, axisBuilder); + group.add(this._axisGroup); + group.add(axisBuilder.getGroup()); + each(selfBuilderAttrs$2, function (name) { + if (axisModel.get([name, 'show'])) { + axisElementBuilders$2[name](this, this.group, this._axisGroup, axisModel); + } + }, this); + groupTransition(oldAxisGroup, this._axisGroup, axisModel); + + _super.prototype.render.call(this, axisModel, ecModel, api, payload); + }; + + SingleAxisView.prototype.remove = function () { + rectCoordAxisHandleRemove(this); + }; + + SingleAxisView.type = 'singleAxis'; + return SingleAxisView; + }(AxisView); + + var axisElementBuilders$2 = { + splitLine: function (axisView, group, axisGroup, axisModel) { + var axis = axisModel.axis; + + if (axis.scale.isBlank()) { + return; + } + + var splitLineModel = axisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + lineColors = lineColors instanceof Array ? lineColors : [lineColors]; + var gridRect = axisModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + var splitLines = []; + var lineCount = 0; + var ticksCoords = axis.getTicksCoords({ + tickModel: splitLineModel + }); + var p1 = []; + var p2 = []; + + for (var i = 0; i < ticksCoords.length; ++i) { + var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); + + if (isHorizontal) { + p1[0] = tickCoord; + p1[1] = gridRect.y; + p2[0] = tickCoord; + p2[1] = gridRect.y + gridRect.height; + } else { + p1[0] = gridRect.x; + p1[1] = tickCoord; + p2[0] = gridRect.x + gridRect.width; + p2[1] = tickCoord; + } + + var colorIndex = lineCount++ % lineColors.length; + splitLines[colorIndex] = splitLines[colorIndex] || []; + splitLines[colorIndex].push(new Line({ + subPixelOptimize: true, + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + silent: true + })); + } + + var lineStyle = lineStyleModel.getLineStyle(['color']); + + for (var i = 0; i < splitLines.length; ++i) { + group.add(mergePath$1(splitLines[i], { + style: defaults({ + stroke: lineColors[i % lineColors.length] + }, lineStyle), + silent: true + })); + } + }, + splitArea: function (axisView, group, axisGroup, axisModel) { + rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, axisModel); + } + }; + + var SingleAxisModel = + /** @class */ + function (_super) { + __extends(SingleAxisModel, _super); + + function SingleAxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SingleAxisModel.type; + return _this; + } + + SingleAxisModel.prototype.getCoordSysModel = function () { + return this; + }; + + SingleAxisModel.type = 'singleAxis'; + SingleAxisModel.layoutMode = 'box'; + SingleAxisModel.defaultOption = { + left: '5%', + top: '5%', + right: '5%', + bottom: '5%', + type: 'value', + position: 'bottom', + orient: 'horizontal', + axisLine: { + show: true, + lineStyle: { + width: 1, + type: 'solid' + } + }, + // Single coordinate system and single axis is the, + // which is used as the parent tooltip model. + // same model, so we set default tooltip show as true. + tooltip: { + show: true + }, + axisTick: { + show: true, + length: 6, + lineStyle: { + width: 1 + } + }, + axisLabel: { + show: true, + interval: 'auto' + }, + splitLine: { + show: true, + lineStyle: { + type: 'dashed', + opacity: 0.2 + } + } + }; + return SingleAxisModel; + }(ComponentModel); + + mixin(SingleAxisModel, AxisModelCommonMixin.prototype); + + var SingleAxis = + /** @class */ + function (_super) { + __extends(SingleAxis, _super); + + function SingleAxis(dim, scale, coordExtent, axisType, position) { + var _this = _super.call(this, dim, scale, coordExtent) || this; + + _this.type = axisType || 'value'; + _this.position = position || 'bottom'; + return _this; + } + /** + * Judge the orient of the axis. + */ + + + SingleAxis.prototype.isHorizontal = function () { + var position = this.position; + return position === 'top' || position === 'bottom'; + }; + + SingleAxis.prototype.pointToData = function (point, clamp) { + return this.coordinateSystem.pointToData(point)[0]; + }; + + return SingleAxis; + }(Axis); + + var singleDimensions = ['single']; + /** + * Create a single coordinates system. + */ + + var Single = + /** @class */ + function () { + function Single(axisModel, ecModel, api) { + this.type = 'single'; + this.dimension = 'single'; + /** + * Add it just for draw tooltip. + */ + + this.dimensions = singleDimensions; + this.axisPointerEnabled = true; + this.model = axisModel; + + this._init(axisModel, ecModel, api); + } + /** + * Initialize single coordinate system. + */ + + + Single.prototype._init = function (axisModel, ecModel, api) { + var dim = this.dimension; + var axis = new SingleAxis(dim, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisModel.get('position')); + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); + axis.orient = axisModel.get('orient'); + axisModel.axis = axis; + axis.model = axisModel; + axis.coordinateSystem = this; + this._axis = axis; + }; + /** + * Update axis scale after data processed + */ + + + Single.prototype.update = function (ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.coordinateSystem === this) { + var data_1 = seriesModel.getData(); + each(data_1.mapDimensionsAll(this.dimension), function (dim) { + this._axis.scale.unionExtentFromData(data_1, dim); + }, this); + niceScaleExtent(this._axis.scale, this._axis.model); + } + }, this); + }; + /** + * Resize the single coordinate system. + */ + + + Single.prototype.resize = function (axisModel, api) { + this._rect = getLayoutRect({ + left: axisModel.get('left'), + top: axisModel.get('top'), + right: axisModel.get('right'), + bottom: axisModel.get('bottom'), + width: axisModel.get('width'), + height: axisModel.get('height') + }, { + width: api.getWidth(), + height: api.getHeight() + }); + + this._adjustAxis(); + }; + + Single.prototype.getRect = function () { + return this._rect; + }; + + Single.prototype._adjustAxis = function () { + var rect = this._rect; + var axis = this._axis; + var isHorizontal = axis.isHorizontal(); + var extent = isHorizontal ? [0, rect.width] : [0, rect.height]; + var idx = axis.reverse ? 1 : 0; + axis.setExtent(extent[idx], extent[1 - idx]); + + this._updateAxisTransform(axis, isHorizontal ? rect.x : rect.y); + }; + + Single.prototype._updateAxisTransform = function (axis, coordBase) { + var axisExtent = axis.getExtent(); + var extentSum = axisExtent[0] + axisExtent[1]; + var isHorizontal = axis.isHorizontal(); + axis.toGlobalCoord = isHorizontal ? function (coord) { + return coord + coordBase; + } : function (coord) { + return extentSum - coord + coordBase; + }; + axis.toLocalCoord = isHorizontal ? function (coord) { + return coord - coordBase; + } : function (coord) { + return extentSum - coord + coordBase; + }; + }; + /** + * Get axis. + */ + + + Single.prototype.getAxis = function () { + return this._axis; + }; + /** + * Get axis, add it just for draw tooltip. + */ + + + Single.prototype.getBaseAxis = function () { + return this._axis; + }; + + Single.prototype.getAxes = function () { + return [this._axis]; + }; + + Single.prototype.getTooltipAxes = function () { + return { + baseAxes: [this.getAxis()], + // Empty otherAxes + otherAxes: [] + }; + }; + /** + * If contain point. + */ + + + Single.prototype.containPoint = function (point) { + var rect = this.getRect(); + var axis = this.getAxis(); + var orient = axis.orient; + + if (orient === 'horizontal') { + return axis.contain(axis.toLocalCoord(point[0])) && point[1] >= rect.y && point[1] <= rect.y + rect.height; + } else { + return axis.contain(axis.toLocalCoord(point[1])) && point[0] >= rect.y && point[0] <= rect.y + rect.height; + } + }; + + Single.prototype.pointToData = function (point) { + var axis = this.getAxis(); + return [axis.coordToData(axis.toLocalCoord(point[axis.orient === 'horizontal' ? 0 : 1]))]; + }; + /** + * Convert the series data to concrete point. + * Can be [val] | val + */ + + + Single.prototype.dataToPoint = function (val) { + var axis = this.getAxis(); + var rect = this.getRect(); + var pt = []; + var idx = axis.orient === 'horizontal' ? 0 : 1; + + if (val instanceof Array) { + val = val[0]; + } + + pt[idx] = axis.toGlobalCoord(axis.dataToCoord(+val)); + pt[1 - idx] = idx === 0 ? rect.y + rect.height / 2 : rect.x + rect.width / 2; + return pt; + }; + + Single.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys$3(finder); + return coordSys === this ? this.dataToPoint(value) : null; + }; + + Single.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys$3(finder); + return coordSys === this ? this.pointToData(pixel) : null; + }; + + return Single; + }(); + + function getCoordSys$3(finder) { + var seriesModel = finder.seriesModel; + var singleModel = finder.singleAxisModel; + return singleModel && singleModel.coordinateSystem || seriesModel && seriesModel.coordinateSystem; + } + + /** + * Create single coordinate system and inject it into seriesModel. + */ + + function create$2(ecModel, api) { + var singles = []; + ecModel.eachComponent('singleAxis', function (axisModel, idx) { + var single = new Single(axisModel, ecModel, api); + single.name = 'single_' + idx; + single.resize(axisModel, api); + axisModel.coordinateSystem = single; + singles.push(single); + }); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'singleAxis') { + var singleAxisModel = seriesModel.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0]; + seriesModel.coordinateSystem = singleAxisModel && singleAxisModel.coordinateSystem; + } + }); + return singles; + } + + var singleCreator = { + create: create$2, + dimensions: singleDimensions + }; + + var XY = ['x', 'y']; + var WH = ['width', 'height']; + + var SingleAxisPointer = + /** @class */ + function (_super) { + __extends(SingleAxisPointer, _super); + + function SingleAxisPointer() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @override + */ + + + SingleAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) { + var axis = axisModel.axis; + var coordSys = axis.coordinateSystem; + var otherExtent = getGlobalExtent(coordSys, 1 - getPointDimIndex(axis)); + var pixelValue = coordSys.dataToPoint(value)[0]; + var axisPointerType = axisPointerModel.get('type'); + + if (axisPointerType && axisPointerType !== 'none') { + var elStyle = buildElStyle(axisPointerModel); + var pointerOption = pointerShapeBuilder$2[axisPointerType](axis, pixelValue, otherExtent); + pointerOption.style = elStyle; + elOption.graphicKey = pointerOption.type; + elOption.pointer = pointerOption; + } + + var layoutInfo = layout$2(axisModel); + buildCartesianSingleLabelElOption( // @ts-ignore + value, elOption, layoutInfo, axisModel, axisPointerModel, api); + }; + /** + * @override + */ + + + SingleAxisPointer.prototype.getHandleTransform = function (value, axisModel, axisPointerModel) { + var layoutInfo = layout$2(axisModel, { + labelInside: false + }); // @ts-ignore + + layoutInfo.labelMargin = axisPointerModel.get(['handle', 'margin']); + var position = getTransformedPosition(axisModel.axis, value, layoutInfo); + return { + x: position[0], + y: position[1], + rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0) + }; + }; + /** + * @override + */ + + + SingleAxisPointer.prototype.updateHandleTransform = function (transform, delta, axisModel, axisPointerModel) { + var axis = axisModel.axis; + var coordSys = axis.coordinateSystem; + var dimIndex = getPointDimIndex(axis); + var axisExtent = getGlobalExtent(coordSys, dimIndex); + var currPosition = [transform.x, transform.y]; + currPosition[dimIndex] += delta[dimIndex]; + currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]); + currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]); + var otherExtent = getGlobalExtent(coordSys, 1 - dimIndex); + var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2; + var cursorPoint = [cursorOtherValue, cursorOtherValue]; + cursorPoint[dimIndex] = currPosition[dimIndex]; + return { + x: currPosition[0], + y: currPosition[1], + rotation: transform.rotation, + cursorPoint: cursorPoint, + tooltipOption: { + verticalAlign: 'middle' + } + }; + }; + + return SingleAxisPointer; + }(BaseAxisPointer); + + var pointerShapeBuilder$2 = { + line: function (axis, pixelValue, otherExtent) { + var targetShape = makeLineShape([pixelValue, otherExtent[0]], [pixelValue, otherExtent[1]], getPointDimIndex(axis)); + return { + type: 'Line', + subPixelOptimize: true, + shape: targetShape + }; + }, + shadow: function (axis, pixelValue, otherExtent) { + var bandWidth = axis.getBandWidth(); + var span = otherExtent[1] - otherExtent[0]; + return { + type: 'Rect', + shape: makeRectShape([pixelValue - bandWidth / 2, otherExtent[0]], [bandWidth, span], getPointDimIndex(axis)) + }; + } + }; + + function getPointDimIndex(axis) { + return axis.isHorizontal() ? 0 : 1; + } + + function getGlobalExtent(coordSys, dimIndex) { + var rect = coordSys.getRect(); + return [rect[XY[dimIndex]], rect[XY[dimIndex]] + rect[WH[dimIndex]]]; + } + + var SingleView = + /** @class */ + function (_super) { + __extends(SingleView, _super); + + function SingleView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SingleView.type; + return _this; + } + + SingleView.type = 'single'; + return SingleView; + }(ComponentView); + + function install$v(registers) { + use(install$s); + AxisView.registerAxisPointerClass('SingleAxisPointer', SingleAxisPointer); + registers.registerComponentView(SingleView); // Axis + + registers.registerComponentView(SingleAxisView); + registers.registerComponentModel(SingleAxisModel); + axisModelCreator(registers, 'single', SingleAxisModel, SingleAxisModel.defaultOption); + registers.registerCoordinateSystem('single', singleCreator); + } + + var CalendarModel = + /** @class */ + function (_super) { + __extends(CalendarModel, _super); + + function CalendarModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CalendarModel.type; + return _this; + } + /** + * @override + */ + + + CalendarModel.prototype.init = function (option, parentModel, ecModel) { + var inputPositionParams = getLayoutParams(option); + + _super.prototype.init.apply(this, arguments); + + mergeAndNormalizeLayoutParams(option, inputPositionParams); + }; + /** + * @override + */ + + + CalendarModel.prototype.mergeOption = function (option) { + _super.prototype.mergeOption.apply(this, arguments); + + mergeAndNormalizeLayoutParams(this.option, option); + }; + + CalendarModel.prototype.getCellSize = function () { + // Has been normalized + return this.option.cellSize; + }; + + CalendarModel.type = 'calendar'; + CalendarModel.defaultOption = { + // zlevel: 0, + z: 2, + left: 80, + top: 60, + cellSize: 20, + // horizontal vertical + orient: 'horizontal', + // month separate line style + splitLine: { + show: true, + lineStyle: { + color: '#000', + width: 1, + type: 'solid' + } + }, + // rect style temporarily unused emphasis + itemStyle: { + color: '#fff', + borderWidth: 1, + borderColor: '#ccc' + }, + // week text style + dayLabel: { + show: true, + firstDay: 0, + // start end + position: 'start', + margin: '50%', + color: '#000' + }, + // month text style + monthLabel: { + show: true, + // start end + position: 'start', + margin: 5, + // center or left + align: 'center', + formatter: null, + color: '#000' + }, + // year text style + yearLabel: { + show: true, + // top bottom left right + position: null, + margin: 30, + formatter: null, + color: '#ccc', + fontFamily: 'sans-serif', + fontWeight: 'bolder', + fontSize: 20 + } + }; + return CalendarModel; + }(ComponentModel); + + function mergeAndNormalizeLayoutParams(target, raw) { + // Normalize cellSize + var cellSize = target.cellSize; + var cellSizeArr; + + if (!isArray(cellSize)) { + cellSizeArr = target.cellSize = [cellSize, cellSize]; + } else { + cellSizeArr = cellSize; + } + + if (cellSizeArr.length === 1) { + cellSizeArr[1] = cellSizeArr[0]; + } + + var ignoreSize = map([0, 1], function (hvIdx) { + // If user have set `width` or both `left` and `right`, cellSizeArr + // will be automatically set to 'auto', otherwise the default + // setting of cellSizeArr will make `width` setting not work. + if (sizeCalculable(raw, hvIdx)) { + cellSizeArr[hvIdx] = 'auto'; + } + + return cellSizeArr[hvIdx] != null && cellSizeArr[hvIdx] !== 'auto'; + }); + mergeLayoutParam(target, raw, { + type: 'box', + ignoreSize: ignoreSize + }); + } + + var CalendarView = + /** @class */ + function (_super) { + __extends(CalendarView, _super); + + function CalendarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CalendarView.type; + return _this; + } + + CalendarView.prototype.render = function (calendarModel, ecModel, api) { + var group = this.group; + group.removeAll(); + var coordSys = calendarModel.coordinateSystem; // range info + + var rangeData = coordSys.getRangeInfo(); + var orient = coordSys.getOrient(); // locale + + var localeModel = ecModel.getLocaleModel(); + + this._renderDayRect(calendarModel, rangeData, group); // _renderLines must be called prior to following function + + + this._renderLines(calendarModel, rangeData, orient, group); + + this._renderYearText(calendarModel, rangeData, orient, group); + + this._renderMonthText(calendarModel, localeModel, orient, group); + + this._renderWeekText(calendarModel, localeModel, rangeData, orient, group); + }; // render day rect + + + CalendarView.prototype._renderDayRect = function (calendarModel, rangeData, group) { + var coordSys = calendarModel.coordinateSystem; + var itemRectStyleModel = calendarModel.getModel('itemStyle').getItemStyle(); + var sw = coordSys.getCellWidth(); + var sh = coordSys.getCellHeight(); + + for (var i = rangeData.start.time; i <= rangeData.end.time; i = coordSys.getNextNDay(i, 1).time) { + var point = coordSys.dataToRect([i], false).tl; // every rect + + var rect = new Rect({ + shape: { + x: point[0], + y: point[1], + width: sw, + height: sh + }, + cursor: 'default', + style: itemRectStyleModel + }); + group.add(rect); + } + }; // render separate line + + + CalendarView.prototype._renderLines = function (calendarModel, rangeData, orient, group) { + var self = this; + var coordSys = calendarModel.coordinateSystem; + var lineStyleModel = calendarModel.getModel(['splitLine', 'lineStyle']).getLineStyle(); + var show = calendarModel.get(['splitLine', 'show']); + var lineWidth = lineStyleModel.lineWidth; + this._tlpoints = []; + this._blpoints = []; + this._firstDayOfMonth = []; + this._firstDayPoints = []; + var firstDay = rangeData.start; + + for (var i = 0; firstDay.time <= rangeData.end.time; i++) { + addPoints(firstDay.formatedDate); + + if (i === 0) { + firstDay = coordSys.getDateInfo(rangeData.start.y + '-' + rangeData.start.m); + } + + var date = firstDay.date; + date.setMonth(date.getMonth() + 1); + firstDay = coordSys.getDateInfo(date); + } + + addPoints(coordSys.getNextNDay(rangeData.end.time, 1).formatedDate); + + function addPoints(date) { + self._firstDayOfMonth.push(coordSys.getDateInfo(date)); + + self._firstDayPoints.push(coordSys.dataToRect([date], false).tl); + + var points = self._getLinePointsOfOneWeek(calendarModel, date, orient); + + self._tlpoints.push(points[0]); + + self._blpoints.push(points[points.length - 1]); + + show && self._drawSplitline(points, lineStyleModel, group); + } // render top/left line + + + show && this._drawSplitline(self._getEdgesPoints(self._tlpoints, lineWidth, orient), lineStyleModel, group); // render bottom/right line + + show && this._drawSplitline(self._getEdgesPoints(self._blpoints, lineWidth, orient), lineStyleModel, group); + }; // get points at both ends + + + CalendarView.prototype._getEdgesPoints = function (points, lineWidth, orient) { + var rs = [points[0].slice(), points[points.length - 1].slice()]; + var idx = orient === 'horizontal' ? 0 : 1; // both ends of the line are extend half lineWidth + + rs[0][idx] = rs[0][idx] - lineWidth / 2; + rs[1][idx] = rs[1][idx] + lineWidth / 2; + return rs; + }; // render split line + + + CalendarView.prototype._drawSplitline = function (points, lineStyle, group) { + var poyline = new Polyline({ + z2: 20, + shape: { + points: points + }, + style: lineStyle + }); + group.add(poyline); + }; // render month line of one week points + + + CalendarView.prototype._getLinePointsOfOneWeek = function (calendarModel, date, orient) { + var coordSys = calendarModel.coordinateSystem; + var parsedDate = coordSys.getDateInfo(date); + var points = []; + + for (var i = 0; i < 7; i++) { + var tmpD = coordSys.getNextNDay(parsedDate.time, i); + var point = coordSys.dataToRect([tmpD.time], false); + points[2 * tmpD.day] = point.tl; + points[2 * tmpD.day + 1] = point[orient === 'horizontal' ? 'bl' : 'tr']; + } + + return points; + }; + + CalendarView.prototype._formatterLabel = function (formatter, params) { + if (isString(formatter) && formatter) { + return formatTplSimple(formatter, params); + } + + if (isFunction(formatter)) { + return formatter(params); + } + + return params.nameMap; + }; + + CalendarView.prototype._yearTextPositionControl = function (textEl, point, orient, position, margin) { + var x = point[0]; + var y = point[1]; + var aligns = ['center', 'bottom']; + + if (position === 'bottom') { + y += margin; + aligns = ['center', 'top']; + } else if (position === 'left') { + x -= margin; + } else if (position === 'right') { + x += margin; + aligns = ['center', 'top']; + } else { + // top + y -= margin; + } + + var rotate = 0; + + if (position === 'left' || position === 'right') { + rotate = Math.PI / 2; + } + + return { + rotation: rotate, + x: x, + y: y, + style: { + align: aligns[0], + verticalAlign: aligns[1] + } + }; + }; // render year + + + CalendarView.prototype._renderYearText = function (calendarModel, rangeData, orient, group) { + var yearLabel = calendarModel.getModel('yearLabel'); + + if (!yearLabel.get('show')) { + return; + } + + var margin = yearLabel.get('margin'); + var pos = yearLabel.get('position'); + + if (!pos) { + pos = orient !== 'horizontal' ? 'top' : 'left'; + } + + var points = [this._tlpoints[this._tlpoints.length - 1], this._blpoints[0]]; + var xc = (points[0][0] + points[1][0]) / 2; + var yc = (points[0][1] + points[1][1]) / 2; + var idx = orient === 'horizontal' ? 0 : 1; + var posPoints = { + top: [xc, points[idx][1]], + bottom: [xc, points[1 - idx][1]], + left: [points[1 - idx][0], yc], + right: [points[idx][0], yc] + }; + var name = rangeData.start.y; + + if (+rangeData.end.y > +rangeData.start.y) { + name = name + '-' + rangeData.end.y; + } + + var formatter = yearLabel.get('formatter'); + var params = { + start: rangeData.start.y, + end: rangeData.end.y, + nameMap: name + }; + + var content = this._formatterLabel(formatter, params); + + var yearText = new ZRText({ + z2: 30, + style: createTextStyle(yearLabel, { + text: content + }) + }); + yearText.attr(this._yearTextPositionControl(yearText, posPoints[pos], orient, pos, margin)); + group.add(yearText); + }; + + CalendarView.prototype._monthTextPositionControl = function (point, isCenter, orient, position, margin) { + var align = 'left'; + var vAlign = 'top'; + var x = point[0]; + var y = point[1]; + + if (orient === 'horizontal') { + y = y + margin; + + if (isCenter) { + align = 'center'; + } + + if (position === 'start') { + vAlign = 'bottom'; + } + } else { + x = x + margin; + + if (isCenter) { + vAlign = 'middle'; + } + + if (position === 'start') { + align = 'right'; + } + } + + return { + x: x, + y: y, + align: align, + verticalAlign: vAlign + }; + }; // render month and year text + + + CalendarView.prototype._renderMonthText = function (calendarModel, localeModel, orient, group) { + var monthLabel = calendarModel.getModel('monthLabel'); + + if (!monthLabel.get('show')) { + return; + } + + var nameMap = monthLabel.get('nameMap'); + var margin = monthLabel.get('margin'); + var pos = monthLabel.get('position'); + var align = monthLabel.get('align'); + var termPoints = [this._tlpoints, this._blpoints]; + + if (!nameMap || isString(nameMap)) { + if (nameMap) { + // case-sensitive + localeModel = getLocaleModel(nameMap) || localeModel; + } // PENDING + // for ZH locale, original form is `一月` but current form is `1月` + + + nameMap = localeModel.get(['time', 'monthAbbr']) || []; + } + + var idx = pos === 'start' ? 0 : 1; + var axis = orient === 'horizontal' ? 0 : 1; + margin = pos === 'start' ? -margin : margin; + var isCenter = align === 'center'; + + for (var i = 0; i < termPoints[idx].length - 1; i++) { + var tmp = termPoints[idx][i].slice(); + var firstDay = this._firstDayOfMonth[i]; + + if (isCenter) { + var firstDayPoints = this._firstDayPoints[i]; + tmp[axis] = (firstDayPoints[axis] + termPoints[0][i + 1][axis]) / 2; + } + + var formatter = monthLabel.get('formatter'); + var name_1 = nameMap[+firstDay.m - 1]; + var params = { + yyyy: firstDay.y, + yy: (firstDay.y + '').slice(2), + MM: firstDay.m, + M: +firstDay.m, + nameMap: name_1 + }; + + var content = this._formatterLabel(formatter, params); + + var monthText = new ZRText({ + z2: 30, + style: extend(createTextStyle(monthLabel, { + text: content + }), this._monthTextPositionControl(tmp, isCenter, orient, pos, margin)) + }); + group.add(monthText); + } + }; + + CalendarView.prototype._weekTextPositionControl = function (point, orient, position, margin, cellSize) { + var align = 'center'; + var vAlign = 'middle'; + var x = point[0]; + var y = point[1]; + var isStart = position === 'start'; + + if (orient === 'horizontal') { + x = x + margin + (isStart ? 1 : -1) * cellSize[0] / 2; + align = isStart ? 'right' : 'left'; + } else { + y = y + margin + (isStart ? 1 : -1) * cellSize[1] / 2; + vAlign = isStart ? 'bottom' : 'top'; + } + + return { + x: x, + y: y, + align: align, + verticalAlign: vAlign + }; + }; // render weeks + + + CalendarView.prototype._renderWeekText = function (calendarModel, localeModel, rangeData, orient, group) { + var dayLabel = calendarModel.getModel('dayLabel'); + + if (!dayLabel.get('show')) { + return; + } + + var coordSys = calendarModel.coordinateSystem; + var pos = dayLabel.get('position'); + var nameMap = dayLabel.get('nameMap'); + var margin = dayLabel.get('margin'); + var firstDayOfWeek = coordSys.getFirstDayOfWeek(); + + if (!nameMap || isString(nameMap)) { + if (nameMap) { + // case-sensitive + localeModel = getLocaleModel(nameMap) || localeModel; + } // Use the first letter of `dayOfWeekAbbr` if `dayOfWeekShort` doesn't exist in the locale file + + + var dayOfWeekShort = localeModel.get(['time', 'dayOfWeekShort']); + nameMap = dayOfWeekShort || map(localeModel.get(['time', 'dayOfWeekAbbr']), function (val) { + return val[0]; + }); + } + + var start = coordSys.getNextNDay(rangeData.end.time, 7 - rangeData.lweek).time; + var cellSize = [coordSys.getCellWidth(), coordSys.getCellHeight()]; + margin = parsePercent$1(margin, Math.min(cellSize[1], cellSize[0])); + + if (pos === 'start') { + start = coordSys.getNextNDay(rangeData.start.time, -(7 + rangeData.fweek)).time; + margin = -margin; + } + + for (var i = 0; i < 7; i++) { + var tmpD = coordSys.getNextNDay(start, i); + var point = coordSys.dataToRect([tmpD.time], false).center; + var day = i; + day = Math.abs((i + firstDayOfWeek) % 7); + var weekText = new ZRText({ + z2: 30, + style: extend(createTextStyle(dayLabel, { + text: nameMap[day] + }), this._weekTextPositionControl(point, orient, pos, margin, cellSize)) + }); + group.add(weekText); + } + }; + + CalendarView.type = 'calendar'; + return CalendarView; + }(ComponentView); + + var PROXIMATE_ONE_DAY = 86400000; + + var Calendar = + /** @class */ + function () { + function Calendar(calendarModel, ecModel, api) { + this.type = 'calendar'; + this.dimensions = Calendar.dimensions; // Required in createListFromData + + this.getDimensionsInfo = Calendar.getDimensionsInfo; + this._model = calendarModel; + } + + Calendar.getDimensionsInfo = function () { + return [{ + name: 'time', + type: 'time' + }, 'value']; + }; + + Calendar.prototype.getRangeInfo = function () { + return this._rangeInfo; + }; + + Calendar.prototype.getModel = function () { + return this._model; + }; + + Calendar.prototype.getRect = function () { + return this._rect; + }; + + Calendar.prototype.getCellWidth = function () { + return this._sw; + }; + + Calendar.prototype.getCellHeight = function () { + return this._sh; + }; + + Calendar.prototype.getOrient = function () { + return this._orient; + }; + /** + * getFirstDayOfWeek + * + * @example + * 0 : start at Sunday + * 1 : start at Monday + * + * @return {number} + */ + + + Calendar.prototype.getFirstDayOfWeek = function () { + return this._firstDayOfWeek; + }; + /** + * get date info + * } + */ + + + Calendar.prototype.getDateInfo = function (date) { + date = parseDate(date); + var y = date.getFullYear(); + var m = date.getMonth() + 1; + var mStr = m < 10 ? '0' + m : '' + m; + var d = date.getDate(); + var dStr = d < 10 ? '0' + d : '' + d; + var day = date.getDay(); + day = Math.abs((day + 7 - this.getFirstDayOfWeek()) % 7); + return { + y: y + '', + m: mStr, + d: dStr, + day: day, + time: date.getTime(), + formatedDate: y + '-' + mStr + '-' + dStr, + date: date + }; + }; + + Calendar.prototype.getNextNDay = function (date, n) { + n = n || 0; + + if (n === 0) { + return this.getDateInfo(date); + } + + date = new Date(this.getDateInfo(date).time); + date.setDate(date.getDate() + n); + return this.getDateInfo(date); + }; + + Calendar.prototype.update = function (ecModel, api) { + this._firstDayOfWeek = +this._model.getModel('dayLabel').get('firstDay'); + this._orient = this._model.get('orient'); + this._lineWidth = this._model.getModel('itemStyle').getItemStyle().lineWidth || 0; + this._rangeInfo = this._getRangeInfo(this._initRangeOption()); + var weeks = this._rangeInfo.weeks || 1; + var whNames = ['width', 'height']; + + var cellSize = this._model.getCellSize().slice(); + + var layoutParams = this._model.getBoxLayoutParams(); + + var cellNumbers = this._orient === 'horizontal' ? [weeks, 7] : [7, weeks]; + each([0, 1], function (idx) { + if (cellSizeSpecified(cellSize, idx)) { + layoutParams[whNames[idx]] = cellSize[idx] * cellNumbers[idx]; + } + }); + var whGlobal = { + width: api.getWidth(), + height: api.getHeight() + }; + var calendarRect = this._rect = getLayoutRect(layoutParams, whGlobal); + each([0, 1], function (idx) { + if (!cellSizeSpecified(cellSize, idx)) { + cellSize[idx] = calendarRect[whNames[idx]] / cellNumbers[idx]; + } + }); + + function cellSizeSpecified(cellSize, idx) { + return cellSize[idx] != null && cellSize[idx] !== 'auto'; + } // Has been calculated out number. + + + this._sw = cellSize[0]; + this._sh = cellSize[1]; + }; + /** + * Convert a time data(time, value) item to (x, y) point. + */ + // TODO Clamp of calendar is not same with cartesian coordinate systems. + // It will return NaN if data exceeds. + + + Calendar.prototype.dataToPoint = function (data, clamp) { + isArray(data) && (data = data[0]); + clamp == null && (clamp = true); + var dayInfo = this.getDateInfo(data); + var range = this._rangeInfo; + var date = dayInfo.formatedDate; // if not in range return [NaN, NaN] + + if (clamp && !(dayInfo.time >= range.start.time && dayInfo.time < range.end.time + PROXIMATE_ONE_DAY)) { + return [NaN, NaN]; + } + + var week = dayInfo.day; + + var nthWeek = this._getRangeInfo([range.start.time, date]).nthWeek; + + if (this._orient === 'vertical') { + return [this._rect.x + week * this._sw + this._sw / 2, this._rect.y + nthWeek * this._sh + this._sh / 2]; + } + + return [this._rect.x + nthWeek * this._sw + this._sw / 2, this._rect.y + week * this._sh + this._sh / 2]; + }; + /** + * Convert a (x, y) point to time data + */ + + + Calendar.prototype.pointToData = function (point) { + var date = this.pointToDate(point); + return date && date.time; + }; + /** + * Convert a time date item to (x, y) four point. + */ + + + Calendar.prototype.dataToRect = function (data, clamp) { + var point = this.dataToPoint(data, clamp); + return { + contentShape: { + x: point[0] - (this._sw - this._lineWidth) / 2, + y: point[1] - (this._sh - this._lineWidth) / 2, + width: this._sw - this._lineWidth, + height: this._sh - this._lineWidth + }, + center: point, + tl: [point[0] - this._sw / 2, point[1] - this._sh / 2], + tr: [point[0] + this._sw / 2, point[1] - this._sh / 2], + br: [point[0] + this._sw / 2, point[1] + this._sh / 2], + bl: [point[0] - this._sw / 2, point[1] + this._sh / 2] + }; + }; + /** + * Convert a (x, y) point to time date + * + * @param {Array} point point + * @return {Object} date + */ + + + Calendar.prototype.pointToDate = function (point) { + var nthX = Math.floor((point[0] - this._rect.x) / this._sw) + 1; + var nthY = Math.floor((point[1] - this._rect.y) / this._sh) + 1; + var range = this._rangeInfo.range; + + if (this._orient === 'vertical') { + return this._getDateByWeeksAndDay(nthY, nthX - 1, range); + } + + return this._getDateByWeeksAndDay(nthX, nthY - 1, range); + }; + + Calendar.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys$4(finder); + return coordSys === this ? coordSys.dataToPoint(value) : null; + }; + + Calendar.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys$4(finder); + return coordSys === this ? coordSys.pointToData(pixel) : null; + }; + + Calendar.prototype.containPoint = function (point) { + console.warn('Not implemented.'); + return false; + }; + /** + * initRange + * Normalize to an [start, end] array + */ + + + Calendar.prototype._initRangeOption = function () { + var range = this._model.get('range'); + + var normalizedRange; // Convert [1990] to 1990 + + if (isArray(range) && range.length === 1) { + range = range[0]; + } + + if (!isArray(range)) { + var rangeStr = range.toString(); // One year. + + if (/^\d{4}$/.test(rangeStr)) { + normalizedRange = [rangeStr + '-01-01', rangeStr + '-12-31']; + } // One month + + + if (/^\d{4}[\/|-]\d{1,2}$/.test(rangeStr)) { + var start = this.getDateInfo(rangeStr); + var firstDay = start.date; + firstDay.setMonth(firstDay.getMonth() + 1); + var end = this.getNextNDay(firstDay, -1); + normalizedRange = [start.formatedDate, end.formatedDate]; + } // One day + + + if (/^\d{4}[\/|-]\d{1,2}[\/|-]\d{1,2}$/.test(rangeStr)) { + normalizedRange = [rangeStr, rangeStr]; + } + } else { + normalizedRange = range; + } + + if (!normalizedRange) { + if ("development" !== 'production') { + logError('Invalid date range.'); + } // Not handling it. + + + return range; + } + + var tmp = this._getRangeInfo(normalizedRange); + + if (tmp.start.time > tmp.end.time) { + normalizedRange.reverse(); + } + + return normalizedRange; + }; + /** + * range info + * + * @private + * @param {Array} range range ['2017-01-01', '2017-07-08'] + * If range[0] > range[1], they will not be reversed. + * @return {Object} obj + */ + + + Calendar.prototype._getRangeInfo = function (range) { + var parsedRange = [this.getDateInfo(range[0]), this.getDateInfo(range[1])]; + var reversed; + + if (parsedRange[0].time > parsedRange[1].time) { + reversed = true; + parsedRange.reverse(); + } + + var allDay = Math.floor(parsedRange[1].time / PROXIMATE_ONE_DAY) - Math.floor(parsedRange[0].time / PROXIMATE_ONE_DAY) + 1; // Consider case1 (#11677 #10430): + // Set the system timezone as "UK", set the range to `['2016-07-01', '2016-12-31']` + // Consider case2: + // Firstly set system timezone as "Time Zone: America/Toronto", + // ``` + // let first = new Date(1478412000000 - 3600 * 1000 * 2.5); + // let second = new Date(1478412000000); + // let allDays = Math.floor(second / ONE_DAY) - Math.floor(first / ONE_DAY) + 1; + // ``` + // will get wrong result because of DST. So we should fix it. + + var date = new Date(parsedRange[0].time); + var startDateNum = date.getDate(); + var endDateNum = parsedRange[1].date.getDate(); + date.setDate(startDateNum + allDay - 1); // The bias can not over a month, so just compare date. + + var dateNum = date.getDate(); + + if (dateNum !== endDateNum) { + var sign = date.getTime() - parsedRange[1].time > 0 ? 1 : -1; + + while ((dateNum = date.getDate()) !== endDateNum && (date.getTime() - parsedRange[1].time) * sign > 0) { + allDay -= sign; + date.setDate(dateNum - sign); + } + } + + var weeks = Math.floor((allDay + parsedRange[0].day + 6) / 7); + var nthWeek = reversed ? -weeks + 1 : weeks - 1; + reversed && parsedRange.reverse(); + return { + range: [parsedRange[0].formatedDate, parsedRange[1].formatedDate], + start: parsedRange[0], + end: parsedRange[1], + allDay: allDay, + weeks: weeks, + // From 0. + nthWeek: nthWeek, + fweek: parsedRange[0].day, + lweek: parsedRange[1].day + }; + }; + /** + * get date by nthWeeks and week day in range + * + * @private + * @param {number} nthWeek the week + * @param {number} day the week day + * @param {Array} range [d1, d2] + * @return {Object} + */ + + + Calendar.prototype._getDateByWeeksAndDay = function (nthWeek, day, range) { + var rangeInfo = this._getRangeInfo(range); + + if (nthWeek > rangeInfo.weeks || nthWeek === 0 && day < rangeInfo.fweek || nthWeek === rangeInfo.weeks && day > rangeInfo.lweek) { + return null; + } + + var nthDay = (nthWeek - 1) * 7 - rangeInfo.fweek + day; + var date = new Date(rangeInfo.start.time); + date.setDate(+rangeInfo.start.d + nthDay); + return this.getDateInfo(date); + }; + + Calendar.create = function (ecModel, api) { + var calendarList = []; + ecModel.eachComponent('calendar', function (calendarModel) { + var calendar = new Calendar(calendarModel, ecModel, api); + calendarList.push(calendar); + calendarModel.coordinateSystem = calendar; + }); + ecModel.eachSeries(function (calendarSeries) { + if (calendarSeries.get('coordinateSystem') === 'calendar') { + // Inject coordinate system + calendarSeries.coordinateSystem = calendarList[calendarSeries.get('calendarIndex') || 0]; + } + }); + return calendarList; + }; + + Calendar.dimensions = ['time', 'value']; + return Calendar; + }(); + + function getCoordSys$4(finder) { + var calendarModel = finder.calendarModel; + var seriesModel = finder.seriesModel; + var coordSys = calendarModel ? calendarModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem : null; + return coordSys; + } + + function install$w(registers) { + registers.registerComponentModel(CalendarModel); + registers.registerComponentView(CalendarView); + registers.registerCoordinateSystem('calendar', Calendar); + } + + function setKeyInfoToNewElOption(resultItem, newElOption) { + var existElOption = resultItem.existing; // Set id and type after id assigned. + + newElOption.id = resultItem.keyInfo.id; + !newElOption.type && existElOption && (newElOption.type = existElOption.type); // Set parent id if not specified + + if (newElOption.parentId == null) { + var newElParentOption = newElOption.parentOption; + + if (newElParentOption) { + newElOption.parentId = newElParentOption.id; + } else if (existElOption) { + newElOption.parentId = existElOption.parentId; + } + } // Clear + + + newElOption.parentOption = null; + } + + function isSetLoc(obj, props) { + var isSet; + each(props, function (prop) { + obj[prop] != null && obj[prop] !== 'auto' && (isSet = true); + }); + return isSet; + } + + function mergeNewElOptionToExist(existList, index, newElOption) { + // Update existing options, for `getOption` feature. + var newElOptCopy = extend({}, newElOption); + var existElOption = existList[index]; + var $action = newElOption.$action || 'merge'; + + if ($action === 'merge') { + if (existElOption) { + if ("development" !== 'production') { + var newType = newElOption.type; + assert(!newType || existElOption.type === newType, 'Please set $action: "replace" to change `type`'); + } // We can ensure that newElOptCopy and existElOption are not + // the same object, so `merge` will not change newElOptCopy. + + + merge(existElOption, newElOptCopy, true); // Rigid body, use ignoreSize. + + mergeLayoutParam(existElOption, newElOptCopy, { + ignoreSize: true + }); // Will be used in render. + + copyLayoutParams(newElOption, existElOption); // Copy transition info to new option so it can be used in the transition. + // DO IT AFTER merge + + copyTransitionInfo(newElOption, existElOption); + copyTransitionInfo(newElOption, existElOption, 'shape'); + copyTransitionInfo(newElOption, existElOption, 'style'); + copyTransitionInfo(newElOption, existElOption, 'extra'); // Copy clipPath + + newElOption.clipPath = existElOption.clipPath; + } else { + existList[index] = newElOptCopy; + } + } else if ($action === 'replace') { + existList[index] = newElOptCopy; + } else if ($action === 'remove') { + // null will be cleaned later. + existElOption && (existList[index] = null); + } + } + + var TRANSITION_PROPS_TO_COPY = ['transition', 'enterFrom', 'leaveTo']; + var ROOT_TRANSITION_PROPS_TO_COPY = TRANSITION_PROPS_TO_COPY.concat(['enterAnimation', 'updateAnimation', 'leaveAnimation']); + + function copyTransitionInfo(target, source, targetProp) { + if (targetProp) { + if (!target[targetProp] && source[targetProp]) { + // TODO avoid creating this empty object when there is no transition configuration. + target[targetProp] = {}; + } + + target = target[targetProp]; + source = source[targetProp]; + } + + if (!target || !source) { + return; + } + + var props = targetProp ? TRANSITION_PROPS_TO_COPY : ROOT_TRANSITION_PROPS_TO_COPY; + + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + + if (target[prop] == null && source[prop] != null) { + target[prop] = source[prop]; + } + } + } + + function setLayoutInfoToExist(existItem, newElOption) { + if (!existItem) { + return; + } + + existItem.hv = newElOption.hv = [// Rigid body, dont care `width`. + isSetLoc(newElOption, ['left', 'right']), // Rigid body, dont care `height`. + isSetLoc(newElOption, ['top', 'bottom'])]; // Give default group size. Otherwise layout error may occur. + + if (existItem.type === 'group') { + var existingGroupOpt = existItem; + var newGroupOpt = newElOption; + existingGroupOpt.width == null && (existingGroupOpt.width = newGroupOpt.width = 0); + existingGroupOpt.height == null && (existingGroupOpt.height = newGroupOpt.height = 0); + } + } + + var GraphicComponentModel = + /** @class */ + function (_super) { + __extends(GraphicComponentModel, _super); + + function GraphicComponentModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GraphicComponentModel.type; + _this.preventAutoZ = true; + return _this; + } + + GraphicComponentModel.prototype.mergeOption = function (option, ecModel) { + // Prevent default merge to elements + var elements = this.option.elements; + this.option.elements = null; + + _super.prototype.mergeOption.call(this, option, ecModel); + + this.option.elements = elements; + }; + + GraphicComponentModel.prototype.optionUpdated = function (newOption, isInit) { + var thisOption = this.option; + var newList = (isInit ? thisOption : newOption).elements; + var existList = thisOption.elements = isInit ? [] : thisOption.elements; + var flattenedList = []; + + this._flatten(newList, flattenedList, null); + + var mappingResult = mappingToExists(existList, flattenedList, 'normalMerge'); // Clear elOptionsToUpdate + + var elOptionsToUpdate = this._elOptionsToUpdate = []; + each(mappingResult, function (resultItem, index) { + var newElOption = resultItem.newOption; + + if ("development" !== 'production') { + assert(isObject(newElOption) || resultItem.existing, 'Empty graphic option definition'); + } + + if (!newElOption) { + return; + } + + elOptionsToUpdate.push(newElOption); + setKeyInfoToNewElOption(resultItem, newElOption); + mergeNewElOptionToExist(existList, index, newElOption); + setLayoutInfoToExist(existList[index], newElOption); + }, this); // Clean + + thisOption.elements = filter(existList, function (item) { + // $action should be volatile, otherwise option gotten from + // `getOption` will contain unexpected $action. + item && delete item.$action; + return item != null; + }); + }; + /** + * Convert + * [{ + * type: 'group', + * id: 'xx', + * children: [{type: 'circle'}, {type: 'polygon'}] + * }] + * to + * [ + * {type: 'group', id: 'xx'}, + * {type: 'circle', parentId: 'xx'}, + * {type: 'polygon', parentId: 'xx'} + * ] + */ + + + GraphicComponentModel.prototype._flatten = function (optionList, result, parentOption) { + each(optionList, function (option) { + if (!option) { + return; + } + + if (parentOption) { + option.parentOption = parentOption; + } + + result.push(option); + var children = option.children; // here we don't judge if option.type is `group` + // when new option doesn't provide `type`, it will cause that the children can't be updated. + + if (children && children.length) { + this._flatten(children, result, option); + } // Deleting for JSON output, and for not affecting group creation. + + + delete option.children; + }, this); + }; // FIXME + // Pass to view using payload? setOption has a payload? + + + GraphicComponentModel.prototype.useElOptionsToUpdate = function () { + var els = this._elOptionsToUpdate; // Clear to avoid render duplicately when zooming. + + this._elOptionsToUpdate = null; + return els; + }; + + GraphicComponentModel.type = 'graphic'; + GraphicComponentModel.defaultOption = { + elements: [] // parentId: null + + }; + return GraphicComponentModel; + }(ComponentModel); + + var nonShapeGraphicElements = { + // Reserved but not supported in graphic component. + path: null, + compoundPath: null, + // Supported in graphic component. + group: Group, + image: ZRImage, + text: ZRText + }; + var inner$e = makeInner(); // ------------------------ + // View + // ------------------------ + + var GraphicComponentView = + /** @class */ + function (_super) { + __extends(GraphicComponentView, _super); + + function GraphicComponentView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GraphicComponentView.type; + return _this; + } + + GraphicComponentView.prototype.init = function () { + this._elMap = createHashMap(); + }; + + GraphicComponentView.prototype.render = function (graphicModel, ecModel, api) { + // Having leveraged between use cases and algorithm complexity, a very + // simple layout mechanism is used: + // The size(width/height) can be determined by itself or its parent (not + // implemented yet), but can not by its children. (Top-down travel) + // The location(x/y) can be determined by the bounding rect of itself + // (can including its descendants or not) and the size of its parent. + // (Bottom-up travel) + // When `chart.clear()` or `chart.setOption({...}, true)` with the same id, + // view will be reused. + if (graphicModel !== this._lastGraphicModel) { + this._clear(); + } + + this._lastGraphicModel = graphicModel; + + this._updateElements(graphicModel); + + this._relocate(graphicModel, api); + }; + /** + * Update graphic elements. + */ + + + GraphicComponentView.prototype._updateElements = function (graphicModel) { + var elOptionsToUpdate = graphicModel.useElOptionsToUpdate(); + + if (!elOptionsToUpdate) { + return; + } + + var elMap = this._elMap; + var rootGroup = this.group; + var globalZ = graphicModel.get('z'); + var globalZLevel = graphicModel.get('zlevel'); // Top-down tranverse to assign graphic settings to each elements. + + each(elOptionsToUpdate, function (elOption) { + var id = convertOptionIdName(elOption.id, null); + var elExisting = id != null ? elMap.get(id) : null; + var parentId = convertOptionIdName(elOption.parentId, null); + var targetElParent = parentId != null ? elMap.get(parentId) : rootGroup; + var elType = elOption.type; + var elOptionStyle = elOption.style; + + if (elType === 'text' && elOptionStyle) { + // In top/bottom mode, textVerticalAlign should not be used, which cause + // inaccurately locating. + if (elOption.hv && elOption.hv[1]) { + elOptionStyle.textVerticalAlign = elOptionStyle.textBaseline = elOptionStyle.verticalAlign = elOptionStyle.align = null; + } + } + + var textContentOption = elOption.textContent; + var textConfig = elOption.textConfig; + + if (elOptionStyle && isEC4CompatibleStyle(elOptionStyle, elType, !!textConfig, !!textContentOption)) { + var convertResult = convertFromEC4CompatibleStyle(elOptionStyle, elType, true); + + if (!textConfig && convertResult.textConfig) { + textConfig = elOption.textConfig = convertResult.textConfig; + } + + if (!textContentOption && convertResult.textContent) { + textContentOption = convertResult.textContent; + } + } // Remove unnecessary props to avoid potential problems. + + + var elOptionCleaned = getCleanedElOption(elOption); // For simple, do not support parent change, otherwise reorder is needed. + + if ("development" !== 'production') { + elExisting && assert(targetElParent === elExisting.parent, 'Changing parent is not supported.'); + } + + var $action = elOption.$action || 'merge'; + var isMerge = $action === 'merge'; + var isReplace = $action === 'replace'; + + if (isMerge) { + var isInit = !elExisting; + var el_1 = elExisting; + + if (isInit) { + el_1 = createEl$1(id, targetElParent, elOption.type, elMap); + } else { + el_1 && (inner$e(el_1).isNew = false); // Stop and restore before update any other attributes. + + stopPreviousKeyframeAnimationAndRestore(el_1); + } + + if (el_1) { + applyUpdateTransition(el_1, elOptionCleaned, graphicModel, { + isInit: isInit + }); + updateCommonAttrs(el_1, elOption, globalZ, globalZLevel); + } + } else if (isReplace) { + removeEl(elExisting, elOption, elMap, graphicModel); + var el_2 = createEl$1(id, targetElParent, elOption.type, elMap); + + if (el_2) { + applyUpdateTransition(el_2, elOptionCleaned, graphicModel, { + isInit: true + }); + updateCommonAttrs(el_2, elOption, globalZ, globalZLevel); + } + } else if ($action === 'remove') { + updateLeaveTo(elExisting, elOption); + removeEl(elExisting, elOption, elMap, graphicModel); + } + + var el = elMap.get(id); + + if (el && textContentOption) { + if (isMerge) { + var textContentExisting = el.getTextContent(); + textContentExisting ? textContentExisting.attr(textContentOption) : el.setTextContent(new ZRText(textContentOption)); + } else if (isReplace) { + el.setTextContent(new ZRText(textContentOption)); + } + } + + if (el) { + var clipPathOption = elOption.clipPath; + + if (clipPathOption) { + var clipPathType = clipPathOption.type; + var clipPath = void 0; + var isInit = false; + + if (isMerge) { + var oldClipPath = el.getClipPath(); + isInit = !oldClipPath || inner$e(oldClipPath).type !== clipPathType; + clipPath = isInit ? newEl(clipPathType) : oldClipPath; + } else if (isReplace) { + isInit = true; + clipPath = newEl(clipPathType); + } + + el.setClipPath(clipPath); + applyUpdateTransition(clipPath, clipPathOption, graphicModel, { + isInit: isInit + }); + applyKeyframeAnimation(clipPath, clipPathOption.keyframeAnimation, graphicModel); + } + + var elInner = inner$e(el); + el.setTextConfig(textConfig); + elInner.option = elOption; + setEventData(el, graphicModel, elOption); + setTooltipConfig({ + el: el, + componentModel: graphicModel, + itemName: el.name, + itemTooltipOption: elOption.tooltip + }); + applyKeyframeAnimation(el, elOption.keyframeAnimation, graphicModel); + } + }); + }; + /** + * Locate graphic elements. + */ + + + GraphicComponentView.prototype._relocate = function (graphicModel, api) { + var elOptions = graphicModel.option.elements; + var rootGroup = this.group; + var elMap = this._elMap; + var apiWidth = api.getWidth(); + var apiHeight = api.getHeight(); + var xy = ['x', 'y']; // Top-down to calculate percentage width/height of group + + for (var i = 0; i < elOptions.length; i++) { + var elOption = elOptions[i]; + var id = convertOptionIdName(elOption.id, null); + var el = id != null ? elMap.get(id) : null; + + if (!el || !el.isGroup) { + continue; + } + + var parentEl = el.parent; + var isParentRoot = parentEl === rootGroup; // Like 'position:absolut' in css, default 0. + + var elInner = inner$e(el); + var parentElInner = inner$e(parentEl); + elInner.width = parsePercent$1(elInner.option.width, isParentRoot ? apiWidth : parentElInner.width) || 0; + elInner.height = parsePercent$1(elInner.option.height, isParentRoot ? apiHeight : parentElInner.height) || 0; + } // Bottom-up tranvese all elements (consider ec resize) to locate elements. + + + for (var i = elOptions.length - 1; i >= 0; i--) { + var elOption = elOptions[i]; + var id = convertOptionIdName(elOption.id, null); + var el = id != null ? elMap.get(id) : null; + + if (!el) { + continue; + } + + var parentEl = el.parent; + var parentElInner = inner$e(parentEl); + var containerInfo = parentEl === rootGroup ? { + width: apiWidth, + height: apiHeight + } : { + width: parentElInner.width, + height: parentElInner.height + }; // PENDING + // Currently, when `bounding: 'all'`, the union bounding rect of the group + // does not include the rect of [0, 0, group.width, group.height], which + // is probably weird for users. Should we make a break change for it? + + var layoutPos = {}; + var layouted = positionElement(el, elOption, containerInfo, null, { + hv: elOption.hv, + boundingMode: elOption.bounding + }, layoutPos); + + if (!inner$e(el).isNew && layouted) { + var transition = elOption.transition; + var animatePos = {}; + + for (var k = 0; k < xy.length; k++) { + var key = xy[k]; + var val = layoutPos[key]; + + if (transition && (isTransitionAll(transition) || indexOf(transition, key) >= 0)) { + animatePos[key] = val; + } else { + el[key] = val; + } + } + + updateProps(el, animatePos, graphicModel, 0); + } else { + el.attr(layoutPos); + } + } + }; + /** + * Clear all elements. + */ + + + GraphicComponentView.prototype._clear = function () { + var _this = this; + + var elMap = this._elMap; + elMap.each(function (el) { + removeEl(el, inner$e(el).option, elMap, _this._lastGraphicModel); + }); + this._elMap = createHashMap(); + }; + + GraphicComponentView.prototype.dispose = function () { + this._clear(); + }; + + GraphicComponentView.type = 'graphic'; + return GraphicComponentView; + }(ComponentView); + + function newEl(graphicType) { + if ("development" !== 'production') { + assert(graphicType, 'graphic type MUST be set'); + } + + var Clz = hasOwn(nonShapeGraphicElements, graphicType) // Those graphic elements are not shapes. They should not be + // overwritten by users, so do them first. + ? nonShapeGraphicElements[graphicType] : getShapeClass(graphicType); + + if ("development" !== 'production') { + assert(Clz, "graphic type " + graphicType + " can not be found"); + } + + var el = new Clz({}); + inner$e(el).type = graphicType; + return el; + } + + function createEl$1(id, targetElParent, graphicType, elMap) { + var el = newEl(graphicType); + targetElParent.add(el); + elMap.set(id, el); + inner$e(el).id = id; + inner$e(el).isNew = true; + return el; + } + + function removeEl(elExisting, elOption, elMap, graphicModel) { + var existElParent = elExisting && elExisting.parent; + + if (existElParent) { + elExisting.type === 'group' && elExisting.traverse(function (el) { + removeEl(el, elOption, elMap, graphicModel); + }); + applyLeaveTransition(elExisting, elOption, graphicModel); + elMap.removeKey(inner$e(elExisting).id); + } + } + + function updateCommonAttrs(el, elOption, defaultZ, defaultZlevel) { + if (!el.isGroup) { + each([['cursor', Displayable.prototype.cursor], // We should not support configure z and zlevel in the element level. + // But seems we didn't limit it previously. So here still use it to avoid breaking. + ['zlevel', defaultZlevel || 0], ['z', defaultZ || 0], // z2 must not be null/undefined, otherwise sort error may occur. + ['z2', 0]], function (item) { + var prop = item[0]; + + if (hasOwn(elOption, prop)) { + el[prop] = retrieve2(elOption[prop], item[1]); + } else if (el[prop] == null) { + el[prop] = item[1]; + } + }); + } + + each(keys(elOption), function (key) { + // Assign event handlers. + // PENDING: should enumerate all event names or use pattern matching? + if (key.indexOf('on') === 0) { + var val = elOption[key]; + el[key] = isFunction(val) ? val : null; + } + }); + + if (hasOwn(elOption, 'draggable')) { + el.draggable = elOption.draggable; + } // Other attributes + + + elOption.name != null && (el.name = elOption.name); + elOption.id != null && (el.id = elOption.id); + } // Remove unnecessary props to avoid potential problems. + + + function getCleanedElOption(elOption) { + elOption = extend({}, elOption); + each(['id', 'parentId', '$action', 'hv', 'bounding', 'textContent', 'clipPath'].concat(LOCATION_PARAMS), function (name) { + delete elOption[name]; + }); + return elOption; + } + + function setEventData(el, graphicModel, elOption) { + var eventData = getECData(el).eventData; // Simple optimize for large amount of elements that no need event. + + if (!el.silent && !el.ignore && !eventData) { + eventData = getECData(el).eventData = { + componentType: 'graphic', + componentIndex: graphicModel.componentIndex, + name: el.name + }; + } // `elOption.info` enables user to mount some info on + // elements and use them in event handlers. + + + if (eventData) { + eventData.info = elOption.info; + } + } + + function install$x(registers) { + registers.registerComponentModel(GraphicComponentModel); + registers.registerComponentView(GraphicComponentView); + registers.registerPreprocessor(function (option) { + var graphicOption = option.graphic; // Convert + // {graphic: [{left: 10, type: 'circle'}, ...]} + // or + // {graphic: {left: 10, type: 'circle'}} + // to + // {graphic: [{elements: [{left: 10, type: 'circle'}, ...]}]} + + if (isArray(graphicOption)) { + if (!graphicOption[0] || !graphicOption[0].elements) { + option.graphic = [{ + elements: graphicOption + }]; + } else { + // Only one graphic instance can be instantiated. (We dont + // want that too many views are created in echarts._viewMap) + option.graphic = [option.graphic[0]]; + } + } else if (graphicOption && !graphicOption.elements) { + option.graphic = [{ + elements: [graphicOption] + }]; + } + }); + } + + var DATA_ZOOM_AXIS_DIMENSIONS = ['x', 'y', 'radius', 'angle', 'single']; // Supported coords. + // FIXME: polar has been broken (but rarely used). + + var SERIES_COORDS = ['cartesian2d', 'polar', 'singleAxis']; + function isCoordSupported(seriesModel) { + var coordType = seriesModel.get('coordinateSystem'); + return indexOf(SERIES_COORDS, coordType) >= 0; + } + function getAxisMainType(axisDim) { + if ("development" !== 'production') { + assert(axisDim); + } + + return axisDim + 'Axis'; + } + /** + * If two dataZoomModels has the same axis controlled, we say that they are 'linked'. + * This function finds all linked dataZoomModels start from the given payload. + */ + + function findEffectedDataZooms(ecModel, payload) { + // Key: `DataZoomAxisDimension` + var axisRecords = createHashMap(); + var effectedModels = []; // Key: uid of dataZoomModel + + var effectedModelMap = createHashMap(); // Find the dataZooms specified by payload. + + ecModel.eachComponent({ + mainType: 'dataZoom', + query: payload + }, function (dataZoomModel) { + if (!effectedModelMap.get(dataZoomModel.uid)) { + addToEffected(dataZoomModel); + } + }); // Start from the given dataZoomModels, travel the graph to find + // all of the linked dataZoom models. + + var foundNewLink; + + do { + foundNewLink = false; + ecModel.eachComponent('dataZoom', processSingle); + } while (foundNewLink); + + function processSingle(dataZoomModel) { + if (!effectedModelMap.get(dataZoomModel.uid) && isLinked(dataZoomModel)) { + addToEffected(dataZoomModel); + foundNewLink = true; + } + } + + function addToEffected(dataZoom) { + effectedModelMap.set(dataZoom.uid, true); + effectedModels.push(dataZoom); + markAxisControlled(dataZoom); + } + + function isLinked(dataZoomModel) { + var isLink = false; + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + var axisIdxArr = axisRecords.get(axisDim); + + if (axisIdxArr && axisIdxArr[axisIndex]) { + isLink = true; + } + }); + return isLink; + } + + function markAxisControlled(dataZoomModel) { + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + (axisRecords.get(axisDim) || axisRecords.set(axisDim, []))[axisIndex] = true; + }); + } + + return effectedModels; + } + /** + * Find the first target coordinate system. + * Available after model built. + * + * @return Like { + * grid: [ + * {model: coord0, axisModels: [axis1, axis3], coordIndex: 1}, + * {model: coord1, axisModels: [axis0, axis2], coordIndex: 0}, + * ... + * ], // cartesians must not be null/undefined. + * polar: [ + * {model: coord0, axisModels: [axis4], coordIndex: 0}, + * ... + * ], // polars must not be null/undefined. + * singleAxis: [ + * {model: coord0, axisModels: [], coordIndex: 0} + * ] + * } + */ + + function collectReferCoordSysModelInfo(dataZoomModel) { + var ecModel = dataZoomModel.ecModel; + var coordSysInfoWrap = { + infoList: [], + infoMap: createHashMap() + }; + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + var axisModel = ecModel.getComponent(getAxisMainType(axisDim), axisIndex); + + if (!axisModel) { + return; + } + + var coordSysModel = axisModel.getCoordSysModel(); + + if (!coordSysModel) { + return; + } + + var coordSysUid = coordSysModel.uid; + var coordSysInfo = coordSysInfoWrap.infoMap.get(coordSysUid); + + if (!coordSysInfo) { + coordSysInfo = { + model: coordSysModel, + axisModels: [] + }; + coordSysInfoWrap.infoList.push(coordSysInfo); + coordSysInfoWrap.infoMap.set(coordSysUid, coordSysInfo); + } + + coordSysInfo.axisModels.push(axisModel); + }); + return coordSysInfoWrap; + } + + var DataZoomAxisInfo = + /** @class */ + function () { + function DataZoomAxisInfo() { + this.indexList = []; + this.indexMap = []; + } + + DataZoomAxisInfo.prototype.add = function (axisCmptIdx) { + // Remove duplication. + if (!this.indexMap[axisCmptIdx]) { + this.indexList.push(axisCmptIdx); + this.indexMap[axisCmptIdx] = true; + } + }; + + return DataZoomAxisInfo; + }(); + + var DataZoomModel = + /** @class */ + function (_super) { + __extends(DataZoomModel, _super); + + function DataZoomModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = DataZoomModel.type; + _this._autoThrottle = true; + _this._noTarget = true; + /** + * It is `[rangeModeForMin, rangeModeForMax]`. + * The optional values for `rangeMode`: + * + `'value'` mode: the axis extent will always be determined by + * `dataZoom.startValue` and `dataZoom.endValue`, despite + * how data like and how `axis.min` and `axis.max` are. + * + `'percent'` mode: `100` represents 100% of the `[dMin, dMax]`, + * where `dMin` is `axis.min` if `axis.min` specified, otherwise `data.extent[0]`, + * and `dMax` is `axis.max` if `axis.max` specified, otherwise `data.extent[1]`. + * Axis extent will be determined by the result of the percent of `[dMin, dMax]`. + * + * For example, when users are using dynamic data (update data periodically via `setOption`), + * if in `'value`' mode, the window will be kept in a fixed value range despite how + * data are appended, while if in `'percent'` mode, whe window range will be changed alone with + * the appended data (suppose `axis.min` and `axis.max` are not specified). + */ + + _this._rangePropMode = ['percent', 'percent']; + return _this; + } + + DataZoomModel.prototype.init = function (option, parentModel, ecModel) { + var inputRawOption = retrieveRawOption(option); + /** + * Suppose a "main process" start at the point that model prepared (that is, + * model initialized or merged or method called in `action`). + * We should keep the `main process` idempotent, that is, given a set of values + * on `option`, we get the same result. + * + * But sometimes, values on `option` will be updated for providing users + * a "final calculated value" (`dataZoomProcessor` will do that). Those value + * should not be the base/input of the `main process`. + * + * So in that case we should save and keep the input of the `main process` + * separately, called `settledOption`. + * + * For example, consider the case: + * (Step_1) brush zoom the grid by `toolbox.dataZoom`, + * where the original input `option.startValue`, `option.endValue` are earsed by + * calculated value. + * (Step)2) click the legend to hide and show a series, + * where the new range is calculated by the earsed `startValue` and `endValue`, + * which brings incorrect result. + */ + + this.settledOption = inputRawOption; + this.mergeDefaultAndTheme(option, ecModel); + + this._doInit(inputRawOption); + }; + + DataZoomModel.prototype.mergeOption = function (newOption) { + var inputRawOption = retrieveRawOption(newOption); //FIX #2591 + + merge(this.option, newOption, true); + merge(this.settledOption, inputRawOption, true); + + this._doInit(inputRawOption); + }; + + DataZoomModel.prototype._doInit = function (inputRawOption) { + var thisOption = this.option; + + this._setDefaultThrottle(inputRawOption); + + this._updateRangeUse(inputRawOption); + + var settledOption = this.settledOption; + each([['start', 'startValue'], ['end', 'endValue']], function (names, index) { + // start/end has higher priority over startValue/endValue if they + // both set, but we should make chart.setOption({endValue: 1000}) + // effective, rather than chart.setOption({endValue: 1000, end: null}). + if (this._rangePropMode[index] === 'value') { + thisOption[names[0]] = settledOption[names[0]] = null; + } // Otherwise do nothing and use the merge result. + + }, this); + + this._resetTarget(); + }; + + DataZoomModel.prototype._resetTarget = function () { + var optionOrient = this.get('orient', true); + var targetAxisIndexMap = this._targetAxisInfoMap = createHashMap(); + + var hasAxisSpecified = this._fillSpecifiedTargetAxis(targetAxisIndexMap); + + if (hasAxisSpecified) { + this._orient = optionOrient || this._makeAutoOrientByTargetAxis(); + } else { + this._orient = optionOrient || 'horizontal'; + + this._fillAutoTargetAxisByOrient(targetAxisIndexMap, this._orient); + } + + this._noTarget = true; + targetAxisIndexMap.each(function (axisInfo) { + if (axisInfo.indexList.length) { + this._noTarget = false; + } + }, this); + }; + + DataZoomModel.prototype._fillSpecifiedTargetAxis = function (targetAxisIndexMap) { + var hasAxisSpecified = false; + each(DATA_ZOOM_AXIS_DIMENSIONS, function (axisDim) { + var refering = this.getReferringComponents(getAxisMainType(axisDim), MULTIPLE_REFERRING); // When user set axisIndex as a empty array, we think that user specify axisIndex + // but do not want use auto mode. Because empty array may be encountered when + // some error occured. + + if (!refering.specified) { + return; + } + + hasAxisSpecified = true; + var axisInfo = new DataZoomAxisInfo(); + each(refering.models, function (axisModel) { + axisInfo.add(axisModel.componentIndex); + }); + targetAxisIndexMap.set(axisDim, axisInfo); + }, this); + return hasAxisSpecified; + }; + + DataZoomModel.prototype._fillAutoTargetAxisByOrient = function (targetAxisIndexMap, orient) { + var ecModel = this.ecModel; + var needAuto = true; // Find axis that parallel to dataZoom as default. + + if (needAuto) { + var axisDim = orient === 'vertical' ? 'y' : 'x'; + var axisModels = ecModel.findComponents({ + mainType: axisDim + 'Axis' + }); + setParallelAxis(axisModels, axisDim); + } // Find axis that parallel to dataZoom as default. + + + if (needAuto) { + var axisModels = ecModel.findComponents({ + mainType: 'singleAxis', + filter: function (axisModel) { + return axisModel.get('orient', true) === orient; + } + }); + setParallelAxis(axisModels, 'single'); + } + + function setParallelAxis(axisModels, axisDim) { + // At least use the first parallel axis as the target axis. + var axisModel = axisModels[0]; + + if (!axisModel) { + return; + } + + var axisInfo = new DataZoomAxisInfo(); + axisInfo.add(axisModel.componentIndex); + targetAxisIndexMap.set(axisDim, axisInfo); + needAuto = false; // Find parallel axes in the same grid. + + if (axisDim === 'x' || axisDim === 'y') { + var gridModel_1 = axisModel.getReferringComponents('grid', SINGLE_REFERRING).models[0]; + gridModel_1 && each(axisModels, function (axModel) { + if (axisModel.componentIndex !== axModel.componentIndex && gridModel_1 === axModel.getReferringComponents('grid', SINGLE_REFERRING).models[0]) { + axisInfo.add(axModel.componentIndex); + } + }); + } + } + + if (needAuto) { + // If no parallel axis, find the first category axis as default. (Also consider polar). + each(DATA_ZOOM_AXIS_DIMENSIONS, function (axisDim) { + if (!needAuto) { + return; + } + + var axisModels = ecModel.findComponents({ + mainType: getAxisMainType(axisDim), + filter: function (axisModel) { + return axisModel.get('type', true) === 'category'; + } + }); + + if (axisModels[0]) { + var axisInfo = new DataZoomAxisInfo(); + axisInfo.add(axisModels[0].componentIndex); + targetAxisIndexMap.set(axisDim, axisInfo); + needAuto = false; + } + }, this); + } + }; + + DataZoomModel.prototype._makeAutoOrientByTargetAxis = function () { + var dim; // Find the first axis + + this.eachTargetAxis(function (axisDim) { + !dim && (dim = axisDim); + }, this); + return dim === 'y' ? 'vertical' : 'horizontal'; + }; + + DataZoomModel.prototype._setDefaultThrottle = function (inputRawOption) { + // When first time user set throttle, auto throttle ends. + if (inputRawOption.hasOwnProperty('throttle')) { + this._autoThrottle = false; + } + + if (this._autoThrottle) { + var globalOption = this.ecModel.option; + this.option.throttle = globalOption.animation && globalOption.animationDurationUpdate > 0 ? 100 : 20; + } + }; + + DataZoomModel.prototype._updateRangeUse = function (inputRawOption) { + var rangePropMode = this._rangePropMode; + var rangeModeInOption = this.get('rangeMode'); + each([['start', 'startValue'], ['end', 'endValue']], function (names, index) { + var percentSpecified = inputRawOption[names[0]] != null; + var valueSpecified = inputRawOption[names[1]] != null; + + if (percentSpecified && !valueSpecified) { + rangePropMode[index] = 'percent'; + } else if (!percentSpecified && valueSpecified) { + rangePropMode[index] = 'value'; + } else if (rangeModeInOption) { + rangePropMode[index] = rangeModeInOption[index]; + } else if (percentSpecified) { + // percentSpecified && valueSpecified + rangePropMode[index] = 'percent'; + } // else remain its original setting. + + }); + }; + + DataZoomModel.prototype.noTarget = function () { + return this._noTarget; + }; + + DataZoomModel.prototype.getFirstTargetAxisModel = function () { + var firstAxisModel; + this.eachTargetAxis(function (axisDim, axisIndex) { + if (firstAxisModel == null) { + firstAxisModel = this.ecModel.getComponent(getAxisMainType(axisDim), axisIndex); + } + }, this); + return firstAxisModel; + }; + /** + * @param {Function} callback param: axisModel, dimNames, axisIndex, dataZoomModel, ecModel + */ + + + DataZoomModel.prototype.eachTargetAxis = function (callback, context) { + this._targetAxisInfoMap.each(function (axisInfo, axisDim) { + each(axisInfo.indexList, function (axisIndex) { + callback.call(context, axisDim, axisIndex); + }); + }); + }; + /** + * @return If not found, return null/undefined. + */ + + + DataZoomModel.prototype.getAxisProxy = function (axisDim, axisIndex) { + var axisModel = this.getAxisModel(axisDim, axisIndex); + + if (axisModel) { + return axisModel.__dzAxisProxy; + } + }; + /** + * @return If not found, return null/undefined. + */ + + + DataZoomModel.prototype.getAxisModel = function (axisDim, axisIndex) { + if ("development" !== 'production') { + assert(axisDim && axisIndex != null); + } + + var axisInfo = this._targetAxisInfoMap.get(axisDim); + + if (axisInfo && axisInfo.indexMap[axisIndex]) { + return this.ecModel.getComponent(getAxisMainType(axisDim), axisIndex); + } + }; + /** + * If not specified, set to undefined. + */ + + + DataZoomModel.prototype.setRawRange = function (opt) { + var thisOption = this.option; + var settledOption = this.settledOption; + each([['start', 'startValue'], ['end', 'endValue']], function (names) { + // Consider the pair <start, startValue>: + // If one has value and the other one is `null/undefined`, we both set them + // to `settledOption`. This strategy enables the feature to clear the original + // value in `settledOption` to `null/undefined`. + // But if both of them are `null/undefined`, we do not set them to `settledOption` + // and keep `settledOption` with the original value. This strategy enables users to + // only set <end or endValue> but not set <start or startValue> when calling + // `dispatchAction`. + // The pair <end, endValue> is treated in the same way. + if (opt[names[0]] != null || opt[names[1]] != null) { + thisOption[names[0]] = settledOption[names[0]] = opt[names[0]]; + thisOption[names[1]] = settledOption[names[1]] = opt[names[1]]; + } + }, this); + + this._updateRangeUse(opt); + }; + + DataZoomModel.prototype.setCalculatedRange = function (opt) { + var option = this.option; + each(['start', 'startValue', 'end', 'endValue'], function (name) { + option[name] = opt[name]; + }); + }; + + DataZoomModel.prototype.getPercentRange = function () { + var axisProxy = this.findRepresentativeAxisProxy(); + + if (axisProxy) { + return axisProxy.getDataPercentWindow(); + } + }; + /** + * For example, chart.getModel().getComponent('dataZoom').getValueRange('y', 0); + * + * @return [startValue, endValue] value can only be '-' or finite number. + */ + + + DataZoomModel.prototype.getValueRange = function (axisDim, axisIndex) { + if (axisDim == null && axisIndex == null) { + var axisProxy = this.findRepresentativeAxisProxy(); + + if (axisProxy) { + return axisProxy.getDataValueWindow(); + } + } else { + return this.getAxisProxy(axisDim, axisIndex).getDataValueWindow(); + } + }; + /** + * @param axisModel If axisModel given, find axisProxy + * corresponding to the axisModel + */ + + + DataZoomModel.prototype.findRepresentativeAxisProxy = function (axisModel) { + if (axisModel) { + return axisModel.__dzAxisProxy; + } // Find the first hosted axisProxy + + + var firstProxy; + + var axisDimList = this._targetAxisInfoMap.keys(); + + for (var i = 0; i < axisDimList.length; i++) { + var axisDim = axisDimList[i]; + + var axisInfo = this._targetAxisInfoMap.get(axisDim); + + for (var j = 0; j < axisInfo.indexList.length; j++) { + var proxy = this.getAxisProxy(axisDim, axisInfo.indexList[j]); + + if (proxy.hostedBy(this)) { + return proxy; + } + + if (!firstProxy) { + firstProxy = proxy; + } + } + } // If no hosted proxy found, still need to return a proxy. + // This case always happens in toolbox dataZoom, where axes are all hosted by + // other dataZooms. + + + return firstProxy; + }; + + DataZoomModel.prototype.getRangePropMode = function () { + return this._rangePropMode.slice(); + }; + + DataZoomModel.prototype.getOrient = function () { + if ("development" !== 'production') { + // Should not be called before initialized. + assert(this._orient); + } + + return this._orient; + }; + + DataZoomModel.type = 'dataZoom'; + DataZoomModel.dependencies = ['xAxis', 'yAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'series', 'toolbox']; + DataZoomModel.defaultOption = { + // zlevel: 0, + z: 4, + filterMode: 'filter', + start: 0, + end: 100 + }; + return DataZoomModel; + }(ComponentModel); + /** + * Retrieve the those raw params from option, which will be cached separately. + * becasue they will be overwritten by normalized/calculated values in the main + * process. + */ + + + function retrieveRawOption(option) { + var ret = {}; + each(['start', 'end', 'startValue', 'endValue', 'throttle'], function (name) { + option.hasOwnProperty(name) && (ret[name] = option[name]); + }); + return ret; + } + + var SelectDataZoomModel = + /** @class */ + function (_super) { + __extends(SelectDataZoomModel, _super); + + function SelectDataZoomModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SelectDataZoomModel.type; + return _this; + } + + SelectDataZoomModel.type = 'dataZoom.select'; + return SelectDataZoomModel; + }(DataZoomModel); + + var DataZoomView = + /** @class */ + function (_super) { + __extends(DataZoomView, _super); + + function DataZoomView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = DataZoomView.type; + return _this; + } + + DataZoomView.prototype.render = function (dataZoomModel, ecModel, api, payload) { + this.dataZoomModel = dataZoomModel; + this.ecModel = ecModel; + this.api = api; + }; + + DataZoomView.type = 'dataZoom'; + return DataZoomView; + }(ComponentView); + + var SelectDataZoomView = + /** @class */ + function (_super) { + __extends(SelectDataZoomView, _super); + + function SelectDataZoomView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SelectDataZoomView.type; + return _this; + } + + SelectDataZoomView.type = 'dataZoom.select'; + return SelectDataZoomView; + }(DataZoomView); + + var each$8 = each; + var asc$1 = asc; + /** + * Operate single axis. + * One axis can only operated by one axis operator. + * Different dataZoomModels may be defined to operate the same axis. + * (i.e. 'inside' data zoom and 'slider' data zoom components) + * So dataZoomModels share one axisProxy in that case. + */ + + var AxisProxy = + /** @class */ + function () { + function AxisProxy(dimName, axisIndex, dataZoomModel, ecModel) { + this._dimName = dimName; + this._axisIndex = axisIndex; + this.ecModel = ecModel; + this._dataZoomModel = dataZoomModel; // /** + // * @readOnly + // * @private + // */ + // this.hasSeriesStacked; + } + /** + * Whether the axisProxy is hosted by dataZoomModel. + */ + + + AxisProxy.prototype.hostedBy = function (dataZoomModel) { + return this._dataZoomModel === dataZoomModel; + }; + /** + * @return Value can only be NaN or finite value. + */ + + + AxisProxy.prototype.getDataValueWindow = function () { + return this._valueWindow.slice(); + }; + /** + * @return {Array.<number>} + */ + + + AxisProxy.prototype.getDataPercentWindow = function () { + return this._percentWindow.slice(); + }; + + AxisProxy.prototype.getTargetSeriesModels = function () { + var seriesModels = []; + this.ecModel.eachSeries(function (seriesModel) { + if (isCoordSupported(seriesModel)) { + var axisMainType = getAxisMainType(this._dimName); + var axisModel = seriesModel.getReferringComponents(axisMainType, SINGLE_REFERRING).models[0]; + + if (axisModel && this._axisIndex === axisModel.componentIndex) { + seriesModels.push(seriesModel); + } + } + }, this); + return seriesModels; + }; + + AxisProxy.prototype.getAxisModel = function () { + return this.ecModel.getComponent(this._dimName + 'Axis', this._axisIndex); + }; + + AxisProxy.prototype.getMinMaxSpan = function () { + return clone(this._minMaxSpan); + }; + /** + * Only calculate by given range and this._dataExtent, do not change anything. + */ + + + AxisProxy.prototype.calculateDataWindow = function (opt) { + var dataExtent = this._dataExtent; + var axisModel = this.getAxisModel(); + var scale = axisModel.axis.scale; + + var rangePropMode = this._dataZoomModel.getRangePropMode(); + + var percentExtent = [0, 100]; + var percentWindow = []; + var valueWindow = []; + var hasPropModeValue; + each$8(['start', 'end'], function (prop, idx) { + var boundPercent = opt[prop]; + var boundValue = opt[prop + 'Value']; // Notice: dataZoom is based either on `percentProp` ('start', 'end') or + // on `valueProp` ('startValue', 'endValue'). (They are based on the data extent + // but not min/max of axis, which will be calculated by data window then). + // The former one is suitable for cases that a dataZoom component controls multiple + // axes with different unit or extent, and the latter one is suitable for accurate + // zoom by pixel (e.g., in dataZoomSelect). + // we use `getRangePropMode()` to mark which prop is used. `rangePropMode` is updated + // only when setOption or dispatchAction, otherwise it remains its original value. + // (Why not only record `percentProp` and always map to `valueProp`? Because + // the map `valueProp` -> `percentProp` -> `valueProp` probably not the original + // `valueProp`. consider two axes constrolled by one dataZoom. They have different + // data extent. All of values that are overflow the `dataExtent` will be calculated + // to percent '100%'). + + if (rangePropMode[idx] === 'percent') { + boundPercent == null && (boundPercent = percentExtent[idx]); // Use scale.parse to math round for category or time axis. + + boundValue = scale.parse(linearMap(boundPercent, percentExtent, dataExtent)); + } else { + hasPropModeValue = true; + boundValue = boundValue == null ? dataExtent[idx] : scale.parse(boundValue); // Calculating `percent` from `value` may be not accurate, because + // This calculation can not be inversed, because all of values that + // are overflow the `dataExtent` will be calculated to percent '100%' + + boundPercent = linearMap(boundValue, dataExtent, percentExtent); + } // valueWindow[idx] = round(boundValue); + // percentWindow[idx] = round(boundPercent); + + + valueWindow[idx] = boundValue; + percentWindow[idx] = boundPercent; + }); + asc$1(valueWindow); + asc$1(percentWindow); // The windows from user calling of `dispatchAction` might be out of the extent, + // or do not obey the `min/maxSpan`, `min/maxValueSpan`. But we dont restrict window + // by `zoomLock` here, because we see `zoomLock` just as a interaction constraint, + // where API is able to initialize/modify the window size even though `zoomLock` + // specified. + + var spans = this._minMaxSpan; + hasPropModeValue ? restrictSet(valueWindow, percentWindow, dataExtent, percentExtent, false) : restrictSet(percentWindow, valueWindow, percentExtent, dataExtent, true); + + function restrictSet(fromWindow, toWindow, fromExtent, toExtent, toValue) { + var suffix = toValue ? 'Span' : 'ValueSpan'; + sliderMove(0, fromWindow, fromExtent, 'all', spans['min' + suffix], spans['max' + suffix]); + + for (var i = 0; i < 2; i++) { + toWindow[i] = linearMap(fromWindow[i], fromExtent, toExtent, true); + toValue && (toWindow[i] = scale.parse(toWindow[i])); + } + } + + return { + valueWindow: valueWindow, + percentWindow: percentWindow + }; + }; + /** + * Notice: reset should not be called before series.restoreData() called, + * so it is recommanded to be called in "process stage" but not "model init + * stage". + */ + + + AxisProxy.prototype.reset = function (dataZoomModel) { + if (dataZoomModel !== this._dataZoomModel) { + return; + } + + var targetSeries = this.getTargetSeriesModels(); // Culculate data window and data extent, and record them. + + this._dataExtent = calculateDataExtent(this, this._dimName, targetSeries); // `calculateDataWindow` uses min/maxSpan. + + this._updateMinMaxSpan(); + + var dataWindow = this.calculateDataWindow(dataZoomModel.settledOption); + this._valueWindow = dataWindow.valueWindow; + this._percentWindow = dataWindow.percentWindow; // Update axis setting then. + + this._setAxisModel(); + }; + + AxisProxy.prototype.filterData = function (dataZoomModel, api) { + if (dataZoomModel !== this._dataZoomModel) { + return; + } + + var axisDim = this._dimName; + var seriesModels = this.getTargetSeriesModels(); + var filterMode = dataZoomModel.get('filterMode'); + var valueWindow = this._valueWindow; + + if (filterMode === 'none') { + return; + } // FIXME + // Toolbox may has dataZoom injected. And if there are stacked bar chart + // with NaN data, NaN will be filtered and stack will be wrong. + // So we need to force the mode to be set empty. + // In fect, it is not a big deal that do not support filterMode-'filter' + // when using toolbox#dataZoom, utill tooltip#dataZoom support "single axis + // selection" some day, which might need "adapt to data extent on the + // otherAxis", which is disabled by filterMode-'empty'. + // But currently, stack has been fixed to based on value but not index, + // so this is not an issue any more. + // let otherAxisModel = this.getOtherAxisModel(); + // if (dataZoomModel.get('$fromToolbox') + // && otherAxisModel + // && otherAxisModel.hasSeriesStacked + // ) { + // filterMode = 'empty'; + // } + // TODO + // filterMode 'weakFilter' and 'empty' is not optimized for huge data yet. + + + each$8(seriesModels, function (seriesModel) { + var seriesData = seriesModel.getData(); + var dataDims = seriesData.mapDimensionsAll(axisDim); + + if (!dataDims.length) { + return; + } + + if (filterMode === 'weakFilter') { + var store_1 = seriesData.getStore(); + var dataDimIndices_1 = map(dataDims, function (dim) { + return seriesData.getDimensionIndex(dim); + }, seriesData); + seriesData.filterSelf(function (dataIndex) { + var leftOut; + var rightOut; + var hasValue; + + for (var i = 0; i < dataDims.length; i++) { + var value = store_1.get(dataDimIndices_1[i], dataIndex); + var thisHasValue = !isNaN(value); + var thisLeftOut = value < valueWindow[0]; + var thisRightOut = value > valueWindow[1]; + + if (thisHasValue && !thisLeftOut && !thisRightOut) { + return true; + } + + thisHasValue && (hasValue = true); + thisLeftOut && (leftOut = true); + thisRightOut && (rightOut = true); + } // If both left out and right out, do not filter. + + + return hasValue && leftOut && rightOut; + }); + } else { + each$8(dataDims, function (dim) { + if (filterMode === 'empty') { + seriesModel.setData(seriesData = seriesData.map(dim, function (value) { + return !isInWindow(value) ? NaN : value; + })); + } else { + var range = {}; + range[dim] = valueWindow; // console.time('select'); + + seriesData.selectRange(range); // console.timeEnd('select'); + } + }); + } + + each$8(dataDims, function (dim) { + seriesData.setApproximateExtent(valueWindow, dim); + }); + }); + + function isInWindow(value) { + return value >= valueWindow[0] && value <= valueWindow[1]; + } + }; + + AxisProxy.prototype._updateMinMaxSpan = function () { + var minMaxSpan = this._minMaxSpan = {}; + var dataZoomModel = this._dataZoomModel; + var dataExtent = this._dataExtent; + each$8(['min', 'max'], function (minMax) { + var percentSpan = dataZoomModel.get(minMax + 'Span'); + var valueSpan = dataZoomModel.get(minMax + 'ValueSpan'); + valueSpan != null && (valueSpan = this.getAxisModel().axis.scale.parse(valueSpan)); // minValueSpan and maxValueSpan has higher priority than minSpan and maxSpan + + if (valueSpan != null) { + percentSpan = linearMap(dataExtent[0] + valueSpan, dataExtent, [0, 100], true); + } else if (percentSpan != null) { + valueSpan = linearMap(percentSpan, [0, 100], dataExtent, true) - dataExtent[0]; + } + + minMaxSpan[minMax + 'Span'] = percentSpan; + minMaxSpan[minMax + 'ValueSpan'] = valueSpan; + }, this); + }; + + AxisProxy.prototype._setAxisModel = function () { + var axisModel = this.getAxisModel(); + var percentWindow = this._percentWindow; + var valueWindow = this._valueWindow; + + if (!percentWindow) { + return; + } // [0, 500]: arbitrary value, guess axis extent. + + + var precision = getPixelPrecision(valueWindow, [0, 500]); + precision = Math.min(precision, 20); // For value axis, if min/max/scale are not set, we just use the extent obtained + // by series data, which may be a little different from the extent calculated by + // `axisHelper.getScaleExtent`. But the different just affects the experience a + // little when zooming. So it will not be fixed until some users require it strongly. + + var rawExtentInfo = axisModel.axis.scale.rawExtentInfo; + + if (percentWindow[0] !== 0) { + rawExtentInfo.setDeterminedMinMax('min', +valueWindow[0].toFixed(precision)); + } + + if (percentWindow[1] !== 100) { + rawExtentInfo.setDeterminedMinMax('max', +valueWindow[1].toFixed(precision)); + } + + rawExtentInfo.freeze(); + }; + + return AxisProxy; + }(); + + function calculateDataExtent(axisProxy, axisDim, seriesModels) { + var dataExtent = [Infinity, -Infinity]; + each$8(seriesModels, function (seriesModel) { + unionAxisExtentFromData(dataExtent, seriesModel.getData(), axisDim); + }); // It is important to get "consistent" extent when more then one axes is + // controlled by a `dataZoom`, otherwise those axes will not be synchronized + // when zooming. But it is difficult to know what is "consistent", considering + // axes have different type or even different meanings (For example, two + // time axes are used to compare data of the same date in different years). + // So basically dataZoom just obtains extent by series.data (in category axis + // extent can be obtained from axis.data). + // Nevertheless, user can set min/max/scale on axes to make extent of axes + // consistent. + + var axisModel = axisProxy.getAxisModel(); + var rawExtentResult = ensureScaleRawExtentInfo(axisModel.axis.scale, axisModel, dataExtent).calculate(); + return [rawExtentResult.min, rawExtentResult.max]; + } + + var dataZoomProcessor = { + // `dataZoomProcessor` will only be performed in needed series. Consider if + // there is a line series and a pie series, it is better not to update the + // line series if only pie series is needed to be updated. + getTargetSeries: function (ecModel) { + function eachAxisModel(cb) { + ecModel.eachComponent('dataZoom', function (dataZoomModel) { + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + var axisModel = ecModel.getComponent(getAxisMainType(axisDim), axisIndex); + cb(axisDim, axisIndex, axisModel, dataZoomModel); + }); + }); + } // FIXME: it brings side-effect to `getTargetSeries`. + // Prepare axis proxies. + + + eachAxisModel(function (axisDim, axisIndex, axisModel, dataZoomModel) { + // dispose all last axis proxy, in case that some axis are deleted. + axisModel.__dzAxisProxy = null; + }); + var proxyList = []; + eachAxisModel(function (axisDim, axisIndex, axisModel, dataZoomModel) { + // Different dataZooms may constrol the same axis. In that case, + // an axisProxy serves both of them. + if (!axisModel.__dzAxisProxy) { + // Use the first dataZoomModel as the main model of axisProxy. + axisModel.__dzAxisProxy = new AxisProxy(axisDim, axisIndex, dataZoomModel, ecModel); + proxyList.push(axisModel.__dzAxisProxy); + } + }); + var seriesModelMap = createHashMap(); + each(proxyList, function (axisProxy) { + each(axisProxy.getTargetSeriesModels(), function (seriesModel) { + seriesModelMap.set(seriesModel.uid, seriesModel); + }); + }); + return seriesModelMap; + }, + // Consider appendData, where filter should be performed. Because data process is + // in block mode currently, it is not need to worry about that the overallProgress + // execute every frame. + overallReset: function (ecModel, api) { + ecModel.eachComponent('dataZoom', function (dataZoomModel) { + // We calculate window and reset axis here but not in model + // init stage and not after action dispatch handler, because + // reset should be called after seriesData.restoreData. + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + dataZoomModel.getAxisProxy(axisDim, axisIndex).reset(dataZoomModel); + }); // Caution: data zoom filtering is order sensitive when using + // percent range and no min/max/scale set on axis. + // For example, we have dataZoom definition: + // [ + // {xAxisIndex: 0, start: 30, end: 70}, + // {yAxisIndex: 0, start: 20, end: 80} + // ] + // In this case, [20, 80] of y-dataZoom should be based on data + // that have filtered by x-dataZoom using range of [30, 70], + // but should not be based on full raw data. Thus sliding + // x-dataZoom will change both ranges of xAxis and yAxis, + // while sliding y-dataZoom will only change the range of yAxis. + // So we should filter x-axis after reset x-axis immediately, + // and then reset y-axis and filter y-axis. + + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + dataZoomModel.getAxisProxy(axisDim, axisIndex).filterData(dataZoomModel, api); + }); + }); + ecModel.eachComponent('dataZoom', function (dataZoomModel) { + // Fullfill all of the range props so that user + // is able to get them from chart.getOption(). + var axisProxy = dataZoomModel.findRepresentativeAxisProxy(); + + if (axisProxy) { + var percentRange = axisProxy.getDataPercentWindow(); + var valueRange = axisProxy.getDataValueWindow(); + dataZoomModel.setCalculatedRange({ + start: percentRange[0], + end: percentRange[1], + startValue: valueRange[0], + endValue: valueRange[1] + }); + } + }); + } + }; + + function installDataZoomAction(registers) { + registers.registerAction('dataZoom', function (payload, ecModel) { + var effectedModels = findEffectedDataZooms(ecModel, payload); + each(effectedModels, function (dataZoomModel) { + dataZoomModel.setRawRange({ + start: payload.start, + end: payload.end, + startValue: payload.startValue, + endValue: payload.endValue + }); + }); + }); + } + + var installed = false; + function installCommon(registers) { + if (installed) { + return; + } + + installed = true; + registers.registerProcessor(registers.PRIORITY.PROCESSOR.FILTER, dataZoomProcessor); + installDataZoomAction(registers); + registers.registerSubTypeDefaulter('dataZoom', function () { + // Default 'slider' when no type specified. + return 'slider'; + }); + } + + function install$y(registers) { + registers.registerComponentModel(SelectDataZoomModel); + registers.registerComponentView(SelectDataZoomView); + installCommon(registers); + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + var ToolboxFeature = + /** @class */ + function () { + function ToolboxFeature() {} + + return ToolboxFeature; + }(); + var features = {}; + function registerFeature(name, ctor) { + features[name] = ctor; + } + function getFeature(name) { + return features[name]; + } + + var ToolboxModel = + /** @class */ + function (_super) { + __extends(ToolboxModel, _super); + + function ToolboxModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ToolboxModel.type; + return _this; + } + + ToolboxModel.prototype.optionUpdated = function () { + _super.prototype.optionUpdated.apply(this, arguments); + + var ecModel = this.ecModel; + each(this.option.feature, function (featureOpt, featureName) { + var Feature = getFeature(featureName); + + if (Feature) { + if (Feature.getDefaultOption) { + Feature.defaultOption = Feature.getDefaultOption(ecModel); + } + + merge(featureOpt, Feature.defaultOption); + } + }); + }; + + ToolboxModel.type = 'toolbox'; + ToolboxModel.layoutMode = { + type: 'box', + ignoreSize: true + }; + ToolboxModel.defaultOption = { + show: true, + z: 6, + // zlevel: 0, + orient: 'horizontal', + left: 'right', + top: 'top', + // right + // bottom + backgroundColor: 'transparent', + borderColor: '#ccc', + borderRadius: 0, + borderWidth: 0, + padding: 5, + itemSize: 15, + itemGap: 8, + showTitle: true, + iconStyle: { + borderColor: '#666', + color: 'none' + }, + emphasis: { + iconStyle: { + borderColor: '#3E98C5' + } + }, + // textStyle: {}, + // feature + tooltip: { + show: false, + position: 'bottom' + } + }; + return ToolboxModel; + }(ComponentModel); + + /** + * Layout list like component. + * It will box layout each items in group of component and then position the whole group in the viewport + * @param {module:zrender/group/Group} group + * @param {module:echarts/model/Component} componentModel + * @param {module:echarts/ExtensionAPI} + */ + + function layout$3(group, componentModel, api) { + var boxLayoutParams = componentModel.getBoxLayoutParams(); + var padding = componentModel.get('padding'); + var viewportSize = { + width: api.getWidth(), + height: api.getHeight() + }; + var rect = getLayoutRect(boxLayoutParams, viewportSize, padding); + box(componentModel.get('orient'), group, componentModel.get('itemGap'), rect.width, rect.height); + positionElement(group, boxLayoutParams, viewportSize, padding); + } + function makeBackground(rect, componentModel) { + var padding = normalizeCssArray$1(componentModel.get('padding')); + var style = componentModel.getItemStyle(['color', 'opacity']); + style.fill = componentModel.get('backgroundColor'); + rect = new Rect({ + shape: { + x: rect.x - padding[3], + y: rect.y - padding[0], + width: rect.width + padding[1] + padding[3], + height: rect.height + padding[0] + padding[2], + r: componentModel.get('borderRadius') + }, + style: style, + silent: true, + z2: -1 + }); // FIXME + // `subPixelOptimizeRect` may bring some gap between edge of viewpart + // and background rect when setting like `left: 0`, `top: 0`. + // graphic.subPixelOptimizeRect(rect); + + return rect; + } + + var ToolboxView = + /** @class */ + function (_super) { + __extends(ToolboxView, _super); + + function ToolboxView() { + return _super !== null && _super.apply(this, arguments) || this; + } + + ToolboxView.prototype.render = function (toolboxModel, ecModel, api, payload) { + var group = this.group; + group.removeAll(); + + if (!toolboxModel.get('show')) { + return; + } + + var itemSize = +toolboxModel.get('itemSize'); + var isVertical = toolboxModel.get('orient') === 'vertical'; + var featureOpts = toolboxModel.get('feature') || {}; + var features = this._features || (this._features = {}); + var featureNames = []; + each(featureOpts, function (opt, name) { + featureNames.push(name); + }); + new DataDiffer(this._featureNames || [], featureNames).add(processFeature).update(processFeature).remove(curry(processFeature, null)).execute(); // Keep for diff. + + this._featureNames = featureNames; + + function processFeature(newIndex, oldIndex) { + var featureName = featureNames[newIndex]; + var oldName = featureNames[oldIndex]; + var featureOpt = featureOpts[featureName]; + var featureModel = new Model(featureOpt, toolboxModel, toolboxModel.ecModel); + var feature; // FIX#11236, merge feature title from MagicType newOption. TODO: consider seriesIndex ? + + if (payload && payload.newTitle != null && payload.featureName === featureName) { + featureOpt.title = payload.newTitle; + } + + if (featureName && !oldName) { + // Create + if (isUserFeatureName(featureName)) { + feature = { + onclick: featureModel.option.onclick, + featureName: featureName + }; + } else { + var Feature = getFeature(featureName); + + if (!Feature) { + return; + } + + feature = new Feature(); + } + + features[featureName] = feature; + } else { + feature = features[oldName]; // If feature does not exsit. + + if (!feature) { + return; + } + } + + feature.uid = getUID('toolbox-feature'); + feature.model = featureModel; + feature.ecModel = ecModel; + feature.api = api; + var isToolboxFeature = feature instanceof ToolboxFeature; + + if (!featureName && oldName) { + isToolboxFeature && feature.dispose && feature.dispose(ecModel, api); + return; + } + + if (!featureModel.get('show') || isToolboxFeature && feature.unusable) { + isToolboxFeature && feature.remove && feature.remove(ecModel, api); + return; + } + + createIconPaths(featureModel, feature, featureName); + + featureModel.setIconStatus = function (iconName, status) { + var option = this.option; + var iconPaths = this.iconPaths; + option.iconStatus = option.iconStatus || {}; + option.iconStatus[iconName] = status; + + if (iconPaths[iconName]) { + (status === 'emphasis' ? enterEmphasis : leaveEmphasis)(iconPaths[iconName]); + } + }; + + if (feature instanceof ToolboxFeature) { + if (feature.render) { + feature.render(featureModel, ecModel, api, payload); + } + } + } + + function createIconPaths(featureModel, feature, featureName) { + var iconStyleModel = featureModel.getModel('iconStyle'); + var iconStyleEmphasisModel = featureModel.getModel(['emphasis', 'iconStyle']); // If one feature has mutiple icon. they are orginaized as + // { + // icon: { + // foo: '', + // bar: '' + // }, + // title: { + // foo: '', + // bar: '' + // } + // } + + var icons = feature instanceof ToolboxFeature && feature.getIcons ? feature.getIcons() : featureModel.get('icon'); + var titles = featureModel.get('title') || {}; + var iconsMap; + var titlesMap; + + if (isString(icons)) { + iconsMap = {}; + iconsMap[featureName] = icons; + } else { + iconsMap = icons; + } + + if (isString(titles)) { + titlesMap = {}; + titlesMap[featureName] = titles; + } else { + titlesMap = titles; + } + + var iconPaths = featureModel.iconPaths = {}; + each(iconsMap, function (iconStr, iconName) { + var path = createIcon(iconStr, {}, { + x: -itemSize / 2, + y: -itemSize / 2, + width: itemSize, + height: itemSize + }); // TODO handling image + + path.setStyle(iconStyleModel.getItemStyle()); + var pathEmphasisState = path.ensureState('emphasis'); + pathEmphasisState.style = iconStyleEmphasisModel.getItemStyle(); // Text position calculation + + var textContent = new ZRText({ + style: { + text: titlesMap[iconName], + align: iconStyleEmphasisModel.get('textAlign'), + borderRadius: iconStyleEmphasisModel.get('textBorderRadius'), + padding: iconStyleEmphasisModel.get('textPadding'), + fill: null + }, + ignore: true + }); + path.setTextContent(textContent); + setTooltipConfig({ + el: path, + componentModel: toolboxModel, + itemName: iconName, + formatterParamsExtra: { + title: titlesMap[iconName] + } + }); + path.__title = titlesMap[iconName]; + path.on('mouseover', function () { + // Should not reuse above hoverStyle, which might be modified. + var hoverStyle = iconStyleEmphasisModel.getItemStyle(); + var defaultTextPosition = isVertical ? toolboxModel.get('right') == null && toolboxModel.get('left') !== 'right' ? 'right' : 'left' : toolboxModel.get('bottom') == null && toolboxModel.get('top') !== 'bottom' ? 'bottom' : 'top'; + textContent.setStyle({ + fill: iconStyleEmphasisModel.get('textFill') || hoverStyle.fill || hoverStyle.stroke || '#000', + backgroundColor: iconStyleEmphasisModel.get('textBackgroundColor') + }); + path.setTextConfig({ + position: iconStyleEmphasisModel.get('textPosition') || defaultTextPosition + }); + textContent.ignore = !toolboxModel.get('showTitle'); // Use enterEmphasis and leaveEmphasis provide by ec. + // There are flags managed by the echarts. + + api.enterEmphasis(this); + }).on('mouseout', function () { + if (featureModel.get(['iconStatus', iconName]) !== 'emphasis') { + api.leaveEmphasis(this); + } + + textContent.hide(); + }); + (featureModel.get(['iconStatus', iconName]) === 'emphasis' ? enterEmphasis : leaveEmphasis)(path); + group.add(path); + path.on('click', bind(feature.onclick, feature, ecModel, api, iconName)); + iconPaths[iconName] = path; + }); + } + + layout$3(group, toolboxModel, api); // Render background after group is layout + // FIXME + + group.add(makeBackground(group.getBoundingRect(), toolboxModel)); // Adjust icon title positions to avoid them out of screen + + isVertical || group.eachChild(function (icon) { + var titleText = icon.__title; // const hoverStyle = icon.hoverStyle; + // TODO simplify code? + + var emphasisState = icon.ensureState('emphasis'); + var emphasisTextConfig = emphasisState.textConfig || (emphasisState.textConfig = {}); + var textContent = icon.getTextContent(); + var emphasisTextState = textContent && textContent.ensureState('emphasis'); // May be background element + + if (emphasisTextState && !isFunction(emphasisTextState) && titleText) { + var emphasisTextStyle = emphasisTextState.style || (emphasisTextState.style = {}); + var rect = getBoundingRect(titleText, ZRText.makeFont(emphasisTextStyle)); + var offsetX = icon.x + group.x; + var offsetY = icon.y + group.y + itemSize; + var needPutOnTop = false; + + if (offsetY + rect.height > api.getHeight()) { + emphasisTextConfig.position = 'top'; + needPutOnTop = true; + } + + var topOffset = needPutOnTop ? -5 - rect.height : itemSize + 10; + + if (offsetX + rect.width / 2 > api.getWidth()) { + emphasisTextConfig.position = ['100%', topOffset]; + emphasisTextStyle.align = 'right'; + } else if (offsetX - rect.width / 2 < 0) { + emphasisTextConfig.position = [0, topOffset]; + emphasisTextStyle.align = 'left'; + } + } + }); + }; + + ToolboxView.prototype.updateView = function (toolboxModel, ecModel, api, payload) { + each(this._features, function (feature) { + feature instanceof ToolboxFeature && feature.updateView && feature.updateView(feature.model, ecModel, api, payload); + }); + }; // updateLayout(toolboxModel, ecModel, api, payload) { + // zrUtil.each(this._features, function (feature) { + // feature.updateLayout && feature.updateLayout(feature.model, ecModel, api, payload); + // }); + // }, + + + ToolboxView.prototype.remove = function (ecModel, api) { + each(this._features, function (feature) { + feature instanceof ToolboxFeature && feature.remove && feature.remove(ecModel, api); + }); + this.group.removeAll(); + }; + + ToolboxView.prototype.dispose = function (ecModel, api) { + each(this._features, function (feature) { + feature instanceof ToolboxFeature && feature.dispose && feature.dispose(ecModel, api); + }); + }; + + ToolboxView.type = 'toolbox'; + return ToolboxView; + }(ComponentView); + + function isUserFeatureName(featureName) { + return featureName.indexOf('my') === 0; + } + + /* global window, document */ + + var SaveAsImage = + /** @class */ + function (_super) { + __extends(SaveAsImage, _super); + + function SaveAsImage() { + return _super !== null && _super.apply(this, arguments) || this; + } + + SaveAsImage.prototype.onclick = function (ecModel, api) { + var model = this.model; + var title = model.get('name') || ecModel.get('title.0.text') || 'echarts'; + var isSvg = api.getZr().painter.getType() === 'svg'; + var type = isSvg ? 'svg' : model.get('type', true) || 'png'; + var url = api.getConnectedDataURL({ + type: type, + backgroundColor: model.get('backgroundColor', true) || ecModel.get('backgroundColor') || '#fff', + connectedBackgroundColor: model.get('connectedBackgroundColor'), + excludeComponents: model.get('excludeComponents'), + pixelRatio: model.get('pixelRatio') + }); + var browser = env.browser; // Chrome, Firefox, New Edge + + if (isFunction(MouseEvent) && (browser.newEdge || !browser.ie && !browser.edge)) { + var $a = document.createElement('a'); + $a.download = title + '.' + type; + $a.target = '_blank'; + $a.href = url; + var evt = new MouseEvent('click', { + // some micro front-end framework, window maybe is a Proxy + view: document.defaultView, + bubbles: true, + cancelable: false + }); + $a.dispatchEvent(evt); + } // IE or old Edge + else { + // @ts-ignore + if (window.navigator.msSaveOrOpenBlob || isSvg) { + var parts = url.split(','); // data:[<mime type>][;charset=<charset>][;base64],<encoded data> + + var base64Encoded = parts[0].indexOf('base64') > -1; + var bstr = isSvg // should decode the svg data uri first + ? decodeURIComponent(parts[1]) : parts[1]; // only `atob` when the data uri is encoded with base64 + // otherwise, like `svg` data uri exported by zrender, + // there will be an error, for it's not encoded with base64. + // (just a url-encoded string through `encodeURIComponent`) + + base64Encoded && (bstr = window.atob(bstr)); + var filename = title + '.' + type; // @ts-ignore + + if (window.navigator.msSaveOrOpenBlob) { + var n = bstr.length; + var u8arr = new Uint8Array(n); + + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + + var blob = new Blob([u8arr]); // @ts-ignore + + window.navigator.msSaveOrOpenBlob(blob, filename); + } else { + var frame = document.createElement('iframe'); + document.body.appendChild(frame); + var cw = frame.contentWindow; + var doc = cw.document; + doc.open('image/svg+xml', 'replace'); + doc.write(bstr); + doc.close(); + cw.focus(); + doc.execCommand('SaveAs', true, filename); + document.body.removeChild(frame); + } + } else { + var lang = model.get('lang'); + var html = '' + '<body style="margin:0;">' + '<img src="' + url + '" style="max-width:100%;" title="' + (lang && lang[0] || '') + '" />' + '</body>'; + var tab = window.open(); + tab.document.write(html); + tab.document.title = title; + } + } + }; + + SaveAsImage.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + icon: 'M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0', + title: ecModel.getLocaleModel().get(['toolbox', 'saveAsImage', 'title']), + type: 'png', + // Default use option.backgroundColor + // backgroundColor: '#fff', + connectedBackgroundColor: '#fff', + name: '', + excludeComponents: ['toolbox'], + // use current pixel ratio of device by default + // pixelRatio: 1, + lang: ecModel.getLocaleModel().get(['toolbox', 'saveAsImage', 'lang']) + }; + return defaultOption; + }; + + return SaveAsImage; + }(ToolboxFeature); + + var INNER_STACK_KEYWORD = '__ec_magicType_stack__'; + var radioTypes = [['line', 'bar'], ['stack']]; + + var MagicType = + /** @class */ + function (_super) { + __extends(MagicType, _super); + + function MagicType() { + return _super !== null && _super.apply(this, arguments) || this; + } + + MagicType.prototype.getIcons = function () { + var model = this.model; + var availableIcons = model.get('icon'); + var icons = {}; + each(model.get('type'), function (type) { + if (availableIcons[type]) { + icons[type] = availableIcons[type]; + } + }); + return icons; + }; + + MagicType.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + type: [], + // Icon group + icon: { + line: 'M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4', + bar: 'M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7', + // eslint-disable-next-line + stack: 'M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z' // jshint ignore:line + + }, + // `line`, `bar`, `stack`, `tiled` + title: ecModel.getLocaleModel().get(['toolbox', 'magicType', 'title']), + option: {}, + seriesIndex: {} + }; + return defaultOption; + }; + + MagicType.prototype.onclick = function (ecModel, api, type) { + var model = this.model; + var seriesIndex = model.get(['seriesIndex', type]); // Not supported magicType + + if (!seriesOptGenreator[type]) { + return; + } + + var newOption = { + series: [] + }; + + var generateNewSeriesTypes = function (seriesModel) { + var seriesType = seriesModel.subType; + var seriesId = seriesModel.id; + var newSeriesOpt = seriesOptGenreator[type](seriesType, seriesId, seriesModel, model); + + if (newSeriesOpt) { + // PENDING If merge original option? + defaults(newSeriesOpt, seriesModel.option); + newOption.series.push(newSeriesOpt); + } // Modify boundaryGap + + + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.type === 'cartesian2d' && (type === 'line' || type === 'bar')) { + var categoryAxis = coordSys.getAxesByScale('ordinal')[0]; + + if (categoryAxis) { + var axisDim = categoryAxis.dim; + var axisType = axisDim + 'Axis'; + var axisModel = seriesModel.getReferringComponents(axisType, SINGLE_REFERRING).models[0]; + var axisIndex = axisModel.componentIndex; + newOption[axisType] = newOption[axisType] || []; + + for (var i = 0; i <= axisIndex; i++) { + newOption[axisType][axisIndex] = newOption[axisType][axisIndex] || {}; + } + + newOption[axisType][axisIndex].boundaryGap = type === 'bar'; + } + } + }; + + each(radioTypes, function (radio) { + if (indexOf(radio, type) >= 0) { + each(radio, function (item) { + model.setIconStatus(item, 'normal'); + }); + } + }); + model.setIconStatus(type, 'emphasis'); + ecModel.eachComponent({ + mainType: 'series', + query: seriesIndex == null ? null : { + seriesIndex: seriesIndex + } + }, generateNewSeriesTypes); + var newTitle; + var currentType = type; // Change title of stack + + if (type === 'stack') { + // use titles in model instead of ecModel + // as stack and tiled appears in pair, just flip them + // no need of checking stack state + newTitle = merge({ + stack: model.option.title.tiled, + tiled: model.option.title.stack + }, model.option.title); + + if (model.get(['iconStatus', type]) !== 'emphasis') { + currentType = 'tiled'; + } + } + + api.dispatchAction({ + type: 'changeMagicType', + currentType: currentType, + newOption: newOption, + newTitle: newTitle, + featureName: 'magicType' + }); + }; + + return MagicType; + }(ToolboxFeature); + + var seriesOptGenreator = { + 'line': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'bar') { + return merge({ + id: seriesId, + type: 'line', + // Preserve data related option + data: seriesModel.get('data'), + stack: seriesModel.get('stack'), + markPoint: seriesModel.get('markPoint'), + markLine: seriesModel.get('markLine') + }, model.get(['option', 'line']) || {}, true); + } + }, + 'bar': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'line') { + return merge({ + id: seriesId, + type: 'bar', + // Preserve data related option + data: seriesModel.get('data'), + stack: seriesModel.get('stack'), + markPoint: seriesModel.get('markPoint'), + markLine: seriesModel.get('markLine') + }, model.get(['option', 'bar']) || {}, true); + } + }, + 'stack': function (seriesType, seriesId, seriesModel, model) { + var isStack = seriesModel.get('stack') === INNER_STACK_KEYWORD; + + if (seriesType === 'line' || seriesType === 'bar') { + model.setIconStatus('stack', isStack ? 'normal' : 'emphasis'); + return merge({ + id: seriesId, + stack: isStack ? '' : INNER_STACK_KEYWORD + }, model.get(['option', 'stack']) || {}, true); + } + } + }; // TODO: SELF REGISTERED. + + registerAction({ + type: 'changeMagicType', + event: 'magicTypeChanged', + update: 'prepareAndUpdate' + }, function (payload, ecModel) { + ecModel.mergeOption(payload.newOption); + }); + + /* global document */ + + var BLOCK_SPLITER = new Array(60).join('-'); + var ITEM_SPLITER = '\t'; + /** + * Group series into two types + * 1. on category axis, like line, bar + * 2. others, like scatter, pie + */ + + function groupSeries(ecModel) { + var seriesGroupByCategoryAxis = {}; + var otherSeries = []; + var meta = []; + ecModel.eachRawSeries(function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && (coordSys.type === 'cartesian2d' || coordSys.type === 'polar')) { + // TODO: TYPE Consider polar? Include polar may increase unecessary bundle size. + var baseAxis = coordSys.getBaseAxis(); + + if (baseAxis.type === 'category') { + var key = baseAxis.dim + '_' + baseAxis.index; + + if (!seriesGroupByCategoryAxis[key]) { + seriesGroupByCategoryAxis[key] = { + categoryAxis: baseAxis, + valueAxis: coordSys.getOtherAxis(baseAxis), + series: [] + }; + meta.push({ + axisDim: baseAxis.dim, + axisIndex: baseAxis.index + }); + } + + seriesGroupByCategoryAxis[key].series.push(seriesModel); + } else { + otherSeries.push(seriesModel); + } + } else { + otherSeries.push(seriesModel); + } + }); + return { + seriesGroupByCategoryAxis: seriesGroupByCategoryAxis, + other: otherSeries, + meta: meta + }; + } + /** + * Assemble content of series on cateogory axis + * @inner + */ + + + function assembleSeriesWithCategoryAxis(groups) { + var tables = []; + each(groups, function (group, key) { + var categoryAxis = group.categoryAxis; + var valueAxis = group.valueAxis; + var valueAxisDim = valueAxis.dim; + var headers = [' '].concat(map(group.series, function (series) { + return series.name; + })); // @ts-ignore TODO Polar + + var columns = [categoryAxis.model.getCategories()]; + each(group.series, function (series) { + var rawData = series.getRawData(); + columns.push(series.getRawData().mapArray(rawData.mapDimension(valueAxisDim), function (val) { + return val; + })); + }); // Assemble table content + + var lines = [headers.join(ITEM_SPLITER)]; + + for (var i = 0; i < columns[0].length; i++) { + var items = []; + + for (var j = 0; j < columns.length; j++) { + items.push(columns[j][i]); + } + + lines.push(items.join(ITEM_SPLITER)); + } + + tables.push(lines.join('\n')); + }); + return tables.join('\n\n' + BLOCK_SPLITER + '\n\n'); + } + /** + * Assemble content of other series + */ + + + function assembleOtherSeries(series) { + return map(series, function (series) { + var data = series.getRawData(); + var lines = [series.name]; + var vals = []; + data.each(data.dimensions, function () { + var argLen = arguments.length; + var dataIndex = arguments[argLen - 1]; + var name = data.getName(dataIndex); + + for (var i = 0; i < argLen - 1; i++) { + vals[i] = arguments[i]; + } + + lines.push((name ? name + ITEM_SPLITER : '') + vals.join(ITEM_SPLITER)); + }); + return lines.join('\n'); + }).join('\n\n' + BLOCK_SPLITER + '\n\n'); + } + + function getContentFromModel(ecModel) { + var result = groupSeries(ecModel); + return { + value: filter([assembleSeriesWithCategoryAxis(result.seriesGroupByCategoryAxis), assembleOtherSeries(result.other)], function (str) { + return !!str.replace(/[\n\t\s]/g, ''); + }).join('\n\n' + BLOCK_SPLITER + '\n\n'), + meta: result.meta + }; + } + + function trim$1(str) { + return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); + } + /** + * If a block is tsv format + */ + + + function isTSVFormat(block) { + // Simple method to find out if a block is tsv format + var firstLine = block.slice(0, block.indexOf('\n')); + + if (firstLine.indexOf(ITEM_SPLITER) >= 0) { + return true; + } + } + + var itemSplitRegex = new RegExp('[' + ITEM_SPLITER + ']+', 'g'); + /** + * @param {string} tsv + * @return {Object} + */ + + function parseTSVContents(tsv) { + var tsvLines = tsv.split(/\n+/g); + var headers = trim$1(tsvLines.shift()).split(itemSplitRegex); + var categories = []; + var series = map(headers, function (header) { + return { + name: header, + data: [] + }; + }); + + for (var i = 0; i < tsvLines.length; i++) { + var items = trim$1(tsvLines[i]).split(itemSplitRegex); + categories.push(items.shift()); + + for (var j = 0; j < items.length; j++) { + series[j] && (series[j].data[i] = items[j]); + } + } + + return { + series: series, + categories: categories + }; + } + + function parseListContents(str) { + var lines = str.split(/\n+/g); + var seriesName = trim$1(lines.shift()); + var data = []; + + for (var i = 0; i < lines.length; i++) { + // if line is empty, ignore it. + // there is a case that a user forgot to delete `\n`. + var line = trim$1(lines[i]); + + if (!line) { + continue; + } + + var items = line.split(itemSplitRegex); + var name_1 = ''; + var value = void 0; + var hasName = false; + + if (isNaN(items[0])) { + // First item is name + hasName = true; + name_1 = items[0]; + items = items.slice(1); + data[i] = { + name: name_1, + value: [] + }; + value = data[i].value; + } else { + value = data[i] = []; + } + + for (var j = 0; j < items.length; j++) { + value.push(+items[j]); + } + + if (value.length === 1) { + hasName ? data[i].value = value[0] : data[i] = value[0]; + } + } + + return { + name: seriesName, + data: data + }; + } + + function parseContents(str, blockMetaList) { + var blocks = str.split(new RegExp('\n*' + BLOCK_SPLITER + '\n*', 'g')); + var newOption = { + series: [] + }; + each(blocks, function (block, idx) { + if (isTSVFormat(block)) { + var result = parseTSVContents(block); + var blockMeta = blockMetaList[idx]; + var axisKey = blockMeta.axisDim + 'Axis'; + + if (blockMeta) { + newOption[axisKey] = newOption[axisKey] || []; + newOption[axisKey][blockMeta.axisIndex] = { + data: result.categories + }; + newOption.series = newOption.series.concat(result.series); + } + } else { + var result = parseListContents(block); + newOption.series.push(result); + } + }); + return newOption; + } + + var DataView = + /** @class */ + function (_super) { + __extends(DataView, _super); + + function DataView() { + return _super !== null && _super.apply(this, arguments) || this; + } + + DataView.prototype.onclick = function (ecModel, api) { + // FIXME: better way? + setTimeout(function () { + api.dispatchAction({ + type: 'hideTip' + }); + }); + var container = api.getDom(); + var model = this.model; + + if (this._dom) { + container.removeChild(this._dom); + } + + var root = document.createElement('div'); // use padding to avoid 5px whitespace + + root.style.cssText = 'position:absolute;top:0;bottom:0;left:0;right:0;padding:5px'; + root.style.backgroundColor = model.get('backgroundColor') || '#fff'; // Create elements + + var header = document.createElement('h4'); + var lang = model.get('lang') || []; + header.innerHTML = lang[0] || model.get('title'); + header.style.cssText = 'margin:10px 20px'; + header.style.color = model.get('textColor'); + var viewMain = document.createElement('div'); + var textarea = document.createElement('textarea'); + viewMain.style.cssText = 'overflow:auto'; + var optionToContent = model.get('optionToContent'); + var contentToOption = model.get('contentToOption'); + var result = getContentFromModel(ecModel); + + if (isFunction(optionToContent)) { + var htmlOrDom = optionToContent(api.getOption()); + + if (isString(htmlOrDom)) { + viewMain.innerHTML = htmlOrDom; + } else if (isDom(htmlOrDom)) { + viewMain.appendChild(htmlOrDom); + } + } else { + // Use default textarea + textarea.readOnly = model.get('readOnly'); + var style = textarea.style; // eslint-disable-next-line max-len + + style.cssText = 'display:block;width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;resize:none;box-sizing:border-box;outline:none'; + style.color = model.get('textColor'); + style.borderColor = model.get('textareaBorderColor'); + style.backgroundColor = model.get('textareaColor'); + textarea.value = result.value; + viewMain.appendChild(textarea); + } + + var blockMetaList = result.meta; + var buttonContainer = document.createElement('div'); + buttonContainer.style.cssText = 'position:absolute;bottom:5px;left:0;right:0'; // eslint-disable-next-line max-len + + var buttonStyle = 'float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px'; + var closeButton = document.createElement('div'); + var refreshButton = document.createElement('div'); + buttonStyle += ';background-color:' + model.get('buttonColor'); + buttonStyle += ';color:' + model.get('buttonTextColor'); + var self = this; + + function close() { + container.removeChild(root); + self._dom = null; + } + + addEventListener(closeButton, 'click', close); + addEventListener(refreshButton, 'click', function () { + if (contentToOption == null && optionToContent != null || contentToOption != null && optionToContent == null) { + if ("development" !== 'production') { + // eslint-disable-next-line + warn('It seems you have just provided one of `contentToOption` and `optionToContent` functions but missed the other one. Data change is ignored.'); + } + + close(); + return; + } + + var newOption; + + try { + if (isFunction(contentToOption)) { + newOption = contentToOption(viewMain, api.getOption()); + } else { + newOption = parseContents(textarea.value, blockMetaList); + } + } catch (e) { + close(); + throw new Error('Data view format error ' + e); + } + + if (newOption) { + api.dispatchAction({ + type: 'changeDataView', + newOption: newOption + }); + } + + close(); + }); + closeButton.innerHTML = lang[1]; + refreshButton.innerHTML = lang[2]; + refreshButton.style.cssText = closeButton.style.cssText = buttonStyle; + !model.get('readOnly') && buttonContainer.appendChild(refreshButton); + buttonContainer.appendChild(closeButton); + root.appendChild(header); + root.appendChild(viewMain); + root.appendChild(buttonContainer); + viewMain.style.height = container.clientHeight - 80 + 'px'; + container.appendChild(root); + this._dom = root; + }; + + DataView.prototype.remove = function (ecModel, api) { + this._dom && api.getDom().removeChild(this._dom); + }; + + DataView.prototype.dispose = function (ecModel, api) { + this.remove(ecModel, api); + }; + + DataView.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + readOnly: false, + optionToContent: null, + contentToOption: null, + // eslint-disable-next-line + icon: 'M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28', + title: ecModel.getLocaleModel().get(['toolbox', 'dataView', 'title']), + lang: ecModel.getLocaleModel().get(['toolbox', 'dataView', 'lang']), + backgroundColor: '#fff', + textColor: '#000', + textareaColor: '#fff', + textareaBorderColor: '#333', + buttonColor: '#c23531', + buttonTextColor: '#fff' + }; + return defaultOption; + }; + + return DataView; + }(ToolboxFeature); + /** + * @inner + */ + + + function tryMergeDataOption(newData, originalData) { + return map(newData, function (newVal, idx) { + var original = originalData && originalData[idx]; + + if (isObject(original) && !isArray(original)) { + var newValIsObject = isObject(newVal) && !isArray(newVal); + + if (!newValIsObject) { + newVal = { + value: newVal + }; + } // original data has name but new data has no name + + + var shouldDeleteName = original.name != null && newVal.name == null; // Original data has option + + newVal = defaults(newVal, original); + shouldDeleteName && delete newVal.name; + return newVal; + } else { + return newVal; + } + }); + } // TODO: SELF REGISTERED. + + + registerAction({ + type: 'changeDataView', + event: 'dataViewChanged', + update: 'prepareAndUpdate' + }, function (payload, ecModel) { + var newSeriesOptList = []; + each(payload.newOption.series, function (seriesOpt) { + var seriesModel = ecModel.getSeriesByName(seriesOpt.name)[0]; + + if (!seriesModel) { + // New created series + // Geuss the series type + newSeriesOptList.push(extend({ + // Default is scatter + type: 'scatter' + }, seriesOpt)); + } else { + var originalData = seriesModel.get('data'); + newSeriesOptList.push({ + name: seriesOpt.name, + data: tryMergeDataOption(seriesOpt.data, originalData) + }); + } + }); + ecModel.mergeOption(defaults({ + series: newSeriesOptList + }, payload.newOption)); + }); + + var each$9 = each; + var inner$f = makeInner(); + /** + * @param ecModel + * @param newSnapshot key is dataZoomId + */ + + function push(ecModel, newSnapshot) { + var storedSnapshots = getStoreSnapshots(ecModel); // If previous dataZoom can not be found, + // complete an range with current range. + + each$9(newSnapshot, function (batchItem, dataZoomId) { + var i = storedSnapshots.length - 1; + + for (; i >= 0; i--) { + var snapshot = storedSnapshots[i]; + + if (snapshot[dataZoomId]) { + break; + } + } + + if (i < 0) { + // No origin range set, create one by current range. + var dataZoomModel = ecModel.queryComponents({ + mainType: 'dataZoom', + subType: 'select', + id: dataZoomId + })[0]; + + if (dataZoomModel) { + var percentRange = dataZoomModel.getPercentRange(); + storedSnapshots[0][dataZoomId] = { + dataZoomId: dataZoomId, + start: percentRange[0], + end: percentRange[1] + }; + } + } + }); + storedSnapshots.push(newSnapshot); + } + function pop(ecModel) { + var storedSnapshots = getStoreSnapshots(ecModel); + var head = storedSnapshots[storedSnapshots.length - 1]; + storedSnapshots.length > 1 && storedSnapshots.pop(); // Find top for all dataZoom. + + var snapshot = {}; + each$9(head, function (batchItem, dataZoomId) { + for (var i = storedSnapshots.length - 1; i >= 0; i--) { + batchItem = storedSnapshots[i][dataZoomId]; + + if (batchItem) { + snapshot[dataZoomId] = batchItem; + break; + } + } + }); + return snapshot; + } + function clear$1(ecModel) { + inner$f(ecModel).snapshots = null; + } + function count(ecModel) { + return getStoreSnapshots(ecModel).length; + } + /** + * History length of each dataZoom may be different. + * this._history[0] is used to store origin range. + */ + + function getStoreSnapshots(ecModel) { + var store = inner$f(ecModel); + + if (!store.snapshots) { + store.snapshots = [{}]; + } + + return store.snapshots; + } + + var RestoreOption = + /** @class */ + function (_super) { + __extends(RestoreOption, _super); + + function RestoreOption() { + return _super !== null && _super.apply(this, arguments) || this; + } + + RestoreOption.prototype.onclick = function (ecModel, api) { + clear$1(ecModel); + api.dispatchAction({ + type: 'restore', + from: this.uid + }); + }; + + RestoreOption.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + // eslint-disable-next-line + icon: 'M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5', + title: ecModel.getLocaleModel().get(['toolbox', 'restore', 'title']) + }; + return defaultOption; + }; + + return RestoreOption; + }(ToolboxFeature); // TODO: SELF REGISTERED. + + + registerAction({ + type: 'restore', + event: 'restore', + update: 'prepareAndUpdate' + }, function (payload, ecModel) { + ecModel.resetOption('recreate'); + }); + + // how to genarialize to more coordinate systems. + + var INCLUDE_FINDER_MAIN_TYPES = ['grid', 'xAxis', 'yAxis', 'geo', 'graph', 'polar', 'radiusAxis', 'angleAxis', 'bmap']; + + var BrushTargetManager = + /** @class */ + function () { + /** + * @param finder contains Index/Id/Name of xAxis/yAxis/geo/grid + * Each can be {number|Array.<number>}. like: {xAxisIndex: [3, 4]} + * @param opt.include include coordinate system types. + */ + function BrushTargetManager(finder, ecModel, opt) { + var _this = this; + + this._targetInfoList = []; + var foundCpts = parseFinder$1(ecModel, finder); + each(targetInfoBuilders, function (builder, type) { + if (!opt || !opt.include || indexOf(opt.include, type) >= 0) { + builder(foundCpts, _this._targetInfoList); + } + }); + } + + BrushTargetManager.prototype.setOutputRanges = function (areas, ecModel) { + this.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) { + (area.coordRanges || (area.coordRanges = [])).push(coordRange); // area.coordRange is the first of area.coordRanges + + if (!area.coordRange) { + area.coordRange = coordRange; // In 'category' axis, coord to pixel is not reversible, so we can not + // rebuild range by coordRange accrately, which may bring trouble when + // brushing only one item. So we use __rangeOffset to rebuilding range + // by coordRange. And this it only used in brush component so it is no + // need to be adapted to coordRanges. + + var result = coordConvert[area.brushType](0, coordSys, coordRange); + area.__rangeOffset = { + offset: diffProcessor[area.brushType](result.values, area.range, [1, 1]), + xyMinMax: result.xyMinMax + }; + } + }); + return areas; + }; + + BrushTargetManager.prototype.matchOutputRanges = function (areas, ecModel, cb) { + each(areas, function (area) { + var targetInfo = this.findTargetInfo(area, ecModel); + + if (targetInfo && targetInfo !== true) { + each(targetInfo.coordSyses, function (coordSys) { + var result = coordConvert[area.brushType](1, coordSys, area.range, true); + cb(area, result.values, coordSys, ecModel); + }); + } + }, this); + }; + /** + * the `areas` is `BrushModel.areas`. + * Called in layout stage. + * convert `area.coordRange` to global range and set panelId to `area.range`. + */ + + + BrushTargetManager.prototype.setInputRanges = function (areas, ecModel) { + each(areas, function (area) { + var targetInfo = this.findTargetInfo(area, ecModel); + + if ("development" !== 'production') { + assert(!targetInfo || targetInfo === true || area.coordRange, 'coordRange must be specified when coord index specified.'); + assert(!targetInfo || targetInfo !== true || area.range, 'range must be specified in global brush.'); + } + + area.range = area.range || []; // convert coordRange to global range and set panelId. + + if (targetInfo && targetInfo !== true) { + area.panelId = targetInfo.panelId; // (1) area.range shoule always be calculate from coordRange but does + // not keep its original value, for the sake of the dataZoom scenario, + // where area.coordRange remains unchanged but area.range may be changed. + // (2) Only support converting one coordRange to pixel range in brush + // component. So do not consider `coordRanges`. + // (3) About __rangeOffset, see comment above. + + var result = coordConvert[area.brushType](0, targetInfo.coordSys, area.coordRange); + var rangeOffset = area.__rangeOffset; + area.range = rangeOffset ? diffProcessor[area.brushType](result.values, rangeOffset.offset, getScales(result.xyMinMax, rangeOffset.xyMinMax)) : result.values; + } + }, this); + }; + + BrushTargetManager.prototype.makePanelOpts = function (api, getDefaultBrushType) { + return map(this._targetInfoList, function (targetInfo) { + var rect = targetInfo.getPanelRect(); + return { + panelId: targetInfo.panelId, + defaultBrushType: getDefaultBrushType ? getDefaultBrushType(targetInfo) : null, + clipPath: makeRectPanelClipPath(rect), + isTargetByCursor: makeRectIsTargetByCursor(rect, api, targetInfo.coordSysModel), + getLinearBrushOtherExtent: makeLinearBrushOtherExtent(rect) + }; + }); + }; + + BrushTargetManager.prototype.controlSeries = function (area, seriesModel, ecModel) { + // Check whether area is bound in coord, and series do not belong to that coord. + // If do not do this check, some brush (like lineX) will controll all axes. + var targetInfo = this.findTargetInfo(area, ecModel); + return targetInfo === true || targetInfo && indexOf(targetInfo.coordSyses, seriesModel.coordinateSystem) >= 0; + }; + /** + * If return Object, a coord found. + * If reutrn true, global found. + * Otherwise nothing found. + */ + + + BrushTargetManager.prototype.findTargetInfo = function (area, ecModel) { + var targetInfoList = this._targetInfoList; + var foundCpts = parseFinder$1(ecModel, area); + + for (var i = 0; i < targetInfoList.length; i++) { + var targetInfo = targetInfoList[i]; + var areaPanelId = area.panelId; + + if (areaPanelId) { + if (targetInfo.panelId === areaPanelId) { + return targetInfo; + } + } else { + for (var j = 0; j < targetInfoMatchers.length; j++) { + if (targetInfoMatchers[j](foundCpts, targetInfo)) { + return targetInfo; + } + } + } + } + + return true; + }; + + return BrushTargetManager; + }(); + + function formatMinMax(minMax) { + minMax[0] > minMax[1] && minMax.reverse(); + return minMax; + } + + function parseFinder$1(ecModel, finder) { + return parseFinder(ecModel, finder, { + includeMainTypes: INCLUDE_FINDER_MAIN_TYPES + }); + } + + var targetInfoBuilders = { + grid: function (foundCpts, targetInfoList) { + var xAxisModels = foundCpts.xAxisModels; + var yAxisModels = foundCpts.yAxisModels; + var gridModels = foundCpts.gridModels; // Remove duplicated. + + var gridModelMap = createHashMap(); + var xAxesHas = {}; + var yAxesHas = {}; + + if (!xAxisModels && !yAxisModels && !gridModels) { + return; + } + + each(xAxisModels, function (axisModel) { + var gridModel = axisModel.axis.grid.model; + gridModelMap.set(gridModel.id, gridModel); + xAxesHas[gridModel.id] = true; + }); + each(yAxisModels, function (axisModel) { + var gridModel = axisModel.axis.grid.model; + gridModelMap.set(gridModel.id, gridModel); + yAxesHas[gridModel.id] = true; + }); + each(gridModels, function (gridModel) { + gridModelMap.set(gridModel.id, gridModel); + xAxesHas[gridModel.id] = true; + yAxesHas[gridModel.id] = true; + }); + gridModelMap.each(function (gridModel) { + var grid = gridModel.coordinateSystem; + var cartesians = []; + each(grid.getCartesians(), function (cartesian, index) { + if (indexOf(xAxisModels, cartesian.getAxis('x').model) >= 0 || indexOf(yAxisModels, cartesian.getAxis('y').model) >= 0) { + cartesians.push(cartesian); + } + }); + targetInfoList.push({ + panelId: 'grid--' + gridModel.id, + gridModel: gridModel, + coordSysModel: gridModel, + // Use the first one as the representitive coordSys. + coordSys: cartesians[0], + coordSyses: cartesians, + getPanelRect: panelRectBuilders.grid, + xAxisDeclared: xAxesHas[gridModel.id], + yAxisDeclared: yAxesHas[gridModel.id] + }); + }); + }, + geo: function (foundCpts, targetInfoList) { + each(foundCpts.geoModels, function (geoModel) { + var coordSys = geoModel.coordinateSystem; + targetInfoList.push({ + panelId: 'geo--' + geoModel.id, + geoModel: geoModel, + coordSysModel: geoModel, + coordSys: coordSys, + coordSyses: [coordSys], + getPanelRect: panelRectBuilders.geo + }); + }); + } + }; + var targetInfoMatchers = [// grid + function (foundCpts, targetInfo) { + var xAxisModel = foundCpts.xAxisModel; + var yAxisModel = foundCpts.yAxisModel; + var gridModel = foundCpts.gridModel; + !gridModel && xAxisModel && (gridModel = xAxisModel.axis.grid.model); + !gridModel && yAxisModel && (gridModel = yAxisModel.axis.grid.model); + return gridModel && gridModel === targetInfo.gridModel; + }, // geo + function (foundCpts, targetInfo) { + var geoModel = foundCpts.geoModel; + return geoModel && geoModel === targetInfo.geoModel; + }]; + var panelRectBuilders = { + grid: function () { + // grid is not Transformable. + return this.coordSys.master.getRect().clone(); + }, + geo: function () { + var coordSys = this.coordSys; + var rect = coordSys.getBoundingRect().clone(); // geo roam and zoom transform + + rect.applyTransform(getTransform(coordSys)); + return rect; + } + }; + var coordConvert = { + lineX: curry(axisConvert, 0), + lineY: curry(axisConvert, 1), + rect: function (to, coordSys, rangeOrCoordRange, clamp) { + var xminymin = to ? coordSys.pointToData([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]], clamp) : coordSys.dataToPoint([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]], clamp); + var xmaxymax = to ? coordSys.pointToData([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]], clamp) : coordSys.dataToPoint([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]], clamp); + var values = [formatMinMax([xminymin[0], xmaxymax[0]]), formatMinMax([xminymin[1], xmaxymax[1]])]; + return { + values: values, + xyMinMax: values + }; + }, + polygon: function (to, coordSys, rangeOrCoordRange, clamp) { + var xyMinMax = [[Infinity, -Infinity], [Infinity, -Infinity]]; + var values = map(rangeOrCoordRange, function (item) { + var p = to ? coordSys.pointToData(item, clamp) : coordSys.dataToPoint(item, clamp); + xyMinMax[0][0] = Math.min(xyMinMax[0][0], p[0]); + xyMinMax[1][0] = Math.min(xyMinMax[1][0], p[1]); + xyMinMax[0][1] = Math.max(xyMinMax[0][1], p[0]); + xyMinMax[1][1] = Math.max(xyMinMax[1][1], p[1]); + return p; + }); + return { + values: values, + xyMinMax: xyMinMax + }; + } + }; + + function axisConvert(axisNameIndex, to, coordSys, rangeOrCoordRange) { + if ("development" !== 'production') { + assert(coordSys.type === 'cartesian2d', 'lineX/lineY brush is available only in cartesian2d.'); + } + + var axis = coordSys.getAxis(['x', 'y'][axisNameIndex]); + var values = formatMinMax(map([0, 1], function (i) { + return to ? axis.coordToData(axis.toLocalCoord(rangeOrCoordRange[i]), true) : axis.toGlobalCoord(axis.dataToCoord(rangeOrCoordRange[i])); + })); + var xyMinMax = []; + xyMinMax[axisNameIndex] = values; + xyMinMax[1 - axisNameIndex] = [NaN, NaN]; + return { + values: values, + xyMinMax: xyMinMax + }; + } + + var diffProcessor = { + lineX: curry(axisDiffProcessor, 0), + lineY: curry(axisDiffProcessor, 1), + rect: function (values, refer, scales) { + return [[values[0][0] - scales[0] * refer[0][0], values[0][1] - scales[0] * refer[0][1]], [values[1][0] - scales[1] * refer[1][0], values[1][1] - scales[1] * refer[1][1]]]; + }, + polygon: function (values, refer, scales) { + return map(values, function (item, idx) { + return [item[0] - scales[0] * refer[idx][0], item[1] - scales[1] * refer[idx][1]]; + }); + } + }; + + function axisDiffProcessor(axisNameIndex, values, refer, scales) { + return [values[0] - scales[axisNameIndex] * refer[0], values[1] - scales[axisNameIndex] * refer[1]]; + } // We have to process scale caused by dataZoom manually, + // although it might be not accurate. + // Return [0~1, 0~1] + + + function getScales(xyMinMaxCurr, xyMinMaxOrigin) { + var sizeCurr = getSize$1(xyMinMaxCurr); + var sizeOrigin = getSize$1(xyMinMaxOrigin); + var scales = [sizeCurr[0] / sizeOrigin[0], sizeCurr[1] / sizeOrigin[1]]; + isNaN(scales[0]) && (scales[0] = 1); + isNaN(scales[1]) && (scales[1] = 1); + return scales; + } + + function getSize$1(xyMinMax) { + return xyMinMax ? [xyMinMax[0][1] - xyMinMax[0][0], xyMinMax[1][1] - xyMinMax[1][0]] : [NaN, NaN]; + } + + var each$a = each; + var DATA_ZOOM_ID_BASE = makeInternalComponentId('toolbox-dataZoom_'); + + var DataZoomFeature = + /** @class */ + function (_super) { + __extends(DataZoomFeature, _super); + + function DataZoomFeature() { + return _super !== null && _super.apply(this, arguments) || this; + } + + DataZoomFeature.prototype.render = function (featureModel, ecModel, api, payload) { + if (!this._brushController) { + this._brushController = new BrushController(api.getZr()); + + this._brushController.on('brush', bind(this._onBrush, this)).mount(); + } + + updateZoomBtnStatus(featureModel, ecModel, this, payload, api); + updateBackBtnStatus(featureModel, ecModel); + }; + + DataZoomFeature.prototype.onclick = function (ecModel, api, type) { + handlers$1[type].call(this); + }; + + DataZoomFeature.prototype.remove = function (ecModel, api) { + this._brushController && this._brushController.unmount(); + }; + + DataZoomFeature.prototype.dispose = function (ecModel, api) { + this._brushController && this._brushController.dispose(); + }; + + DataZoomFeature.prototype._onBrush = function (eventParam) { + var areas = eventParam.areas; + + if (!eventParam.isEnd || !areas.length) { + return; + } + + var snapshot = {}; + var ecModel = this.ecModel; + + this._brushController.updateCovers([]); // remove cover + + + var brushTargetManager = new BrushTargetManager(makeAxisFinder(this.model), ecModel, { + include: ['grid'] + }); + brushTargetManager.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) { + if (coordSys.type !== 'cartesian2d') { + return; + } + + var brushType = area.brushType; + + if (brushType === 'rect') { + setBatch('x', coordSys, coordRange[0]); + setBatch('y', coordSys, coordRange[1]); + } else { + setBatch({ + lineX: 'x', + lineY: 'y' + }[brushType], coordSys, coordRange); + } + }); + push(ecModel, snapshot); + + this._dispatchZoomAction(snapshot); + + function setBatch(dimName, coordSys, minMax) { + var axis = coordSys.getAxis(dimName); + var axisModel = axis.model; + var dataZoomModel = findDataZoom(dimName, axisModel, ecModel); // Restrict range. + + var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy(axisModel).getMinMaxSpan(); + + if (minMaxSpan.minValueSpan != null || minMaxSpan.maxValueSpan != null) { + minMax = sliderMove(0, minMax.slice(), axis.scale.getExtent(), 0, minMaxSpan.minValueSpan, minMaxSpan.maxValueSpan); + } + + dataZoomModel && (snapshot[dataZoomModel.id] = { + dataZoomId: dataZoomModel.id, + startValue: minMax[0], + endValue: minMax[1] + }); + } + + function findDataZoom(dimName, axisModel, ecModel) { + var found; + ecModel.eachComponent({ + mainType: 'dataZoom', + subType: 'select' + }, function (dzModel) { + var has = dzModel.getAxisModel(dimName, axisModel.componentIndex); + has && (found = dzModel); + }); + return found; + } + }; + + DataZoomFeature.prototype._dispatchZoomAction = function (snapshot) { + var batch = []; // Convert from hash map to array. + + each$a(snapshot, function (batchItem, dataZoomId) { + batch.push(clone(batchItem)); + }); + batch.length && this.api.dispatchAction({ + type: 'dataZoom', + from: this.uid, + batch: batch + }); + }; + + DataZoomFeature.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + filterMode: 'filter', + // Icon group + icon: { + zoom: 'M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1', + back: 'M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26' + }, + // `zoom`, `back` + title: ecModel.getLocaleModel().get(['toolbox', 'dataZoom', 'title']), + brushStyle: { + borderWidth: 0, + color: 'rgba(210,219,238,0.2)' + } + }; + return defaultOption; + }; + + return DataZoomFeature; + }(ToolboxFeature); + + var handlers$1 = { + zoom: function () { + var nextActive = !this._isZoomActive; + this.api.dispatchAction({ + type: 'takeGlobalCursor', + key: 'dataZoomSelect', + dataZoomSelectActive: nextActive + }); + }, + back: function () { + this._dispatchZoomAction(pop(this.ecModel)); + } + }; + + function makeAxisFinder(dzFeatureModel) { + var setting = { + xAxisIndex: dzFeatureModel.get('xAxisIndex', true), + yAxisIndex: dzFeatureModel.get('yAxisIndex', true), + xAxisId: dzFeatureModel.get('xAxisId', true), + yAxisId: dzFeatureModel.get('yAxisId', true) + }; // If both `xAxisIndex` `xAxisId` not set, it means 'all'. + // If both `yAxisIndex` `yAxisId` not set, it means 'all'. + // Some old cases set like this below to close yAxis control but leave xAxis control: + // `{ feature: { dataZoom: { yAxisIndex: false } }`. + + if (setting.xAxisIndex == null && setting.xAxisId == null) { + setting.xAxisIndex = 'all'; + } + + if (setting.yAxisIndex == null && setting.yAxisId == null) { + setting.yAxisIndex = 'all'; + } + + return setting; + } + + function updateBackBtnStatus(featureModel, ecModel) { + featureModel.setIconStatus('back', count(ecModel) > 1 ? 'emphasis' : 'normal'); + } + + function updateZoomBtnStatus(featureModel, ecModel, view, payload, api) { + var zoomActive = view._isZoomActive; + + if (payload && payload.type === 'takeGlobalCursor') { + zoomActive = payload.key === 'dataZoomSelect' ? payload.dataZoomSelectActive : false; + } + + view._isZoomActive = zoomActive; + featureModel.setIconStatus('zoom', zoomActive ? 'emphasis' : 'normal'); + var brushTargetManager = new BrushTargetManager(makeAxisFinder(featureModel), ecModel, { + include: ['grid'] + }); + var panels = brushTargetManager.makePanelOpts(api, function (targetInfo) { + return targetInfo.xAxisDeclared && !targetInfo.yAxisDeclared ? 'lineX' : !targetInfo.xAxisDeclared && targetInfo.yAxisDeclared ? 'lineY' : 'rect'; + }); + + view._brushController.setPanels(panels).enableBrush(zoomActive && panels.length ? { + brushType: 'auto', + brushStyle: featureModel.getModel('brushStyle').getItemStyle() + } : false); + } + + registerInternalOptionCreator('dataZoom', function (ecModel) { + var toolboxModel = ecModel.getComponent('toolbox', 0); + var featureDataZoomPath = ['feature', 'dataZoom']; + + if (!toolboxModel || toolboxModel.get(featureDataZoomPath) == null) { + return; + } + + var dzFeatureModel = toolboxModel.getModel(featureDataZoomPath); + var dzOptions = []; + var finder = makeAxisFinder(dzFeatureModel); + var finderResult = parseFinder(ecModel, finder); + each$a(finderResult.xAxisModels, function (axisModel) { + return buildInternalOptions(axisModel, 'xAxis', 'xAxisIndex'); + }); + each$a(finderResult.yAxisModels, function (axisModel) { + return buildInternalOptions(axisModel, 'yAxis', 'yAxisIndex'); + }); + + function buildInternalOptions(axisModel, axisMainType, axisIndexPropName) { + var axisIndex = axisModel.componentIndex; + var newOpt = { + type: 'select', + $fromToolbox: true, + // Default to be filter + filterMode: dzFeatureModel.get('filterMode', true) || 'filter', + // Id for merge mapping. + id: DATA_ZOOM_ID_BASE + axisMainType + axisIndex + }; + newOpt[axisIndexPropName] = axisIndex; + dzOptions.push(newOpt); + } + + return dzOptions; + }); + + function install$z(registers) { + registers.registerComponentModel(ToolboxModel); + registers.registerComponentView(ToolboxView); + registerFeature('saveAsImage', SaveAsImage); + registerFeature('magicType', MagicType); + registerFeature('dataView', DataView); + registerFeature('dataZoom', DataZoomFeature); + registerFeature('restore', RestoreOption); + use(install$y); + } + + var TooltipModel = + /** @class */ + function (_super) { + __extends(TooltipModel, _super); + + function TooltipModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TooltipModel.type; + return _this; + } + + TooltipModel.type = 'tooltip'; + TooltipModel.dependencies = ['axisPointer']; + TooltipModel.defaultOption = { + // zlevel: 0, + z: 60, + show: true, + // tooltip main content + showContent: true, + // 'trigger' only works on coordinate system. + // 'item' | 'axis' | 'none' + trigger: 'item', + // 'click' | 'mousemove' | 'none' + triggerOn: 'mousemove|click', + alwaysShowContent: false, + displayMode: 'single', + renderMode: 'auto', + // whether restraint content inside viewRect. + // If renderMode: 'richText', default true. + // If renderMode: 'html', defaut false (for backward compat). + confine: null, + showDelay: 0, + hideDelay: 100, + // Animation transition time, unit is second + transitionDuration: 0.4, + enterable: false, + backgroundColor: '#fff', + // box shadow + shadowBlur: 10, + shadowColor: 'rgba(0, 0, 0, .2)', + shadowOffsetX: 1, + shadowOffsetY: 2, + // tooltip border radius, unit is px, default is 4 + borderRadius: 4, + // tooltip border width, unit is px, default is 0 (no border) + borderWidth: 1, + // Tooltip inside padding, default is 5 for all direction + // Array is allowed to set up, right, bottom, left, same with css + // The default value: See `tooltip/tooltipMarkup.ts#getPaddingFromTooltipModel`. + padding: null, + // Extra css text + extraCssText: '', + // axis indicator, trigger by axis + axisPointer: { + // default is line + // legal values: 'line' | 'shadow' | 'cross' + type: 'line', + // Valid when type is line, appoint tooltip line locate on which line. Optional + // legal values: 'x' | 'y' | 'angle' | 'radius' | 'auto' + // default is 'auto', chose the axis which type is category. + // for multiply y axis, cartesian coord chose x axis, polar chose angle axis + axis: 'auto', + animation: 'auto', + animationDurationUpdate: 200, + animationEasingUpdate: 'exponentialOut', + crossStyle: { + color: '#999', + width: 1, + type: 'dashed', + // TODO formatter + textStyle: {} + } // lineStyle and shadowStyle should not be specified here, + // otherwise it will always override those styles on option.axisPointer. + + }, + textStyle: { + color: '#666', + fontSize: 14 + } + }; + return TooltipModel; + }(ComponentModel); + + /* global document */ + + function shouldTooltipConfine(tooltipModel) { + var confineOption = tooltipModel.get('confine'); + return confineOption != null ? !!confineOption // In richText mode, the outside part can not be visible. + : tooltipModel.get('renderMode') === 'richText'; + } + + function testStyle(styleProps) { + if (!env.domSupported) { + return; + } + + var style = document.documentElement.style; + + for (var i = 0, len = styleProps.length; i < len; i++) { + if (styleProps[i] in style) { + return styleProps[i]; + } + } + } + + var TRANSFORM_VENDOR = testStyle(['transform', 'webkitTransform', 'OTransform', 'MozTransform', 'msTransform']); + var TRANSITION_VENDOR = testStyle(['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']); + function toCSSVendorPrefix(styleVendor, styleProp) { + if (!styleVendor) { + return styleProp; + } + + styleProp = toCamelCase(styleProp, true); + var idx = styleVendor.indexOf(styleProp); + styleVendor = idx === -1 ? styleProp : "-" + styleVendor.slice(0, idx) + "-" + styleProp; + return styleVendor.toLowerCase(); + } + function getComputedStyle(el, style) { + var stl = el.currentStyle || document.defaultView && document.defaultView.getComputedStyle(el); + return stl ? style ? stl[style] : stl : null; + } + + /* global document, window */ + + var CSS_TRANSITION_VENDOR = toCSSVendorPrefix(TRANSITION_VENDOR, 'transition'); + var CSS_TRANSFORM_VENDOR = toCSSVendorPrefix(TRANSFORM_VENDOR, 'transform'); // eslint-disable-next-line + + var gCssText = "position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;" + (env.transform3dSupported ? 'will-change:transform;' : ''); + + function mirrorPos(pos) { + pos = pos === 'left' ? 'right' : pos === 'right' ? 'left' : pos === 'top' ? 'bottom' : 'top'; + return pos; + } + + function assembleArrow(tooltipModel, borderColor, arrowPosition) { + if (!isString(arrowPosition) || arrowPosition === 'inside') { + return ''; + } + + var backgroundColor = tooltipModel.get('backgroundColor'); + var borderWidth = tooltipModel.get('borderWidth'); + borderColor = convertToColorString(borderColor); + var arrowPos = mirrorPos(arrowPosition); + var arrowSize = Math.max(Math.round(borderWidth) * 1.5, 6); + var positionStyle = ''; + var transformStyle = CSS_TRANSFORM_VENDOR + ':'; + var rotateDeg; + + if (indexOf(['left', 'right'], arrowPos) > -1) { + positionStyle += 'top:50%'; + transformStyle += "translateY(-50%) rotate(" + (rotateDeg = arrowPos === 'left' ? -225 : -45) + "deg)"; + } else { + positionStyle += 'left:50%'; + transformStyle += "translateX(-50%) rotate(" + (rotateDeg = arrowPos === 'top' ? 225 : 45) + "deg)"; + } + + var rotateRadian = rotateDeg * Math.PI / 180; + var arrowWH = arrowSize + borderWidth; + var rotatedWH = arrowWH * Math.abs(Math.cos(rotateRadian)) + arrowWH * Math.abs(Math.sin(rotateRadian)); + var arrowOffset = Math.round(((rotatedWH - Math.SQRT2 * borderWidth) / 2 + Math.SQRT2 * borderWidth - (rotatedWH - arrowWH) / 2) * 100) / 100; + positionStyle += ";" + arrowPos + ":-" + arrowOffset + "px"; + var borderStyle = borderColor + " solid " + borderWidth + "px;"; + var styleCss = ["position:absolute;width:" + arrowSize + "px;height:" + arrowSize + "px;", positionStyle + ";" + transformStyle + ";", "border-bottom:" + borderStyle, "border-right:" + borderStyle, "background-color:" + backgroundColor + ";"]; + return "<div style=\"" + styleCss.join('') + "\"></div>"; + } + + function assembleTransition(duration, onlyFade) { + var transitionCurve = 'cubic-bezier(0.23,1,0.32,1)'; + var transitionOption = " " + duration / 2 + "s " + transitionCurve; + var transitionText = "opacity" + transitionOption + ",visibility" + transitionOption; + + if (!onlyFade) { + transitionOption = " " + duration + "s " + transitionCurve; + transitionText += env.transformSupported ? "," + CSS_TRANSFORM_VENDOR + transitionOption : ",left" + transitionOption + ",top" + transitionOption; + } + + return CSS_TRANSITION_VENDOR + ':' + transitionText; + } + + function assembleTransform(x, y, toString) { + // If using float on style, the final width of the dom might + // keep changing slightly while mouse move. So `toFixed(0)` them. + var x0 = x.toFixed(0) + 'px'; + var y0 = y.toFixed(0) + 'px'; // not support transform, use `left` and `top` instead. + + if (!env.transformSupported) { + return toString ? "top:" + y0 + ";left:" + x0 + ";" : [['top', y0], ['left', x0]]; + } // support transform + + + var is3d = env.transform3dSupported; + var translate = "translate" + (is3d ? '3d' : '') + "(" + x0 + "," + y0 + (is3d ? ',0' : '') + ")"; + return toString ? 'top:0;left:0;' + CSS_TRANSFORM_VENDOR + ':' + translate + ';' : [['top', 0], ['left', 0], [TRANSFORM_VENDOR, translate]]; + } + /** + * @param {Object} textStyle + * @return {string} + * @inner + */ + + + function assembleFont(textStyleModel) { + var cssText = []; + var fontSize = textStyleModel.get('fontSize'); + var color = textStyleModel.getTextColor(); + color && cssText.push('color:' + color); + cssText.push('font:' + textStyleModel.getFont()); + fontSize // @ts-ignore, leave it to the tooltip refactor. + && cssText.push('line-height:' + Math.round(fontSize * 3 / 2) + 'px'); + var shadowColor = textStyleModel.get('textShadowColor'); + var shadowBlur = textStyleModel.get('textShadowBlur') || 0; + var shadowOffsetX = textStyleModel.get('textShadowOffsetX') || 0; + var shadowOffsetY = textStyleModel.get('textShadowOffsetY') || 0; + shadowColor && shadowBlur && cssText.push('text-shadow:' + shadowOffsetX + 'px ' + shadowOffsetY + 'px ' + shadowBlur + 'px ' + shadowColor); + each(['decoration', 'align'], function (name) { + var val = textStyleModel.get(name); + val && cssText.push('text-' + name + ':' + val); + }); + return cssText.join(';'); + } + + function assembleCssText(tooltipModel, enableTransition, onlyFade) { + var cssText = []; + var transitionDuration = tooltipModel.get('transitionDuration'); + var backgroundColor = tooltipModel.get('backgroundColor'); + var shadowBlur = tooltipModel.get('shadowBlur'); + var shadowColor = tooltipModel.get('shadowColor'); + var shadowOffsetX = tooltipModel.get('shadowOffsetX'); + var shadowOffsetY = tooltipModel.get('shadowOffsetY'); + var textStyleModel = tooltipModel.getModel('textStyle'); + var padding = getPaddingFromTooltipModel(tooltipModel, 'html'); + var boxShadow = shadowOffsetX + "px " + shadowOffsetY + "px " + shadowBlur + "px " + shadowColor; + cssText.push('box-shadow:' + boxShadow); // Animation transition. Do not animate when transitionDuration is 0. + + enableTransition && transitionDuration && cssText.push(assembleTransition(transitionDuration, onlyFade)); + + if (backgroundColor) { + cssText.push('background-color:' + backgroundColor); + } // Border style + + + each(['width', 'color', 'radius'], function (name) { + var borderName = 'border-' + name; + var camelCase = toCamelCase(borderName); + var val = tooltipModel.get(camelCase); + val != null && cssText.push(borderName + ':' + val + (name === 'color' ? '' : 'px')); + }); // Text style + + cssText.push(assembleFont(textStyleModel)); // Padding + + if (padding != null) { + cssText.push('padding:' + normalizeCssArray$1(padding).join('px ') + 'px'); + } + + return cssText.join(';') + ';'; + } // If not able to make, do not modify the input `out`. + + + function makeStyleCoord(out, zr, appendToBody, zrX, zrY) { + var zrPainter = zr && zr.painter; + + if (appendToBody) { + var zrViewportRoot = zrPainter && zrPainter.getViewportRoot(); + + if (zrViewportRoot) { + // Some APPs might use scale on body, so we support CSS transform here. + transformLocalCoord(out, zrViewportRoot, document.body, zrX, zrY); + } + } else { + out[0] = zrX; + out[1] = zrY; // xy should be based on canvas root. But tooltipContent is + // the sibling of canvas root. So padding of ec container + // should be considered here. + + var viewportRootOffset = zrPainter && zrPainter.getViewportRootOffset(); + + if (viewportRootOffset) { + out[0] += viewportRootOffset.offsetLeft; + out[1] += viewportRootOffset.offsetTop; + } + } + + out[2] = out[0] / zr.getWidth(); + out[3] = out[1] / zr.getHeight(); + } + + var TooltipHTMLContent = + /** @class */ + function () { + function TooltipHTMLContent(container, api, opt) { + this._show = false; + this._styleCoord = [0, 0, 0, 0]; + this._enterable = true; + this._firstShow = true; + this._longHide = true; + + if (env.wxa) { + return null; + } + + var el = document.createElement('div'); // TODO: TYPE + + el.domBelongToZr = true; + this.el = el; + var zr = this._zr = api.getZr(); + var appendToBody = this._appendToBody = opt && opt.appendToBody; + makeStyleCoord(this._styleCoord, zr, appendToBody, api.getWidth() / 2, api.getHeight() / 2); + + if (appendToBody) { + document.body.appendChild(el); + } else { + container.appendChild(el); + } + + this._container = container; // FIXME + // Is it needed to trigger zr event manually if + // the browser do not support `pointer-events: none`. + + var self = this; + + el.onmouseenter = function () { + // clear the timeout in hideLater and keep showing tooltip + if (self._enterable) { + clearTimeout(self._hideTimeout); + self._show = true; + } + + self._inContent = true; + }; + + el.onmousemove = function (e) { + e = e || window.event; + + if (!self._enterable) { + // `pointer-events: none` is set to tooltip content div + // if `enterable` is set as `false`, and `el.onmousemove` + // can not be triggered. But in browser that do not + // support `pointer-events`, we need to do this: + // Try trigger zrender event to avoid mouse + // in and out shape too frequently + var handler = zr.handler; + var zrViewportRoot = zr.painter.getViewportRoot(); + normalizeEvent(zrViewportRoot, e, true); + handler.dispatch('mousemove', e); + } + }; + + el.onmouseleave = function () { + // set `_inContent` to `false` before `hideLater` + self._inContent = false; + + if (self._enterable) { + if (self._show) { + self.hideLater(self._hideDelay); + } + } + }; + } + /** + * Update when tooltip is rendered + */ + + + TooltipHTMLContent.prototype.update = function (tooltipModel) { + // FIXME + // Move this logic to ec main? + var container = this._container; + var position = getComputedStyle(container, 'position'); + var domStyle = container.style; + + if (domStyle.position !== 'absolute' && position !== 'absolute') { + domStyle.position = 'relative'; + } // move tooltip if chart resized + + + var alwaysShowContent = tooltipModel.get('alwaysShowContent'); + alwaysShowContent && this._moveIfResized(); // update className + + this.el.className = tooltipModel.get('className') || ''; // Hide the tooltip + // PENDING + // this.hide(); + }; + + TooltipHTMLContent.prototype.show = function (tooltipModel, nearPointColor) { + clearTimeout(this._hideTimeout); + clearTimeout(this._longHideTimeout); + var el = this.el; + var style = el.style; + var styleCoord = this._styleCoord; + + if (!el.innerHTML) { + style.display = 'none'; + } else { + style.cssText = gCssText + assembleCssText(tooltipModel, !this._firstShow, this._longHide) // initial transform + + assembleTransform(styleCoord[0], styleCoord[1], true) + ("border-color:" + convertToColorString(nearPointColor) + ";") + (tooltipModel.get('extraCssText') || '') // If mouse occasionally move over the tooltip, a mouseout event will be + // triggered by canvas, and cause some unexpectable result like dragging + // stop, "unfocusAdjacency". Here `pointer-events: none` is used to solve + // it. Although it is not supported by IE8~IE10, fortunately it is a rare + // scenario. + + (";pointer-events:" + (this._enterable ? 'auto' : 'none')); + } + + this._show = true; + this._firstShow = false; + this._longHide = false; + }; + + TooltipHTMLContent.prototype.setContent = function (content, markers, tooltipModel, borderColor, arrowPosition) { + var el = this.el; + + if (content == null) { + el.innerHTML = ''; + return; + } + + var arrow = ''; + + if (isString(arrowPosition) && tooltipModel.get('trigger') === 'item' && !shouldTooltipConfine(tooltipModel)) { + arrow = assembleArrow(tooltipModel, borderColor, arrowPosition); + } + + if (isString(content)) { + el.innerHTML = content + arrow; + } else if (content) { + // Clear previous + el.innerHTML = ''; + + if (!isArray(content)) { + content = [content]; + } + + for (var i = 0; i < content.length; i++) { + if (isDom(content[i]) && content[i].parentNode !== el) { + el.appendChild(content[i]); + } + } // no arrow if empty + + + if (arrow && el.childNodes.length) { + // no need to create a new parent element, but it's not supported by IE 10 and older. + // const arrowEl = document.createRange().createContextualFragment(arrow); + var arrowEl = document.createElement('div'); + arrowEl.innerHTML = arrow; + el.appendChild(arrowEl); + } + } + }; + + TooltipHTMLContent.prototype.setEnterable = function (enterable) { + this._enterable = enterable; + }; + + TooltipHTMLContent.prototype.getSize = function () { + var el = this.el; + return [el.offsetWidth, el.offsetHeight]; + }; + + TooltipHTMLContent.prototype.moveTo = function (zrX, zrY) { + var styleCoord = this._styleCoord; + makeStyleCoord(styleCoord, this._zr, this._appendToBody, zrX, zrY); + + if (styleCoord[0] != null && styleCoord[1] != null) { + var style_1 = this.el.style; + var transforms = assembleTransform(styleCoord[0], styleCoord[1]); + each(transforms, function (transform) { + style_1[transform[0]] = transform[1]; + }); + } + }; + /** + * when `alwaysShowContent` is true, + * move the tooltip after chart resized + */ + + + TooltipHTMLContent.prototype._moveIfResized = function () { + // The ratio of left to width + var ratioX = this._styleCoord[2]; // The ratio of top to height + + var ratioY = this._styleCoord[3]; + this.moveTo(ratioX * this._zr.getWidth(), ratioY * this._zr.getHeight()); + }; + + TooltipHTMLContent.prototype.hide = function () { + var _this = this; + + var style = this.el.style; + style.visibility = 'hidden'; + style.opacity = '0'; + env.transform3dSupported && (style.willChange = ''); + this._show = false; + this._longHideTimeout = setTimeout(function () { + return _this._longHide = true; + }, 500); + }; + + TooltipHTMLContent.prototype.hideLater = function (time) { + if (this._show && !(this._inContent && this._enterable)) { + if (time) { + this._hideDelay = time; // Set show false to avoid invoke hideLater multiple times + + this._show = false; + this._hideTimeout = setTimeout(bind(this.hide, this), time); + } else { + this.hide(); + } + } + }; + + TooltipHTMLContent.prototype.isShow = function () { + return this._show; + }; + + TooltipHTMLContent.prototype.dispose = function () { + this.el.parentNode.removeChild(this.el); + }; + + return TooltipHTMLContent; + }(); + + var TooltipRichContent = + /** @class */ + function () { + function TooltipRichContent(api) { + this._show = false; + this._styleCoord = [0, 0, 0, 0]; + this._enterable = true; + this._zr = api.getZr(); + makeStyleCoord$1(this._styleCoord, this._zr, api.getWidth() / 2, api.getHeight() / 2); + } + /** + * Update when tooltip is rendered + */ + + + TooltipRichContent.prototype.update = function (tooltipModel) { + var alwaysShowContent = tooltipModel.get('alwaysShowContent'); + alwaysShowContent && this._moveIfResized(); + }; + + TooltipRichContent.prototype.show = function () { + if (this._hideTimeout) { + clearTimeout(this._hideTimeout); + } + + this.el.show(); + this._show = true; + }; + /** + * Set tooltip content + */ + + + TooltipRichContent.prototype.setContent = function (content, markupStyleCreator, tooltipModel, borderColor, arrowPosition) { + var _this = this; + + if (isObject(content)) { + throwError("development" !== 'production' ? 'Passing DOM nodes as content is not supported in richText tooltip!' : ''); + } + + if (this.el) { + this._zr.remove(this.el); + } + + var textStyleModel = tooltipModel.getModel('textStyle'); + this.el = new ZRText({ + style: { + rich: markupStyleCreator.richTextStyles, + text: content, + lineHeight: 22, + borderWidth: 1, + borderColor: borderColor, + textShadowColor: textStyleModel.get('textShadowColor'), + fill: tooltipModel.get(['textStyle', 'color']), + padding: getPaddingFromTooltipModel(tooltipModel, 'richText'), + verticalAlign: 'top', + align: 'left' + }, + z: tooltipModel.get('z') + }); + each(['backgroundColor', 'borderRadius', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'], function (propName) { + _this.el.style[propName] = tooltipModel.get(propName); + }); + each(['textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY'], function (propName) { + _this.el.style[propName] = textStyleModel.get(propName) || 0; + }); + + this._zr.add(this.el); + + var self = this; + this.el.on('mouseover', function () { + // clear the timeout in hideLater and keep showing tooltip + if (self._enterable) { + clearTimeout(self._hideTimeout); + self._show = true; + } + + self._inContent = true; + }); + this.el.on('mouseout', function () { + if (self._enterable) { + if (self._show) { + self.hideLater(self._hideDelay); + } + } + + self._inContent = false; + }); + }; + + TooltipRichContent.prototype.setEnterable = function (enterable) { + this._enterable = enterable; + }; + + TooltipRichContent.prototype.getSize = function () { + var el = this.el; + var bounding = this.el.getBoundingRect(); // bounding rect does not include shadow. For renderMode richText, + // if overflow, it will be cut. So calculate them accurately. + + var shadowOuterSize = calcShadowOuterSize(el.style); + return [bounding.width + shadowOuterSize.left + shadowOuterSize.right, bounding.height + shadowOuterSize.top + shadowOuterSize.bottom]; + }; + + TooltipRichContent.prototype.moveTo = function (x, y) { + var el = this.el; + + if (el) { + var styleCoord = this._styleCoord; + makeStyleCoord$1(styleCoord, this._zr, x, y); + x = styleCoord[0]; + y = styleCoord[1]; + var style = el.style; + var borderWidth = mathMaxWith0(style.borderWidth || 0); + var shadowOuterSize = calcShadowOuterSize(style); // rich text x, y do not include border. + + el.x = x + borderWidth + shadowOuterSize.left; + el.y = y + borderWidth + shadowOuterSize.top; + el.markRedraw(); + } + }; + /** + * when `alwaysShowContent` is true, + * move the tooltip after chart resized + */ + + + TooltipRichContent.prototype._moveIfResized = function () { + // The ratio of left to width + var ratioX = this._styleCoord[2]; // The ratio of top to height + + var ratioY = this._styleCoord[3]; + this.moveTo(ratioX * this._zr.getWidth(), ratioY * this._zr.getHeight()); + }; + + TooltipRichContent.prototype.hide = function () { + if (this.el) { + this.el.hide(); + } + + this._show = false; + }; + + TooltipRichContent.prototype.hideLater = function (time) { + if (this._show && !(this._inContent && this._enterable)) { + if (time) { + this._hideDelay = time; // Set show false to avoid invoke hideLater multiple times + + this._show = false; + this._hideTimeout = setTimeout(bind(this.hide, this), time); + } else { + this.hide(); + } + } + }; + + TooltipRichContent.prototype.isShow = function () { + return this._show; + }; + + TooltipRichContent.prototype.dispose = function () { + this._zr.remove(this.el); + }; + + return TooltipRichContent; + }(); + + function mathMaxWith0(val) { + return Math.max(0, val); + } + + function calcShadowOuterSize(style) { + var shadowBlur = mathMaxWith0(style.shadowBlur || 0); + var shadowOffsetX = mathMaxWith0(style.shadowOffsetX || 0); + var shadowOffsetY = mathMaxWith0(style.shadowOffsetY || 0); + return { + left: mathMaxWith0(shadowBlur - shadowOffsetX), + right: mathMaxWith0(shadowBlur + shadowOffsetX), + top: mathMaxWith0(shadowBlur - shadowOffsetY), + bottom: mathMaxWith0(shadowBlur + shadowOffsetY) + }; + } + + function makeStyleCoord$1(out, zr, zrX, zrY) { + out[0] = zrX; + out[1] = zrY; + out[2] = out[0] / zr.getWidth(); + out[3] = out[1] / zr.getHeight(); + } + + var proxyRect = new Rect({ + shape: { + x: -1, + y: -1, + width: 2, + height: 2 + } + }); + + var TooltipView = + /** @class */ + function (_super) { + __extends(TooltipView, _super); + + function TooltipView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TooltipView.type; + return _this; + } + + TooltipView.prototype.init = function (ecModel, api) { + if (env.node || !api.getDom()) { + return; + } + + var tooltipModel = ecModel.getComponent('tooltip'); + var renderMode = this._renderMode = getTooltipRenderMode(tooltipModel.get('renderMode')); + this._tooltipContent = renderMode === 'richText' ? new TooltipRichContent(api) : new TooltipHTMLContent(api.getDom(), api, { + appendToBody: tooltipModel.get('appendToBody', true) + }); + }; + + TooltipView.prototype.render = function (tooltipModel, ecModel, api) { + if (env.node || !api.getDom()) { + return; + } // Reset + + + this.group.removeAll(); + this._tooltipModel = tooltipModel; + this._ecModel = ecModel; + this._api = api; + /** + * @private + * @type {boolean} + */ + + this._alwaysShowContent = tooltipModel.get('alwaysShowContent'); + var tooltipContent = this._tooltipContent; + tooltipContent.update(tooltipModel); + tooltipContent.setEnterable(tooltipModel.get('enterable')); + + this._initGlobalListener(); + + this._keepShow(); // PENDING + // `mousemove` event will be triggered very frequently when the mouse moves fast, + // which causes that the `updatePosition` function was also called frequently. + // In Chrome with devtools open and Firefox, tooltip looks laggy and shakes. See #14695 #16101 + // To avoid frequent triggering, + // consider throttling it in 50ms when transition is enabled + + + if (this._renderMode !== 'richText' && tooltipModel.get('transitionDuration')) { + createOrUpdate(this, '_updatePosition', 50, 'fixRate'); + } else { + clear(this, '_updatePosition'); + } + }; + + TooltipView.prototype._initGlobalListener = function () { + var tooltipModel = this._tooltipModel; + var triggerOn = tooltipModel.get('triggerOn'); + register('itemTooltip', this._api, bind(function (currTrigger, e, dispatchAction) { + // If 'none', it is not controlled by mouse totally. + if (triggerOn !== 'none') { + if (triggerOn.indexOf(currTrigger) >= 0) { + this._tryShow(e, dispatchAction); + } else if (currTrigger === 'leave') { + this._hide(dispatchAction); + } + } + }, this)); + }; + + TooltipView.prototype._keepShow = function () { + var tooltipModel = this._tooltipModel; + var ecModel = this._ecModel; + var api = this._api; + var triggerOn = tooltipModel.get('triggerOn'); // Try to keep the tooltip show when refreshing + + if (this._lastX != null && this._lastY != null // When user is willing to control tooltip totally using API, + // self.manuallyShowTip({x, y}) might cause tooltip hide, + // which is not expected. + && triggerOn !== 'none' && triggerOn !== 'click') { + var self_1 = this; + clearTimeout(this._refreshUpdateTimeout); + this._refreshUpdateTimeout = setTimeout(function () { + // Show tip next tick after other charts are rendered + // In case highlight action has wrong result + // FIXME + !api.isDisposed() && self_1.manuallyShowTip(tooltipModel, ecModel, api, { + x: self_1._lastX, + y: self_1._lastY, + dataByCoordSys: self_1._lastDataByCoordSys + }); + }); + } + }; + /** + * Show tip manually by + * dispatchAction({ + * type: 'showTip', + * x: 10, + * y: 10 + * }); + * Or + * dispatchAction({ + * type: 'showTip', + * seriesIndex: 0, + * dataIndex or dataIndexInside or name + * }); + * + * TODO Batch + */ + + + TooltipView.prototype.manuallyShowTip = function (tooltipModel, ecModel, api, payload) { + if (payload.from === this.uid || env.node || !api.getDom()) { + return; + } + + var dispatchAction = makeDispatchAction$1(payload, api); // Reset ticket + + this._ticket = ''; // When triggered from axisPointer. + + var dataByCoordSys = payload.dataByCoordSys; + var cmptRef = findComponentReference(payload, ecModel, api); + + if (cmptRef) { + var rect = cmptRef.el.getBoundingRect().clone(); + rect.applyTransform(cmptRef.el.transform); + + this._tryShow({ + offsetX: rect.x + rect.width / 2, + offsetY: rect.y + rect.height / 2, + target: cmptRef.el, + position: payload.position, + // When manully trigger, the mouse is not on the el, so we'd better to + // position tooltip on the bottom of the el and display arrow is possible. + positionDefault: 'bottom' + }, dispatchAction); + } else if (payload.tooltip && payload.x != null && payload.y != null) { + var el = proxyRect; + el.x = payload.x; + el.y = payload.y; + el.update(); + getECData(el).tooltipConfig = { + name: null, + option: payload.tooltip + }; // Manually show tooltip while view is not using zrender elements. + + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + target: el + }, dispatchAction); + } else if (dataByCoordSys) { + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + position: payload.position, + dataByCoordSys: dataByCoordSys, + tooltipOption: payload.tooltipOption + }, dispatchAction); + } else if (payload.seriesIndex != null) { + if (this._manuallyAxisShowTip(tooltipModel, ecModel, api, payload)) { + return; + } + + var pointInfo = findPointFromSeries(payload, ecModel); + var cx = pointInfo.point[0]; + var cy = pointInfo.point[1]; + + if (cx != null && cy != null) { + this._tryShow({ + offsetX: cx, + offsetY: cy, + target: pointInfo.el, + position: payload.position, + // When manully trigger, the mouse is not on the el, so we'd better to + // position tooltip on the bottom of the el and display arrow is possible. + positionDefault: 'bottom' + }, dispatchAction); + } + } else if (payload.x != null && payload.y != null) { + // FIXME + // should wrap dispatchAction like `axisPointer/globalListener` ? + api.dispatchAction({ + type: 'updateAxisPointer', + x: payload.x, + y: payload.y + }); + + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + position: payload.position, + target: api.getZr().findHover(payload.x, payload.y).target + }, dispatchAction); + } + }; + + TooltipView.prototype.manuallyHideTip = function (tooltipModel, ecModel, api, payload) { + var tooltipContent = this._tooltipContent; + + if (!this._alwaysShowContent && this._tooltipModel) { + tooltipContent.hideLater(this._tooltipModel.get('hideDelay')); + } + + this._lastX = this._lastY = this._lastDataByCoordSys = null; + + if (payload.from !== this.uid) { + this._hide(makeDispatchAction$1(payload, api)); + } + }; // Be compatible with previous design, that is, when tooltip.type is 'axis' and + // dispatchAction 'showTip' with seriesIndex and dataIndex will trigger axis pointer + // and tooltip. + + + TooltipView.prototype._manuallyAxisShowTip = function (tooltipModel, ecModel, api, payload) { + var seriesIndex = payload.seriesIndex; + var dataIndex = payload.dataIndex; // @ts-ignore + + var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo; + + if (seriesIndex == null || dataIndex == null || coordSysAxesInfo == null) { + return; + } + + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); + + if (!seriesModel) { + return; + } + + var data = seriesModel.getData(); + var tooltipCascadedModel = buildTooltipModel([data.getItemModel(dataIndex), seriesModel, (seriesModel.coordinateSystem || {}).model], this._tooltipModel); + + if (tooltipCascadedModel.get('trigger') !== 'axis') { + return; + } + + api.dispatchAction({ + type: 'updateAxisPointer', + seriesIndex: seriesIndex, + dataIndex: dataIndex, + position: payload.position + }); + return true; + }; + + TooltipView.prototype._tryShow = function (e, dispatchAction) { + var el = e.target; + var tooltipModel = this._tooltipModel; + + if (!tooltipModel) { + return; + } // Save mouse x, mouse y. So we can try to keep showing the tip if chart is refreshed + + + this._lastX = e.offsetX; + this._lastY = e.offsetY; + var dataByCoordSys = e.dataByCoordSys; + + if (dataByCoordSys && dataByCoordSys.length) { + this._showAxisTooltip(dataByCoordSys, e); + } else if (el) { + this._lastDataByCoordSys = null; + var seriesDispatcher_1; + var cmptDispatcher_1; + findEventDispatcher(el, function (target) { + // Always show item tooltip if mouse is on the element with dataIndex + if (getECData(target).dataIndex != null) { + seriesDispatcher_1 = target; + return true; + } // Tooltip provided directly. Like legend. + + + if (getECData(target).tooltipConfig != null) { + cmptDispatcher_1 = target; + return true; + } + }, true); + + if (seriesDispatcher_1) { + this._showSeriesItemTooltip(e, seriesDispatcher_1, dispatchAction); + } else if (cmptDispatcher_1) { + this._showComponentItemTooltip(e, cmptDispatcher_1, dispatchAction); + } else { + this._hide(dispatchAction); + } + } else { + this._lastDataByCoordSys = null; + + this._hide(dispatchAction); + } + }; + + TooltipView.prototype._showOrMove = function (tooltipModel, cb) { + // showDelay is used in this case: tooltip.enterable is set + // as true. User intent to move mouse into tooltip and click + // something. `showDelay` makes it easier to enter the content + // but tooltip do not move immediately. + var delay = tooltipModel.get('showDelay'); + cb = bind(cb, this); + clearTimeout(this._showTimout); + delay > 0 ? this._showTimout = setTimeout(cb, delay) : cb(); + }; + + TooltipView.prototype._showAxisTooltip = function (dataByCoordSys, e) { + var ecModel = this._ecModel; + var globalTooltipModel = this._tooltipModel; + var point = [e.offsetX, e.offsetY]; + var singleTooltipModel = buildTooltipModel([e.tooltipOption], globalTooltipModel); + var renderMode = this._renderMode; + var cbParamsList = []; + var articleMarkup = createTooltipMarkup('section', { + blocks: [], + noHeader: true + }); // Only for legacy: `Serise['formatTooltip']` returns a string. + + var markupTextArrLegacy = []; + var markupStyleCreator = new TooltipMarkupStyleCreator(); + each(dataByCoordSys, function (itemCoordSys) { + each(itemCoordSys.dataByAxis, function (axisItem) { + var axisModel = ecModel.getComponent(axisItem.axisDim + 'Axis', axisItem.axisIndex); + var axisValue = axisItem.value; + + if (!axisModel || axisValue == null) { + return; + } + + var axisValueLabel = getValueLabel(axisValue, axisModel.axis, ecModel, axisItem.seriesDataIndices, axisItem.valueLabelOpt); + var axisSectionMarkup = createTooltipMarkup('section', { + header: axisValueLabel, + noHeader: !trim(axisValueLabel), + sortBlocks: true, + blocks: [] + }); + articleMarkup.blocks.push(axisSectionMarkup); + each(axisItem.seriesDataIndices, function (idxItem) { + var series = ecModel.getSeriesByIndex(idxItem.seriesIndex); + var dataIndex = idxItem.dataIndexInside; + var cbParams = series.getDataParams(dataIndex); // Can't find data. + + if (cbParams.dataIndex < 0) { + return; + } + + cbParams.axisDim = axisItem.axisDim; + cbParams.axisIndex = axisItem.axisIndex; + cbParams.axisType = axisItem.axisType; + cbParams.axisId = axisItem.axisId; + cbParams.axisValue = getAxisRawValue(axisModel.axis, { + value: axisValue + }); + cbParams.axisValueLabel = axisValueLabel; // Pre-create marker style for makers. Users can assemble richText + // text in `formatter` callback and use those markers style. + + cbParams.marker = markupStyleCreator.makeTooltipMarker('item', convertToColorString(cbParams.color), renderMode); + var seriesTooltipResult = normalizeTooltipFormatResult(series.formatTooltip(dataIndex, true, null)); + var frag = seriesTooltipResult.frag; + + if (frag) { + var valueFormatter = buildTooltipModel([series], globalTooltipModel).get('valueFormatter'); + axisSectionMarkup.blocks.push(valueFormatter ? extend({ + valueFormatter: valueFormatter + }, frag) : frag); + } + + if (seriesTooltipResult.text) { + markupTextArrLegacy.push(seriesTooltipResult.text); + } + + cbParamsList.push(cbParams); + }); + }); + }); // In most cases, the second axis is displays upper on the first one. + // So we reverse it to look better. + + articleMarkup.blocks.reverse(); + markupTextArrLegacy.reverse(); + var positionExpr = e.position; + var orderMode = singleTooltipModel.get('order'); + var builtMarkupText = buildTooltipMarkup(articleMarkup, markupStyleCreator, renderMode, orderMode, ecModel.get('useUTC'), singleTooltipModel.get('textStyle')); + builtMarkupText && markupTextArrLegacy.unshift(builtMarkupText); + var blockBreak = renderMode === 'richText' ? '\n\n' : '<br/>'; + var allMarkupText = markupTextArrLegacy.join(blockBreak); + + this._showOrMove(singleTooltipModel, function () { + if (this._updateContentNotChangedOnAxis(dataByCoordSys, cbParamsList)) { + this._updatePosition(singleTooltipModel, positionExpr, point[0], point[1], this._tooltipContent, cbParamsList); + } else { + this._showTooltipContent(singleTooltipModel, allMarkupText, cbParamsList, Math.random() + '', point[0], point[1], positionExpr, null, markupStyleCreator); + } + }); // Do not trigger events here, because this branch only be entered + // from dispatchAction. + + }; + + TooltipView.prototype._showSeriesItemTooltip = function (e, dispatcher, dispatchAction) { + var ecModel = this._ecModel; + var ecData = getECData(dispatcher); // Use dataModel in element if possible + // Used when mouseover on a element like markPoint or edge + // In which case, the data is not main data in series. + + var seriesIndex = ecData.seriesIndex; + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); // For example, graph link. + + var dataModel = ecData.dataModel || seriesModel; + var dataIndex = ecData.dataIndex; + var dataType = ecData.dataType; + var data = dataModel.getData(dataType); + var renderMode = this._renderMode; + var positionDefault = e.positionDefault; + var tooltipModel = buildTooltipModel([data.getItemModel(dataIndex), dataModel, seriesModel && (seriesModel.coordinateSystem || {}).model], this._tooltipModel, positionDefault ? { + position: positionDefault + } : null); + var tooltipTrigger = tooltipModel.get('trigger'); + + if (tooltipTrigger != null && tooltipTrigger !== 'item') { + return; + } + + var params = dataModel.getDataParams(dataIndex, dataType); + var markupStyleCreator = new TooltipMarkupStyleCreator(); // Pre-create marker style for makers. Users can assemble richText + // text in `formatter` callback and use those markers style. + + params.marker = markupStyleCreator.makeTooltipMarker('item', convertToColorString(params.color), renderMode); + var seriesTooltipResult = normalizeTooltipFormatResult(dataModel.formatTooltip(dataIndex, false, dataType)); + var orderMode = tooltipModel.get('order'); + var valueFormatter = tooltipModel.get('valueFormatter'); + var frag = seriesTooltipResult.frag; + var markupText = frag ? buildTooltipMarkup(valueFormatter ? extend({ + valueFormatter: valueFormatter + }, frag) : frag, markupStyleCreator, renderMode, orderMode, ecModel.get('useUTC'), tooltipModel.get('textStyle')) : seriesTooltipResult.text; + var asyncTicket = 'item_' + dataModel.name + '_' + dataIndex; + + this._showOrMove(tooltipModel, function () { + this._showTooltipContent(tooltipModel, markupText, params, asyncTicket, e.offsetX, e.offsetY, e.position, e.target, markupStyleCreator); + }); // FIXME + // duplicated showtip if manuallyShowTip is called from dispatchAction. + + + dispatchAction({ + type: 'showTip', + dataIndexInside: dataIndex, + dataIndex: data.getRawIndex(dataIndex), + seriesIndex: seriesIndex, + from: this.uid + }); + }; + + TooltipView.prototype._showComponentItemTooltip = function (e, el, dispatchAction) { + var ecData = getECData(el); + var tooltipConfig = ecData.tooltipConfig; + var tooltipOpt = tooltipConfig.option || {}; + + if (isString(tooltipOpt)) { + var content = tooltipOpt; + tooltipOpt = { + content: content, + // Fixed formatter + formatter: content + }; + } + + var tooltipModelCascade = [tooltipOpt]; + + var cmpt = this._ecModel.getComponent(ecData.componentMainType, ecData.componentIndex); + + if (cmpt) { + tooltipModelCascade.push(cmpt); + } // In most cases, component tooltip formatter has different params with series tooltip formatter, + // so that they can not share the same formatter. Since the global tooltip formatter is used for series + // by convension, we do not use it as the default formatter for component. + + + tooltipModelCascade.push({ + formatter: tooltipOpt.content + }); + var positionDefault = e.positionDefault; + var subTooltipModel = buildTooltipModel(tooltipModelCascade, this._tooltipModel, positionDefault ? { + position: positionDefault + } : null); + var defaultHtml = subTooltipModel.get('content'); + var asyncTicket = Math.random() + ''; // PENDING: this case do not support richText style yet. + + var markupStyleCreator = new TooltipMarkupStyleCreator(); // Do not check whether `trigger` is 'none' here, because `trigger` + // only works on coordinate system. In fact, we have not found case + // that requires setting `trigger` nothing on component yet. + + this._showOrMove(subTooltipModel, function () { + // Use formatterParams from element defined in component + // Avoid users modify it. + var formatterParams = clone(subTooltipModel.get('formatterParams') || {}); + + this._showTooltipContent(subTooltipModel, defaultHtml, formatterParams, asyncTicket, e.offsetX, e.offsetY, e.position, el, markupStyleCreator); + }); // If not dispatch showTip, tip may be hide triggered by axis. + + + dispatchAction({ + type: 'showTip', + from: this.uid + }); + }; + + TooltipView.prototype._showTooltipContent = function ( // Use Model<TooltipOption> insteadof TooltipModel because this model may be from series or other options. + // Instead of top level tooltip. + tooltipModel, defaultHtml, params, asyncTicket, x, y, positionExpr, el, markupStyleCreator) { + // Reset ticket + this._ticket = ''; + + if (!tooltipModel.get('showContent') || !tooltipModel.get('show')) { + return; + } + + var tooltipContent = this._tooltipContent; + tooltipContent.setEnterable(tooltipModel.get('enterable')); + var formatter = tooltipModel.get('formatter'); + positionExpr = positionExpr || tooltipModel.get('position'); + var html = defaultHtml; + + var nearPoint = this._getNearestPoint([x, y], params, tooltipModel.get('trigger'), tooltipModel.get('borderColor')); + + var nearPointColor = nearPoint.color; + + if (formatter) { + if (isString(formatter)) { + var useUTC = tooltipModel.ecModel.get('useUTC'); + var params0 = isArray(params) ? params[0] : params; + var isTimeAxis = params0 && params0.axisType && params0.axisType.indexOf('time') >= 0; + html = formatter; + + if (isTimeAxis) { + html = format(params0.axisValue, html, useUTC); + } + + html = formatTpl(html, params, true); + } else if (isFunction(formatter)) { + var callback = bind(function (cbTicket, html) { + if (cbTicket === this._ticket) { + tooltipContent.setContent(html, markupStyleCreator, tooltipModel, nearPointColor, positionExpr); + + this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el); + } + }, this); + this._ticket = asyncTicket; + html = formatter(params, asyncTicket, callback); + } else { + html = formatter; + } + } + + tooltipContent.setContent(html, markupStyleCreator, tooltipModel, nearPointColor, positionExpr); + tooltipContent.show(tooltipModel, nearPointColor); + + this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el); + }; + + TooltipView.prototype._getNearestPoint = function (point, tooltipDataParams, trigger, borderColor) { + if (trigger === 'axis' || isArray(tooltipDataParams)) { + return { + color: borderColor || (this._renderMode === 'html' ? '#fff' : 'none') + }; + } + + if (!isArray(tooltipDataParams)) { + return { + color: borderColor || tooltipDataParams.color || tooltipDataParams.borderColor + }; + } + }; + + TooltipView.prototype._updatePosition = function (tooltipModel, positionExpr, x, // Mouse x + y, // Mouse y + content, params, el) { + var viewWidth = this._api.getWidth(); + + var viewHeight = this._api.getHeight(); + + positionExpr = positionExpr || tooltipModel.get('position'); + var contentSize = content.getSize(); + var align = tooltipModel.get('align'); + var vAlign = tooltipModel.get('verticalAlign'); + var rect = el && el.getBoundingRect().clone(); + el && rect.applyTransform(el.transform); + + if (isFunction(positionExpr)) { + // Callback of position can be an array or a string specify the position + positionExpr = positionExpr([x, y], params, content.el, rect, { + viewSize: [viewWidth, viewHeight], + contentSize: contentSize.slice() + }); + } + + if (isArray(positionExpr)) { + x = parsePercent$1(positionExpr[0], viewWidth); + y = parsePercent$1(positionExpr[1], viewHeight); + } else if (isObject(positionExpr)) { + var boxLayoutPosition = positionExpr; + boxLayoutPosition.width = contentSize[0]; + boxLayoutPosition.height = contentSize[1]; + var layoutRect = getLayoutRect(boxLayoutPosition, { + width: viewWidth, + height: viewHeight + }); + x = layoutRect.x; + y = layoutRect.y; + align = null; // When positionExpr is left/top/right/bottom, + // align and verticalAlign will not work. + + vAlign = null; + } // Specify tooltip position by string 'top' 'bottom' 'left' 'right' around graphic element + else if (isString(positionExpr) && el) { + var pos = calcTooltipPosition(positionExpr, rect, contentSize, tooltipModel.get('borderWidth')); + x = pos[0]; + y = pos[1]; + } else { + var pos = refixTooltipPosition(x, y, content, viewWidth, viewHeight, align ? null : 20, vAlign ? null : 20); + x = pos[0]; + y = pos[1]; + } + + align && (x -= isCenterAlign(align) ? contentSize[0] / 2 : align === 'right' ? contentSize[0] : 0); + vAlign && (y -= isCenterAlign(vAlign) ? contentSize[1] / 2 : vAlign === 'bottom' ? contentSize[1] : 0); + + if (shouldTooltipConfine(tooltipModel)) { + var pos = confineTooltipPosition(x, y, content, viewWidth, viewHeight); + x = pos[0]; + y = pos[1]; + } + + content.moveTo(x, y); + }; // FIXME + // Should we remove this but leave this to user? + + + TooltipView.prototype._updateContentNotChangedOnAxis = function (dataByCoordSys, cbParamsList) { + var lastCoordSys = this._lastDataByCoordSys; + var lastCbParamsList = this._cbParamsList; + var contentNotChanged = !!lastCoordSys && lastCoordSys.length === dataByCoordSys.length; + contentNotChanged && each(lastCoordSys, function (lastItemCoordSys, indexCoordSys) { + var lastDataByAxis = lastItemCoordSys.dataByAxis || []; + var thisItemCoordSys = dataByCoordSys[indexCoordSys] || {}; + var thisDataByAxis = thisItemCoordSys.dataByAxis || []; + contentNotChanged = contentNotChanged && lastDataByAxis.length === thisDataByAxis.length; + contentNotChanged && each(lastDataByAxis, function (lastItem, indexAxis) { + var thisItem = thisDataByAxis[indexAxis] || {}; + var lastIndices = lastItem.seriesDataIndices || []; + var newIndices = thisItem.seriesDataIndices || []; + contentNotChanged = contentNotChanged && lastItem.value === thisItem.value && lastItem.axisType === thisItem.axisType && lastItem.axisId === thisItem.axisId && lastIndices.length === newIndices.length; + contentNotChanged && each(lastIndices, function (lastIdxItem, j) { + var newIdxItem = newIndices[j]; + contentNotChanged = contentNotChanged && lastIdxItem.seriesIndex === newIdxItem.seriesIndex && lastIdxItem.dataIndex === newIdxItem.dataIndex; + }); // check is cbParams data value changed + + lastCbParamsList && each(lastItem.seriesDataIndices, function (idxItem) { + var seriesIdx = idxItem.seriesIndex; + var cbParams = cbParamsList[seriesIdx]; + var lastCbParams = lastCbParamsList[seriesIdx]; + + if (cbParams && lastCbParams && lastCbParams.data !== cbParams.data) { + contentNotChanged = false; + } + }); + }); + }); + this._lastDataByCoordSys = dataByCoordSys; + this._cbParamsList = cbParamsList; + return !!contentNotChanged; + }; + + TooltipView.prototype._hide = function (dispatchAction) { + // Do not directly hideLater here, because this behavior may be prevented + // in dispatchAction when showTip is dispatched. + // FIXME + // duplicated hideTip if manuallyHideTip is called from dispatchAction. + this._lastDataByCoordSys = null; + dispatchAction({ + type: 'hideTip', + from: this.uid + }); + }; + + TooltipView.prototype.dispose = function (ecModel, api) { + if (env.node || !api.getDom()) { + return; + } + + clear(this, '_updatePosition'); + + this._tooltipContent.dispose(); + + unregister('itemTooltip', api); + }; + + TooltipView.type = 'tooltip'; + return TooltipView; + }(ComponentView); + /** + * From top to bottom. (the last one should be globalTooltipModel); + */ + + + function buildTooltipModel(modelCascade, globalTooltipModel, defaultTooltipOption) { + // Last is always tooltip model. + var ecModel = globalTooltipModel.ecModel; + var resultModel; + + if (defaultTooltipOption) { + resultModel = new Model(defaultTooltipOption, ecModel, ecModel); + resultModel = new Model(globalTooltipModel.option, resultModel, ecModel); + } else { + resultModel = globalTooltipModel; + } + + for (var i = modelCascade.length - 1; i >= 0; i--) { + var tooltipOpt = modelCascade[i]; + + if (tooltipOpt) { + if (tooltipOpt instanceof Model) { + tooltipOpt = tooltipOpt.get('tooltip', true); + } // In each data item tooltip can be simply write: + // { + // value: 10, + // tooltip: 'Something you need to know' + // } + + + if (isString(tooltipOpt)) { + tooltipOpt = { + formatter: tooltipOpt + }; + } + + if (tooltipOpt) { + resultModel = new Model(tooltipOpt, resultModel, ecModel); + } + } + } + + return resultModel; + } + + function makeDispatchAction$1(payload, api) { + return payload.dispatchAction || bind(api.dispatchAction, api); + } + + function refixTooltipPosition(x, y, content, viewWidth, viewHeight, gapH, gapV) { + var size = content.getSize(); + var width = size[0]; + var height = size[1]; + + if (gapH != null) { + // Add extra 2 pixels for this case: + // At present the "values" in defaut tooltip are using CSS `float: right`. + // When the right edge of the tooltip box is on the right side of the + // viewport, the `float` layout might push the "values" to the second line. + if (x + width + gapH + 2 > viewWidth) { + x -= width + gapH; + } else { + x += gapH; + } + } + + if (gapV != null) { + if (y + height + gapV > viewHeight) { + y -= height + gapV; + } else { + y += gapV; + } + } + + return [x, y]; + } + + function confineTooltipPosition(x, y, content, viewWidth, viewHeight) { + var size = content.getSize(); + var width = size[0]; + var height = size[1]; + x = Math.min(x + width, viewWidth) - width; + y = Math.min(y + height, viewHeight) - height; + x = Math.max(x, 0); + y = Math.max(y, 0); + return [x, y]; + } + + function calcTooltipPosition(position, rect, contentSize, borderWidth) { + var domWidth = contentSize[0]; + var domHeight = contentSize[1]; + var offset = Math.ceil(Math.SQRT2 * borderWidth) + 8; + var x = 0; + var y = 0; + var rectWidth = rect.width; + var rectHeight = rect.height; + + switch (position) { + case 'inside': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y + rectHeight / 2 - domHeight / 2; + break; + + case 'top': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y - domHeight - offset; + break; + + case 'bottom': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y + rectHeight + offset; + break; + + case 'left': + x = rect.x - domWidth - offset; + y = rect.y + rectHeight / 2 - domHeight / 2; + break; + + case 'right': + x = rect.x + rectWidth + offset; + y = rect.y + rectHeight / 2 - domHeight / 2; + } + + return [x, y]; + } + + function isCenterAlign(align) { + return align === 'center' || align === 'middle'; + } + /** + * Find target component by payload like: + * ```js + * { legendId: 'some_id', name: 'xxx' } + * { toolboxIndex: 1, name: 'xxx' } + * { geoName: 'some_name', name: 'xxx' } + * ``` + * PENDING: at present only + * + * If not found, return null/undefined. + */ + + + function findComponentReference(payload, ecModel, api) { + var queryOptionMap = preParseFinder(payload).queryOptionMap; + var componentMainType = queryOptionMap.keys()[0]; + + if (!componentMainType || componentMainType === 'series') { + return; + } + + var queryResult = queryReferringComponents(ecModel, componentMainType, queryOptionMap.get(componentMainType), { + useDefault: false, + enableAll: false, + enableNone: false + }); + var model = queryResult.models[0]; + + if (!model) { + return; + } + + var view = api.getViewOfComponentModel(model); + var el; + view.group.traverse(function (subEl) { + var tooltipConfig = getECData(subEl).tooltipConfig; + + if (tooltipConfig && tooltipConfig.name === payload.name) { + el = subEl; + return true; // stop + } + }); + + if (el) { + return { + componentMainType: componentMainType, + componentIndex: model.componentIndex, + el: el + }; + } + } + + function install$A(registers) { + use(install$s); + registers.registerComponentModel(TooltipModel); + registers.registerComponentView(TooltipView); + /** + * @action + * @property {string} type + * @property {number} seriesIndex + * @property {number} dataIndex + * @property {number} [x] + * @property {number} [y] + */ + + registers.registerAction({ + type: 'showTip', + event: 'showTip', + update: 'tooltip:manuallyShowTip' + }, noop); + registers.registerAction({ + type: 'hideTip', + event: 'hideTip', + update: 'tooltip:manuallyHideTip' + }, noop); + } + + var DEFAULT_TOOLBOX_BTNS = ['rect', 'polygon', 'keep', 'clear']; + function brushPreprocessor(option, isNew) { + var brushComponents = normalizeToArray(option ? option.brush : []); + + if (!brushComponents.length) { + return; + } + + var brushComponentSpecifiedBtns = []; + each(brushComponents, function (brushOpt) { + var tbs = brushOpt.hasOwnProperty('toolbox') ? brushOpt.toolbox : []; + + if (tbs instanceof Array) { + brushComponentSpecifiedBtns = brushComponentSpecifiedBtns.concat(tbs); + } + }); + var toolbox = option && option.toolbox; + + if (isArray(toolbox)) { + toolbox = toolbox[0]; + } + + if (!toolbox) { + toolbox = { + feature: {} + }; + option.toolbox = [toolbox]; + } + + var toolboxFeature = toolbox.feature || (toolbox.feature = {}); + var toolboxBrush = toolboxFeature.brush || (toolboxFeature.brush = {}); + var brushTypes = toolboxBrush.type || (toolboxBrush.type = []); + brushTypes.push.apply(brushTypes, brushComponentSpecifiedBtns); + removeDuplicate(brushTypes); + + if (isNew && !brushTypes.length) { + brushTypes.push.apply(brushTypes, DEFAULT_TOOLBOX_BTNS); + } + } + + function removeDuplicate(arr) { + var map = {}; + each(arr, function (val) { + map[val] = 1; + }); + arr.length = 0; + each(map, function (flag, val) { + arr.push(val); + }); + } + + var each$b = each; + + function hasKeys(obj) { + if (obj) { + for (var name_1 in obj) { + if (obj.hasOwnProperty(name_1)) { + return true; + } + } + } + } + + function createVisualMappings(option, stateList, supplementVisualOption) { + var visualMappings = {}; + each$b(stateList, function (state) { + var mappings = visualMappings[state] = createMappings(); + each$b(option[state], function (visualData, visualType) { + if (!VisualMapping.isValidType(visualType)) { + return; + } + + var mappingOption = { + type: visualType, + visual: visualData + }; + supplementVisualOption && supplementVisualOption(mappingOption, state); + mappings[visualType] = new VisualMapping(mappingOption); // Prepare a alpha for opacity, for some case that opacity + // is not supported, such as rendering using gradient color. + + if (visualType === 'opacity') { + mappingOption = clone(mappingOption); + mappingOption.type = 'colorAlpha'; + mappings.__hidden.__alphaForOpacity = new VisualMapping(mappingOption); + } + }); + }); + return visualMappings; + + function createMappings() { + var Creater = function () {}; // Make sure hidden fields will not be visited by + // object iteration (with hasOwnProperty checking). + + + Creater.prototype.__hidden = Creater.prototype; + var obj = new Creater(); + return obj; + } + } + function replaceVisualOption(thisOption, newOption, keys) { + // Visual attributes merge is not supported, otherwise it + // brings overcomplicated merge logic. See #2853. So if + // newOption has anyone of these keys, all of these keys + // will be reset. Otherwise, all keys remain. + var has; + each(keys, function (key) { + if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) { + has = true; + } + }); + has && each(keys, function (key) { + if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) { + thisOption[key] = clone(newOption[key]); + } else { + delete thisOption[key]; + } + }); + } + /** + * @param stateList + * @param visualMappings + * @param list + * @param getValueState param: valueOrIndex, return: state. + * @param scope Scope for getValueState + * @param dimension Concrete dimension, if used. + */ + // ???! handle brush? + + function applyVisual(stateList, visualMappings, data, getValueState, scope, dimension) { + var visualTypesMap = {}; + each(stateList, function (state) { + var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]); + visualTypesMap[state] = visualTypes; + }); + var dataIndex; + + function getVisual(key) { + return getItemVisualFromData(data, dataIndex, key); + } + + function setVisual(key, value) { + setItemVisualFromData(data, dataIndex, key, value); + } + + if (dimension == null) { + data.each(eachItem); + } else { + data.each([dimension], eachItem); + } + + function eachItem(valueOrIndex, index) { + dataIndex = dimension == null ? valueOrIndex // First argument is index + : index; + var rawDataItem = data.getRawDataItem(dataIndex); // Consider performance + // @ts-ignore + + if (rawDataItem && rawDataItem.visualMap === false) { + return; + } + + var valueState = getValueState.call(scope, valueOrIndex); + var mappings = visualMappings[valueState]; + var visualTypes = visualTypesMap[valueState]; + + for (var i = 0, len = visualTypes.length; i < len; i++) { + var type = visualTypes[i]; + mappings[type] && mappings[type].applyVisual(valueOrIndex, getVisual, setVisual); + } + } + } + /** + * @param data + * @param stateList + * @param visualMappings <state, Object.<visualType, module:echarts/visual/VisualMapping>> + * @param getValueState param: valueOrIndex, return: state. + * @param dim dimension or dimension index. + */ + + function incrementalApplyVisual(stateList, visualMappings, getValueState, dim) { + var visualTypesMap = {}; + each(stateList, function (state) { + var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]); + visualTypesMap[state] = visualTypes; + }); + return { + progress: function progress(params, data) { + var dimIndex; + + if (dim != null) { + dimIndex = data.getDimensionIndex(dim); + } + + function getVisual(key) { + return getItemVisualFromData(data, dataIndex, key); + } + + function setVisual(key, value) { + setItemVisualFromData(data, dataIndex, key, value); + } + + var dataIndex; + var store = data.getStore(); + + while ((dataIndex = params.next()) != null) { + var rawDataItem = data.getRawDataItem(dataIndex); // Consider performance + // @ts-ignore + + if (rawDataItem && rawDataItem.visualMap === false) { + continue; + } + + var value = dim != null ? store.get(dimIndex, dataIndex) : dataIndex; + var valueState = getValueState(value); + var mappings = visualMappings[valueState]; + var visualTypes = visualTypesMap[valueState]; + + for (var i = 0, len = visualTypes.length; i < len; i++) { + var type = visualTypes[i]; + mappings[type] && mappings[type].applyVisual(value, getVisual, setVisual); + } + } + } + }; + } + + function makeBrushCommonSelectorForSeries(area) { + var brushType = area.brushType; // Do not use function binding or curry for performance. + + var selectors = { + point: function (itemLayout) { + return selector[brushType].point(itemLayout, selectors, area); + }, + rect: function (itemLayout) { + return selector[brushType].rect(itemLayout, selectors, area); + } + }; + return selectors; + } + var selector = { + lineX: getLineSelectors(0), + lineY: getLineSelectors(1), + rect: { + point: function (itemLayout, selectors, area) { + return itemLayout && area.boundingRect.contain(itemLayout[0], itemLayout[1]); + }, + rect: function (itemLayout, selectors, area) { + return itemLayout && area.boundingRect.intersect(itemLayout); + } + }, + polygon: { + point: function (itemLayout, selectors, area) { + return itemLayout && area.boundingRect.contain(itemLayout[0], itemLayout[1]) && contain$2(area.range, itemLayout[0], itemLayout[1]); + }, + rect: function (itemLayout, selectors, area) { + var points = area.range; + + if (!itemLayout || points.length <= 1) { + return false; + } + + var x = itemLayout.x; + var y = itemLayout.y; + var width = itemLayout.width; + var height = itemLayout.height; + var p = points[0]; + + if (contain$2(points, x, y) || contain$2(points, x + width, y) || contain$2(points, x, y + height) || contain$2(points, x + width, y + height) || BoundingRect.create(itemLayout).contain(p[0], p[1]) || linePolygonIntersect(x, y, x + width, y, points) || linePolygonIntersect(x, y, x, y + height, points) || linePolygonIntersect(x + width, y, x + width, y + height, points) || linePolygonIntersect(x, y + height, x + width, y + height, points)) { + return true; + } + } + } + }; + + function getLineSelectors(xyIndex) { + var xy = ['x', 'y']; + var wh = ['width', 'height']; + return { + point: function (itemLayout, selectors, area) { + if (itemLayout) { + var range = area.range; + var p = itemLayout[xyIndex]; + return inLineRange(p, range); + } + }, + rect: function (itemLayout, selectors, area) { + if (itemLayout) { + var range = area.range; + var layoutRange = [itemLayout[xy[xyIndex]], itemLayout[xy[xyIndex]] + itemLayout[wh[xyIndex]]]; + layoutRange[1] < layoutRange[0] && layoutRange.reverse(); + return inLineRange(layoutRange[0], range) || inLineRange(layoutRange[1], range) || inLineRange(range[0], layoutRange) || inLineRange(range[1], layoutRange); + } + } + }; + } + + function inLineRange(p, range) { + return range[0] <= p && p <= range[1]; + } + + var STATE_LIST = ['inBrush', 'outOfBrush']; + var DISPATCH_METHOD = '__ecBrushSelect'; + var DISPATCH_FLAG = '__ecInBrushSelectEvent'; + function layoutCovers(ecModel) { + ecModel.eachComponent({ + mainType: 'brush' + }, function (brushModel) { + var brushTargetManager = brushModel.brushTargetManager = new BrushTargetManager(brushModel.option, ecModel); + brushTargetManager.setInputRanges(brushModel.areas, ecModel); + }); + } + /** + * Register the visual encoding if this modules required. + */ + + function brushVisual(ecModel, api, payload) { + var brushSelected = []; + var throttleType; + var throttleDelay; + ecModel.eachComponent({ + mainType: 'brush' + }, function (brushModel) { + payload && payload.type === 'takeGlobalCursor' && brushModel.setBrushOption(payload.key === 'brush' ? payload.brushOption : { + brushType: false + }); + }); + layoutCovers(ecModel); + ecModel.eachComponent({ + mainType: 'brush' + }, function (brushModel, brushIndex) { + var thisBrushSelected = { + brushId: brushModel.id, + brushIndex: brushIndex, + brushName: brushModel.name, + areas: clone(brushModel.areas), + selected: [] + }; // Every brush component exists in event params, convenient + // for user to find by index. + + brushSelected.push(thisBrushSelected); + var brushOption = brushModel.option; + var brushLink = brushOption.brushLink; + var linkedSeriesMap = []; + var selectedDataIndexForLink = []; + var rangeInfoBySeries = []; + var hasBrushExists = false; + + if (!brushIndex) { + // Only the first throttle setting works. + throttleType = brushOption.throttleType; + throttleDelay = brushOption.throttleDelay; + } // Add boundingRect and selectors to range. + + + var areas = map(brushModel.areas, function (area) { + var builder = boundingRectBuilders[area.brushType]; + var selectableArea = defaults({ + boundingRect: builder ? builder(area) : void 0 + }, area); + selectableArea.selectors = makeBrushCommonSelectorForSeries(selectableArea); + return selectableArea; + }); + var visualMappings = createVisualMappings(brushModel.option, STATE_LIST, function (mappingOption) { + mappingOption.mappingMethod = 'fixed'; + }); + isArray(brushLink) && each(brushLink, function (seriesIndex) { + linkedSeriesMap[seriesIndex] = 1; + }); + + function linkOthers(seriesIndex) { + return brushLink === 'all' || !!linkedSeriesMap[seriesIndex]; + } // If no supported brush or no brush on the series, + // all visuals should be in original state. + + + function brushed(rangeInfoList) { + return !!rangeInfoList.length; + } + /** + * Logic for each series: (If the logic has to be modified one day, do it carefully!) + * + * ( brushed ┬ && ┬hasBrushExist ┬ && linkOthers ) => StepA: ┬record, ┬ StepB: ┬visualByRecord. + * !brushed┘ ├hasBrushExist ┤ └nothing,┘ ├visualByRecord. + * └!hasBrushExist┘ └nothing. + * ( !brushed && ┬hasBrushExist ┬ && linkOthers ) => StepA: nothing, StepB: ┬visualByRecord. + * └!hasBrushExist┘ └nothing. + * ( brushed ┬ && !linkOthers ) => StepA: nothing, StepB: ┬visualByCheck. + * !brushed┘ └nothing. + * ( !brushed && !linkOthers ) => StepA: nothing, StepB: nothing. + */ + // Step A + + + ecModel.eachSeries(function (seriesModel, seriesIndex) { + var rangeInfoList = rangeInfoBySeries[seriesIndex] = []; + seriesModel.subType === 'parallel' ? stepAParallel(seriesModel, seriesIndex) : stepAOthers(seriesModel, seriesIndex, rangeInfoList); + }); + + function stepAParallel(seriesModel, seriesIndex) { + var coordSys = seriesModel.coordinateSystem; + hasBrushExists = hasBrushExists || coordSys.hasAxisBrushed(); + linkOthers(seriesIndex) && coordSys.eachActiveState(seriesModel.getData(), function (activeState, dataIndex) { + activeState === 'active' && (selectedDataIndexForLink[dataIndex] = 1); + }); + } + + function stepAOthers(seriesModel, seriesIndex, rangeInfoList) { + if (!seriesModel.brushSelector || brushModelNotControll(brushModel, seriesIndex)) { + return; + } + + each(areas, function (area) { + if (brushModel.brushTargetManager.controlSeries(area, seriesModel, ecModel)) { + rangeInfoList.push(area); + } + + hasBrushExists = hasBrushExists || brushed(rangeInfoList); + }); + + if (linkOthers(seriesIndex) && brushed(rangeInfoList)) { + var data_1 = seriesModel.getData(); + data_1.each(function (dataIndex) { + if (checkInRange(seriesModel, rangeInfoList, data_1, dataIndex)) { + selectedDataIndexForLink[dataIndex] = 1; + } + }); + } + } // Step B + + + ecModel.eachSeries(function (seriesModel, seriesIndex) { + var seriesBrushSelected = { + seriesId: seriesModel.id, + seriesIndex: seriesIndex, + seriesName: seriesModel.name, + dataIndex: [] + }; // Every series exists in event params, convenient + // for user to find series by seriesIndex. + + thisBrushSelected.selected.push(seriesBrushSelected); + var rangeInfoList = rangeInfoBySeries[seriesIndex]; + var data = seriesModel.getData(); + var getValueState = linkOthers(seriesIndex) ? function (dataIndex) { + return selectedDataIndexForLink[dataIndex] ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush') : 'outOfBrush'; + } : function (dataIndex) { + return checkInRange(seriesModel, rangeInfoList, data, dataIndex) ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush') : 'outOfBrush'; + }; // If no supported brush or no brush, all visuals are in original state. + + (linkOthers(seriesIndex) ? hasBrushExists : brushed(rangeInfoList)) && applyVisual(STATE_LIST, visualMappings, data, getValueState); + }); + }); + dispatchAction(api, throttleType, throttleDelay, brushSelected, payload); + } + + function dispatchAction(api, throttleType, throttleDelay, brushSelected, payload) { + // This event will not be triggered when `setOpion`, otherwise dead lock may + // triggered when do `setOption` in event listener, which we do not find + // satisfactory way to solve yet. Some considered resolutions: + // (a) Diff with prevoius selected data ant only trigger event when changed. + // But store previous data and diff precisely (i.e., not only by dataIndex, but + // also detect value changes in selected data) might bring complexity or fragility. + // (b) Use spectial param like `silent` to suppress event triggering. + // But such kind of volatile param may be weird in `setOption`. + if (!payload) { + return; + } + + var zr = api.getZr(); + + if (zr[DISPATCH_FLAG]) { + return; + } + + if (!zr[DISPATCH_METHOD]) { + zr[DISPATCH_METHOD] = doDispatch; + } + + var fn = createOrUpdate(zr, DISPATCH_METHOD, throttleDelay, throttleType); + fn(api, brushSelected); + } + + function doDispatch(api, brushSelected) { + if (!api.isDisposed()) { + var zr = api.getZr(); + zr[DISPATCH_FLAG] = true; + api.dispatchAction({ + type: 'brushSelect', + batch: brushSelected + }); + zr[DISPATCH_FLAG] = false; + } + } + + function checkInRange(seriesModel, rangeInfoList, data, dataIndex) { + for (var i = 0, len = rangeInfoList.length; i < len; i++) { + var area = rangeInfoList[i]; + + if (seriesModel.brushSelector(dataIndex, data, area.selectors, area)) { + return true; + } + } + } + + function brushModelNotControll(brushModel, seriesIndex) { + var seriesIndices = brushModel.option.seriesIndex; + return seriesIndices != null && seriesIndices !== 'all' && (isArray(seriesIndices) ? indexOf(seriesIndices, seriesIndex) < 0 : seriesIndex !== seriesIndices); + } + + var boundingRectBuilders = { + rect: function (area) { + return getBoundingRectFromMinMax(area.range); + }, + polygon: function (area) { + var minMax; + var range = area.range; + + for (var i = 0, len = range.length; i < len; i++) { + minMax = minMax || [[Infinity, -Infinity], [Infinity, -Infinity]]; + var rg = range[i]; + rg[0] < minMax[0][0] && (minMax[0][0] = rg[0]); + rg[0] > minMax[0][1] && (minMax[0][1] = rg[0]); + rg[1] < minMax[1][0] && (minMax[1][0] = rg[1]); + rg[1] > minMax[1][1] && (minMax[1][1] = rg[1]); + } + + return minMax && getBoundingRectFromMinMax(minMax); + } + }; + + function getBoundingRectFromMinMax(minMax) { + return new BoundingRect(minMax[0][0], minMax[1][0], minMax[0][1] - minMax[0][0], minMax[1][1] - minMax[1][0]); + } + + var BrushView = + /** @class */ + function (_super) { + __extends(BrushView, _super); + + function BrushView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BrushView.type; + return _this; + } + + BrushView.prototype.init = function (ecModel, api) { + this.ecModel = ecModel; + this.api = api; + this.model; + (this._brushController = new BrushController(api.getZr())).on('brush', bind(this._onBrush, this)).mount(); + }; + + BrushView.prototype.render = function (brushModel, ecModel, api, payload) { + this.model = brushModel; + + this._updateController(brushModel, ecModel, api, payload); + }; + + BrushView.prototype.updateTransform = function (brushModel, ecModel, api, payload) { + // PENDING: `updateTransform` is a little tricky, whose layout need + // to be calculate mandatorily and other stages will not be performed. + // Take care the correctness of the logic. See #11754 . + layoutCovers(ecModel); + + this._updateController(brushModel, ecModel, api, payload); + }; + + BrushView.prototype.updateVisual = function (brushModel, ecModel, api, payload) { + this.updateTransform(brushModel, ecModel, api, payload); + }; + + BrushView.prototype.updateView = function (brushModel, ecModel, api, payload) { + this._updateController(brushModel, ecModel, api, payload); + }; + + BrushView.prototype._updateController = function (brushModel, ecModel, api, payload) { + // Do not update controller when drawing. + (!payload || payload.$from !== brushModel.id) && this._brushController.setPanels(brushModel.brushTargetManager.makePanelOpts(api)).enableBrush(brushModel.brushOption).updateCovers(brushModel.areas.slice()); + }; // updateLayout: updateController, + // updateVisual: updateController, + + + BrushView.prototype.dispose = function () { + this._brushController.dispose(); + }; + + BrushView.prototype._onBrush = function (eventParam) { + var modelId = this.model.id; + var areas = this.model.brushTargetManager.setOutputRanges(eventParam.areas, this.ecModel); // Action is not dispatched on drag end, because the drag end + // emits the same params with the last drag move event, and + // may have some delay when using touch pad, which makes + // animation not smooth (when using debounce). + + (!eventParam.isEnd || eventParam.removeOnClick) && this.api.dispatchAction({ + type: 'brush', + brushId: modelId, + areas: clone(areas), + $from: modelId + }); + eventParam.isEnd && this.api.dispatchAction({ + type: 'brushEnd', + brushId: modelId, + areas: clone(areas), + $from: modelId + }); + }; + + BrushView.type = 'brush'; + return BrushView; + }(ComponentView); + + var DEFAULT_OUT_OF_BRUSH_COLOR = '#ddd'; + + var BrushModel = + /** @class */ + function (_super) { + __extends(BrushModel, _super); + + function BrushModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BrushModel.type; + /** + * @readOnly + */ + + _this.areas = []; + /** + * Current brush painting area settings. + * @readOnly + */ + + _this.brushOption = {}; + return _this; + } + + BrushModel.prototype.optionUpdated = function (newOption, isInit) { + var thisOption = this.option; + !isInit && replaceVisualOption(thisOption, newOption, ['inBrush', 'outOfBrush']); + var inBrush = thisOption.inBrush = thisOption.inBrush || {}; // Always give default visual, consider setOption at the second time. + + thisOption.outOfBrush = thisOption.outOfBrush || { + color: DEFAULT_OUT_OF_BRUSH_COLOR + }; + + if (!inBrush.hasOwnProperty('liftZ')) { + // Bigger than the highlight z lift, otherwise it will + // be effected by the highlight z when brush. + inBrush.liftZ = 5; + } + }; + /** + * If `areas` is null/undefined, range state remain. + */ + + + BrushModel.prototype.setAreas = function (areas) { + if ("development" !== 'production') { + assert(isArray(areas)); + each(areas, function (area) { + assert(area.brushType, 'Illegal areas'); + }); + } // If areas is null/undefined, range state remain. + // This helps user to dispatchAction({type: 'brush'}) with no areas + // set but just want to get the current brush select info from a `brush` event. + + + if (!areas) { + return; + } + + this.areas = map(areas, function (area) { + return generateBrushOption(this.option, area); + }, this); + }; + /** + * Set the current painting brush option. + */ + + + BrushModel.prototype.setBrushOption = function (brushOption) { + this.brushOption = generateBrushOption(this.option, brushOption); + this.brushType = this.brushOption.brushType; + }; + + BrushModel.type = 'brush'; + BrushModel.dependencies = ['geo', 'grid', 'xAxis', 'yAxis', 'parallel', 'series']; + BrushModel.defaultOption = { + seriesIndex: 'all', + brushType: 'rect', + brushMode: 'single', + transformable: true, + brushStyle: { + borderWidth: 1, + color: 'rgba(210,219,238,0.3)', + borderColor: '#D2DBEE' + }, + throttleType: 'fixRate', + throttleDelay: 0, + removeOnClick: true, + z: 10000 + }; + return BrushModel; + }(ComponentModel); + + function generateBrushOption(option, brushOption) { + return merge({ + brushType: option.brushType, + brushMode: option.brushMode, + transformable: option.transformable, + brushStyle: new Model(option.brushStyle).getItemStyle(), + removeOnClick: option.removeOnClick, + z: option.z + }, brushOption, true); + } + + var ICON_TYPES = ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear']; + + var BrushFeature = + /** @class */ + function (_super) { + __extends(BrushFeature, _super); + + function BrushFeature() { + return _super !== null && _super.apply(this, arguments) || this; + } + + BrushFeature.prototype.render = function (featureModel, ecModel, api) { + var brushType; + var brushMode; + var isBrushed; + ecModel.eachComponent({ + mainType: 'brush' + }, function (brushModel) { + brushType = brushModel.brushType; + brushMode = brushModel.brushOption.brushMode || 'single'; + isBrushed = isBrushed || !!brushModel.areas.length; + }); + this._brushType = brushType; + this._brushMode = brushMode; + each(featureModel.get('type', true), function (type) { + featureModel.setIconStatus(type, (type === 'keep' ? brushMode === 'multiple' : type === 'clear' ? isBrushed : type === brushType) ? 'emphasis' : 'normal'); + }); + }; + + BrushFeature.prototype.updateView = function (featureModel, ecModel, api) { + this.render(featureModel, ecModel, api); + }; + + BrushFeature.prototype.getIcons = function () { + var model = this.model; + var availableIcons = model.get('icon', true); + var icons = {}; + each(model.get('type', true), function (type) { + if (availableIcons[type]) { + icons[type] = availableIcons[type]; + } + }); + return icons; + }; + + BrushFeature.prototype.onclick = function (ecModel, api, type) { + var brushType = this._brushType; + var brushMode = this._brushMode; + + if (type === 'clear') { + // Trigger parallel action firstly + api.dispatchAction({ + type: 'axisAreaSelect', + intervals: [] + }); + api.dispatchAction({ + type: 'brush', + command: 'clear', + // Clear all areas of all brush components. + areas: [] + }); + } else { + api.dispatchAction({ + type: 'takeGlobalCursor', + key: 'brush', + brushOption: { + brushType: type === 'keep' ? brushType : brushType === type ? false : type, + brushMode: type === 'keep' ? brushMode === 'multiple' ? 'single' : 'multiple' : brushMode + } + }); + } + }; + + BrushFeature.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + type: ICON_TYPES.slice(), + icon: { + /* eslint-disable */ + rect: 'M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13', + polygon: 'M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2', + lineX: 'M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4', + lineY: 'M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4', + keep: 'M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z', + clear: 'M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2' // jshint ignore:line + + /* eslint-enable */ + + }, + // `rect`, `polygon`, `lineX`, `lineY`, `keep`, `clear` + title: ecModel.getLocaleModel().get(['toolbox', 'brush', 'title']) + }; + return defaultOption; + }; + + return BrushFeature; + }(ToolboxFeature); + + function install$B(registers) { + registers.registerComponentView(BrushView); + registers.registerComponentModel(BrushModel); + registers.registerPreprocessor(brushPreprocessor); + registers.registerVisual(registers.PRIORITY.VISUAL.BRUSH, brushVisual); + registers.registerAction({ + type: 'brush', + event: 'brush', + update: 'updateVisual' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'brush', + query: payload + }, function (brushModel) { + brushModel.setAreas(payload.areas); + }); + }); + /** + * payload: { + * brushComponents: [ + * { + * brushId, + * brushIndex, + * brushName, + * series: [ + * { + * seriesId, + * seriesIndex, + * seriesName, + * rawIndices: [21, 34, ...] + * }, + * ... + * ] + * }, + * ... + * ] + * } + */ + + registers.registerAction({ + type: 'brushSelect', + event: 'brushSelected', + update: 'none' + }, noop); + registers.registerAction({ + type: 'brushEnd', + event: 'brushEnd', + update: 'none' + }, noop); + registerFeature('brush', BrushFeature); + } + + var TitleModel = + /** @class */ + function (_super) { + __extends(TitleModel, _super); + + function TitleModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TitleModel.type; + _this.layoutMode = { + type: 'box', + ignoreSize: true + }; + return _this; + } + + TitleModel.type = 'title'; + TitleModel.defaultOption = { + // zlevel: 0, + z: 6, + show: true, + text: '', + target: 'blank', + subtext: '', + subtarget: 'blank', + left: 0, + top: 0, + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', + borderWidth: 0, + padding: 5, + itemGap: 10, + textStyle: { + fontSize: 18, + fontWeight: 'bold', + color: '#464646' + }, + subtextStyle: { + fontSize: 12, + color: '#6E7079' + } + }; + return TitleModel; + }(ComponentModel); // View + + + var TitleView = + /** @class */ + function (_super) { + __extends(TitleView, _super); + + function TitleView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TitleView.type; + return _this; + } + + TitleView.prototype.render = function (titleModel, ecModel, api) { + this.group.removeAll(); + + if (!titleModel.get('show')) { + return; + } + + var group = this.group; + var textStyleModel = titleModel.getModel('textStyle'); + var subtextStyleModel = titleModel.getModel('subtextStyle'); + var textAlign = titleModel.get('textAlign'); + var textVerticalAlign = retrieve2(titleModel.get('textBaseline'), titleModel.get('textVerticalAlign')); + var textEl = new ZRText({ + style: createTextStyle(textStyleModel, { + text: titleModel.get('text'), + fill: textStyleModel.getTextColor() + }, { + disableBox: true + }), + z2: 10 + }); + var textRect = textEl.getBoundingRect(); + var subText = titleModel.get('subtext'); + var subTextEl = new ZRText({ + style: createTextStyle(subtextStyleModel, { + text: subText, + fill: subtextStyleModel.getTextColor(), + y: textRect.height + titleModel.get('itemGap'), + verticalAlign: 'top' + }, { + disableBox: true + }), + z2: 10 + }); + var link = titleModel.get('link'); + var sublink = titleModel.get('sublink'); + var triggerEvent = titleModel.get('triggerEvent', true); + textEl.silent = !link && !triggerEvent; + subTextEl.silent = !sublink && !triggerEvent; + + if (link) { + textEl.on('click', function () { + windowOpen(link, '_' + titleModel.get('target')); + }); + } + + if (sublink) { + subTextEl.on('click', function () { + windowOpen(sublink, '_' + titleModel.get('subtarget')); + }); + } + + getECData(textEl).eventData = getECData(subTextEl).eventData = triggerEvent ? { + componentType: 'title', + componentIndex: titleModel.componentIndex + } : null; + group.add(textEl); + subText && group.add(subTextEl); // If no subText, but add subTextEl, there will be an empty line. + + var groupRect = group.getBoundingRect(); + var layoutOption = titleModel.getBoxLayoutParams(); + layoutOption.width = groupRect.width; + layoutOption.height = groupRect.height; + var layoutRect = getLayoutRect(layoutOption, { + width: api.getWidth(), + height: api.getHeight() + }, titleModel.get('padding')); // Adjust text align based on position + + if (!textAlign) { + // Align left if title is on the left. center and right is same + textAlign = titleModel.get('left') || titleModel.get('right'); // @ts-ignore + + if (textAlign === 'middle') { + textAlign = 'center'; + } // Adjust layout by text align + + + if (textAlign === 'right') { + layoutRect.x += layoutRect.width; + } else if (textAlign === 'center') { + layoutRect.x += layoutRect.width / 2; + } + } + + if (!textVerticalAlign) { + textVerticalAlign = titleModel.get('top') || titleModel.get('bottom'); // @ts-ignore + + if (textVerticalAlign === 'center') { + textVerticalAlign = 'middle'; + } + + if (textVerticalAlign === 'bottom') { + layoutRect.y += layoutRect.height; + } else if (textVerticalAlign === 'middle') { + layoutRect.y += layoutRect.height / 2; + } + + textVerticalAlign = textVerticalAlign || 'top'; + } + + group.x = layoutRect.x; + group.y = layoutRect.y; + group.markRedraw(); + var alignStyle = { + align: textAlign, + verticalAlign: textVerticalAlign + }; + textEl.setStyle(alignStyle); + subTextEl.setStyle(alignStyle); // Render background + // Get groupRect again because textAlign has been changed + + groupRect = group.getBoundingRect(); + var padding = layoutRect.margin; + var style = titleModel.getItemStyle(['color', 'opacity']); + style.fill = titleModel.get('backgroundColor'); + var rect = new Rect({ + shape: { + x: groupRect.x - padding[3], + y: groupRect.y - padding[0], + width: groupRect.width + padding[1] + padding[3], + height: groupRect.height + padding[0] + padding[2], + r: titleModel.get('borderRadius') + }, + style: style, + subPixelOptimize: true, + silent: true + }); + group.add(rect); + }; + + TitleView.type = 'title'; + return TitleView; + }(ComponentView); + + function install$C(registers) { + registers.registerComponentModel(TitleModel); + registers.registerComponentView(TitleView); + } + + var TimelineModel = + /** @class */ + function (_super) { + __extends(TimelineModel, _super); + + function TimelineModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TimelineModel.type; + _this.layoutMode = 'box'; + return _this; + } + /** + * @override + */ + + + TimelineModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + + this._initData(); + }; + /** + * @override + */ + + + TimelineModel.prototype.mergeOption = function (option) { + _super.prototype.mergeOption.apply(this, arguments); + + this._initData(); + }; + + TimelineModel.prototype.setCurrentIndex = function (currentIndex) { + if (currentIndex == null) { + currentIndex = this.option.currentIndex; + } + + var count = this._data.count(); + + if (this.option.loop) { + currentIndex = (currentIndex % count + count) % count; + } else { + currentIndex >= count && (currentIndex = count - 1); + currentIndex < 0 && (currentIndex = 0); + } + + this.option.currentIndex = currentIndex; + }; + /** + * @return {number} currentIndex + */ + + + TimelineModel.prototype.getCurrentIndex = function () { + return this.option.currentIndex; + }; + /** + * @return {boolean} + */ + + + TimelineModel.prototype.isIndexMax = function () { + return this.getCurrentIndex() >= this._data.count() - 1; + }; + /** + * @param {boolean} state true: play, false: stop + */ + + + TimelineModel.prototype.setPlayState = function (state) { + this.option.autoPlay = !!state; + }; + /** + * @return {boolean} true: play, false: stop + */ + + + TimelineModel.prototype.getPlayState = function () { + return !!this.option.autoPlay; + }; + /** + * @private + */ + + + TimelineModel.prototype._initData = function () { + var thisOption = this.option; + var dataArr = thisOption.data || []; + var axisType = thisOption.axisType; + var names = this._names = []; + var processedDataArr; + + if (axisType === 'category') { + processedDataArr = []; + each(dataArr, function (item, index) { + var value = convertOptionIdName(getDataItemValue(item), ''); + var newItem; + + if (isObject(item)) { + newItem = clone(item); + newItem.value = index; + } else { + newItem = index; + } + + processedDataArr.push(newItem); + names.push(value); + }); + } else { + processedDataArr = dataArr; + } + + var dimType = { + category: 'ordinal', + time: 'time', + value: 'number' + }[axisType] || 'number'; + var data = this._data = new SeriesData([{ + name: 'value', + type: dimType + }], this); + data.initData(processedDataArr, names); + }; + + TimelineModel.prototype.getData = function () { + return this._data; + }; + /** + * @public + * @return {Array.<string>} categoreis + */ + + + TimelineModel.prototype.getCategories = function () { + if (this.get('axisType') === 'category') { + return this._names.slice(); + } + }; + + TimelineModel.type = 'timeline'; + /** + * @protected + */ + + TimelineModel.defaultOption = { + // zlevel: 0, // 一级层叠 + z: 4, + show: true, + axisType: 'time', + realtime: true, + left: '20%', + top: null, + right: '20%', + bottom: 0, + width: null, + height: 40, + padding: 5, + controlPosition: 'left', + autoPlay: false, + rewind: false, + loop: true, + playInterval: 2000, + currentIndex: 0, + itemStyle: {}, + label: { + color: '#000' + }, + data: [] + }; + return TimelineModel; + }(ComponentModel); + + var SliderTimelineModel = + /** @class */ + function (_super) { + __extends(SliderTimelineModel, _super); + + function SliderTimelineModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SliderTimelineModel.type; + return _this; + } + + SliderTimelineModel.type = 'timeline.slider'; + /** + * @protected + */ + + SliderTimelineModel.defaultOption = inheritDefaultOption(TimelineModel.defaultOption, { + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', + borderWidth: 0, + orient: 'horizontal', + inverse: false, + tooltip: { + trigger: 'item' // data item may also have tootip attr. + + }, + symbol: 'circle', + symbolSize: 12, + lineStyle: { + show: true, + width: 2, + color: '#DAE1F5' + }, + label: { + position: 'auto', + // When using number, label position is not + // restricted by viewRect. + // positive: right/bottom, negative: left/top + show: true, + interval: 'auto', + rotate: 0, + // formatter: null, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#A4B1D7' + }, + itemStyle: { + color: '#A4B1D7', + borderWidth: 1 + }, + checkpointStyle: { + symbol: 'circle', + symbolSize: 15, + color: '#316bf3', + borderColor: '#fff', + borderWidth: 2, + shadowBlur: 2, + shadowOffsetX: 1, + shadowOffsetY: 1, + shadowColor: 'rgba(0, 0, 0, 0.3)', + // borderColor: 'rgba(194,53,49, 0.5)', + animation: true, + animationDuration: 300, + animationEasing: 'quinticInOut' + }, + controlStyle: { + show: true, + showPlayBtn: true, + showPrevBtn: true, + showNextBtn: true, + itemSize: 24, + itemGap: 12, + position: 'left', + playIcon: 'path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z', + stopIcon: 'path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z', + // eslint-disable-next-line max-len + nextIcon: 'M2,18.5A1.52,1.52,0,0,1,.92,18a1.49,1.49,0,0,1,0-2.12L7.81,9.36,1,3.11A1.5,1.5,0,1,1,3,.89l8,7.34a1.48,1.48,0,0,1,.49,1.09,1.51,1.51,0,0,1-.46,1.1L3,18.08A1.5,1.5,0,0,1,2,18.5Z', + // eslint-disable-next-line max-len + prevIcon: 'M10,.5A1.52,1.52,0,0,1,11.08,1a1.49,1.49,0,0,1,0,2.12L4.19,9.64,11,15.89a1.5,1.5,0,1,1-2,2.22L1,10.77A1.48,1.48,0,0,1,.5,9.68,1.51,1.51,0,0,1,1,8.58L9,.92A1.5,1.5,0,0,1,10,.5Z', + prevBtnSize: 18, + nextBtnSize: 18, + color: '#A4B1D7', + borderColor: '#A4B1D7', + borderWidth: 1 + }, + emphasis: { + label: { + show: true, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#6f778d' + }, + itemStyle: { + color: '#316BF3' + }, + controlStyle: { + color: '#316BF3', + borderColor: '#316BF3', + borderWidth: 2 + } + }, + progress: { + lineStyle: { + color: '#316BF3' + }, + itemStyle: { + color: '#316BF3' + }, + label: { + color: '#6f778d' + } + }, + data: [] + }); + return SliderTimelineModel; + }(TimelineModel); + + mixin(SliderTimelineModel, DataFormatMixin.prototype); + + var TimelineView = + /** @class */ + function (_super) { + __extends(TimelineView, _super); + + function TimelineView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TimelineView.type; + return _this; + } + + TimelineView.type = 'timeline'; + return TimelineView; + }(ComponentView); + + /** + * Extend axis 2d + */ + + var TimelineAxis = + /** @class */ + function (_super) { + __extends(TimelineAxis, _super); + + function TimelineAxis(dim, scale, coordExtent, axisType) { + var _this = _super.call(this, dim, scale, coordExtent) || this; + + _this.type = axisType || 'value'; + return _this; + } + /** + * @override + */ + + + TimelineAxis.prototype.getLabelModel = function () { + // Force override + return this.model.getModel('label'); + }; + /** + * @override + */ + + + TimelineAxis.prototype.isHorizontal = function () { + return this.model.get('orient') === 'horizontal'; + }; + + return TimelineAxis; + }(Axis); + + var PI$8 = Math.PI; + var labelDataIndexStore = makeInner(); + + var SliderTimelineView = + /** @class */ + function (_super) { + __extends(SliderTimelineView, _super); + + function SliderTimelineView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SliderTimelineView.type; + return _this; + } + + SliderTimelineView.prototype.init = function (ecModel, api) { + this.api = api; + }; + /** + * @override + */ + + + SliderTimelineView.prototype.render = function (timelineModel, ecModel, api) { + this.model = timelineModel; + this.api = api; + this.ecModel = ecModel; + this.group.removeAll(); + + if (timelineModel.get('show', true)) { + var layoutInfo_1 = this._layout(timelineModel, api); + + var mainGroup_1 = this._createGroup('_mainGroup'); + + var labelGroup = this._createGroup('_labelGroup'); + + var axis_1 = this._axis = this._createAxis(layoutInfo_1, timelineModel); + + timelineModel.formatTooltip = function (dataIndex) { + var name = axis_1.scale.getLabel({ + value: dataIndex + }); + return createTooltipMarkup('nameValue', { + noName: true, + value: name + }); + }; + + each(['AxisLine', 'AxisTick', 'Control', 'CurrentPointer'], function (name) { + this['_render' + name](layoutInfo_1, mainGroup_1, axis_1, timelineModel); + }, this); + + this._renderAxisLabel(layoutInfo_1, labelGroup, axis_1, timelineModel); + + this._position(layoutInfo_1, timelineModel); + } + + this._doPlayStop(); + + this._updateTicksStatus(); + }; + /** + * @override + */ + + + SliderTimelineView.prototype.remove = function () { + this._clearTimer(); + + this.group.removeAll(); + }; + /** + * @override + */ + + + SliderTimelineView.prototype.dispose = function () { + this._clearTimer(); + }; + + SliderTimelineView.prototype._layout = function (timelineModel, api) { + var labelPosOpt = timelineModel.get(['label', 'position']); + var orient = timelineModel.get('orient'); + var viewRect = getViewRect$5(timelineModel, api); + var parsedLabelPos; // Auto label offset. + + if (labelPosOpt == null || labelPosOpt === 'auto') { + parsedLabelPos = orient === 'horizontal' ? viewRect.y + viewRect.height / 2 < api.getHeight() / 2 ? '-' : '+' : viewRect.x + viewRect.width / 2 < api.getWidth() / 2 ? '+' : '-'; + } else if (isString(labelPosOpt)) { + parsedLabelPos = { + horizontal: { + top: '-', + bottom: '+' + }, + vertical: { + left: '-', + right: '+' + } + }[orient][labelPosOpt]; + } else { + // is number + parsedLabelPos = labelPosOpt; + } + + var labelAlignMap = { + horizontal: 'center', + vertical: parsedLabelPos >= 0 || parsedLabelPos === '+' ? 'left' : 'right' + }; + var labelBaselineMap = { + horizontal: parsedLabelPos >= 0 || parsedLabelPos === '+' ? 'top' : 'bottom', + vertical: 'middle' + }; + var rotationMap = { + horizontal: 0, + vertical: PI$8 / 2 + }; // Position + + var mainLength = orient === 'vertical' ? viewRect.height : viewRect.width; + var controlModel = timelineModel.getModel('controlStyle'); + var showControl = controlModel.get('show', true); + var controlSize = showControl ? controlModel.get('itemSize') : 0; + var controlGap = showControl ? controlModel.get('itemGap') : 0; + var sizePlusGap = controlSize + controlGap; // Special label rotate. + + var labelRotation = timelineModel.get(['label', 'rotate']) || 0; + labelRotation = labelRotation * PI$8 / 180; // To radian. + + var playPosition; + var prevBtnPosition; + var nextBtnPosition; + var controlPosition = controlModel.get('position', true); + var showPlayBtn = showControl && controlModel.get('showPlayBtn', true); + var showPrevBtn = showControl && controlModel.get('showPrevBtn', true); + var showNextBtn = showControl && controlModel.get('showNextBtn', true); + var xLeft = 0; + var xRight = mainLength; // position[0] means left, position[1] means middle. + + if (controlPosition === 'left' || controlPosition === 'bottom') { + showPlayBtn && (playPosition = [0, 0], xLeft += sizePlusGap); + showPrevBtn && (prevBtnPosition = [xLeft, 0], xLeft += sizePlusGap); + showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); + } else { + // 'top' 'right' + showPlayBtn && (playPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); + showPrevBtn && (prevBtnPosition = [0, 0], xLeft += sizePlusGap); + showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); + } + + var axisExtent = [xLeft, xRight]; + + if (timelineModel.get('inverse')) { + axisExtent.reverse(); + } + + return { + viewRect: viewRect, + mainLength: mainLength, + orient: orient, + rotation: rotationMap[orient], + labelRotation: labelRotation, + labelPosOpt: parsedLabelPos, + labelAlign: timelineModel.get(['label', 'align']) || labelAlignMap[orient], + labelBaseline: timelineModel.get(['label', 'verticalAlign']) || timelineModel.get(['label', 'baseline']) || labelBaselineMap[orient], + // Based on mainGroup. + playPosition: playPosition, + prevBtnPosition: prevBtnPosition, + nextBtnPosition: nextBtnPosition, + axisExtent: axisExtent, + controlSize: controlSize, + controlGap: controlGap + }; + }; + + SliderTimelineView.prototype._position = function (layoutInfo, timelineModel) { + // Position is be called finally, because bounding rect is needed for + // adapt content to fill viewRect (auto adapt offset). + // Timeline may be not all in the viewRect when 'offset' is specified + // as a number, because it is more appropriate that label aligns at + // 'offset' but not the other edge defined by viewRect. + var mainGroup = this._mainGroup; + var labelGroup = this._labelGroup; + var viewRect = layoutInfo.viewRect; + + if (layoutInfo.orient === 'vertical') { + // transform to horizontal, inverse rotate by left-top point. + var m = create$1(); + var rotateOriginX = viewRect.x; + var rotateOriginY = viewRect.y + viewRect.height; + translate(m, m, [-rotateOriginX, -rotateOriginY]); + rotate(m, m, -PI$8 / 2); + translate(m, m, [rotateOriginX, rotateOriginY]); + viewRect = viewRect.clone(); + viewRect.applyTransform(m); + } + + var viewBound = getBound(viewRect); + var mainBound = getBound(mainGroup.getBoundingRect()); + var labelBound = getBound(labelGroup.getBoundingRect()); + var mainPosition = [mainGroup.x, mainGroup.y]; + var labelsPosition = [labelGroup.x, labelGroup.y]; + labelsPosition[0] = mainPosition[0] = viewBound[0][0]; + var labelPosOpt = layoutInfo.labelPosOpt; + + if (labelPosOpt == null || isString(labelPosOpt)) { + // '+' or '-' + var mainBoundIdx = labelPosOpt === '+' ? 0 : 1; + toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx); + toBound(labelsPosition, labelBound, viewBound, 1, 1 - mainBoundIdx); + } else { + var mainBoundIdx = labelPosOpt >= 0 ? 0 : 1; + toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx); + labelsPosition[1] = mainPosition[1] + labelPosOpt; + } + + mainGroup.setPosition(mainPosition); + labelGroup.setPosition(labelsPosition); + mainGroup.rotation = labelGroup.rotation = layoutInfo.rotation; + setOrigin(mainGroup); + setOrigin(labelGroup); + + function setOrigin(targetGroup) { + targetGroup.originX = viewBound[0][0] - targetGroup.x; + targetGroup.originY = viewBound[1][0] - targetGroup.y; + } + + function getBound(rect) { + // [[xmin, xmax], [ymin, ymax]] + return [[rect.x, rect.x + rect.width], [rect.y, rect.y + rect.height]]; + } + + function toBound(fromPos, from, to, dimIdx, boundIdx) { + fromPos[dimIdx] += to[dimIdx][boundIdx] - from[dimIdx][boundIdx]; + } + }; + + SliderTimelineView.prototype._createAxis = function (layoutInfo, timelineModel) { + var data = timelineModel.getData(); + var axisType = timelineModel.get('axisType'); + var scale = createScaleByModel$1(timelineModel, axisType); // Customize scale. The `tickValue` is `dataIndex`. + + scale.getTicks = function () { + return data.mapArray(['value'], function (value) { + return { + value: value + }; + }); + }; + + var dataExtent = data.getDataExtent('value'); + scale.setExtent(dataExtent[0], dataExtent[1]); + scale.calcNiceTicks(); + var axis = new TimelineAxis('value', scale, layoutInfo.axisExtent, axisType); + axis.model = timelineModel; + return axis; + }; + + SliderTimelineView.prototype._createGroup = function (key) { + var newGroup = this[key] = new Group(); + this.group.add(newGroup); + return newGroup; + }; + + SliderTimelineView.prototype._renderAxisLine = function (layoutInfo, group, axis, timelineModel) { + var axisExtent = axis.getExtent(); + + if (!timelineModel.get(['lineStyle', 'show'])) { + return; + } + + var line = new Line({ + shape: { + x1: axisExtent[0], + y1: 0, + x2: axisExtent[1], + y2: 0 + }, + style: extend({ + lineCap: 'round' + }, timelineModel.getModel('lineStyle').getLineStyle()), + silent: true, + z2: 1 + }); + group.add(line); + var progressLine = this._progressLine = new Line({ + shape: { + x1: axisExtent[0], + x2: this._currentPointer ? this._currentPointer.x : axisExtent[0], + y1: 0, + y2: 0 + }, + style: defaults({ + lineCap: 'round', + lineWidth: line.style.lineWidth + }, timelineModel.getModel(['progress', 'lineStyle']).getLineStyle()), + silent: true, + z2: 1 + }); + group.add(progressLine); + }; + + SliderTimelineView.prototype._renderAxisTick = function (layoutInfo, group, axis, timelineModel) { + var _this = this; + + var data = timelineModel.getData(); // Show all ticks, despite ignoring strategy. + + var ticks = axis.scale.getTicks(); + this._tickSymbols = []; // The value is dataIndex, see the costomized scale. + + each(ticks, function (tick) { + var tickCoord = axis.dataToCoord(tick.value); + var itemModel = data.getItemModel(tick.value); + var itemStyleModel = itemModel.getModel('itemStyle'); + var hoverStyleModel = itemModel.getModel(['emphasis', 'itemStyle']); + var progressStyleModel = itemModel.getModel(['progress', 'itemStyle']); + var symbolOpt = { + x: tickCoord, + y: 0, + onclick: bind(_this._changeTimeline, _this, tick.value) + }; + var el = giveSymbol(itemModel, itemStyleModel, group, symbolOpt); + el.ensureState('emphasis').style = hoverStyleModel.getItemStyle(); + el.ensureState('progress').style = progressStyleModel.getItemStyle(); + enableHoverEmphasis(el); + var ecData = getECData(el); + + if (itemModel.get('tooltip')) { + ecData.dataIndex = tick.value; + ecData.dataModel = timelineModel; + } else { + ecData.dataIndex = ecData.dataModel = null; + } + + _this._tickSymbols.push(el); + }); + }; + + SliderTimelineView.prototype._renderAxisLabel = function (layoutInfo, group, axis, timelineModel) { + var _this = this; + + var labelModel = axis.getLabelModel(); + + if (!labelModel.get('show')) { + return; + } + + var data = timelineModel.getData(); + var labels = axis.getViewLabels(); + this._tickLabels = []; + each(labels, function (labelItem) { + // The tickValue is dataIndex, see the costomized scale. + var dataIndex = labelItem.tickValue; + var itemModel = data.getItemModel(dataIndex); + var normalLabelModel = itemModel.getModel('label'); + var hoverLabelModel = itemModel.getModel(['emphasis', 'label']); + var progressLabelModel = itemModel.getModel(['progress', 'label']); + var tickCoord = axis.dataToCoord(labelItem.tickValue); + var textEl = new ZRText({ + x: tickCoord, + y: 0, + rotation: layoutInfo.labelRotation - layoutInfo.rotation, + onclick: bind(_this._changeTimeline, _this, dataIndex), + silent: false, + style: createTextStyle(normalLabelModel, { + text: labelItem.formattedLabel, + align: layoutInfo.labelAlign, + verticalAlign: layoutInfo.labelBaseline + }) + }); + textEl.ensureState('emphasis').style = createTextStyle(hoverLabelModel); + textEl.ensureState('progress').style = createTextStyle(progressLabelModel); + group.add(textEl); + enableHoverEmphasis(textEl); + labelDataIndexStore(textEl).dataIndex = dataIndex; + + _this._tickLabels.push(textEl); + }); + }; + + SliderTimelineView.prototype._renderControl = function (layoutInfo, group, axis, timelineModel) { + var controlSize = layoutInfo.controlSize; + var rotation = layoutInfo.rotation; + var itemStyle = timelineModel.getModel('controlStyle').getItemStyle(); + var hoverStyle = timelineModel.getModel(['emphasis', 'controlStyle']).getItemStyle(); + var playState = timelineModel.getPlayState(); + var inverse = timelineModel.get('inverse', true); + makeBtn(layoutInfo.nextBtnPosition, 'next', bind(this._changeTimeline, this, inverse ? '-' : '+')); + makeBtn(layoutInfo.prevBtnPosition, 'prev', bind(this._changeTimeline, this, inverse ? '+' : '-')); + makeBtn(layoutInfo.playPosition, playState ? 'stop' : 'play', bind(this._handlePlayClick, this, !playState), true); + + function makeBtn(position, iconName, onclick, willRotate) { + if (!position) { + return; + } + + var iconSize = parsePercent(retrieve2(timelineModel.get(['controlStyle', iconName + 'BtnSize']), controlSize), controlSize); + var rect = [0, -iconSize / 2, iconSize, iconSize]; + var btn = makeControlIcon(timelineModel, iconName + 'Icon', rect, { + x: position[0], + y: position[1], + originX: controlSize / 2, + originY: 0, + rotation: willRotate ? -rotation : 0, + rectHover: true, + style: itemStyle, + onclick: onclick + }); + btn.ensureState('emphasis').style = hoverStyle; + group.add(btn); + enableHoverEmphasis(btn); + } + }; + + SliderTimelineView.prototype._renderCurrentPointer = function (layoutInfo, group, axis, timelineModel) { + var data = timelineModel.getData(); + var currentIndex = timelineModel.getCurrentIndex(); + var pointerModel = data.getItemModel(currentIndex).getModel('checkpointStyle'); + var me = this; + var callback = { + onCreate: function (pointer) { + pointer.draggable = true; + pointer.drift = bind(me._handlePointerDrag, me); + pointer.ondragend = bind(me._handlePointerDragend, me); + pointerMoveTo(pointer, me._progressLine, currentIndex, axis, timelineModel, true); + }, + onUpdate: function (pointer) { + pointerMoveTo(pointer, me._progressLine, currentIndex, axis, timelineModel); + } + }; // Reuse when exists, for animation and drag. + + this._currentPointer = giveSymbol(pointerModel, pointerModel, this._mainGroup, {}, this._currentPointer, callback); + }; + + SliderTimelineView.prototype._handlePlayClick = function (nextState) { + this._clearTimer(); + + this.api.dispatchAction({ + type: 'timelinePlayChange', + playState: nextState, + from: this.uid + }); + }; + + SliderTimelineView.prototype._handlePointerDrag = function (dx, dy, e) { + this._clearTimer(); + + this._pointerChangeTimeline([e.offsetX, e.offsetY]); + }; + + SliderTimelineView.prototype._handlePointerDragend = function (e) { + this._pointerChangeTimeline([e.offsetX, e.offsetY], true); + }; + + SliderTimelineView.prototype._pointerChangeTimeline = function (mousePos, trigger) { + var toCoord = this._toAxisCoord(mousePos)[0]; + + var axis = this._axis; + var axisExtent = asc(axis.getExtent().slice()); + toCoord > axisExtent[1] && (toCoord = axisExtent[1]); + toCoord < axisExtent[0] && (toCoord = axisExtent[0]); + this._currentPointer.x = toCoord; + + this._currentPointer.markRedraw(); + + this._progressLine.shape.x2 = toCoord; + + this._progressLine.dirty(); + + var targetDataIndex = this._findNearestTick(toCoord); + + var timelineModel = this.model; + + if (trigger || targetDataIndex !== timelineModel.getCurrentIndex() && timelineModel.get('realtime')) { + this._changeTimeline(targetDataIndex); + } + }; + + SliderTimelineView.prototype._doPlayStop = function () { + var _this = this; + + this._clearTimer(); + + if (this.model.getPlayState()) { + this._timer = setTimeout(function () { + // Do not cache + var timelineModel = _this.model; + + _this._changeTimeline(timelineModel.getCurrentIndex() + (timelineModel.get('rewind', true) ? -1 : 1)); + }, this.model.get('playInterval')); + } + }; + + SliderTimelineView.prototype._toAxisCoord = function (vertex) { + var trans = this._mainGroup.getLocalTransform(); + + return applyTransform$1(vertex, trans, true); + }; + + SliderTimelineView.prototype._findNearestTick = function (axisCoord) { + var data = this.model.getData(); + var dist = Infinity; + var targetDataIndex; + var axis = this._axis; + data.each(['value'], function (value, dataIndex) { + var coord = axis.dataToCoord(value); + var d = Math.abs(coord - axisCoord); + + if (d < dist) { + dist = d; + targetDataIndex = dataIndex; + } + }); + return targetDataIndex; + }; + + SliderTimelineView.prototype._clearTimer = function () { + if (this._timer) { + clearTimeout(this._timer); + this._timer = null; + } + }; + + SliderTimelineView.prototype._changeTimeline = function (nextIndex) { + var currentIndex = this.model.getCurrentIndex(); + + if (nextIndex === '+') { + nextIndex = currentIndex + 1; + } else if (nextIndex === '-') { + nextIndex = currentIndex - 1; + } + + this.api.dispatchAction({ + type: 'timelineChange', + currentIndex: nextIndex, + from: this.uid + }); + }; + + SliderTimelineView.prototype._updateTicksStatus = function () { + var currentIndex = this.model.getCurrentIndex(); + var tickSymbols = this._tickSymbols; + var tickLabels = this._tickLabels; + + if (tickSymbols) { + for (var i = 0; i < tickSymbols.length; i++) { + tickSymbols && tickSymbols[i] && tickSymbols[i].toggleState('progress', i < currentIndex); + } + } + + if (tickLabels) { + for (var i = 0; i < tickLabels.length; i++) { + tickLabels && tickLabels[i] && tickLabels[i].toggleState('progress', labelDataIndexStore(tickLabels[i]).dataIndex <= currentIndex); + } + } + }; + + SliderTimelineView.type = 'timeline.slider'; + return SliderTimelineView; + }(TimelineView); + + function createScaleByModel$1(model, axisType) { + axisType = axisType || model.get('type'); + + if (axisType) { + switch (axisType) { + // Buildin scale + case 'category': + return new OrdinalScale({ + ordinalMeta: model.getCategories(), + extent: [Infinity, -Infinity] + }); + + case 'time': + return new TimeScale({ + locale: model.ecModel.getLocaleModel(), + useUTC: model.ecModel.get('useUTC') + }); + + default: + // default to be value + return new IntervalScale(); + } + } + } + + function getViewRect$5(model, api) { + return getLayoutRect(model.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }, model.get('padding')); + } + + function makeControlIcon(timelineModel, objPath, rect, opts) { + var style = opts.style; + var icon = createIcon(timelineModel.get(['controlStyle', objPath]), opts || {}, new BoundingRect(rect[0], rect[1], rect[2], rect[3])); // TODO createIcon won't use style in opt. + + if (style) { + icon.setStyle(style); + } + + return icon; + } + /** + * Create symbol or update symbol + * opt: basic position and event handlers + */ + + + function giveSymbol(hostModel, itemStyleModel, group, opt, symbol, callback) { + var color = itemStyleModel.get('color'); + + if (!symbol) { + var symbolType = hostModel.get('symbol'); + symbol = createSymbol(symbolType, -1, -1, 2, 2, color); + symbol.setStyle('strokeNoScale', true); + group.add(symbol); + callback && callback.onCreate(symbol); + } else { + symbol.setColor(color); + group.add(symbol); // Group may be new, also need to add. + + callback && callback.onUpdate(symbol); + } // Style + + + var itemStyle = itemStyleModel.getItemStyle(['color']); + symbol.setStyle(itemStyle); // Transform and events. + + opt = merge({ + rectHover: true, + z2: 100 + }, opt, true); + var symbolSize = normalizeSymbolSize(hostModel.get('symbolSize')); + opt.scaleX = symbolSize[0] / 2; + opt.scaleY = symbolSize[1] / 2; + var symbolOffset = normalizeSymbolOffset(hostModel.get('symbolOffset'), symbolSize); + + if (symbolOffset) { + opt.x = (opt.x || 0) + symbolOffset[0]; + opt.y = (opt.y || 0) + symbolOffset[1]; + } + + var symbolRotate = hostModel.get('symbolRotate'); + opt.rotation = (symbolRotate || 0) * Math.PI / 180 || 0; + symbol.attr(opt); // FIXME + // (1) When symbol.style.strokeNoScale is true and updateTransform is not performed, + // getBoundingRect will return wrong result. + // (This is supposed to be resolved in zrender, but it is a little difficult to + // leverage performance and auto updateTransform) + // (2) All of ancesters of symbol do not scale, so we can just updateTransform symbol. + + symbol.updateTransform(); + return symbol; + } + + function pointerMoveTo(pointer, progressLine, dataIndex, axis, timelineModel, noAnimation) { + if (pointer.dragging) { + return; + } + + var pointerModel = timelineModel.getModel('checkpointStyle'); + var toCoord = axis.dataToCoord(timelineModel.getData().get('value', dataIndex)); + + if (noAnimation || !pointerModel.get('animation', true)) { + pointer.attr({ + x: toCoord, + y: 0 + }); + progressLine && progressLine.attr({ + shape: { + x2: toCoord + } + }); + } else { + var animationCfg = { + duration: pointerModel.get('animationDuration', true), + easing: pointerModel.get('animationEasing', true) + }; + pointer.stopAnimation(null, true); + pointer.animateTo({ + x: toCoord, + y: 0 + }, animationCfg); + progressLine && progressLine.animateTo({ + shape: { + x2: toCoord + } + }, animationCfg); + } + } + + function installTimelineAction(registers) { + registers.registerAction({ + type: 'timelineChange', + event: 'timelineChanged', + update: 'prepareAndUpdate' + }, function (payload, ecModel, api) { + var timelineModel = ecModel.getComponent('timeline'); + + if (timelineModel && payload.currentIndex != null) { + timelineModel.setCurrentIndex(payload.currentIndex); + + if (!timelineModel.get('loop', true) && timelineModel.isIndexMax() && timelineModel.getPlayState()) { + timelineModel.setPlayState(false); // The timeline has played to the end, trigger event + + api.dispatchAction({ + type: 'timelinePlayChange', + playState: false, + from: payload.from + }); + } + } // Set normalized currentIndex to payload. + + + ecModel.resetOption('timeline', { + replaceMerge: timelineModel.get('replaceMerge', true) + }); + return defaults({ + currentIndex: timelineModel.option.currentIndex + }, payload); + }); + registers.registerAction({ + type: 'timelinePlayChange', + event: 'timelinePlayChanged', + update: 'update' + }, function (payload, ecModel) { + var timelineModel = ecModel.getComponent('timeline'); + + if (timelineModel && payload.playState != null) { + timelineModel.setPlayState(payload.playState); + } + }); + } + + function timelinePreprocessor(option) { + var timelineOpt = option && option.timeline; + + if (!isArray(timelineOpt)) { + timelineOpt = timelineOpt ? [timelineOpt] : []; + } + + each(timelineOpt, function (opt) { + if (!opt) { + return; + } + + compatibleEC2(opt); + }); + } + + function compatibleEC2(opt) { + var type = opt.type; + var ec2Types = { + 'number': 'value', + 'time': 'time' + }; // Compatible with ec2 + + if (ec2Types[type]) { + opt.axisType = ec2Types[type]; + delete opt.type; + } + + transferItem(opt); + + if (has(opt, 'controlPosition')) { + var controlStyle = opt.controlStyle || (opt.controlStyle = {}); + + if (!has(controlStyle, 'position')) { + controlStyle.position = opt.controlPosition; + } + + if (controlStyle.position === 'none' && !has(controlStyle, 'show')) { + controlStyle.show = false; + delete controlStyle.position; + } + + delete opt.controlPosition; + } + + each(opt.data || [], function (dataItem) { + if (isObject(dataItem) && !isArray(dataItem)) { + if (!has(dataItem, 'value') && has(dataItem, 'name')) { + // In ec2, using name as value. + dataItem.value = dataItem.name; + } + + transferItem(dataItem); + } + }); + } + + function transferItem(opt) { + var itemStyle = opt.itemStyle || (opt.itemStyle = {}); + var itemStyleEmphasis = itemStyle.emphasis || (itemStyle.emphasis = {}); // Transfer label out + + var label = opt.label || opt.label || {}; + var labelNormal = label.normal || (label.normal = {}); + var excludeLabelAttr = { + normal: 1, + emphasis: 1 + }; + each(label, function (value, name) { + if (!excludeLabelAttr[name] && !has(labelNormal, name)) { + labelNormal[name] = value; + } + }); + + if (itemStyleEmphasis.label && !has(label, 'emphasis')) { + label.emphasis = itemStyleEmphasis.label; + delete itemStyleEmphasis.label; + } + } + + function has(obj, attr) { + return obj.hasOwnProperty(attr); + } + + function install$D(registers) { + registers.registerComponentModel(SliderTimelineModel); + registers.registerComponentView(SliderTimelineView); + registers.registerSubTypeDefaulter('timeline', function () { + // Only slider now. + return 'slider'; + }); + installTimelineAction(registers); + registers.registerPreprocessor(timelinePreprocessor); + } + + function checkMarkerInSeries(seriesOpts, markerType) { + if (!seriesOpts) { + return false; + } + + var seriesOptArr = isArray(seriesOpts) ? seriesOpts : [seriesOpts]; + + for (var idx = 0; idx < seriesOptArr.length; idx++) { + if (seriesOptArr[idx] && seriesOptArr[idx][markerType]) { + return true; + } + } + + return false; + } + + function fillLabel(opt) { + defaultEmphasis(opt, 'label', ['show']); + } // { [componentType]: MarkerModel } + + + var inner$g = makeInner(); + + var MarkerModel = + /** @class */ + function (_super) { + __extends(MarkerModel, _super); + + function MarkerModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkerModel.type; + /** + * If marker model is created by self from series + */ + + _this.createdBySelf = false; + return _this; + } + /** + * @overrite + */ + + + MarkerModel.prototype.init = function (option, parentModel, ecModel) { + if ("development" !== 'production') { + if (this.type === 'marker') { + throw new Error('Marker component is abstract component. Use markLine, markPoint, markArea instead.'); + } + } + + this.mergeDefaultAndTheme(option, ecModel); + + this._mergeOption(option, ecModel, false, true); + }; + + MarkerModel.prototype.isAnimationEnabled = function () { + if (env.node) { + return false; + } + + var hostSeries = this.__hostSeries; + return this.getShallow('animation') && hostSeries && hostSeries.isAnimationEnabled(); + }; + /** + * @overrite + */ + + + MarkerModel.prototype.mergeOption = function (newOpt, ecModel) { + this._mergeOption(newOpt, ecModel, false, false); + }; + + MarkerModel.prototype._mergeOption = function (newOpt, ecModel, createdBySelf, isInit) { + var componentType = this.mainType; + + if (!createdBySelf) { + ecModel.eachSeries(function (seriesModel) { + // mainType can be markPoint, markLine, markArea + var markerOpt = seriesModel.get(this.mainType, true); + var markerModel = inner$g(seriesModel)[componentType]; + + if (!markerOpt || !markerOpt.data) { + inner$g(seriesModel)[componentType] = null; + return; + } + + if (!markerModel) { + if (isInit) { + // Default label emphasis `position` and `show` + fillLabel(markerOpt); + } + + each(markerOpt.data, function (item) { + // FIXME Overwrite fillLabel method ? + if (item instanceof Array) { + fillLabel(item[0]); + fillLabel(item[1]); + } else { + fillLabel(item); + } + }); + markerModel = this.createMarkerModelFromSeries(markerOpt, this, ecModel); // markerModel = new ImplementedMarkerModel( + // markerOpt, this, ecModel + // ); + + extend(markerModel, { + mainType: this.mainType, + // Use the same series index and name + seriesIndex: seriesModel.seriesIndex, + name: seriesModel.name, + createdBySelf: true + }); + markerModel.__hostSeries = seriesModel; + } else { + markerModel._mergeOption(markerOpt, ecModel, true); + } + + inner$g(seriesModel)[componentType] = markerModel; + }, this); + } + }; + + MarkerModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var value = this.getRawValue(dataIndex); + var itemName = data.getName(dataIndex); + return createTooltipMarkup('section', { + header: this.name, + blocks: [createTooltipMarkup('nameValue', { + name: itemName, + value: value, + noName: !itemName, + noValue: value == null + })] + }); + }; + + MarkerModel.prototype.getData = function () { + return this._data; + }; + + MarkerModel.prototype.setData = function (data) { + this._data = data; + }; + + MarkerModel.getMarkerModelFromSeries = function (seriesModel, // Support three types of markers. Strict check. + componentType) { + return inner$g(seriesModel)[componentType]; + }; + + MarkerModel.type = 'marker'; + MarkerModel.dependencies = ['series', 'grid', 'polar', 'geo']; + return MarkerModel; + }(ComponentModel); + + mixin(MarkerModel, DataFormatMixin.prototype); + + var MarkPointModel = + /** @class */ + function (_super) { + __extends(MarkPointModel, _super); + + function MarkPointModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkPointModel.type; + return _this; + } + + MarkPointModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) { + return new MarkPointModel(markerOpt, masterMarkerModel, ecModel); + }; + + MarkPointModel.type = 'markPoint'; + MarkPointModel.defaultOption = { + // zlevel: 0, + z: 5, + symbol: 'pin', + symbolSize: 50, + //symbolRotate: 0, + //symbolOffset: [0, 0] + tooltip: { + trigger: 'item' + }, + label: { + show: true, + position: 'inside' + }, + itemStyle: { + borderWidth: 2 + }, + emphasis: { + label: { + show: true + } + } + }; + return MarkPointModel; + }(MarkerModel); + + function hasXOrY(item) { + return !(isNaN(parseFloat(item.x)) && isNaN(parseFloat(item.y))); + } + + function hasXAndY(item) { + return !isNaN(parseFloat(item.x)) && !isNaN(parseFloat(item.y)); + } + + function markerTypeCalculatorWithExtent(markerType, data, otherDataDim, targetDataDim, otherCoordIndex, targetCoordIndex) { + var coordArr = []; + var stacked = isDimensionStacked(data, targetDataDim + /*, otherDataDim*/ + ); + var calcDataDim = stacked ? data.getCalculationInfo('stackResultDimension') : targetDataDim; + var value = numCalculate(data, calcDataDim, markerType); + var dataIndex = data.indicesOfNearest(calcDataDim, value)[0]; + coordArr[otherCoordIndex] = data.get(otherDataDim, dataIndex); + coordArr[targetCoordIndex] = data.get(calcDataDim, dataIndex); + var coordArrValue = data.get(targetDataDim, dataIndex); // Make it simple, do not visit all stacked value to count precision. + + var precision = getPrecision(data.get(targetDataDim, dataIndex)); + precision = Math.min(precision, 20); + + if (precision >= 0) { + coordArr[targetCoordIndex] = +coordArr[targetCoordIndex].toFixed(precision); + } + + return [coordArr, coordArrValue]; + } // TODO Specified percent + + + var markerTypeCalculator = { + min: curry(markerTypeCalculatorWithExtent, 'min'), + max: curry(markerTypeCalculatorWithExtent, 'max'), + average: curry(markerTypeCalculatorWithExtent, 'average'), + median: curry(markerTypeCalculatorWithExtent, 'median') + }; + /** + * Transform markPoint data item to format used in List by do the following + * 1. Calculate statistic like `max`, `min`, `average` + * 2. Convert `item.xAxis`, `item.yAxis` to `item.coord` array + */ + + function dataTransform(seriesModel, item) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; // 1. If not specify the position with pixel directly + // 2. If `coord` is not a data array. Which uses `xAxis`, + // `yAxis` to specify the coord on each dimension + // parseFloat first because item.x and item.y can be percent string like '20%' + + if (item && !hasXAndY(item) && !isArray(item.coord) && coordSys) { + var dims = coordSys.dimensions; + var axisInfo = getAxisInfo$1(item, data, coordSys, seriesModel); // Clone the option + // Transform the properties xAxis, yAxis, radiusAxis, angleAxis, geoCoord to value + + item = clone(item); + + if (item.type && markerTypeCalculator[item.type] && axisInfo.baseAxis && axisInfo.valueAxis) { + var otherCoordIndex = indexOf(dims, axisInfo.baseAxis.dim); + var targetCoordIndex = indexOf(dims, axisInfo.valueAxis.dim); + var coordInfo = markerTypeCalculator[item.type](data, axisInfo.baseDataDim, axisInfo.valueDataDim, otherCoordIndex, targetCoordIndex); + item.coord = coordInfo[0]; // Force to use the value of calculated value. + // let item use the value without stack. + + item.value = coordInfo[1]; + } else { + // FIXME Only has one of xAxis and yAxis. + var coord = [item.xAxis != null ? item.xAxis : item.radiusAxis, item.yAxis != null ? item.yAxis : item.angleAxis]; // Each coord support max, min, average + + for (var i = 0; i < 2; i++) { + if (markerTypeCalculator[coord[i]]) { + coord[i] = numCalculate(data, data.mapDimension(dims[i]), coord[i]); + } + } + + item.coord = coord; + } + } + + return item; + } + function getAxisInfo$1(item, data, coordSys, seriesModel) { + var ret = {}; + + if (item.valueIndex != null || item.valueDim != null) { + ret.valueDataDim = item.valueIndex != null ? data.getDimension(item.valueIndex) : item.valueDim; + ret.valueAxis = coordSys.getAxis(dataDimToCoordDim(seriesModel, ret.valueDataDim)); + ret.baseAxis = coordSys.getOtherAxis(ret.valueAxis); + ret.baseDataDim = data.mapDimension(ret.baseAxis.dim); + } else { + ret.baseAxis = seriesModel.getBaseAxis(); + ret.valueAxis = coordSys.getOtherAxis(ret.baseAxis); + ret.baseDataDim = data.mapDimension(ret.baseAxis.dim); + ret.valueDataDim = data.mapDimension(ret.valueAxis.dim); + } + + return ret; + } + + function dataDimToCoordDim(seriesModel, dataDim) { + var dimItem = seriesModel.getData().getDimensionInfo(dataDim); + return dimItem && dimItem.coordDim; + } + /** + * Filter data which is out of coordinateSystem range + * [dataFilter description] + */ + + + function dataFilter$1( // Currently only polar and cartesian has containData. + coordSys, item) { + // Alwalys return true if there is no coordSys + return coordSys && coordSys.containData && item.coord && !hasXOrY(item) ? coordSys.containData(item.coord) : true; + } + function zoneFilter( // Currently only polar and cartesian has containData. + coordSys, item1, item2) { + // Alwalys return true if there is no coordSys + return coordSys && coordSys.containZone && item1.coord && item2.coord && !hasXOrY(item1) && !hasXOrY(item2) ? coordSys.containZone(item1.coord, item2.coord) : true; + } + function createMarkerDimValueGetter(inCoordSys, dims) { + return inCoordSys ? function (item, dimName, dataIndex, dimIndex) { + var rawVal = dimIndex < 2 // x, y, radius, angle + ? item.coord && item.coord[dimIndex] : item.value; + return parseDataValue(rawVal, dims[dimIndex]); + } : function (item, dimName, dataIndex, dimIndex) { + return parseDataValue(item.value, dims[dimIndex]); + }; + } + function numCalculate(data, valueDataDim, type) { + if (type === 'average') { + var sum_1 = 0; + var count_1 = 0; + data.each(valueDataDim, function (val, idx) { + if (!isNaN(val)) { + sum_1 += val; + count_1++; + } + }); + return sum_1 / count_1; + } else if (type === 'median') { + return data.getMedian(valueDataDim); + } else { + // max & min + return data.getDataExtent(valueDataDim)[type === 'max' ? 1 : 0]; + } + } + + var inner$h = makeInner(); + + var MarkerView = + /** @class */ + function (_super) { + __extends(MarkerView, _super); + + function MarkerView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkerView.type; + return _this; + } + + MarkerView.prototype.init = function () { + this.markerGroupMap = createHashMap(); + }; + + MarkerView.prototype.render = function (markerModel, ecModel, api) { + var _this = this; + + var markerGroupMap = this.markerGroupMap; + markerGroupMap.each(function (item) { + inner$h(item).keep = false; + }); + ecModel.eachSeries(function (seriesModel) { + var markerModel = MarkerModel.getMarkerModelFromSeries(seriesModel, _this.type); + markerModel && _this.renderSeries(seriesModel, markerModel, ecModel, api); + }); + markerGroupMap.each(function (item) { + !inner$h(item).keep && _this.group.remove(item.group); + }); + }; + + MarkerView.prototype.markKeep = function (drawGroup) { + inner$h(drawGroup).keep = true; + }; + + MarkerView.prototype.toggleBlurSeries = function (seriesModelList, isBlur) { + var _this = this; + + each(seriesModelList, function (seriesModel) { + var markerModel = MarkerModel.getMarkerModelFromSeries(seriesModel, _this.type); + + if (markerModel) { + var data = markerModel.getData(); + data.eachItemGraphicEl(function (el) { + if (el) { + isBlur ? enterBlur(el) : leaveBlur(el); + } + }); + } + }); + }; + + MarkerView.type = 'marker'; + return MarkerView; + }(ComponentView); + + function updateMarkerLayout(mpData, seriesModel, api) { + var coordSys = seriesModel.coordinateSystem; + mpData.each(function (idx) { + var itemModel = mpData.getItemModel(idx); + var point; + var xPx = parsePercent$1(itemModel.get('x'), api.getWidth()); + var yPx = parsePercent$1(itemModel.get('y'), api.getHeight()); + + if (!isNaN(xPx) && !isNaN(yPx)) { + point = [xPx, yPx]; + } // Chart like bar may have there own marker positioning logic + else if (seriesModel.getMarkerPosition) { + // Use the getMarkerPoisition + point = seriesModel.getMarkerPosition(mpData.getValues(mpData.dimensions, idx)); + } else if (coordSys) { + var x = mpData.get(coordSys.dimensions[0], idx); + var y = mpData.get(coordSys.dimensions[1], idx); + point = coordSys.dataToPoint([x, y]); + } // Use x, y if has any + + + if (!isNaN(xPx)) { + point[0] = xPx; + } + + if (!isNaN(yPx)) { + point[1] = yPx; + } + + mpData.setItemLayout(idx, point); + }); + } + + var MarkPointView = + /** @class */ + function (_super) { + __extends(MarkPointView, _super); + + function MarkPointView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkPointView.type; + return _this; + } + + MarkPointView.prototype.updateTransform = function (markPointModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var mpModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markPoint'); + + if (mpModel) { + updateMarkerLayout(mpModel.getData(), seriesModel, api); + this.markerGroupMap.get(seriesModel.id).updateLayout(); + } + }, this); + }; + + MarkPointView.prototype.renderSeries = function (seriesModel, mpModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesId = seriesModel.id; + var seriesData = seriesModel.getData(); + var symbolDrawMap = this.markerGroupMap; + var symbolDraw = symbolDrawMap.get(seriesId) || symbolDrawMap.set(seriesId, new SymbolDraw()); + var mpData = createData(coordSys, seriesModel, mpModel); // FIXME + + mpModel.setData(mpData); + updateMarkerLayout(mpModel.getData(), seriesModel, api); + mpData.each(function (idx) { + var itemModel = mpData.getItemModel(idx); + var symbol = itemModel.getShallow('symbol'); + var symbolSize = itemModel.getShallow('symbolSize'); + var symbolRotate = itemModel.getShallow('symbolRotate'); + var symbolOffset = itemModel.getShallow('symbolOffset'); + var symbolKeepAspect = itemModel.getShallow('symbolKeepAspect'); // TODO: refactor needed: single data item should not support callback function + + if (isFunction(symbol) || isFunction(symbolSize) || isFunction(symbolRotate) || isFunction(symbolOffset)) { + var rawIdx = mpModel.getRawValue(idx); + var dataParams = mpModel.getDataParams(idx); + + if (isFunction(symbol)) { + symbol = symbol(rawIdx, dataParams); + } + + if (isFunction(symbolSize)) { + // FIXME 这里不兼容 ECharts 2.x,2.x 貌似参数是整个数据? + symbolSize = symbolSize(rawIdx, dataParams); + } + + if (isFunction(symbolRotate)) { + symbolRotate = symbolRotate(rawIdx, dataParams); + } + + if (isFunction(symbolOffset)) { + symbolOffset = symbolOffset(rawIdx, dataParams); + } + } + + var style = itemModel.getModel('itemStyle').getItemStyle(); + var color = getVisualFromData(seriesData, 'color'); + + if (!style.fill) { + style.fill = color; + } + + mpData.setItemVisual(idx, { + symbol: symbol, + symbolSize: symbolSize, + symbolRotate: symbolRotate, + symbolOffset: symbolOffset, + symbolKeepAspect: symbolKeepAspect, + style: style + }); + }); // TODO Text are wrong + + symbolDraw.updateData(mpData); + this.group.add(symbolDraw.group); // Set host model for tooltip + // FIXME + + mpData.eachItemGraphicEl(function (el) { + el.traverse(function (child) { + getECData(child).dataModel = mpModel; + }); + }); + this.markKeep(symbolDraw); + symbolDraw.group.silent = mpModel.get('silent') || seriesModel.get('silent'); + }; + + MarkPointView.type = 'markPoint'; + return MarkPointView; + }(MarkerView); + + function createData(coordSys, seriesModel, mpModel) { + var coordDimsInfos; + + if (coordSys) { + coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) { + var info = seriesModel.getData().getDimensionInfo(seriesModel.getData().mapDimension(coordDim)) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys + + return extend(extend({}, info), { + name: coordDim, + // DON'T use ordinalMeta to parse and collect ordinal. + ordinalMeta: null + }); + }); + } else { + coordDimsInfos = [{ + name: 'value', + type: 'float' + }]; + } + + var mpData = new SeriesData(coordDimsInfos, mpModel); + var dataOpt = map(mpModel.get('data'), curry(dataTransform, seriesModel)); + + if (coordSys) { + dataOpt = filter(dataOpt, curry(dataFilter$1, coordSys)); + } + + var dimValueGetter = createMarkerDimValueGetter(!!coordSys, coordDimsInfos); + mpData.initData(dataOpt, null, dimValueGetter); + return mpData; + } + + function install$E(registers) { + registers.registerComponentModel(MarkPointModel); + registers.registerComponentView(MarkPointView); + registers.registerPreprocessor(function (opt) { + if (checkMarkerInSeries(opt.series, 'markPoint')) { + // Make sure markPoint component is enabled + opt.markPoint = opt.markPoint || {}; + } + }); + } + + var MarkLineModel = + /** @class */ + function (_super) { + __extends(MarkLineModel, _super); + + function MarkLineModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkLineModel.type; + return _this; + } + + MarkLineModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) { + return new MarkLineModel(markerOpt, masterMarkerModel, ecModel); + }; + + MarkLineModel.type = 'markLine'; + MarkLineModel.defaultOption = { + // zlevel: 0, + z: 5, + symbol: ['circle', 'arrow'], + symbolSize: [8, 16], + //symbolRotate: 0, + symbolOffset: 0, + precision: 2, + tooltip: { + trigger: 'item' + }, + label: { + show: true, + position: 'end', + distance: 5 + }, + lineStyle: { + type: 'dashed' + }, + emphasis: { + label: { + show: true + }, + lineStyle: { + width: 3 + } + }, + animationEasing: 'linear' + }; + return MarkLineModel; + }(MarkerModel); + + var inner$i = makeInner(); + + var markLineTransform = function (seriesModel, coordSys, mlModel, item) { + var data = seriesModel.getData(); + var itemArray; + + if (!isArray(item)) { + // Special type markLine like 'min', 'max', 'average', 'median' + var mlType = item.type; + + if (mlType === 'min' || mlType === 'max' || mlType === 'average' || mlType === 'median' // In case + // data: [{ + // yAxis: 10 + // }] + || item.xAxis != null || item.yAxis != null) { + var valueAxis = void 0; + var value = void 0; + + if (item.yAxis != null || item.xAxis != null) { + valueAxis = coordSys.getAxis(item.yAxis != null ? 'y' : 'x'); + value = retrieve(item.yAxis, item.xAxis); + } else { + var axisInfo = getAxisInfo$1(item, data, coordSys, seriesModel); + valueAxis = axisInfo.valueAxis; + var valueDataDim = getStackedDimension(data, axisInfo.valueDataDim); + value = numCalculate(data, valueDataDim, mlType); + } + + var valueIndex = valueAxis.dim === 'x' ? 0 : 1; + var baseIndex = 1 - valueIndex; // Normized to 2d data with start and end point + + var mlFrom = clone(item); + var mlTo = { + coord: [] + }; + mlFrom.type = null; + mlFrom.coord = []; + mlFrom.coord[baseIndex] = -Infinity; + mlTo.coord[baseIndex] = Infinity; + var precision = mlModel.get('precision'); + + if (precision >= 0 && isNumber(value)) { + value = +value.toFixed(Math.min(precision, 20)); + } + + mlFrom.coord[valueIndex] = mlTo.coord[valueIndex] = value; + itemArray = [mlFrom, mlTo, { + type: mlType, + valueIndex: item.valueIndex, + // Force to use the value of calculated value. + value: value + }]; + } else { + // Invalid data + if ("development" !== 'production') { + logError('Invalid markLine data.'); + } + + itemArray = []; + } + } else { + itemArray = item; + } + + var normalizedItem = [dataTransform(seriesModel, itemArray[0]), dataTransform(seriesModel, itemArray[1]), extend({}, itemArray[2])]; // Avoid line data type is extended by from(to) data type + + normalizedItem[2].type = normalizedItem[2].type || null; // Merge from option and to option into line option + + merge(normalizedItem[2], normalizedItem[0]); + merge(normalizedItem[2], normalizedItem[1]); + return normalizedItem; + }; + + function isInifinity(val) { + return !isNaN(val) && !isFinite(val); + } // If a markLine has one dim + + + function ifMarkLineHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) { + var otherDimIndex = 1 - dimIndex; + var dimName = coordSys.dimensions[dimIndex]; + return isInifinity(fromCoord[otherDimIndex]) && isInifinity(toCoord[otherDimIndex]) && fromCoord[dimIndex] === toCoord[dimIndex] && coordSys.getAxis(dimName).containData(fromCoord[dimIndex]); + } + + function markLineFilter(coordSys, item) { + if (coordSys.type === 'cartesian2d') { + var fromCoord = item[0].coord; + var toCoord = item[1].coord; // In case + // { + // markLine: { + // data: [{ yAxis: 2 }] + // } + // } + + if (fromCoord && toCoord && (ifMarkLineHasOnlyDim(1, fromCoord, toCoord, coordSys) || ifMarkLineHasOnlyDim(0, fromCoord, toCoord, coordSys))) { + return true; + } + } + + return dataFilter$1(coordSys, item[0]) && dataFilter$1(coordSys, item[1]); + } + + function updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api) { + var coordSys = seriesModel.coordinateSystem; + var itemModel = data.getItemModel(idx); + var point; + var xPx = parsePercent$1(itemModel.get('x'), api.getWidth()); + var yPx = parsePercent$1(itemModel.get('y'), api.getHeight()); + + if (!isNaN(xPx) && !isNaN(yPx)) { + point = [xPx, yPx]; + } else { + // Chart like bar may have there own marker positioning logic + if (seriesModel.getMarkerPosition) { + // Use the getMarkerPoisition + point = seriesModel.getMarkerPosition(data.getValues(data.dimensions, idx)); + } else { + var dims = coordSys.dimensions; + var x = data.get(dims[0], idx); + var y = data.get(dims[1], idx); + point = coordSys.dataToPoint([x, y]); + } // Expand line to the edge of grid if value on one axis is Inifnity + // In case + // markLine: { + // data: [{ + // yAxis: 2 + // // or + // type: 'average' + // }] + // } + + + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + // TODO: TYPE ts@4.1 may still infer it as Axis instead of Axis2D. Not sure if it's a bug + var xAxis = coordSys.getAxis('x'); + var yAxis = coordSys.getAxis('y'); + var dims = coordSys.dimensions; + + if (isInifinity(data.get(dims[0], idx))) { + point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[isFrom ? 0 : 1]); + } else if (isInifinity(data.get(dims[1], idx))) { + point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[isFrom ? 0 : 1]); + } + } // Use x, y if has any + + + if (!isNaN(xPx)) { + point[0] = xPx; + } + + if (!isNaN(yPx)) { + point[1] = yPx; + } + } + + data.setItemLayout(idx, point); + } + + var MarkLineView = + /** @class */ + function (_super) { + __extends(MarkLineView, _super); + + function MarkLineView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkLineView.type; + return _this; + } + + MarkLineView.prototype.updateTransform = function (markLineModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var mlModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markLine'); + + if (mlModel) { + var mlData_1 = mlModel.getData(); + var fromData_1 = inner$i(mlModel).from; + var toData_1 = inner$i(mlModel).to; // Update visual and layout of from symbol and to symbol + + fromData_1.each(function (idx) { + updateSingleMarkerEndLayout(fromData_1, idx, true, seriesModel, api); + updateSingleMarkerEndLayout(toData_1, idx, false, seriesModel, api); + }); // Update layout of line + + mlData_1.each(function (idx) { + mlData_1.setItemLayout(idx, [fromData_1.getItemLayout(idx), toData_1.getItemLayout(idx)]); + }); + this.markerGroupMap.get(seriesModel.id).updateLayout(); + } + }, this); + }; + + MarkLineView.prototype.renderSeries = function (seriesModel, mlModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesId = seriesModel.id; + var seriesData = seriesModel.getData(); + var lineDrawMap = this.markerGroupMap; + var lineDraw = lineDrawMap.get(seriesId) || lineDrawMap.set(seriesId, new LineDraw()); + this.group.add(lineDraw.group); + var mlData = createList$1(coordSys, seriesModel, mlModel); + var fromData = mlData.from; + var toData = mlData.to; + var lineData = mlData.line; + inner$i(mlModel).from = fromData; + inner$i(mlModel).to = toData; // Line data for tooltip and formatter + + mlModel.setData(lineData); // TODO + // Functionally, `symbolSize` & `symbolOffset` can also be 2D array now. + // But the related logic and type definition are not finished yet. + // Finish it if required + + var symbolType = mlModel.get('symbol'); + var symbolSize = mlModel.get('symbolSize'); + var symbolRotate = mlModel.get('symbolRotate'); + var symbolOffset = mlModel.get('symbolOffset'); // TODO: support callback function like markPoint + + if (!isArray(symbolType)) { + symbolType = [symbolType, symbolType]; + } + + if (!isArray(symbolSize)) { + symbolSize = [symbolSize, symbolSize]; + } + + if (!isArray(symbolRotate)) { + symbolRotate = [symbolRotate, symbolRotate]; + } + + if (!isArray(symbolOffset)) { + symbolOffset = [symbolOffset, symbolOffset]; + } // Update visual and layout of from symbol and to symbol + + + mlData.from.each(function (idx) { + updateDataVisualAndLayout(fromData, idx, true); + updateDataVisualAndLayout(toData, idx, false); + }); // Update visual and layout of line + + lineData.each(function (idx) { + var lineStyle = lineData.getItemModel(idx).getModel('lineStyle').getLineStyle(); // lineData.setItemVisual(idx, { + // color: lineColor || fromData.getItemVisual(idx, 'color') + // }); + + lineData.setItemLayout(idx, [fromData.getItemLayout(idx), toData.getItemLayout(idx)]); + + if (lineStyle.stroke == null) { + lineStyle.stroke = fromData.getItemVisual(idx, 'style').fill; + } + + lineData.setItemVisual(idx, { + fromSymbolKeepAspect: fromData.getItemVisual(idx, 'symbolKeepAspect'), + fromSymbolOffset: fromData.getItemVisual(idx, 'symbolOffset'), + fromSymbolRotate: fromData.getItemVisual(idx, 'symbolRotate'), + fromSymbolSize: fromData.getItemVisual(idx, 'symbolSize'), + fromSymbol: fromData.getItemVisual(idx, 'symbol'), + toSymbolKeepAspect: toData.getItemVisual(idx, 'symbolKeepAspect'), + toSymbolOffset: toData.getItemVisual(idx, 'symbolOffset'), + toSymbolRotate: toData.getItemVisual(idx, 'symbolRotate'), + toSymbolSize: toData.getItemVisual(idx, 'symbolSize'), + toSymbol: toData.getItemVisual(idx, 'symbol'), + style: lineStyle + }); + }); + lineDraw.updateData(lineData); // Set host model for tooltip + // FIXME + + mlData.line.eachItemGraphicEl(function (el) { + getECData(el).dataModel = mlModel; + el.traverse(function (child) { + getECData(child).dataModel = mlModel; + }); + }); + + function updateDataVisualAndLayout(data, idx, isFrom) { + var itemModel = data.getItemModel(idx); + updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api); + var style = itemModel.getModel('itemStyle').getItemStyle(); + + if (style.fill == null) { + style.fill = getVisualFromData(seriesData, 'color'); + } + + data.setItemVisual(idx, { + symbolKeepAspect: itemModel.get('symbolKeepAspect'), + // `0` should be considered as a valid value, so use `retrieve2` instead of `||` + symbolOffset: retrieve2(itemModel.get('symbolOffset', true), symbolOffset[isFrom ? 0 : 1]), + symbolRotate: retrieve2(itemModel.get('symbolRotate', true), symbolRotate[isFrom ? 0 : 1]), + // TODO: when 2d array is supported, it should ignore parent + symbolSize: retrieve2(itemModel.get('symbolSize'), symbolSize[isFrom ? 0 : 1]), + symbol: retrieve2(itemModel.get('symbol', true), symbolType[isFrom ? 0 : 1]), + style: style + }); + } + + this.markKeep(lineDraw); + lineDraw.group.silent = mlModel.get('silent') || seriesModel.get('silent'); + }; + + MarkLineView.type = 'markLine'; + return MarkLineView; + }(MarkerView); + + function createList$1(coordSys, seriesModel, mlModel) { + var coordDimsInfos; + + if (coordSys) { + coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) { + var info = seriesModel.getData().getDimensionInfo(seriesModel.getData().mapDimension(coordDim)) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys + + return extend(extend({}, info), { + name: coordDim, + // DON'T use ordinalMeta to parse and collect ordinal. + ordinalMeta: null + }); + }); + } else { + coordDimsInfos = [{ + name: 'value', + type: 'float' + }]; + } + + var fromData = new SeriesData(coordDimsInfos, mlModel); + var toData = new SeriesData(coordDimsInfos, mlModel); // No dimensions + + var lineData = new SeriesData([], mlModel); + var optData = map(mlModel.get('data'), curry(markLineTransform, seriesModel, coordSys, mlModel)); + + if (coordSys) { + optData = filter(optData, curry(markLineFilter, coordSys)); + } + + var dimValueGetter = createMarkerDimValueGetter(!!coordSys, coordDimsInfos); + fromData.initData(map(optData, function (item) { + return item[0]; + }), null, dimValueGetter); + toData.initData(map(optData, function (item) { + return item[1]; + }), null, dimValueGetter); + lineData.initData(map(optData, function (item) { + return item[2]; + })); + lineData.hasItemOption = true; + return { + from: fromData, + to: toData, + line: lineData + }; + } + + function install$F(registers) { + registers.registerComponentModel(MarkLineModel); + registers.registerComponentView(MarkLineView); + registers.registerPreprocessor(function (opt) { + if (checkMarkerInSeries(opt.series, 'markLine')) { + // Make sure markLine component is enabled + opt.markLine = opt.markLine || {}; + } + }); + } + + var MarkAreaModel = + /** @class */ + function (_super) { + __extends(MarkAreaModel, _super); + + function MarkAreaModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkAreaModel.type; + return _this; + } + + MarkAreaModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) { + return new MarkAreaModel(markerOpt, masterMarkerModel, ecModel); + }; + + MarkAreaModel.type = 'markArea'; + MarkAreaModel.defaultOption = { + // zlevel: 0, + // PENDING + z: 1, + tooltip: { + trigger: 'item' + }, + // markArea should fixed on the coordinate system + animation: false, + label: { + show: true, + position: 'top' + }, + itemStyle: { + // color and borderColor default to use color from series + // color: 'auto' + // borderColor: 'auto' + borderWidth: 0 + }, + emphasis: { + label: { + show: true, + position: 'top' + } + } + }; + return MarkAreaModel; + }(MarkerModel); + + var inner$j = makeInner(); + + var markAreaTransform = function (seriesModel, coordSys, maModel, item) { + var lt = dataTransform(seriesModel, item[0]); + var rb = dataTransform(seriesModel, item[1]); // FIXME make sure lt is less than rb + + var ltCoord = lt.coord; + var rbCoord = rb.coord; + ltCoord[0] = retrieve(ltCoord[0], -Infinity); + ltCoord[1] = retrieve(ltCoord[1], -Infinity); + rbCoord[0] = retrieve(rbCoord[0], Infinity); + rbCoord[1] = retrieve(rbCoord[1], Infinity); // Merge option into one + + var result = mergeAll([{}, lt, rb]); + result.coord = [lt.coord, rb.coord]; + result.x0 = lt.x; + result.y0 = lt.y; + result.x1 = rb.x; + result.y1 = rb.y; + return result; + }; + + function isInifinity$1(val) { + return !isNaN(val) && !isFinite(val); + } // If a markArea has one dim + + + function ifMarkAreaHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) { + var otherDimIndex = 1 - dimIndex; + return isInifinity$1(fromCoord[otherDimIndex]) && isInifinity$1(toCoord[otherDimIndex]); + } + + function markAreaFilter(coordSys, item) { + var fromCoord = item.coord[0]; + var toCoord = item.coord[1]; + var item0 = { + coord: fromCoord, + x: item.x0, + y: item.y0 + }; + var item1 = { + coord: toCoord, + x: item.x1, + y: item.y1 + }; + + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + // In case + // { + // markArea: { + // data: [{ yAxis: 2 }] + // } + // } + if (fromCoord && toCoord && (ifMarkAreaHasOnlyDim(1, fromCoord, toCoord) || ifMarkAreaHasOnlyDim(0, fromCoord, toCoord))) { + return true; + } //Directly returning true may also do the work, + //because markArea will not be shown automatically + //when it's not included in coordinate system. + //But filtering ahead can avoid keeping rendering markArea + //when there are too many of them. + + + return zoneFilter(coordSys, item0, item1); + } + + return dataFilter$1(coordSys, item0) || dataFilter$1(coordSys, item1); + } // dims can be ['x0', 'y0'], ['x1', 'y1'], ['x0', 'y1'], ['x1', 'y0'] + + + function getSingleMarkerEndPoint(data, idx, dims, seriesModel, api) { + var coordSys = seriesModel.coordinateSystem; + var itemModel = data.getItemModel(idx); + var point; + var xPx = parsePercent$1(itemModel.get(dims[0]), api.getWidth()); + var yPx = parsePercent$1(itemModel.get(dims[1]), api.getHeight()); + + if (!isNaN(xPx) && !isNaN(yPx)) { + point = [xPx, yPx]; + } else { + // Chart like bar may have there own marker positioning logic + if (seriesModel.getMarkerPosition) { + // Use the getMarkerPoisition + point = seriesModel.getMarkerPosition(data.getValues(dims, idx)); + } else { + var x = data.get(dims[0], idx); + var y = data.get(dims[1], idx); + var pt = [x, y]; + coordSys.clampData && coordSys.clampData(pt, pt); + point = coordSys.dataToPoint(pt, true); + } + + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + // TODO: TYPE ts@4.1 may still infer it as Axis instead of Axis2D. Not sure if it's a bug + var xAxis = coordSys.getAxis('x'); + var yAxis = coordSys.getAxis('y'); + var x = data.get(dims[0], idx); + var y = data.get(dims[1], idx); + + if (isInifinity$1(x)) { + point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[dims[0] === 'x0' ? 0 : 1]); + } else if (isInifinity$1(y)) { + point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[dims[1] === 'y0' ? 0 : 1]); + } + } // Use x, y if has any + + + if (!isNaN(xPx)) { + point[0] = xPx; + } + + if (!isNaN(yPx)) { + point[1] = yPx; + } + } + + return point; + } + + var dimPermutations = [['x0', 'y0'], ['x1', 'y0'], ['x1', 'y1'], ['x0', 'y1']]; + + var MarkAreaView = + /** @class */ + function (_super) { + __extends(MarkAreaView, _super); + + function MarkAreaView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkAreaView.type; + return _this; + } + + MarkAreaView.prototype.updateTransform = function (markAreaModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var maModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markArea'); + + if (maModel) { + var areaData_1 = maModel.getData(); + areaData_1.each(function (idx) { + var points = map(dimPermutations, function (dim) { + return getSingleMarkerEndPoint(areaData_1, idx, dim, seriesModel, api); + }); // Layout + + areaData_1.setItemLayout(idx, points); + var el = areaData_1.getItemGraphicEl(idx); + el.setShape('points', points); + }); + } + }, this); + }; + + MarkAreaView.prototype.renderSeries = function (seriesModel, maModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesId = seriesModel.id; + var seriesData = seriesModel.getData(); + var areaGroupMap = this.markerGroupMap; + var polygonGroup = areaGroupMap.get(seriesId) || areaGroupMap.set(seriesId, { + group: new Group() + }); + this.group.add(polygonGroup.group); + this.markKeep(polygonGroup); + var areaData = createList$2(coordSys, seriesModel, maModel); // Line data for tooltip and formatter + + maModel.setData(areaData); // Update visual and layout of line + + areaData.each(function (idx) { + // Layout + var points = map(dimPermutations, function (dim) { + return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api); + }); + var xAxisScale = coordSys.getAxis('x').scale; + var yAxisScale = coordSys.getAxis('y').scale; + var xAxisExtent = xAxisScale.getExtent(); + var yAxisExtent = yAxisScale.getExtent(); + var xPointExtent = [xAxisScale.parse(areaData.get('x0', idx)), xAxisScale.parse(areaData.get('x1', idx))]; + var yPointExtent = [yAxisScale.parse(areaData.get('y0', idx)), yAxisScale.parse(areaData.get('y1', idx))]; + asc(xPointExtent); + asc(yPointExtent); + var overlapped = !(xAxisExtent[0] > xPointExtent[1] || xAxisExtent[1] < xPointExtent[0] || yAxisExtent[0] > yPointExtent[1] || yAxisExtent[1] < yPointExtent[0]); // If none of the area is inside coordSys, allClipped is set to be true + // in layout so that label will not be displayed. See #12591 + + var allClipped = !overlapped; + areaData.setItemLayout(idx, { + points: points, + allClipped: allClipped + }); + var style = areaData.getItemModel(idx).getModel('itemStyle').getItemStyle(); + var color$1 = getVisualFromData(seriesData, 'color'); + + if (!style.fill) { + style.fill = color$1; + + if (isString(style.fill)) { + style.fill = modifyAlpha(style.fill, 0.4); + } + } + + if (!style.stroke) { + style.stroke = color$1; + } // Visual + + + areaData.setItemVisual(idx, 'style', style); + }); + areaData.diff(inner$j(polygonGroup).data).add(function (idx) { + var layout = areaData.getItemLayout(idx); + + if (!layout.allClipped) { + var polygon = new Polygon({ + shape: { + points: layout.points + } + }); + areaData.setItemGraphicEl(idx, polygon); + polygonGroup.group.add(polygon); + } + }).update(function (newIdx, oldIdx) { + var polygon = inner$j(polygonGroup).data.getItemGraphicEl(oldIdx); + var layout = areaData.getItemLayout(newIdx); + + if (!layout.allClipped) { + if (polygon) { + updateProps(polygon, { + shape: { + points: layout.points + } + }, maModel, newIdx); + } else { + polygon = new Polygon({ + shape: { + points: layout.points + } + }); + } + + areaData.setItemGraphicEl(newIdx, polygon); + polygonGroup.group.add(polygon); + } else if (polygon) { + polygonGroup.group.remove(polygon); + } + }).remove(function (idx) { + var polygon = inner$j(polygonGroup).data.getItemGraphicEl(idx); + polygonGroup.group.remove(polygon); + }).execute(); + areaData.eachItemGraphicEl(function (polygon, idx) { + var itemModel = areaData.getItemModel(idx); + var style = areaData.getItemVisual(idx, 'style'); + polygon.useStyle(areaData.getItemVisual(idx, 'style')); + setLabelStyle(polygon, getLabelStatesModels(itemModel), { + labelFetcher: maModel, + labelDataIndex: idx, + defaultText: areaData.getName(idx) || '', + inheritColor: isString(style.fill) ? modifyAlpha(style.fill, 1) : '#000' + }); + setStatesStylesFromModel(polygon, itemModel); + toggleHoverEmphasis(polygon, null, null, itemModel.get(['emphasis', 'disabled'])); + getECData(polygon).dataModel = maModel; + }); + inner$j(polygonGroup).data = areaData; + polygonGroup.group.silent = maModel.get('silent') || seriesModel.get('silent'); + }; + + MarkAreaView.type = 'markArea'; + return MarkAreaView; + }(MarkerView); + + function createList$2(coordSys, seriesModel, maModel) { + var areaData; + var dataDims; + var dims = ['x0', 'y0', 'x1', 'y1']; + + if (coordSys) { + var coordDimsInfos_1 = map(coordSys && coordSys.dimensions, function (coordDim) { + var data = seriesModel.getData(); + var info = data.getDimensionInfo(data.mapDimension(coordDim)) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys + + return extend(extend({}, info), { + name: coordDim, + // DON'T use ordinalMeta to parse and collect ordinal. + ordinalMeta: null + }); + }); + dataDims = map(dims, function (dim, idx) { + return { + name: dim, + type: coordDimsInfos_1[idx % 2].type + }; + }); + areaData = new SeriesData(dataDims, maModel); + } else { + dataDims = [{ + name: 'value', + type: 'float' + }]; + areaData = new SeriesData(dataDims, maModel); + } + + var optData = map(maModel.get('data'), curry(markAreaTransform, seriesModel, coordSys, maModel)); + + if (coordSys) { + optData = filter(optData, curry(markAreaFilter, coordSys)); + } + + var dimValueGetter = coordSys ? function (item, dimName, dataIndex, dimIndex) { + // TODO should convert to ParsedValue? + var rawVal = item.coord[Math.floor(dimIndex / 2)][dimIndex % 2]; + return parseDataValue(rawVal, dataDims[dimIndex]); + } : function (item, dimName, dataIndex, dimIndex) { + return parseDataValue(item.value, dataDims[dimIndex]); + }; + areaData.initData(optData, null, dimValueGetter); + areaData.hasItemOption = true; + return areaData; + } + + function install$G(registers) { + registers.registerComponentModel(MarkAreaModel); + registers.registerComponentView(MarkAreaView); + registers.registerPreprocessor(function (opt) { + if (checkMarkerInSeries(opt.series, 'markArea')) { + // Make sure markArea component is enabled + opt.markArea = opt.markArea || {}; + } + }); + } + + var getDefaultSelectorOptions = function (ecModel, type) { + if (type === 'all') { + return { + type: 'all', + title: ecModel.getLocaleModel().get(['legend', 'selector', 'all']) + }; + } else if (type === 'inverse') { + return { + type: 'inverse', + title: ecModel.getLocaleModel().get(['legend', 'selector', 'inverse']) + }; + } + }; + + var LegendModel = + /** @class */ + function (_super) { + __extends(LegendModel, _super); + + function LegendModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LegendModel.type; + _this.layoutMode = { + type: 'box', + // legend.width/height are maxWidth/maxHeight actually, + // whereas realy width/height is calculated by its content. + // (Setting {left: 10, right: 10} does not make sense). + // So consider the case: + // `setOption({legend: {left: 10});` + // then `setOption({legend: {right: 10});` + // The previous `left` should be cleared by setting `ignoreSize`. + ignoreSize: true + }; + return _this; + } + + LegendModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + option.selected = option.selected || {}; + + this._updateSelector(option); + }; + + LegendModel.prototype.mergeOption = function (option, ecModel) { + _super.prototype.mergeOption.call(this, option, ecModel); + + this._updateSelector(option); + }; + + LegendModel.prototype._updateSelector = function (option) { + var selector = option.selector; + var ecModel = this.ecModel; + + if (selector === true) { + selector = option.selector = ['all', 'inverse']; + } + + if (isArray(selector)) { + each(selector, function (item, index) { + isString(item) && (item = { + type: item + }); + selector[index] = merge(item, getDefaultSelectorOptions(ecModel, item.type)); + }); + } + }; + + LegendModel.prototype.optionUpdated = function () { + this._updateData(this.ecModel); + + var legendData = this._data; // If selectedMode is single, try to select one + + if (legendData[0] && this.get('selectedMode') === 'single') { + var hasSelected = false; // If has any selected in option.selected + + for (var i = 0; i < legendData.length; i++) { + var name_1 = legendData[i].get('name'); + + if (this.isSelected(name_1)) { + // Force to unselect others + this.select(name_1); + hasSelected = true; + break; + } + } // Try select the first if selectedMode is single + + + !hasSelected && this.select(legendData[0].get('name')); + } + }; + + LegendModel.prototype._updateData = function (ecModel) { + var potentialData = []; + var availableNames = []; + ecModel.eachRawSeries(function (seriesModel) { + var seriesName = seriesModel.name; + availableNames.push(seriesName); + var isPotential; + + if (seriesModel.legendVisualProvider) { + var provider = seriesModel.legendVisualProvider; + var names = provider.getAllNames(); + + if (!ecModel.isSeriesFiltered(seriesModel)) { + availableNames = availableNames.concat(names); + } + + if (names.length) { + potentialData = potentialData.concat(names); + } else { + isPotential = true; + } + } else { + isPotential = true; + } + + if (isPotential && isNameSpecified(seriesModel)) { + potentialData.push(seriesModel.name); + } + }); + /** + * @type {Array.<string>} + * @private + */ + + this._availableNames = availableNames; // If legend.data not specified in option, use availableNames as data, + // which is convinient for user preparing option. + + var rawData = this.get('data') || potentialData; + var legendData = map(rawData, function (dataItem) { + // Can be string or number + if (isString(dataItem) || isNumber(dataItem)) { + dataItem = { + name: dataItem + }; + } + + return new Model(dataItem, this, this.ecModel); + }, this); + /** + * @type {Array.<module:echarts/model/Model>} + * @private + */ + + this._data = legendData; + }; + + LegendModel.prototype.getData = function () { + return this._data; + }; + + LegendModel.prototype.select = function (name) { + var selected = this.option.selected; + var selectedMode = this.get('selectedMode'); + + if (selectedMode === 'single') { + var data = this._data; + each(data, function (dataItem) { + selected[dataItem.get('name')] = false; + }); + } + + selected[name] = true; + }; + + LegendModel.prototype.unSelect = function (name) { + if (this.get('selectedMode') !== 'single') { + this.option.selected[name] = false; + } + }; + + LegendModel.prototype.toggleSelected = function (name) { + var selected = this.option.selected; // Default is true + + if (!selected.hasOwnProperty(name)) { + selected[name] = true; + } + + this[selected[name] ? 'unSelect' : 'select'](name); + }; + + LegendModel.prototype.allSelect = function () { + var data = this._data; + var selected = this.option.selected; + each(data, function (dataItem) { + selected[dataItem.get('name', true)] = true; + }); + }; + + LegendModel.prototype.inverseSelect = function () { + var data = this._data; + var selected = this.option.selected; + each(data, function (dataItem) { + var name = dataItem.get('name', true); // Initially, default value is true + + if (!selected.hasOwnProperty(name)) { + selected[name] = true; + } + + selected[name] = !selected[name]; + }); + }; + + LegendModel.prototype.isSelected = function (name) { + var selected = this.option.selected; + return !(selected.hasOwnProperty(name) && !selected[name]) && indexOf(this._availableNames, name) >= 0; + }; + + LegendModel.prototype.getOrient = function () { + return this.get('orient') === 'vertical' ? { + index: 1, + name: 'vertical' + } : { + index: 0, + name: 'horizontal' + }; + }; + + LegendModel.type = 'legend.plain'; + LegendModel.dependencies = ['series']; + LegendModel.defaultOption = { + // zlevel: 0, + z: 4, + show: true, + orient: 'horizontal', + left: 'center', + // right: 'center', + top: 0, + // bottom: null, + align: 'auto', + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', + borderRadius: 0, + borderWidth: 0, + padding: 5, + itemGap: 10, + itemWidth: 25, + itemHeight: 14, + symbolRotate: 'inherit', + symbolKeepAspect: true, + inactiveColor: '#ccc', + inactiveBorderColor: '#ccc', + inactiveBorderWidth: 'auto', + itemStyle: { + color: 'inherit', + opacity: 'inherit', + borderColor: 'inherit', + borderWidth: 'auto', + borderCap: 'inherit', + borderJoin: 'inherit', + borderDashOffset: 'inherit', + borderMiterLimit: 'inherit' + }, + lineStyle: { + width: 'auto', + color: 'inherit', + inactiveColor: '#ccc', + inactiveWidth: 2, + opacity: 'inherit', + type: 'inherit', + cap: 'inherit', + join: 'inherit', + dashOffset: 'inherit', + miterLimit: 'inherit' + }, + textStyle: { + color: '#333' + }, + selectedMode: true, + selector: false, + selectorLabel: { + show: true, + borderRadius: 10, + padding: [3, 5, 3, 5], + fontSize: 12, + fontFamily: 'sans-serif', + color: '#666', + borderWidth: 1, + borderColor: '#666' + }, + emphasis: { + selectorLabel: { + show: true, + color: '#eee', + backgroundColor: '#666' + } + }, + selectorPosition: 'auto', + selectorItemGap: 7, + selectorButtonGap: 10, + tooltip: { + show: false + } + }; + return LegendModel; + }(ComponentModel); + + var curry$1 = curry; + var each$c = each; + var Group$2 = Group; + + var LegendView = + /** @class */ + function (_super) { + __extends(LegendView, _super); + + function LegendView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LegendView.type; + _this.newlineDisabled = false; + return _this; + } + + LegendView.prototype.init = function () { + this.group.add(this._contentGroup = new Group$2()); + this.group.add(this._selectorGroup = new Group$2()); + this._isFirstRender = true; + }; + /** + * @protected + */ + + + LegendView.prototype.getContentGroup = function () { + return this._contentGroup; + }; + /** + * @protected + */ + + + LegendView.prototype.getSelectorGroup = function () { + return this._selectorGroup; + }; + /** + * @override + */ + + + LegendView.prototype.render = function (legendModel, ecModel, api) { + var isFirstRender = this._isFirstRender; + this._isFirstRender = false; + this.resetInner(); + + if (!legendModel.get('show', true)) { + return; + } + + var itemAlign = legendModel.get('align'); + var orient = legendModel.get('orient'); + + if (!itemAlign || itemAlign === 'auto') { + itemAlign = legendModel.get('left') === 'right' && orient === 'vertical' ? 'right' : 'left'; + } // selector has been normalized to an array in model + + + var selector = legendModel.get('selector', true); + var selectorPosition = legendModel.get('selectorPosition', true); + + if (selector && (!selectorPosition || selectorPosition === 'auto')) { + selectorPosition = orient === 'horizontal' ? 'end' : 'start'; + } + + this.renderInner(itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition); // Perform layout. + + var positionInfo = legendModel.getBoxLayoutParams(); + var viewportSize = { + width: api.getWidth(), + height: api.getHeight() + }; + var padding = legendModel.get('padding'); + var maxSize = getLayoutRect(positionInfo, viewportSize, padding); + var mainRect = this.layoutInner(legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition); // Place mainGroup, based on the calculated `mainRect`. + + var layoutRect = getLayoutRect(defaults({ + width: mainRect.width, + height: mainRect.height + }, positionInfo), viewportSize, padding); + this.group.x = layoutRect.x - mainRect.x; + this.group.y = layoutRect.y - mainRect.y; + this.group.markRedraw(); // Render background after group is layout. + + this.group.add(this._backgroundEl = makeBackground(mainRect, legendModel)); + }; + + LegendView.prototype.resetInner = function () { + this.getContentGroup().removeAll(); + this._backgroundEl && this.group.remove(this._backgroundEl); + this.getSelectorGroup().removeAll(); + }; + + LegendView.prototype.renderInner = function (itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition) { + var contentGroup = this.getContentGroup(); + var legendDrawnMap = createHashMap(); + var selectMode = legendModel.get('selectedMode'); + var excludeSeriesId = []; + ecModel.eachRawSeries(function (seriesModel) { + !seriesModel.get('legendHoverLink') && excludeSeriesId.push(seriesModel.id); + }); + each$c(legendModel.getData(), function (legendItemModel, dataIndex) { + var name = legendItemModel.get('name'); // Use empty string or \n as a newline string + + if (!this.newlineDisabled && (name === '' || name === '\n')) { + var g = new Group$2(); // @ts-ignore + + g.newline = true; + contentGroup.add(g); + return; + } // Representitive series. + + + var seriesModel = ecModel.getSeriesByName(name)[0]; + + if (legendDrawnMap.get(name)) { + // Have been drawed + return; + } // Legend to control series. + + + if (seriesModel) { + var data = seriesModel.getData(); + var lineVisualStyle = data.getVisual('legendLineStyle') || {}; + var legendIcon = data.getVisual('legendIcon'); + /** + * `data.getVisual('style')` may be the color from the register + * in series. For example, for line series, + */ + + var style = data.getVisual('style'); + + var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, style, legendIcon, selectMode, api); + + itemGroup.on('click', curry$1(dispatchSelectAction, name, null, api, excludeSeriesId)).on('mouseover', curry$1(dispatchHighlightAction, seriesModel.name, null, api, excludeSeriesId)).on('mouseout', curry$1(dispatchDownplayAction, seriesModel.name, null, api, excludeSeriesId)); + legendDrawnMap.set(name, true); + } else { + // Legend to control data. In pie and funnel. + ecModel.eachRawSeries(function (seriesModel) { + // In case multiple series has same data name + if (legendDrawnMap.get(name)) { + return; + } + + if (seriesModel.legendVisualProvider) { + var provider = seriesModel.legendVisualProvider; + + if (!provider.containName(name)) { + return; + } + + var idx = provider.indexOfName(name); + var style = provider.getItemVisual(idx, 'style'); + var legendIcon = provider.getItemVisual(idx, 'legendIcon'); + var colorArr = parse(style.fill); // Color may be set to transparent in visualMap when data is out of range. + // Do not show nothing. + + if (colorArr && colorArr[3] === 0) { + colorArr[3] = 0.2; // TODO color is set to 0, 0, 0, 0. Should show correct RGBA + + style = extend(extend({}, style), { + fill: stringify(colorArr, 'rgba') + }); + } + + var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, {}, style, legendIcon, selectMode, api); // FIXME: consider different series has items with the same name. + + + itemGroup.on('click', curry$1(dispatchSelectAction, null, name, api, excludeSeriesId)) // Should not specify the series name, consider legend controls + // more than one pie series. + .on('mouseover', curry$1(dispatchHighlightAction, null, name, api, excludeSeriesId)).on('mouseout', curry$1(dispatchDownplayAction, null, name, api, excludeSeriesId)); + legendDrawnMap.set(name, true); + } + }, this); + } + + if ("development" !== 'production') { + if (!legendDrawnMap.get(name)) { + console.warn(name + ' series not exists. Legend data should be same with series name or data name.'); + } + } + }, this); + + if (selector) { + this._createSelector(selector, legendModel, api, orient, selectorPosition); + } + }; + + LegendView.prototype._createSelector = function (selector, legendModel, api, orient, selectorPosition) { + var selectorGroup = this.getSelectorGroup(); + each$c(selector, function createSelectorButton(selectorItem) { + var type = selectorItem.type; + var labelText = new ZRText({ + style: { + x: 0, + y: 0, + align: 'center', + verticalAlign: 'middle' + }, + onclick: function () { + api.dispatchAction({ + type: type === 'all' ? 'legendAllSelect' : 'legendInverseSelect' + }); + } + }); + selectorGroup.add(labelText); + var labelModel = legendModel.getModel('selectorLabel'); + var emphasisLabelModel = legendModel.getModel(['emphasis', 'selectorLabel']); + setLabelStyle(labelText, { + normal: labelModel, + emphasis: emphasisLabelModel + }, { + defaultText: selectorItem.title + }); + enableHoverEmphasis(labelText); + }); + }; + + LegendView.prototype._createItem = function (seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, itemVisualStyle, legendIcon, selectMode, api) { + var drawType = seriesModel.visualDrawType; + var itemWidth = legendModel.get('itemWidth'); + var itemHeight = legendModel.get('itemHeight'); + var isSelected = legendModel.isSelected(name); + var iconRotate = legendItemModel.get('symbolRotate'); + var symbolKeepAspect = legendItemModel.get('symbolKeepAspect'); + var legendIconType = legendItemModel.get('icon'); + legendIcon = legendIconType || legendIcon || 'roundRect'; + var style = getLegendStyle(legendIcon, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected, api); + var itemGroup = new Group$2(); + var textStyleModel = legendItemModel.getModel('textStyle'); + + if (isFunction(seriesModel.getLegendIcon) && (!legendIconType || legendIconType === 'inherit')) { + // Series has specific way to define legend icon + itemGroup.add(seriesModel.getLegendIcon({ + itemWidth: itemWidth, + itemHeight: itemHeight, + icon: legendIcon, + iconRotate: iconRotate, + itemStyle: style.itemStyle, + lineStyle: style.lineStyle, + symbolKeepAspect: symbolKeepAspect + })); + } else { + // Use default legend icon policy for most series + var rotate = legendIconType === 'inherit' && seriesModel.getData().getVisual('symbol') ? iconRotate === 'inherit' ? seriesModel.getData().getVisual('symbolRotate') : iconRotate : 0; // No rotation for no icon + + itemGroup.add(getDefaultLegendIcon({ + itemWidth: itemWidth, + itemHeight: itemHeight, + icon: legendIcon, + iconRotate: rotate, + itemStyle: style.itemStyle, + lineStyle: style.lineStyle, + symbolKeepAspect: symbolKeepAspect + })); + } + + var textX = itemAlign === 'left' ? itemWidth + 5 : -5; + var textAlign = itemAlign; + var formatter = legendModel.get('formatter'); + var content = name; + + if (isString(formatter) && formatter) { + content = formatter.replace('{name}', name != null ? name : ''); + } else if (isFunction(formatter)) { + content = formatter(name); + } + + var inactiveColor = legendItemModel.get('inactiveColor'); + itemGroup.add(new ZRText({ + style: createTextStyle(textStyleModel, { + text: content, + x: textX, + y: itemHeight / 2, + fill: isSelected ? textStyleModel.getTextColor() : inactiveColor, + align: textAlign, + verticalAlign: 'middle' + }) + })); // Add a invisible rect to increase the area of mouse hover + + var hitRect = new Rect({ + shape: itemGroup.getBoundingRect(), + invisible: true + }); + var tooltipModel = legendItemModel.getModel('tooltip'); + + if (tooltipModel.get('show')) { + setTooltipConfig({ + el: hitRect, + componentModel: legendModel, + itemName: name, + itemTooltipOption: tooltipModel.option + }); + } + + itemGroup.add(hitRect); + itemGroup.eachChild(function (child) { + child.silent = true; + }); + hitRect.silent = !selectMode; + this.getContentGroup().add(itemGroup); + enableHoverEmphasis(itemGroup); // @ts-ignore + + itemGroup.__legendDataIndex = dataIndex; + return itemGroup; + }; + + LegendView.prototype.layoutInner = function (legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition) { + var contentGroup = this.getContentGroup(); + var selectorGroup = this.getSelectorGroup(); // Place items in contentGroup. + + box(legendModel.get('orient'), contentGroup, legendModel.get('itemGap'), maxSize.width, maxSize.height); + var contentRect = contentGroup.getBoundingRect(); + var contentPos = [-contentRect.x, -contentRect.y]; + selectorGroup.markRedraw(); + contentGroup.markRedraw(); + + if (selector) { + // Place buttons in selectorGroup + box( // Buttons in selectorGroup always layout horizontally + 'horizontal', selectorGroup, legendModel.get('selectorItemGap', true)); + var selectorRect = selectorGroup.getBoundingRect(); + var selectorPos = [-selectorRect.x, -selectorRect.y]; + var selectorButtonGap = legendModel.get('selectorButtonGap', true); + var orientIdx = legendModel.getOrient().index; + var wh = orientIdx === 0 ? 'width' : 'height'; + var hw = orientIdx === 0 ? 'height' : 'width'; + var yx = orientIdx === 0 ? 'y' : 'x'; + + if (selectorPosition === 'end') { + selectorPos[orientIdx] += contentRect[wh] + selectorButtonGap; + } else { + contentPos[orientIdx] += selectorRect[wh] + selectorButtonGap; + } //Always align selector to content as 'middle' + + + selectorPos[1 - orientIdx] += contentRect[hw] / 2 - selectorRect[hw] / 2; + selectorGroup.x = selectorPos[0]; + selectorGroup.y = selectorPos[1]; + contentGroup.x = contentPos[0]; + contentGroup.y = contentPos[1]; + var mainRect = { + x: 0, + y: 0 + }; + mainRect[wh] = contentRect[wh] + selectorButtonGap + selectorRect[wh]; + mainRect[hw] = Math.max(contentRect[hw], selectorRect[hw]); + mainRect[yx] = Math.min(0, selectorRect[yx] + selectorPos[1 - orientIdx]); + return mainRect; + } else { + contentGroup.x = contentPos[0]; + contentGroup.y = contentPos[1]; + return this.group.getBoundingRect(); + } + }; + /** + * @protected + */ + + + LegendView.prototype.remove = function () { + this.getContentGroup().removeAll(); + this._isFirstRender = true; + }; + + LegendView.type = 'legend.plain'; + return LegendView; + }(ComponentView); + + function getLegendStyle(iconType, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected, api) { + /** + * Use series style if is inherit; + * elsewise, use legend style + */ + function handleCommonProps(style, visualStyle) { + // If lineStyle.width is 'auto', it is set to be 2 if series has border + if (style.lineWidth === 'auto') { + style.lineWidth = visualStyle.lineWidth > 0 ? 2 : 0; + } + + each$c(style, function (propVal, propName) { + style[propName] === 'inherit' && (style[propName] = visualStyle[propName]); + }); + } // itemStyle + + + var itemStyleModel = legendItemModel.getModel('itemStyle'); + var itemStyle = itemStyleModel.getItemStyle(); + var iconBrushType = iconType.lastIndexOf('empty', 0) === 0 ? 'fill' : 'stroke'; + var decalStyle = itemStyleModel.getShallow('decal'); + itemStyle.decal = !decalStyle || decalStyle === 'inherit' ? itemVisualStyle.decal : createOrUpdatePatternFromDecal(decalStyle, api); + + if (itemStyle.fill === 'inherit') { + /** + * Series with visualDrawType as 'stroke' should have + * series stroke as legend fill + */ + itemStyle.fill = itemVisualStyle[drawType]; + } + + if (itemStyle.stroke === 'inherit') { + /** + * icon type with "emptyXXX" should use fill color + * in visual style + */ + itemStyle.stroke = itemVisualStyle[iconBrushType]; + } + + if (itemStyle.opacity === 'inherit') { + /** + * Use lineStyle.opacity if drawType is stroke + */ + itemStyle.opacity = (drawType === 'fill' ? itemVisualStyle : lineVisualStyle).opacity; + } + + handleCommonProps(itemStyle, itemVisualStyle); // lineStyle + + var legendLineModel = legendItemModel.getModel('lineStyle'); + var lineStyle = legendLineModel.getLineStyle(); + handleCommonProps(lineStyle, lineVisualStyle); // Fix auto color to real color + + itemStyle.fill === 'auto' && (itemStyle.fill = itemVisualStyle.fill); + itemStyle.stroke === 'auto' && (itemStyle.stroke = itemVisualStyle.fill); + lineStyle.stroke === 'auto' && (lineStyle.stroke = itemVisualStyle.fill); + + if (!isSelected) { + var borderWidth = legendItemModel.get('inactiveBorderWidth'); + /** + * Since stroke is set to be inactiveBorderColor, it may occur that + * there is no border in series but border in legend, so we need to + * use border only when series has border if is set to be auto + */ + + var visualHasBorder = itemStyle[iconBrushType]; + itemStyle.lineWidth = borderWidth === 'auto' ? itemVisualStyle.lineWidth > 0 && visualHasBorder ? 2 : 0 : itemStyle.lineWidth; + itemStyle.fill = legendItemModel.get('inactiveColor'); + itemStyle.stroke = legendItemModel.get('inactiveBorderColor'); + lineStyle.stroke = legendLineModel.get('inactiveColor'); + lineStyle.lineWidth = legendLineModel.get('inactiveWidth'); + } + + return { + itemStyle: itemStyle, + lineStyle: lineStyle + }; + } + + function getDefaultLegendIcon(opt) { + var symboType = opt.icon || 'roundRect'; + var icon = createSymbol(symboType, 0, 0, opt.itemWidth, opt.itemHeight, opt.itemStyle.fill, opt.symbolKeepAspect); + icon.setStyle(opt.itemStyle); + icon.rotation = (opt.iconRotate || 0) * Math.PI / 180; + icon.setOrigin([opt.itemWidth / 2, opt.itemHeight / 2]); + + if (symboType.indexOf('empty') > -1) { + icon.style.stroke = icon.style.fill; + icon.style.fill = '#fff'; + icon.style.lineWidth = 2; + } + + return icon; + } + + function dispatchSelectAction(seriesName, dataName, api, excludeSeriesId) { + // downplay before unselect + dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId); + api.dispatchAction({ + type: 'legendToggleSelect', + name: seriesName != null ? seriesName : dataName + }); // highlight after select + // TODO higlight immediately may cause animation loss. + + dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId); + } + + function isUseHoverLayer(api) { + var list = api.getZr().storage.getDisplayList(); + var emphasisState; + var i = 0; + var len = list.length; + + while (i < len && !(emphasisState = list[i].states.emphasis)) { + i++; + } + + return emphasisState && emphasisState.hoverLayer; + } + + function dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId) { + // If element hover will move to a hoverLayer. + if (!isUseHoverLayer(api)) { + api.dispatchAction({ + type: 'highlight', + seriesName: seriesName, + name: dataName, + excludeSeriesId: excludeSeriesId + }); + } + } + + function dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId) { + // If element hover will move to a hoverLayer. + if (!isUseHoverLayer(api)) { + api.dispatchAction({ + type: 'downplay', + seriesName: seriesName, + name: dataName, + excludeSeriesId: excludeSeriesId + }); + } + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + function legendFilter(ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + + if (legendModels && legendModels.length) { + ecModel.filterSeries(function (series) { + // If in any legend component the status is not selected. + // Because in legend series is assumed selected when it is not in the legend data. + for (var i = 0; i < legendModels.length; i++) { + if (!legendModels[i].isSelected(series.name)) { + return false; + } + } + + return true; + }); + } + } + + function legendSelectActionHandler(methodName, payload, ecModel) { + var selectedMap = {}; + var isToggleSelect = methodName === 'toggleSelected'; + var isSelected; // Update all legend components + + ecModel.eachComponent('legend', function (legendModel) { + if (isToggleSelect && isSelected != null) { + // Force other legend has same selected status + // Or the first is toggled to true and other are toggled to false + // In the case one legend has some item unSelected in option. And if other legend + // doesn't has the item, they will assume it is selected. + legendModel[isSelected ? 'select' : 'unSelect'](payload.name); + } else if (methodName === 'allSelect' || methodName === 'inverseSelect') { + legendModel[methodName](); + } else { + legendModel[methodName](payload.name); + isSelected = legendModel.isSelected(payload.name); + } + + var legendData = legendModel.getData(); + each(legendData, function (model) { + var name = model.get('name'); // Wrap element + + if (name === '\n' || name === '') { + return; + } + + var isItemSelected = legendModel.isSelected(name); + + if (selectedMap.hasOwnProperty(name)) { + // Unselected if any legend is unselected + selectedMap[name] = selectedMap[name] && isItemSelected; + } else { + selectedMap[name] = isItemSelected; + } + }); + }); // Return the event explicitly + + return methodName === 'allSelect' || methodName === 'inverseSelect' ? { + selected: selectedMap + } : { + name: payload.name, + selected: selectedMap + }; + } + + function installLegendAction(registers) { + /** + * @event legendToggleSelect + * @type {Object} + * @property {string} type 'legendToggleSelect' + * @property {string} [from] + * @property {string} name Series name or data item name + */ + registers.registerAction('legendToggleSelect', 'legendselectchanged', curry(legendSelectActionHandler, 'toggleSelected')); + registers.registerAction('legendAllSelect', 'legendselectall', curry(legendSelectActionHandler, 'allSelect')); + registers.registerAction('legendInverseSelect', 'legendinverseselect', curry(legendSelectActionHandler, 'inverseSelect')); + /** + * @event legendSelect + * @type {Object} + * @property {string} type 'legendSelect' + * @property {string} name Series name or data item name + */ + + registers.registerAction('legendSelect', 'legendselected', curry(legendSelectActionHandler, 'select')); + /** + * @event legendUnSelect + * @type {Object} + * @property {string} type 'legendUnSelect' + * @property {string} name Series name or data item name + */ + + registers.registerAction('legendUnSelect', 'legendunselected', curry(legendSelectActionHandler, 'unSelect')); + } + + function install$H(registers) { + registers.registerComponentModel(LegendModel); + registers.registerComponentView(LegendView); + registers.registerProcessor(registers.PRIORITY.PROCESSOR.SERIES_FILTER, legendFilter); + registers.registerSubTypeDefaulter('legend', function () { + return 'plain'; + }); + installLegendAction(registers); + } + + var ScrollableLegendModel = + /** @class */ + function (_super) { + __extends(ScrollableLegendModel, _super); + + function ScrollableLegendModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ScrollableLegendModel.type; + return _this; + } + /** + * @param {number} scrollDataIndex + */ + + + ScrollableLegendModel.prototype.setScrollDataIndex = function (scrollDataIndex) { + this.option.scrollDataIndex = scrollDataIndex; + }; + + ScrollableLegendModel.prototype.init = function (option, parentModel, ecModel) { + var inputPositionParams = getLayoutParams(option); + + _super.prototype.init.call(this, option, parentModel, ecModel); + + mergeAndNormalizeLayoutParams$1(this, option, inputPositionParams); + }; + /** + * @override + */ + + + ScrollableLegendModel.prototype.mergeOption = function (option, ecModel) { + _super.prototype.mergeOption.call(this, option, ecModel); + + mergeAndNormalizeLayoutParams$1(this, this.option, option); + }; + + ScrollableLegendModel.type = 'legend.scroll'; + ScrollableLegendModel.defaultOption = inheritDefaultOption(LegendModel.defaultOption, { + scrollDataIndex: 0, + pageButtonItemGap: 5, + pageButtonGap: null, + pageButtonPosition: 'end', + pageFormatter: '{current}/{total}', + pageIcons: { + horizontal: ['M0,0L12,-10L12,10z', 'M0,0L-12,-10L-12,10z'], + vertical: ['M0,0L20,0L10,-20z', 'M0,0L20,0L10,20z'] + }, + pageIconColor: '#2f4554', + pageIconInactiveColor: '#aaa', + pageIconSize: 15, + pageTextStyle: { + color: '#333' + }, + animationDurationUpdate: 800 + }); + return ScrollableLegendModel; + }(LegendModel); + + function mergeAndNormalizeLayoutParams$1(legendModel, target, raw) { + var orient = legendModel.getOrient(); + var ignoreSize = [1, 1]; + ignoreSize[orient.index] = 0; + mergeLayoutParam(target, raw, { + type: 'box', + ignoreSize: !!ignoreSize + }); + } + + var Group$3 = Group; + var WH$1 = ['width', 'height']; + var XY$1 = ['x', 'y']; + + var ScrollableLegendView = + /** @class */ + function (_super) { + __extends(ScrollableLegendView, _super); + + function ScrollableLegendView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ScrollableLegendView.type; + _this.newlineDisabled = true; + _this._currentIndex = 0; + return _this; + } + + ScrollableLegendView.prototype.init = function () { + _super.prototype.init.call(this); + + this.group.add(this._containerGroup = new Group$3()); + + this._containerGroup.add(this.getContentGroup()); + + this.group.add(this._controllerGroup = new Group$3()); + }; + /** + * @override + */ + + + ScrollableLegendView.prototype.resetInner = function () { + _super.prototype.resetInner.call(this); + + this._controllerGroup.removeAll(); + + this._containerGroup.removeClipPath(); + + this._containerGroup.__rectSize = null; + }; + /** + * @override + */ + + + ScrollableLegendView.prototype.renderInner = function (itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition) { + var self = this; // Render content items. + + _super.prototype.renderInner.call(this, itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition); + + var controllerGroup = this._controllerGroup; // FIXME: support be 'auto' adapt to size number text length, + // e.g., '3/12345' should not overlap with the control arrow button. + + var pageIconSize = legendModel.get('pageIconSize', true); + var pageIconSizeArr = isArray(pageIconSize) ? pageIconSize : [pageIconSize, pageIconSize]; + createPageButton('pagePrev', 0); + var pageTextStyleModel = legendModel.getModel('pageTextStyle'); + controllerGroup.add(new ZRText({ + name: 'pageText', + style: { + // Placeholder to calculate a proper layout. + text: 'xx/xx', + fill: pageTextStyleModel.getTextColor(), + font: pageTextStyleModel.getFont(), + verticalAlign: 'middle', + align: 'center' + }, + silent: true + })); + createPageButton('pageNext', 1); + + function createPageButton(name, iconIdx) { + var pageDataIndexName = name + 'DataIndex'; + var icon = createIcon(legendModel.get('pageIcons', true)[legendModel.getOrient().name][iconIdx], { + // Buttons will be created in each render, so we do not need + // to worry about avoiding using legendModel kept in scope. + onclick: bind(self._pageGo, self, pageDataIndexName, legendModel, api) + }, { + x: -pageIconSizeArr[0] / 2, + y: -pageIconSizeArr[1] / 2, + width: pageIconSizeArr[0], + height: pageIconSizeArr[1] + }); + icon.name = name; + controllerGroup.add(icon); + } + }; + /** + * @override + */ + + + ScrollableLegendView.prototype.layoutInner = function (legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition) { + var selectorGroup = this.getSelectorGroup(); + var orientIdx = legendModel.getOrient().index; + var wh = WH$1[orientIdx]; + var xy = XY$1[orientIdx]; + var hw = WH$1[1 - orientIdx]; + var yx = XY$1[1 - orientIdx]; + selector && box( // Buttons in selectorGroup always layout horizontally + 'horizontal', selectorGroup, legendModel.get('selectorItemGap', true)); + var selectorButtonGap = legendModel.get('selectorButtonGap', true); + var selectorRect = selectorGroup.getBoundingRect(); + var selectorPos = [-selectorRect.x, -selectorRect.y]; + var processMaxSize = clone(maxSize); + selector && (processMaxSize[wh] = maxSize[wh] - selectorRect[wh] - selectorButtonGap); + + var mainRect = this._layoutContentAndController(legendModel, isFirstRender, processMaxSize, orientIdx, wh, hw, yx, xy); + + if (selector) { + if (selectorPosition === 'end') { + selectorPos[orientIdx] += mainRect[wh] + selectorButtonGap; + } else { + var offset = selectorRect[wh] + selectorButtonGap; + selectorPos[orientIdx] -= offset; + mainRect[xy] -= offset; + } + + mainRect[wh] += selectorRect[wh] + selectorButtonGap; + selectorPos[1 - orientIdx] += mainRect[yx] + mainRect[hw] / 2 - selectorRect[hw] / 2; + mainRect[hw] = Math.max(mainRect[hw], selectorRect[hw]); + mainRect[yx] = Math.min(mainRect[yx], selectorRect[yx] + selectorPos[1 - orientIdx]); + selectorGroup.x = selectorPos[0]; + selectorGroup.y = selectorPos[1]; + selectorGroup.markRedraw(); + } + + return mainRect; + }; + + ScrollableLegendView.prototype._layoutContentAndController = function (legendModel, isFirstRender, maxSize, orientIdx, wh, hw, yx, xy) { + var contentGroup = this.getContentGroup(); + var containerGroup = this._containerGroup; + var controllerGroup = this._controllerGroup; // Place items in contentGroup. + + box(legendModel.get('orient'), contentGroup, legendModel.get('itemGap'), !orientIdx ? null : maxSize.width, orientIdx ? null : maxSize.height); + box( // Buttons in controller are layout always horizontally. + 'horizontal', controllerGroup, legendModel.get('pageButtonItemGap', true)); + var contentRect = contentGroup.getBoundingRect(); + var controllerRect = controllerGroup.getBoundingRect(); + var showController = this._showController = contentRect[wh] > maxSize[wh]; // In case that the inner elements of contentGroup layout do not based on [0, 0] + + var contentPos = [-contentRect.x, -contentRect.y]; // Remain contentPos when scroll animation perfroming. + // If first rendering, `contentGroup.position` is [0, 0], which + // does not make sense and may cause unexepcted animation if adopted. + + if (!isFirstRender) { + contentPos[orientIdx] = contentGroup[xy]; + } // Layout container group based on 0. + + + var containerPos = [0, 0]; + var controllerPos = [-controllerRect.x, -controllerRect.y]; + var pageButtonGap = retrieve2(legendModel.get('pageButtonGap', true), legendModel.get('itemGap', true)); // Place containerGroup and controllerGroup and contentGroup. + + if (showController) { + var pageButtonPosition = legendModel.get('pageButtonPosition', true); // controller is on the right / bottom. + + if (pageButtonPosition === 'end') { + controllerPos[orientIdx] += maxSize[wh] - controllerRect[wh]; + } // controller is on the left / top. + else { + containerPos[orientIdx] += controllerRect[wh] + pageButtonGap; + } + } // Always align controller to content as 'middle'. + + + controllerPos[1 - orientIdx] += contentRect[hw] / 2 - controllerRect[hw] / 2; + contentGroup.setPosition(contentPos); + containerGroup.setPosition(containerPos); + controllerGroup.setPosition(controllerPos); // Calculate `mainRect` and set `clipPath`. + // mainRect should not be calculated by `this.group.getBoundingRect()` + // for sake of the overflow. + + var mainRect = { + x: 0, + y: 0 + }; // Consider content may be overflow (should be clipped). + + mainRect[wh] = showController ? maxSize[wh] : contentRect[wh]; + mainRect[hw] = Math.max(contentRect[hw], controllerRect[hw]); // `containerRect[yx] + containerPos[1 - orientIdx]` is 0. + + mainRect[yx] = Math.min(0, controllerRect[yx] + controllerPos[1 - orientIdx]); + containerGroup.__rectSize = maxSize[wh]; + + if (showController) { + var clipShape = { + x: 0, + y: 0 + }; + clipShape[wh] = Math.max(maxSize[wh] - controllerRect[wh] - pageButtonGap, 0); + clipShape[hw] = mainRect[hw]; + containerGroup.setClipPath(new Rect({ + shape: clipShape + })); // Consider content may be larger than container, container rect + // can not be obtained from `containerGroup.getBoundingRect()`. + + containerGroup.__rectSize = clipShape[wh]; + } else { + // Do not remove or ignore controller. Keep them set as placeholders. + controllerGroup.eachChild(function (child) { + child.attr({ + invisible: true, + silent: true + }); + }); + } // Content translate animation. + + + var pageInfo = this._getPageInfo(legendModel); + + pageInfo.pageIndex != null && updateProps(contentGroup, { + x: pageInfo.contentPosition[0], + y: pageInfo.contentPosition[1] + }, // When switch from "show controller" to "not show controller", view should be + // updated immediately without animation, otherwise causes weird effect. + showController ? legendModel : null); + + this._updatePageInfoView(legendModel, pageInfo); + + return mainRect; + }; + + ScrollableLegendView.prototype._pageGo = function (to, legendModel, api) { + var scrollDataIndex = this._getPageInfo(legendModel)[to]; + + scrollDataIndex != null && api.dispatchAction({ + type: 'legendScroll', + scrollDataIndex: scrollDataIndex, + legendId: legendModel.id + }); + }; + + ScrollableLegendView.prototype._updatePageInfoView = function (legendModel, pageInfo) { + var controllerGroup = this._controllerGroup; + each(['pagePrev', 'pageNext'], function (name) { + var key = name + 'DataIndex'; + var canJump = pageInfo[key] != null; + var icon = controllerGroup.childOfName(name); + + if (icon) { + icon.setStyle('fill', canJump ? legendModel.get('pageIconColor', true) : legendModel.get('pageIconInactiveColor', true)); + icon.cursor = canJump ? 'pointer' : 'default'; + } + }); + var pageText = controllerGroup.childOfName('pageText'); + var pageFormatter = legendModel.get('pageFormatter'); + var pageIndex = pageInfo.pageIndex; + var current = pageIndex != null ? pageIndex + 1 : 0; + var total = pageInfo.pageCount; + pageText && pageFormatter && pageText.setStyle('text', isString(pageFormatter) ? pageFormatter.replace('{current}', current == null ? '' : current + '').replace('{total}', total == null ? '' : total + '') : pageFormatter({ + current: current, + total: total + })); + }; + /** + * contentPosition: Array.<number>, null when data item not found. + * pageIndex: number, null when data item not found. + * pageCount: number, always be a number, can be 0. + * pagePrevDataIndex: number, null when no previous page. + * pageNextDataIndex: number, null when no next page. + * } + */ + + + ScrollableLegendView.prototype._getPageInfo = function (legendModel) { + var scrollDataIndex = legendModel.get('scrollDataIndex', true); + var contentGroup = this.getContentGroup(); + var containerRectSize = this._containerGroup.__rectSize; + var orientIdx = legendModel.getOrient().index; + var wh = WH$1[orientIdx]; + var xy = XY$1[orientIdx]; + + var targetItemIndex = this._findTargetItemIndex(scrollDataIndex); + + var children = contentGroup.children(); + var targetItem = children[targetItemIndex]; + var itemCount = children.length; + var pCount = !itemCount ? 0 : 1; + var result = { + contentPosition: [contentGroup.x, contentGroup.y], + pageCount: pCount, + pageIndex: pCount - 1, + pagePrevDataIndex: null, + pageNextDataIndex: null + }; + + if (!targetItem) { + return result; + } + + var targetItemInfo = getItemInfo(targetItem); + result.contentPosition[orientIdx] = -targetItemInfo.s; // Strategy: + // (1) Always align based on the left/top most item. + // (2) It is user-friendly that the last item shown in the + // current window is shown at the begining of next window. + // Otherwise if half of the last item is cut by the window, + // it will have no chance to display entirely. + // (3) Consider that item size probably be different, we + // have calculate pageIndex by size rather than item index, + // and we can not get page index directly by division. + // (4) The window is to narrow to contain more than + // one item, we should make sure that the page can be fliped. + + for (var i = targetItemIndex + 1, winStartItemInfo = targetItemInfo, winEndItemInfo = targetItemInfo, currItemInfo = null; i <= itemCount; ++i) { + currItemInfo = getItemInfo(children[i]); + + if ( // Half of the last item is out of the window. + !currItemInfo && winEndItemInfo.e > winStartItemInfo.s + containerRectSize || // If the current item does not intersect with the window, the new page + // can be started at the current item or the last item. + currItemInfo && !intersect(currItemInfo, winStartItemInfo.s)) { + if (winEndItemInfo.i > winStartItemInfo.i) { + winStartItemInfo = winEndItemInfo; + } else { + // e.g., when page size is smaller than item size. + winStartItemInfo = currItemInfo; + } + + if (winStartItemInfo) { + if (result.pageNextDataIndex == null) { + result.pageNextDataIndex = winStartItemInfo.i; + } + + ++result.pageCount; + } + } + + winEndItemInfo = currItemInfo; + } + + for (var i = targetItemIndex - 1, winStartItemInfo = targetItemInfo, winEndItemInfo = targetItemInfo, currItemInfo = null; i >= -1; --i) { + currItemInfo = getItemInfo(children[i]); + + if ( // If the the end item does not intersect with the window started + // from the current item, a page can be settled. + (!currItemInfo || !intersect(winEndItemInfo, currItemInfo.s)) && // e.g., when page size is smaller than item size. + winStartItemInfo.i < winEndItemInfo.i) { + winEndItemInfo = winStartItemInfo; + + if (result.pagePrevDataIndex == null) { + result.pagePrevDataIndex = winStartItemInfo.i; + } + + ++result.pageCount; + ++result.pageIndex; + } + + winStartItemInfo = currItemInfo; + } + + return result; + + function getItemInfo(el) { + if (el) { + var itemRect = el.getBoundingRect(); + var start = itemRect[xy] + el[xy]; + return { + s: start, + e: start + itemRect[wh], + i: el.__legendDataIndex + }; + } + } + + function intersect(itemInfo, winStart) { + return itemInfo.e >= winStart && itemInfo.s <= winStart + containerRectSize; + } + }; + + ScrollableLegendView.prototype._findTargetItemIndex = function (targetDataIndex) { + if (!this._showController) { + return 0; + } + + var index; + var contentGroup = this.getContentGroup(); + var defaultIndex; + contentGroup.eachChild(function (child, idx) { + var legendDataIdx = child.__legendDataIndex; // FIXME + // If the given targetDataIndex (from model) is illegal, + // we use defaultIndex. But the index on the legend model and + // action payload is still illegal. That case will not be + // changed until some scenario requires. + + if (defaultIndex == null && legendDataIdx != null) { + defaultIndex = idx; + } + + if (legendDataIdx === targetDataIndex) { + index = idx; + } + }); + return index != null ? index : defaultIndex; + }; + + ScrollableLegendView.type = 'legend.scroll'; + return ScrollableLegendView; + }(LegendView); + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + function installScrollableLegendAction(registers) { + /** + * @event legendScroll + * @type {Object} + * @property {string} type 'legendScroll' + * @property {string} scrollDataIndex + */ + registers.registerAction('legendScroll', 'legendscroll', function (payload, ecModel) { + var scrollDataIndex = payload.scrollDataIndex; + scrollDataIndex != null && ecModel.eachComponent({ + mainType: 'legend', + subType: 'scroll', + query: payload + }, function (legendModel) { + legendModel.setScrollDataIndex(scrollDataIndex); + }); + }); + } + + function install$I(registers) { + use(install$H); + registers.registerComponentModel(ScrollableLegendModel); + registers.registerComponentView(ScrollableLegendView); + installScrollableLegendAction(registers); + } + + function install$J(registers) { + use(install$H); + use(install$I); + } + + var InsideZoomModel = + /** @class */ + function (_super) { + __extends(InsideZoomModel, _super); + + function InsideZoomModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = InsideZoomModel.type; + return _this; + } + + InsideZoomModel.type = 'dataZoom.inside'; + InsideZoomModel.defaultOption = inheritDefaultOption(DataZoomModel.defaultOption, { + disabled: false, + zoomLock: false, + zoomOnMouseWheel: true, + moveOnMouseMove: true, + moveOnMouseWheel: false, + preventDefaultMouseMove: true + }); + return InsideZoomModel; + }(DataZoomModel); + + var inner$k = makeInner(); + function setViewInfoToCoordSysRecord(api, dataZoomModel, getRange) { + inner$k(api).coordSysRecordMap.each(function (coordSysRecord) { + var dzInfo = coordSysRecord.dataZoomInfoMap.get(dataZoomModel.uid); + + if (dzInfo) { + dzInfo.getRange = getRange; + } + }); + } + function disposeCoordSysRecordIfNeeded(api, dataZoomModel) { + var coordSysRecordMap = inner$k(api).coordSysRecordMap; + var coordSysKeyArr = coordSysRecordMap.keys(); + + for (var i = 0; i < coordSysKeyArr.length; i++) { + var coordSysKey = coordSysKeyArr[i]; + var coordSysRecord = coordSysRecordMap.get(coordSysKey); + var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap; + + if (dataZoomInfoMap) { + var dzUid = dataZoomModel.uid; + var dzInfo = dataZoomInfoMap.get(dzUid); + + if (dzInfo) { + dataZoomInfoMap.removeKey(dzUid); + + if (!dataZoomInfoMap.keys().length) { + disposeCoordSysRecord(coordSysRecordMap, coordSysRecord); + } + } + } + } + } + + function disposeCoordSysRecord(coordSysRecordMap, coordSysRecord) { + if (coordSysRecord) { + coordSysRecordMap.removeKey(coordSysRecord.model.uid); + var controller = coordSysRecord.controller; + controller && controller.dispose(); + } + } + + function createCoordSysRecord(api, coordSysModel) { + // These init props will never change after record created. + var coordSysRecord = { + model: coordSysModel, + containsPoint: curry(containsPoint, coordSysModel), + dispatchAction: curry(dispatchAction$1, api), + dataZoomInfoMap: null, + controller: null + }; // Must not do anything depends on coordSysRecord outside the event handler here, + // because coordSysRecord not completed yet. + + var controller = coordSysRecord.controller = new RoamController(api.getZr()); + each(['pan', 'zoom', 'scrollMove'], function (eventName) { + controller.on(eventName, function (event) { + var batch = []; + coordSysRecord.dataZoomInfoMap.each(function (dzInfo) { + // Check whether the behaviors (zoomOnMouseWheel, moveOnMouseMove, + // moveOnMouseWheel, ...) enabled. + if (!event.isAvailableBehavior(dzInfo.model.option)) { + return; + } + + var method = (dzInfo.getRange || {})[eventName]; + var range = method && method(dzInfo.dzReferCoordSysInfo, coordSysRecord.model.mainType, coordSysRecord.controller, event); + !dzInfo.model.get('disabled', true) && range && batch.push({ + dataZoomId: dzInfo.model.id, + start: range[0], + end: range[1] + }); + }); + batch.length && coordSysRecord.dispatchAction(batch); + }); + }); + return coordSysRecord; + } + /** + * This action will be throttled. + */ + + + function dispatchAction$1(api, batch) { + if (!api.isDisposed()) { + api.dispatchAction({ + type: 'dataZoom', + animation: { + easing: 'cubicOut', + duration: 100 + }, + batch: batch + }); + } + } + + function containsPoint(coordSysModel, e, x, y) { + return coordSysModel.coordinateSystem.containPoint([x, y]); + } + /** + * Merge roamController settings when multiple dataZooms share one roamController. + */ + + + function mergeControllerParams(dataZoomInfoMap) { + var controlType; // DO NOT use reserved word (true, false, undefined) as key literally. Even if encapsulated + // as string, it is probably revert to reserved word by compress tool. See #7411. + + var prefix = 'type_'; + var typePriority = { + 'type_true': 2, + 'type_move': 1, + 'type_false': 0, + 'type_undefined': -1 + }; + var preventDefaultMouseMove = true; + dataZoomInfoMap.each(function (dataZoomInfo) { + var dataZoomModel = dataZoomInfo.model; + var oneType = dataZoomModel.get('disabled', true) ? false : dataZoomModel.get('zoomLock', true) ? 'move' : true; + + if (typePriority[prefix + oneType] > typePriority[prefix + controlType]) { + controlType = oneType; + } // Prevent default move event by default. If one false, do not prevent. Otherwise + // users may be confused why it does not work when multiple insideZooms exist. + + + preventDefaultMouseMove = preventDefaultMouseMove && dataZoomModel.get('preventDefaultMouseMove', true); + }); + return { + controlType: controlType, + opt: { + // RoamController will enable all of these functionalities, + // and the final behavior is determined by its event listener + // provided by each inside zoom. + zoomOnMouseWheel: true, + moveOnMouseMove: true, + moveOnMouseWheel: true, + preventDefaultMouseMove: !!preventDefaultMouseMove + } + }; + } + + function installDataZoomRoamProcessor(registers) { + registers.registerProcessor(registers.PRIORITY.PROCESSOR.FILTER, function (ecModel, api) { + var apiInner = inner$k(api); + var coordSysRecordMap = apiInner.coordSysRecordMap || (apiInner.coordSysRecordMap = createHashMap()); + coordSysRecordMap.each(function (coordSysRecord) { + // `coordSysRecordMap` always exists (becuase it hold the `roam controller`, which should + // better not re-create each time), but clear `dataZoomInfoMap` each round of the workflow. + coordSysRecord.dataZoomInfoMap = null; + }); + ecModel.eachComponent({ + mainType: 'dataZoom', + subType: 'inside' + }, function (dataZoomModel) { + var dzReferCoordSysWrap = collectReferCoordSysModelInfo(dataZoomModel); + each(dzReferCoordSysWrap.infoList, function (dzCoordSysInfo) { + var coordSysUid = dzCoordSysInfo.model.uid; + var coordSysRecord = coordSysRecordMap.get(coordSysUid) || coordSysRecordMap.set(coordSysUid, createCoordSysRecord(api, dzCoordSysInfo.model)); + var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap || (coordSysRecord.dataZoomInfoMap = createHashMap()); // Notice these props might be changed each time for a single dataZoomModel. + + dataZoomInfoMap.set(dataZoomModel.uid, { + dzReferCoordSysInfo: dzCoordSysInfo, + model: dataZoomModel, + getRange: null + }); + }); + }); // (1) Merge dataZoom settings for each coord sys and set to the roam controller. + // (2) Clear coord sys if not refered by any dataZoom. + + coordSysRecordMap.each(function (coordSysRecord) { + var controller = coordSysRecord.controller; + var firstDzInfo; + var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap; + + if (dataZoomInfoMap) { + var firstDzKey = dataZoomInfoMap.keys()[0]; + + if (firstDzKey != null) { + firstDzInfo = dataZoomInfoMap.get(firstDzKey); + } + } + + if (!firstDzInfo) { + disposeCoordSysRecord(coordSysRecordMap, coordSysRecord); + return; + } + + var controllerParams = mergeControllerParams(dataZoomInfoMap); + controller.enable(controllerParams.controlType, controllerParams.opt); + controller.setPointerChecker(coordSysRecord.containsPoint); + createOrUpdate(coordSysRecord, 'dispatchAction', firstDzInfo.model.get('throttle', true), 'fixRate'); + }); + }); + } + + var InsideZoomView = + /** @class */ + function (_super) { + __extends(InsideZoomView, _super); + + function InsideZoomView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'dataZoom.inside'; + return _this; + } + + InsideZoomView.prototype.render = function (dataZoomModel, ecModel, api) { + _super.prototype.render.apply(this, arguments); + + if (dataZoomModel.noTarget()) { + this._clear(); + + return; + } // Hence the `throttle` util ensures to preserve command order, + // here simply updating range all the time will not cause missing + // any of the the roam change. + + + this.range = dataZoomModel.getPercentRange(); // Reset controllers. + + setViewInfoToCoordSysRecord(api, dataZoomModel, { + pan: bind(getRangeHandlers.pan, this), + zoom: bind(getRangeHandlers.zoom, this), + scrollMove: bind(getRangeHandlers.scrollMove, this) + }); + }; + + InsideZoomView.prototype.dispose = function () { + this._clear(); + + _super.prototype.dispose.apply(this, arguments); + }; + + InsideZoomView.prototype._clear = function () { + disposeCoordSysRecordIfNeeded(this.api, this.dataZoomModel); + this.range = null; + }; + + InsideZoomView.type = 'dataZoom.inside'; + return InsideZoomView; + }(DataZoomView); + + var getRangeHandlers = { + zoom: function (coordSysInfo, coordSysMainType, controller, e) { + var lastRange = this.range; + var range = lastRange.slice(); // Calculate transform by the first axis. + + var axisModel = coordSysInfo.axisModels[0]; + + if (!axisModel) { + return; + } + + var directionInfo = getDirectionInfo[coordSysMainType](null, [e.originX, e.originY], axisModel, controller, coordSysInfo); + var percentPoint = (directionInfo.signal > 0 ? directionInfo.pixelStart + directionInfo.pixelLength - directionInfo.pixel : directionInfo.pixel - directionInfo.pixelStart) / directionInfo.pixelLength * (range[1] - range[0]) + range[0]; + var scale = Math.max(1 / e.scale, 0); + range[0] = (range[0] - percentPoint) * scale + percentPoint; + range[1] = (range[1] - percentPoint) * scale + percentPoint; // Restrict range. + + var minMaxSpan = this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan(); + sliderMove(0, range, [0, 100], 0, minMaxSpan.minSpan, minMaxSpan.maxSpan); + this.range = range; + + if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) { + return range; + } + }, + pan: makeMover(function (range, axisModel, coordSysInfo, coordSysMainType, controller, e) { + var directionInfo = getDirectionInfo[coordSysMainType]([e.oldX, e.oldY], [e.newX, e.newY], axisModel, controller, coordSysInfo); + return directionInfo.signal * (range[1] - range[0]) * directionInfo.pixel / directionInfo.pixelLength; + }), + scrollMove: makeMover(function (range, axisModel, coordSysInfo, coordSysMainType, controller, e) { + var directionInfo = getDirectionInfo[coordSysMainType]([0, 0], [e.scrollDelta, e.scrollDelta], axisModel, controller, coordSysInfo); + return directionInfo.signal * (range[1] - range[0]) * e.scrollDelta; + }) + }; + + function makeMover(getPercentDelta) { + return function (coordSysInfo, coordSysMainType, controller, e) { + var lastRange = this.range; + var range = lastRange.slice(); // Calculate transform by the first axis. + + var axisModel = coordSysInfo.axisModels[0]; + + if (!axisModel) { + return; + } + + var percentDelta = getPercentDelta(range, axisModel, coordSysInfo, coordSysMainType, controller, e); + sliderMove(percentDelta, range, [0, 100], 'all'); + this.range = range; + + if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) { + return range; + } + }; + } + + var getDirectionInfo = { + grid: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) { + var axis = axisModel.axis; + var ret = {}; + var rect = coordSysInfo.model.coordinateSystem.getRect(); + oldPoint = oldPoint || [0, 0]; + + if (axis.dim === 'x') { + ret.pixel = newPoint[0] - oldPoint[0]; + ret.pixelLength = rect.width; + ret.pixelStart = rect.x; + ret.signal = axis.inverse ? 1 : -1; + } else { + // axis.dim === 'y' + ret.pixel = newPoint[1] - oldPoint[1]; + ret.pixelLength = rect.height; + ret.pixelStart = rect.y; + ret.signal = axis.inverse ? -1 : 1; + } + + return ret; + }, + polar: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) { + var axis = axisModel.axis; + var ret = {}; + var polar = coordSysInfo.model.coordinateSystem; + var radiusExtent = polar.getRadiusAxis().getExtent(); + var angleExtent = polar.getAngleAxis().getExtent(); + oldPoint = oldPoint ? polar.pointToCoord(oldPoint) : [0, 0]; + newPoint = polar.pointToCoord(newPoint); + + if (axisModel.mainType === 'radiusAxis') { + ret.pixel = newPoint[0] - oldPoint[0]; // ret.pixelLength = Math.abs(radiusExtent[1] - radiusExtent[0]); + // ret.pixelStart = Math.min(radiusExtent[0], radiusExtent[1]); + + ret.pixelLength = radiusExtent[1] - radiusExtent[0]; + ret.pixelStart = radiusExtent[0]; + ret.signal = axis.inverse ? 1 : -1; + } else { + // 'angleAxis' + ret.pixel = newPoint[1] - oldPoint[1]; // ret.pixelLength = Math.abs(angleExtent[1] - angleExtent[0]); + // ret.pixelStart = Math.min(angleExtent[0], angleExtent[1]); + + ret.pixelLength = angleExtent[1] - angleExtent[0]; + ret.pixelStart = angleExtent[0]; + ret.signal = axis.inverse ? -1 : 1; + } + + return ret; + }, + singleAxis: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) { + var axis = axisModel.axis; + var rect = coordSysInfo.model.coordinateSystem.getRect(); + var ret = {}; + oldPoint = oldPoint || [0, 0]; + + if (axis.orient === 'horizontal') { + ret.pixel = newPoint[0] - oldPoint[0]; + ret.pixelLength = rect.width; + ret.pixelStart = rect.x; + ret.signal = axis.inverse ? 1 : -1; + } else { + // 'vertical' + ret.pixel = newPoint[1] - oldPoint[1]; + ret.pixelLength = rect.height; + ret.pixelStart = rect.y; + ret.signal = axis.inverse ? -1 : 1; + } + + return ret; + } + }; + + function install$K(registers) { + installCommon(registers); + registers.registerComponentModel(InsideZoomModel); + registers.registerComponentView(InsideZoomView); + installDataZoomRoamProcessor(registers); + } + + var SliderZoomModel = + /** @class */ + function (_super) { + __extends(SliderZoomModel, _super); + + function SliderZoomModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SliderZoomModel.type; + return _this; + } + + SliderZoomModel.type = 'dataZoom.slider'; + SliderZoomModel.layoutMode = 'box'; + SliderZoomModel.defaultOption = inheritDefaultOption(DataZoomModel.defaultOption, { + show: true, + // deault value can only be drived in view stage. + right: 'ph', + top: 'ph', + width: 'ph', + height: 'ph', + left: null, + bottom: null, + borderColor: '#d2dbee', + borderRadius: 3, + backgroundColor: 'rgba(47,69,84,0)', + // dataBackgroundColor: '#ddd', + dataBackground: { + lineStyle: { + color: '#d2dbee', + width: 0.5 + }, + areaStyle: { + color: '#d2dbee', + opacity: 0.2 + } + }, + selectedDataBackground: { + lineStyle: { + color: '#8fb0f7', + width: 0.5 + }, + areaStyle: { + color: '#8fb0f7', + opacity: 0.2 + } + }, + // Color of selected window. + fillerColor: 'rgba(135,175,274,0.2)', + handleIcon: 'path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z', + // Percent of the slider height + handleSize: '100%', + handleStyle: { + color: '#fff', + borderColor: '#ACB8D1' + }, + moveHandleSize: 7, + moveHandleIcon: 'path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z', + moveHandleStyle: { + color: '#D2DBEE', + opacity: 0.7 + }, + showDetail: true, + showDataShadow: 'auto', + realtime: true, + zoomLock: false, + textStyle: { + color: '#6E7079' + }, + brushSelect: true, + brushStyle: { + color: 'rgba(135,175,274,0.15)' + }, + emphasis: { + handleStyle: { + borderColor: '#8FB0F7' + }, + moveHandleStyle: { + color: '#8FB0F7' + } + } + }); + return SliderZoomModel; + }(DataZoomModel); + + var Rect$2 = Rect; // Constants + + var DEFAULT_LOCATION_EDGE_GAP = 7; + var DEFAULT_FRAME_BORDER_WIDTH = 1; + var DEFAULT_FILLER_SIZE = 30; + var DEFAULT_MOVE_HANDLE_SIZE = 7; + var HORIZONTAL = 'horizontal'; + var VERTICAL = 'vertical'; + var LABEL_GAP = 5; + var SHOW_DATA_SHADOW_SERIES_TYPE = ['line', 'bar', 'candlestick', 'scatter']; + var REALTIME_ANIMATION_CONFIG = { + easing: 'cubicOut', + duration: 100, + delay: 0 + }; + + var SliderZoomView = + /** @class */ + function (_super) { + __extends(SliderZoomView, _super); + + function SliderZoomView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SliderZoomView.type; + _this._displayables = {}; + return _this; + } + + SliderZoomView.prototype.init = function (ecModel, api) { + this.api = api; // A unique handler for each dataZoom component + + this._onBrush = bind(this._onBrush, this); + this._onBrushEnd = bind(this._onBrushEnd, this); + }; + + SliderZoomView.prototype.render = function (dataZoomModel, ecModel, api, payload) { + _super.prototype.render.apply(this, arguments); + + createOrUpdate(this, '_dispatchZoomAction', dataZoomModel.get('throttle'), 'fixRate'); + this._orient = dataZoomModel.getOrient(); + + if (dataZoomModel.get('show') === false) { + this.group.removeAll(); + return; + } + + if (dataZoomModel.noTarget()) { + this._clear(); + + this.group.removeAll(); + return; + } // Notice: this._resetInterval() should not be executed when payload.type + // is 'dataZoom', origin this._range should be maintained, otherwise 'pan' + // or 'zoom' info will be missed because of 'throttle' of this.dispatchAction, + + + if (!payload || payload.type !== 'dataZoom' || payload.from !== this.uid) { + this._buildView(); + } + + this._updateView(); + }; + + SliderZoomView.prototype.dispose = function () { + this._clear(); + + _super.prototype.dispose.apply(this, arguments); + }; + + SliderZoomView.prototype._clear = function () { + clear(this, '_dispatchZoomAction'); + var zr = this.api.getZr(); + zr.off('mousemove', this._onBrush); + zr.off('mouseup', this._onBrushEnd); + }; + + SliderZoomView.prototype._buildView = function () { + var thisGroup = this.group; + thisGroup.removeAll(); + this._brushing = false; + this._displayables.brushRect = null; + + this._resetLocation(); + + this._resetInterval(); + + var barGroup = this._displayables.sliderGroup = new Group(); + + this._renderBackground(); + + this._renderHandle(); + + this._renderDataShadow(); + + thisGroup.add(barGroup); + + this._positionGroup(); + }; + + SliderZoomView.prototype._resetLocation = function () { + var dataZoomModel = this.dataZoomModel; + var api = this.api; + var showMoveHandle = dataZoomModel.get('brushSelect'); + var moveHandleSize = showMoveHandle ? DEFAULT_MOVE_HANDLE_SIZE : 0; // If some of x/y/width/height are not specified, + // auto-adapt according to target grid. + + var coordRect = this._findCoordRect(); + + var ecSize = { + width: api.getWidth(), + height: api.getHeight() + }; // Default align by coordinate system rect. + + var positionInfo = this._orient === HORIZONTAL ? { + // Why using 'right', because right should be used in vertical, + // and it is better to be consistent for dealing with position param merge. + right: ecSize.width - coordRect.x - coordRect.width, + top: ecSize.height - DEFAULT_FILLER_SIZE - DEFAULT_LOCATION_EDGE_GAP - moveHandleSize, + width: coordRect.width, + height: DEFAULT_FILLER_SIZE + } : { + right: DEFAULT_LOCATION_EDGE_GAP, + top: coordRect.y, + width: DEFAULT_FILLER_SIZE, + height: coordRect.height + }; // Do not write back to option and replace value 'ph', because + // the 'ph' value should be recalculated when resize. + + var layoutParams = getLayoutParams(dataZoomModel.option); // Replace the placeholder value. + + each(['right', 'top', 'width', 'height'], function (name) { + if (layoutParams[name] === 'ph') { + layoutParams[name] = positionInfo[name]; + } + }); + var layoutRect = getLayoutRect(layoutParams, ecSize); + this._location = { + x: layoutRect.x, + y: layoutRect.y + }; + this._size = [layoutRect.width, layoutRect.height]; + this._orient === VERTICAL && this._size.reverse(); + }; + + SliderZoomView.prototype._positionGroup = function () { + var thisGroup = this.group; + var location = this._location; + var orient = this._orient; // Just use the first axis to determine mapping. + + var targetAxisModel = this.dataZoomModel.getFirstTargetAxisModel(); + var inverse = targetAxisModel && targetAxisModel.get('inverse'); + var sliderGroup = this._displayables.sliderGroup; + var otherAxisInverse = (this._dataShadowInfo || {}).otherAxisInverse; // Transform barGroup. + + sliderGroup.attr(orient === HORIZONTAL && !inverse ? { + scaleY: otherAxisInverse ? 1 : -1, + scaleX: 1 + } : orient === HORIZONTAL && inverse ? { + scaleY: otherAxisInverse ? 1 : -1, + scaleX: -1 + } : orient === VERTICAL && !inverse ? { + scaleY: otherAxisInverse ? -1 : 1, + scaleX: 1, + rotation: Math.PI / 2 + } // Dont use Math.PI, considering shadow direction. + : { + scaleY: otherAxisInverse ? -1 : 1, + scaleX: -1, + rotation: Math.PI / 2 + }); // Position barGroup + + var rect = thisGroup.getBoundingRect([sliderGroup]); + thisGroup.x = location.x - rect.x; + thisGroup.y = location.y - rect.y; + thisGroup.markRedraw(); + }; + + SliderZoomView.prototype._getViewExtent = function () { + return [0, this._size[0]]; + }; + + SliderZoomView.prototype._renderBackground = function () { + var dataZoomModel = this.dataZoomModel; + var size = this._size; + var barGroup = this._displayables.sliderGroup; + var brushSelect = dataZoomModel.get('brushSelect'); + barGroup.add(new Rect$2({ + silent: true, + shape: { + x: 0, + y: 0, + width: size[0], + height: size[1] + }, + style: { + fill: dataZoomModel.get('backgroundColor') + }, + z2: -40 + })); // Click panel, over shadow, below handles. + + var clickPanel = new Rect$2({ + shape: { + x: 0, + y: 0, + width: size[0], + height: size[1] + }, + style: { + fill: 'transparent' + }, + z2: 0, + onclick: bind(this._onClickPanel, this) + }); + var zr = this.api.getZr(); + + if (brushSelect) { + clickPanel.on('mousedown', this._onBrushStart, this); + clickPanel.cursor = 'crosshair'; + zr.on('mousemove', this._onBrush); + zr.on('mouseup', this._onBrushEnd); + } else { + zr.off('mousemove', this._onBrush); + zr.off('mouseup', this._onBrushEnd); + } + + barGroup.add(clickPanel); + }; + + SliderZoomView.prototype._renderDataShadow = function () { + var info = this._dataShadowInfo = this._prepareDataShadowInfo(); + + this._displayables.dataShadowSegs = []; + + if (!info) { + return; + } + + var size = this._size; + var oldSize = this._shadowSize || []; + var seriesModel = info.series; + var data = seriesModel.getRawData(); + var otherDim = seriesModel.getShadowDim ? seriesModel.getShadowDim() // @see candlestick + : info.otherDim; + + if (otherDim == null) { + return; + } + + var polygonPts = this._shadowPolygonPts; + var polylinePts = this._shadowPolylinePts; // Not re-render if data doesn't change. + + if (data !== this._shadowData || otherDim !== this._shadowDim || size[0] !== oldSize[0] || size[1] !== oldSize[1]) { + var otherDataExtent_1 = data.getDataExtent(otherDim); // Nice extent. + + var otherOffset = (otherDataExtent_1[1] - otherDataExtent_1[0]) * 0.3; + otherDataExtent_1 = [otherDataExtent_1[0] - otherOffset, otherDataExtent_1[1] + otherOffset]; + var otherShadowExtent_1 = [0, size[1]]; + var thisShadowExtent = [0, size[0]]; + var areaPoints_1 = [[size[0], 0], [0, 0]]; + var linePoints_1 = []; + var step_1 = thisShadowExtent[1] / (data.count() - 1); + var thisCoord_1 = 0; // Optimize for large data shadow + + var stride_1 = Math.round(data.count() / size[0]); + var lastIsEmpty_1; + data.each([otherDim], function (value, index) { + if (stride_1 > 0 && index % stride_1) { + thisCoord_1 += step_1; + return; + } // FIXME + // Should consider axis.min/axis.max when drawing dataShadow. + // FIXME + // 应该使用统一的空判断?还是在list里进行空判断? + + + var isEmpty = value == null || isNaN(value) || value === ''; // See #4235. + + var otherCoord = isEmpty ? 0 : linearMap(value, otherDataExtent_1, otherShadowExtent_1, true); // Attempt to draw data shadow precisely when there are empty value. + + if (isEmpty && !lastIsEmpty_1 && index) { + areaPoints_1.push([areaPoints_1[areaPoints_1.length - 1][0], 0]); + linePoints_1.push([linePoints_1[linePoints_1.length - 1][0], 0]); + } else if (!isEmpty && lastIsEmpty_1) { + areaPoints_1.push([thisCoord_1, 0]); + linePoints_1.push([thisCoord_1, 0]); + } + + areaPoints_1.push([thisCoord_1, otherCoord]); + linePoints_1.push([thisCoord_1, otherCoord]); + thisCoord_1 += step_1; + lastIsEmpty_1 = isEmpty; + }); + polygonPts = this._shadowPolygonPts = areaPoints_1; + polylinePts = this._shadowPolylinePts = linePoints_1; + } + + this._shadowData = data; + this._shadowDim = otherDim; + this._shadowSize = [size[0], size[1]]; + var dataZoomModel = this.dataZoomModel; + + function createDataShadowGroup(isSelectedArea) { + var model = dataZoomModel.getModel(isSelectedArea ? 'selectedDataBackground' : 'dataBackground'); + var group = new Group(); + var polygon = new Polygon({ + shape: { + points: polygonPts + }, + segmentIgnoreThreshold: 1, + style: model.getModel('areaStyle').getAreaStyle(), + silent: true, + z2: -20 + }); + var polyline = new Polyline({ + shape: { + points: polylinePts + }, + segmentIgnoreThreshold: 1, + style: model.getModel('lineStyle').getLineStyle(), + silent: true, + z2: -19 + }); + group.add(polygon); + group.add(polyline); + return group; + } // let dataBackgroundModel = dataZoomModel.getModel('dataBackground'); + + + for (var i = 0; i < 3; i++) { + var group = createDataShadowGroup(i === 1); + + this._displayables.sliderGroup.add(group); + + this._displayables.dataShadowSegs.push(group); + } + }; + + SliderZoomView.prototype._prepareDataShadowInfo = function () { + var dataZoomModel = this.dataZoomModel; + var showDataShadow = dataZoomModel.get('showDataShadow'); + + if (showDataShadow === false) { + return; + } // Find a representative series. + + + var result; + var ecModel = this.ecModel; + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + var seriesModels = dataZoomModel.getAxisProxy(axisDim, axisIndex).getTargetSeriesModels(); + each(seriesModels, function (seriesModel) { + if (result) { + return; + } + + if (showDataShadow !== true && indexOf(SHOW_DATA_SHADOW_SERIES_TYPE, seriesModel.get('type')) < 0) { + return; + } + + var thisAxis = ecModel.getComponent(getAxisMainType(axisDim), axisIndex).axis; + var otherDim = getOtherDim(axisDim); + var otherAxisInverse; + var coordSys = seriesModel.coordinateSystem; + + if (otherDim != null && coordSys.getOtherAxis) { + otherAxisInverse = coordSys.getOtherAxis(thisAxis).inverse; + } + + otherDim = seriesModel.getData().mapDimension(otherDim); + result = { + thisAxis: thisAxis, + series: seriesModel, + thisDim: axisDim, + otherDim: otherDim, + otherAxisInverse: otherAxisInverse + }; + }, this); + }, this); + return result; + }; + + SliderZoomView.prototype._renderHandle = function () { + var thisGroup = this.group; + var displayables = this._displayables; + var handles = displayables.handles = [null, null]; + var handleLabels = displayables.handleLabels = [null, null]; + var sliderGroup = this._displayables.sliderGroup; + var size = this._size; + var dataZoomModel = this.dataZoomModel; + var api = this.api; + var borderRadius = dataZoomModel.get('borderRadius') || 0; + var brushSelect = dataZoomModel.get('brushSelect'); + var filler = displayables.filler = new Rect$2({ + silent: brushSelect, + style: { + fill: dataZoomModel.get('fillerColor') + }, + textConfig: { + position: 'inside' + } + }); + sliderGroup.add(filler); // Frame border. + + sliderGroup.add(new Rect$2({ + silent: true, + subPixelOptimize: true, + shape: { + x: 0, + y: 0, + width: size[0], + height: size[1], + r: borderRadius + }, + style: { + // deprecated option + stroke: dataZoomModel.get('dataBackgroundColor') || dataZoomModel.get('borderColor'), + lineWidth: DEFAULT_FRAME_BORDER_WIDTH, + fill: 'rgba(0,0,0,0)' + } + })); // Left and right handle to resize + + each([0, 1], function (handleIndex) { + var iconStr = dataZoomModel.get('handleIcon'); + + if (!symbolBuildProxies[iconStr] && iconStr.indexOf('path://') < 0 && iconStr.indexOf('image://') < 0) { + // Compatitable with the old icon parsers. Which can use a path string without path:// + iconStr = 'path://' + iconStr; + + if ("development" !== 'production') { + deprecateLog('handleIcon now needs \'path://\' prefix when using a path string'); + } + } + + var path = createSymbol(iconStr, -1, 0, 2, 2, null, true); + path.attr({ + cursor: getCursor(this._orient), + draggable: true, + drift: bind(this._onDragMove, this, handleIndex), + ondragend: bind(this._onDragEnd, this), + onmouseover: bind(this._showDataInfo, this, true), + onmouseout: bind(this._showDataInfo, this, false), + z2: 5 + }); + var bRect = path.getBoundingRect(); + var handleSize = dataZoomModel.get('handleSize'); + this._handleHeight = parsePercent$1(handleSize, this._size[1]); + this._handleWidth = bRect.width / bRect.height * this._handleHeight; + path.setStyle(dataZoomModel.getModel('handleStyle').getItemStyle()); + path.style.strokeNoScale = true; + path.rectHover = true; + path.ensureState('emphasis').style = dataZoomModel.getModel(['emphasis', 'handleStyle']).getItemStyle(); + enableHoverEmphasis(path); + var handleColor = dataZoomModel.get('handleColor'); // deprecated option + // Compatitable with previous version + + if (handleColor != null) { + path.style.fill = handleColor; + } + + sliderGroup.add(handles[handleIndex] = path); + var textStyleModel = dataZoomModel.getModel('textStyle'); + thisGroup.add(handleLabels[handleIndex] = new ZRText({ + silent: true, + invisible: true, + style: createTextStyle(textStyleModel, { + x: 0, + y: 0, + text: '', + verticalAlign: 'middle', + align: 'center', + fill: textStyleModel.getTextColor(), + font: textStyleModel.getFont() + }), + z2: 10 + })); + }, this); // Handle to move. Only visible when brushSelect is set true. + + var actualMoveZone = filler; + + if (brushSelect) { + var moveHandleHeight = parsePercent$1(dataZoomModel.get('moveHandleSize'), size[1]); + var moveHandle_1 = displayables.moveHandle = new Rect({ + style: dataZoomModel.getModel('moveHandleStyle').getItemStyle(), + silent: true, + shape: { + r: [0, 0, 2, 2], + y: size[1] - 0.5, + height: moveHandleHeight + } + }); + var iconSize = moveHandleHeight * 0.8; + var moveHandleIcon = displayables.moveHandleIcon = createSymbol(dataZoomModel.get('moveHandleIcon'), -iconSize / 2, -iconSize / 2, iconSize, iconSize, '#fff', true); + moveHandleIcon.silent = true; + moveHandleIcon.y = size[1] + moveHandleHeight / 2 - 0.5; + moveHandle_1.ensureState('emphasis').style = dataZoomModel.getModel(['emphasis', 'moveHandleStyle']).getItemStyle(); + var moveZoneExpandSize = Math.min(size[1] / 2, Math.max(moveHandleHeight, 10)); + actualMoveZone = displayables.moveZone = new Rect({ + invisible: true, + shape: { + y: size[1] - moveZoneExpandSize, + height: moveHandleHeight + moveZoneExpandSize + } + }); + actualMoveZone.on('mouseover', function () { + api.enterEmphasis(moveHandle_1); + }).on('mouseout', function () { + api.leaveEmphasis(moveHandle_1); + }); + sliderGroup.add(moveHandle_1); + sliderGroup.add(moveHandleIcon); + sliderGroup.add(actualMoveZone); + } + + actualMoveZone.attr({ + draggable: true, + cursor: getCursor(this._orient), + drift: bind(this._onDragMove, this, 'all'), + ondragstart: bind(this._showDataInfo, this, true), + ondragend: bind(this._onDragEnd, this), + onmouseover: bind(this._showDataInfo, this, true), + onmouseout: bind(this._showDataInfo, this, false) + }); + }; + + SliderZoomView.prototype._resetInterval = function () { + var range = this._range = this.dataZoomModel.getPercentRange(); + + var viewExtent = this._getViewExtent(); + + this._handleEnds = [linearMap(range[0], [0, 100], viewExtent, true), linearMap(range[1], [0, 100], viewExtent, true)]; + }; + + SliderZoomView.prototype._updateInterval = function (handleIndex, delta) { + var dataZoomModel = this.dataZoomModel; + var handleEnds = this._handleEnds; + + var viewExtend = this._getViewExtent(); + + var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan(); + var percentExtent = [0, 100]; + sliderMove(delta, handleEnds, viewExtend, dataZoomModel.get('zoomLock') ? 'all' : handleIndex, minMaxSpan.minSpan != null ? linearMap(minMaxSpan.minSpan, percentExtent, viewExtend, true) : null, minMaxSpan.maxSpan != null ? linearMap(minMaxSpan.maxSpan, percentExtent, viewExtend, true) : null); + var lastRange = this._range; + var range = this._range = asc([linearMap(handleEnds[0], viewExtend, percentExtent, true), linearMap(handleEnds[1], viewExtend, percentExtent, true)]); + return !lastRange || lastRange[0] !== range[0] || lastRange[1] !== range[1]; + }; + + SliderZoomView.prototype._updateView = function (nonRealtime) { + var displaybles = this._displayables; + var handleEnds = this._handleEnds; + var handleInterval = asc(handleEnds.slice()); + var size = this._size; + each([0, 1], function (handleIndex) { + // Handles + var handle = displaybles.handles[handleIndex]; + var handleHeight = this._handleHeight; + handle.attr({ + scaleX: handleHeight / 2, + scaleY: handleHeight / 2, + // This is a trick, by adding an extra tiny offset to let the default handle's end point align to the drag window. + // NOTE: It may affect some custom shapes a bit. But we prefer to have better result by default. + x: handleEnds[handleIndex] + (handleIndex ? -1 : 1), + y: size[1] / 2 - handleHeight / 2 + }); + }, this); // Filler + + displaybles.filler.setShape({ + x: handleInterval[0], + y: 0, + width: handleInterval[1] - handleInterval[0], + height: size[1] + }); + var viewExtent = { + x: handleInterval[0], + width: handleInterval[1] - handleInterval[0] + }; // Move handle + + if (displaybles.moveHandle) { + displaybles.moveHandle.setShape(viewExtent); + displaybles.moveZone.setShape(viewExtent); // Force update path on the invisible object + + displaybles.moveZone.getBoundingRect(); + displaybles.moveHandleIcon && displaybles.moveHandleIcon.attr('x', viewExtent.x + viewExtent.width / 2); + } // update clip path of shadow. + + + var dataShadowSegs = displaybles.dataShadowSegs; + var segIntervals = [0, handleInterval[0], handleInterval[1], size[0]]; + + for (var i = 0; i < dataShadowSegs.length; i++) { + var segGroup = dataShadowSegs[i]; + var clipPath = segGroup.getClipPath(); + + if (!clipPath) { + clipPath = new Rect(); + segGroup.setClipPath(clipPath); + } + + clipPath.setShape({ + x: segIntervals[i], + y: 0, + width: segIntervals[i + 1] - segIntervals[i], + height: size[1] + }); + } + + this._updateDataInfo(nonRealtime); + }; + + SliderZoomView.prototype._updateDataInfo = function (nonRealtime) { + var dataZoomModel = this.dataZoomModel; + var displaybles = this._displayables; + var handleLabels = displaybles.handleLabels; + var orient = this._orient; + var labelTexts = ['', '']; // FIXME + // date型,支持formatter,autoformatter(ec2 date.getAutoFormatter) + + if (dataZoomModel.get('showDetail')) { + var axisProxy = dataZoomModel.findRepresentativeAxisProxy(); + + if (axisProxy) { + var axis = axisProxy.getAxisModel().axis; + var range = this._range; + var dataInterval = nonRealtime // See #4434, data and axis are not processed and reset yet in non-realtime mode. + ? axisProxy.calculateDataWindow({ + start: range[0], + end: range[1] + }).valueWindow : axisProxy.getDataValueWindow(); + labelTexts = [this._formatLabel(dataInterval[0], axis), this._formatLabel(dataInterval[1], axis)]; + } + } + + var orderedHandleEnds = asc(this._handleEnds.slice()); + setLabel.call(this, 0); + setLabel.call(this, 1); + + function setLabel(handleIndex) { + // Label + // Text should not transform by barGroup. + // Ignore handlers transform + var barTransform = getTransform(displaybles.handles[handleIndex].parent, this.group); + var direction = transformDirection(handleIndex === 0 ? 'right' : 'left', barTransform); + var offset = this._handleWidth / 2 + LABEL_GAP; + var textPoint = applyTransform$1([orderedHandleEnds[handleIndex] + (handleIndex === 0 ? -offset : offset), this._size[1] / 2], barTransform); + handleLabels[handleIndex].setStyle({ + x: textPoint[0], + y: textPoint[1], + verticalAlign: orient === HORIZONTAL ? 'middle' : direction, + align: orient === HORIZONTAL ? direction : 'center', + text: labelTexts[handleIndex] + }); + } + }; + + SliderZoomView.prototype._formatLabel = function (value, axis) { + var dataZoomModel = this.dataZoomModel; + var labelFormatter = dataZoomModel.get('labelFormatter'); + var labelPrecision = dataZoomModel.get('labelPrecision'); + + if (labelPrecision == null || labelPrecision === 'auto') { + labelPrecision = axis.getPixelPrecision(); + } + + var valueStr = value == null || isNaN(value) ? '' // FIXME Glue code + : axis.type === 'category' || axis.type === 'time' ? axis.scale.getLabel({ + value: Math.round(value) + }) // param of toFixed should less then 20. + : value.toFixed(Math.min(labelPrecision, 20)); + return isFunction(labelFormatter) ? labelFormatter(value, valueStr) : isString(labelFormatter) ? labelFormatter.replace('{value}', valueStr) : valueStr; + }; + /** + * @param showOrHide true: show, false: hide + */ + + + SliderZoomView.prototype._showDataInfo = function (showOrHide) { + // Always show when drgging. + showOrHide = this._dragging || showOrHide; + var displayables = this._displayables; + var handleLabels = displayables.handleLabels; + handleLabels[0].attr('invisible', !showOrHide); + handleLabels[1].attr('invisible', !showOrHide); // Highlight move handle + + displayables.moveHandle && this.api[showOrHide ? 'enterEmphasis' : 'leaveEmphasis'](displayables.moveHandle, 1); + }; + + SliderZoomView.prototype._onDragMove = function (handleIndex, dx, dy, event) { + this._dragging = true; // For mobile device, prevent screen slider on the button. + + stop(event.event); // Transform dx, dy to bar coordination. + + var barTransform = this._displayables.sliderGroup.getLocalTransform(); + + var vertex = applyTransform$1([dx, dy], barTransform, true); + + var changed = this._updateInterval(handleIndex, vertex[0]); + + var realtime = this.dataZoomModel.get('realtime'); + + this._updateView(!realtime); // Avoid dispatch dataZoom repeatly but range not changed, + // which cause bad visual effect when progressive enabled. + + + changed && realtime && this._dispatchZoomAction(true); + }; + + SliderZoomView.prototype._onDragEnd = function () { + this._dragging = false; + + this._showDataInfo(false); // While in realtime mode and stream mode, dispatch action when + // drag end will cause the whole view rerender, which is unnecessary. + + + var realtime = this.dataZoomModel.get('realtime'); + !realtime && this._dispatchZoomAction(false); + }; + + SliderZoomView.prototype._onClickPanel = function (e) { + var size = this._size; + + var localPoint = this._displayables.sliderGroup.transformCoordToLocal(e.offsetX, e.offsetY); + + if (localPoint[0] < 0 || localPoint[0] > size[0] || localPoint[1] < 0 || localPoint[1] > size[1]) { + return; + } + + var handleEnds = this._handleEnds; + var center = (handleEnds[0] + handleEnds[1]) / 2; + + var changed = this._updateInterval('all', localPoint[0] - center); + + this._updateView(); + + changed && this._dispatchZoomAction(false); + }; + + SliderZoomView.prototype._onBrushStart = function (e) { + var x = e.offsetX; + var y = e.offsetY; + this._brushStart = new Point(x, y); + this._brushing = true; + this._brushStartTime = +new Date(); // this._updateBrushRect(x, y); + }; + + SliderZoomView.prototype._onBrushEnd = function (e) { + if (!this._brushing) { + return; + } + + var brushRect = this._displayables.brushRect; + this._brushing = false; + + if (!brushRect) { + return; + } + + brushRect.attr('ignore', true); + var brushShape = brushRect.shape; + var brushEndTime = +new Date(); // console.log(brushEndTime - this._brushStartTime); + + if (brushEndTime - this._brushStartTime < 200 && Math.abs(brushShape.width) < 5) { + // Will treat it as a click + return; + } + + var viewExtend = this._getViewExtent(); + + var percentExtent = [0, 100]; + this._range = asc([linearMap(brushShape.x, viewExtend, percentExtent, true), linearMap(brushShape.x + brushShape.width, viewExtend, percentExtent, true)]); + this._handleEnds = [brushShape.x, brushShape.x + brushShape.width]; + + this._updateView(); + + this._dispatchZoomAction(false); + }; + + SliderZoomView.prototype._onBrush = function (e) { + if (this._brushing) { + // For mobile device, prevent screen slider on the button. + stop(e.event); + + this._updateBrushRect(e.offsetX, e.offsetY); + } + }; + + SliderZoomView.prototype._updateBrushRect = function (mouseX, mouseY) { + var displayables = this._displayables; + var dataZoomModel = this.dataZoomModel; + var brushRect = displayables.brushRect; + + if (!brushRect) { + brushRect = displayables.brushRect = new Rect$2({ + silent: true, + style: dataZoomModel.getModel('brushStyle').getItemStyle() + }); + displayables.sliderGroup.add(brushRect); + } + + brushRect.attr('ignore', false); + var brushStart = this._brushStart; + var sliderGroup = this._displayables.sliderGroup; + var endPoint = sliderGroup.transformCoordToLocal(mouseX, mouseY); + var startPoint = sliderGroup.transformCoordToLocal(brushStart.x, brushStart.y); + var size = this._size; + endPoint[0] = Math.max(Math.min(size[0], endPoint[0]), 0); + brushRect.setShape({ + x: startPoint[0], + y: 0, + width: endPoint[0] - startPoint[0], + height: size[1] + }); + }; + /** + * This action will be throttled. + */ + + + SliderZoomView.prototype._dispatchZoomAction = function (realtime) { + var range = this._range; + this.api.dispatchAction({ + type: 'dataZoom', + from: this.uid, + dataZoomId: this.dataZoomModel.id, + animation: realtime ? REALTIME_ANIMATION_CONFIG : null, + start: range[0], + end: range[1] + }); + }; + + SliderZoomView.prototype._findCoordRect = function () { + // Find the grid coresponding to the first axis referred by dataZoom. + var rect; + var coordSysInfoList = collectReferCoordSysModelInfo(this.dataZoomModel).infoList; + + if (!rect && coordSysInfoList.length) { + var coordSys = coordSysInfoList[0].model.coordinateSystem; + rect = coordSys.getRect && coordSys.getRect(); + } + + if (!rect) { + var width = this.api.getWidth(); + var height = this.api.getHeight(); + rect = { + x: width * 0.2, + y: height * 0.2, + width: width * 0.6, + height: height * 0.6 + }; + } + + return rect; + }; + + SliderZoomView.type = 'dataZoom.slider'; + return SliderZoomView; + }(DataZoomView); + + function getOtherDim(thisDim) { + // FIXME + // 这个逻辑和getOtherAxis里一致,但是写在这里是否不好 + var map = { + x: 'y', + y: 'x', + radius: 'angle', + angle: 'radius' + }; + return map[thisDim]; + } + + function getCursor(orient) { + return orient === 'vertical' ? 'ns-resize' : 'ew-resize'; + } + + function install$L(registers) { + registers.registerComponentModel(SliderZoomModel); + registers.registerComponentView(SliderZoomView); + installCommon(registers); + } + + function install$M(registers) { + use(install$K); + use(install$L); // Do not install './dataZoomSelect', + // since it only work for toolbox dataZoom. + } + + var visualDefault = { + /** + * @public + */ + get: function (visualType, key, isCategory) { + var value = clone((defaultOption$1[visualType] || {})[key]); + return isCategory ? isArray(value) ? value[value.length - 1] : value : value; + } + }; + var defaultOption$1 = { + color: { + active: ['#006edd', '#e0ffff'], + inactive: ['rgba(0,0,0,0)'] + }, + colorHue: { + active: [0, 360], + inactive: [0, 0] + }, + colorSaturation: { + active: [0.3, 1], + inactive: [0, 0] + }, + colorLightness: { + active: [0.9, 0.5], + inactive: [0, 0] + }, + colorAlpha: { + active: [0.3, 1], + inactive: [0, 0] + }, + opacity: { + active: [0.3, 1], + inactive: [0, 0] + }, + symbol: { + active: ['circle', 'roundRect', 'diamond'], + inactive: ['none'] + }, + symbolSize: { + active: [10, 50], + inactive: [0, 0] + } + }; + + var mapVisual$1 = VisualMapping.mapVisual; + var eachVisual = VisualMapping.eachVisual; + var isArray$1 = isArray; + var each$d = each; + var asc$2 = asc; + var linearMap$1 = linearMap; + + var VisualMapModel = + /** @class */ + function (_super) { + __extends(VisualMapModel, _super); + + function VisualMapModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = VisualMapModel.type; + _this.stateList = ['inRange', 'outOfRange']; + _this.replacableOptionKeys = ['inRange', 'outOfRange', 'target', 'controller', 'color']; + _this.layoutMode = { + type: 'box', + ignoreSize: true + }; + /** + * [lowerBound, upperBound] + */ + + _this.dataBound = [-Infinity, Infinity]; + _this.targetVisuals = {}; + _this.controllerVisuals = {}; + return _this; + } + + VisualMapModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + }; + /** + * @protected + */ + + + VisualMapModel.prototype.optionUpdated = function (newOption, isInit) { + var thisOption = this.option; + !isInit && replaceVisualOption(thisOption, newOption, this.replacableOptionKeys); + this.textStyleModel = this.getModel('textStyle'); + this.resetItemSize(); + this.completeVisualOption(); + }; + /** + * @protected + */ + + + VisualMapModel.prototype.resetVisual = function (supplementVisualOption) { + var stateList = this.stateList; + supplementVisualOption = bind(supplementVisualOption, this); + this.controllerVisuals = createVisualMappings(this.option.controller, stateList, supplementVisualOption); + this.targetVisuals = createVisualMappings(this.option.target, stateList, supplementVisualOption); + }; + /** + * @public + */ + + + VisualMapModel.prototype.getItemSymbol = function () { + return null; + }; + /** + * @protected + * @return {Array.<number>} An array of series indices. + */ + + + VisualMapModel.prototype.getTargetSeriesIndices = function () { + var optionSeriesIndex = this.option.seriesIndex; + var seriesIndices = []; + + if (optionSeriesIndex == null || optionSeriesIndex === 'all') { + this.ecModel.eachSeries(function (seriesModel, index) { + seriesIndices.push(index); + }); + } else { + seriesIndices = normalizeToArray(optionSeriesIndex); + } + + return seriesIndices; + }; + /** + * @public + */ + + + VisualMapModel.prototype.eachTargetSeries = function (callback, context) { + each(this.getTargetSeriesIndices(), function (seriesIndex) { + var seriesModel = this.ecModel.getSeriesByIndex(seriesIndex); + + if (seriesModel) { + callback.call(context, seriesModel); + } + }, this); + }; + /** + * @pubilc + */ + + + VisualMapModel.prototype.isTargetSeries = function (seriesModel) { + var is = false; + this.eachTargetSeries(function (model) { + model === seriesModel && (is = true); + }); + return is; + }; + /** + * @example + * this.formatValueText(someVal); // format single numeric value to text. + * this.formatValueText(someVal, true); // format single category value to text. + * this.formatValueText([min, max]); // format numeric min-max to text. + * this.formatValueText([this.dataBound[0], max]); // using data lower bound. + * this.formatValueText([min, this.dataBound[1]]); // using data upper bound. + * + * @param value Real value, or this.dataBound[0 or 1]. + * @param isCategory Only available when value is number. + * @param edgeSymbols Open-close symbol when value is interval. + * @protected + */ + + + VisualMapModel.prototype.formatValueText = function (value, isCategory, edgeSymbols) { + var option = this.option; + var precision = option.precision; + var dataBound = this.dataBound; + var formatter = option.formatter; + var isMinMax; + edgeSymbols = edgeSymbols || ['<', '>']; + + if (isArray(value)) { + value = value.slice(); + isMinMax = true; + } + + var textValue = isCategory ? value // Value is string when isCategory + : isMinMax ? [toFixed(value[0]), toFixed(value[1])] : toFixed(value); + + if (isString(formatter)) { + return formatter.replace('{value}', isMinMax ? textValue[0] : textValue).replace('{value2}', isMinMax ? textValue[1] : textValue); + } else if (isFunction(formatter)) { + return isMinMax ? formatter(value[0], value[1]) : formatter(value); + } + + if (isMinMax) { + if (value[0] === dataBound[0]) { + return edgeSymbols[0] + ' ' + textValue[1]; + } else if (value[1] === dataBound[1]) { + return edgeSymbols[1] + ' ' + textValue[0]; + } else { + return textValue[0] + ' - ' + textValue[1]; + } + } else { + // Format single value (includes category case). + return textValue; + } + + function toFixed(val) { + return val === dataBound[0] ? 'min' : val === dataBound[1] ? 'max' : (+val).toFixed(Math.min(precision, 20)); + } + }; + /** + * @protected + */ + + + VisualMapModel.prototype.resetExtent = function () { + var thisOption = this.option; // Can not calculate data extent by data here. + // Because series and data may be modified in processing stage. + // So we do not support the feature "auto min/max". + + var extent = asc$2([thisOption.min, thisOption.max]); + this._dataExtent = extent; + }; + /** + * PENDING: + * delete this method if no outer usage. + * + * Return Concrete dimention. If return null/undefined, no dimension used. + */ + // getDataDimension(data: SeriesData) { + // const optDim = this.option.dimension; + // if (optDim != null) { + // return data.getDimension(optDim); + // } + // const dimNames = data.dimensions; + // for (let i = dimNames.length - 1; i >= 0; i--) { + // const dimName = dimNames[i]; + // const dimInfo = data.getDimensionInfo(dimName); + // if (!dimInfo.isCalculationCoord) { + // return dimName; + // } + // } + // } + + + VisualMapModel.prototype.getDataDimensionIndex = function (data) { + var optDim = this.option.dimension; + + if (optDim != null) { + return data.getDimensionIndex(optDim); + } + + var dimNames = data.dimensions; + + for (var i = dimNames.length - 1; i >= 0; i--) { + var dimName = dimNames[i]; + var dimInfo = data.getDimensionInfo(dimName); + + if (!dimInfo.isCalculationCoord) { + return dimInfo.storeDimIndex; + } + } + }; + + VisualMapModel.prototype.getExtent = function () { + return this._dataExtent.slice(); + }; + + VisualMapModel.prototype.completeVisualOption = function () { + var ecModel = this.ecModel; + var thisOption = this.option; + var base = { + inRange: thisOption.inRange, + outOfRange: thisOption.outOfRange + }; + var target = thisOption.target || (thisOption.target = {}); + var controller = thisOption.controller || (thisOption.controller = {}); + merge(target, base); // Do not override + + merge(controller, base); // Do not override + + var isCategory = this.isCategory(); + completeSingle.call(this, target); + completeSingle.call(this, controller); + completeInactive.call(this, target, 'inRange', 'outOfRange'); // completeInactive.call(this, target, 'outOfRange', 'inRange'); + + completeController.call(this, controller); + + function completeSingle(base) { + // Compatible with ec2 dataRange.color. + // The mapping order of dataRange.color is: [high value, ..., low value] + // whereas inRange.color and outOfRange.color is [low value, ..., high value] + // Notice: ec2 has no inverse. + if (isArray$1(thisOption.color) // If there has been inRange: {symbol: ...}, adding color is a mistake. + // So adding color only when no inRange defined. + && !base.inRange) { + base.inRange = { + color: thisOption.color.slice().reverse() + }; + } // Compatible with previous logic, always give a defautl color, otherwise + // simple config with no inRange and outOfRange will not work. + // Originally we use visualMap.color as the default color, but setOption at + // the second time the default color will be erased. So we change to use + // constant DEFAULT_COLOR. + // If user do not want the default color, set inRange: {color: null}. + + + base.inRange = base.inRange || { + color: ecModel.get('gradientColor') + }; + } + + function completeInactive(base, stateExist, stateAbsent) { + var optExist = base[stateExist]; + var optAbsent = base[stateAbsent]; + + if (optExist && !optAbsent) { + optAbsent = base[stateAbsent] = {}; + each$d(optExist, function (visualData, visualType) { + if (!VisualMapping.isValidType(visualType)) { + return; + } + + var defa = visualDefault.get(visualType, 'inactive', isCategory); + + if (defa != null) { + optAbsent[visualType] = defa; // Compatibable with ec2: + // Only inactive color to rgba(0,0,0,0) can not + // make label transparent, so use opacity also. + + if (visualType === 'color' && !optAbsent.hasOwnProperty('opacity') && !optAbsent.hasOwnProperty('colorAlpha')) { + optAbsent.opacity = [0, 0]; + } + } + }); + } + } + + function completeController(controller) { + var symbolExists = (controller.inRange || {}).symbol || (controller.outOfRange || {}).symbol; + var symbolSizeExists = (controller.inRange || {}).symbolSize || (controller.outOfRange || {}).symbolSize; + var inactiveColor = this.get('inactiveColor'); + var itemSymbol = this.getItemSymbol(); + var defaultSymbol = itemSymbol || 'roundRect'; + each$d(this.stateList, function (state) { + var itemSize = this.itemSize; + var visuals = controller[state]; // Set inactive color for controller if no other color + // attr (like colorAlpha) specified. + + if (!visuals) { + visuals = controller[state] = { + color: isCategory ? inactiveColor : [inactiveColor] + }; + } // Consistent symbol and symbolSize if not specified. + + + if (visuals.symbol == null) { + visuals.symbol = symbolExists && clone(symbolExists) || (isCategory ? defaultSymbol : [defaultSymbol]); + } + + if (visuals.symbolSize == null) { + visuals.symbolSize = symbolSizeExists && clone(symbolSizeExists) || (isCategory ? itemSize[0] : [itemSize[0], itemSize[0]]); + } // Filter none + + + visuals.symbol = mapVisual$1(visuals.symbol, function (symbol) { + return symbol === 'none' ? defaultSymbol : symbol; + }); // Normalize symbolSize + + var symbolSize = visuals.symbolSize; + + if (symbolSize != null) { + var max_1 = -Infinity; // symbolSize can be object when categories defined. + + eachVisual(symbolSize, function (value) { + value > max_1 && (max_1 = value); + }); + visuals.symbolSize = mapVisual$1(symbolSize, function (value) { + return linearMap$1(value, [0, max_1], [0, itemSize[0]], true); + }); + } + }, this); + } + }; + + VisualMapModel.prototype.resetItemSize = function () { + this.itemSize = [parseFloat(this.get('itemWidth')), parseFloat(this.get('itemHeight'))]; + }; + + VisualMapModel.prototype.isCategory = function () { + return !!this.option.categories; + }; + /** + * @public + * @abstract + */ + + + VisualMapModel.prototype.setSelected = function (selected) {}; + + VisualMapModel.prototype.getSelected = function () { + return null; + }; + /** + * @public + * @abstract + */ + + + VisualMapModel.prototype.getValueState = function (value) { + return null; + }; + /** + * FIXME + * Do not publish to thirt-part-dev temporarily + * util the interface is stable. (Should it return + * a function but not visual meta?) + * + * @pubilc + * @abstract + * @param getColorVisual + * params: value, valueState + * return: color + * @return {Object} visualMeta + * should includes {stops, outerColors} + * outerColor means [colorBeyondMinValue, colorBeyondMaxValue] + */ + + + VisualMapModel.prototype.getVisualMeta = function (getColorVisual) { + return null; + }; + + VisualMapModel.type = 'visualMap'; + VisualMapModel.dependencies = ['series']; + VisualMapModel.defaultOption = { + show: true, + // zlevel: 0, + z: 4, + seriesIndex: 'all', + min: 0, + max: 200, + left: 0, + right: null, + top: null, + bottom: 0, + itemWidth: null, + itemHeight: null, + inverse: false, + orient: 'vertical', + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', + contentColor: '#5793f3', + inactiveColor: '#aaa', + borderWidth: 0, + padding: 5, + // 接受数组分别设定上右下左边距,同css + textGap: 10, + precision: 0, + textStyle: { + color: '#333' // 值域文字颜色 + + } + }; + return VisualMapModel; + }(ComponentModel); + + var DEFAULT_BAR_BOUND = [20, 140]; + + var ContinuousModel = + /** @class */ + function (_super) { + __extends(ContinuousModel, _super); + + function ContinuousModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ContinuousModel.type; + return _this; + } + /** + * @override + */ + + + ContinuousModel.prototype.optionUpdated = function (newOption, isInit) { + _super.prototype.optionUpdated.apply(this, arguments); + + this.resetExtent(); + this.resetVisual(function (mappingOption) { + mappingOption.mappingMethod = 'linear'; + mappingOption.dataExtent = this.getExtent(); + }); + + this._resetRange(); + }; + /** + * @protected + * @override + */ + + + ContinuousModel.prototype.resetItemSize = function () { + _super.prototype.resetItemSize.apply(this, arguments); + + var itemSize = this.itemSize; + (itemSize[0] == null || isNaN(itemSize[0])) && (itemSize[0] = DEFAULT_BAR_BOUND[0]); + (itemSize[1] == null || isNaN(itemSize[1])) && (itemSize[1] = DEFAULT_BAR_BOUND[1]); + }; + /** + * @private + */ + + + ContinuousModel.prototype._resetRange = function () { + var dataExtent = this.getExtent(); + var range = this.option.range; + + if (!range || range.auto) { + // `range` should always be array (so we dont use other + // value like 'auto') for user-friend. (consider getOption). + dataExtent.auto = 1; + this.option.range = dataExtent; + } else if (isArray(range)) { + if (range[0] > range[1]) { + range.reverse(); + } + + range[0] = Math.max(range[0], dataExtent[0]); + range[1] = Math.min(range[1], dataExtent[1]); + } + }; + /** + * @protected + * @override + */ + + + ContinuousModel.prototype.completeVisualOption = function () { + _super.prototype.completeVisualOption.apply(this, arguments); + + each(this.stateList, function (state) { + var symbolSize = this.option.controller[state].symbolSize; + + if (symbolSize && symbolSize[0] !== symbolSize[1]) { + symbolSize[0] = symbolSize[1] / 3; // For good looking. + } + }, this); + }; + /** + * @override + */ + + + ContinuousModel.prototype.setSelected = function (selected) { + this.option.range = selected.slice(); + + this._resetRange(); + }; + /** + * @public + */ + + + ContinuousModel.prototype.getSelected = function () { + var dataExtent = this.getExtent(); + var dataInterval = asc((this.get('range') || []).slice()); // Clamp + + dataInterval[0] > dataExtent[1] && (dataInterval[0] = dataExtent[1]); + dataInterval[1] > dataExtent[1] && (dataInterval[1] = dataExtent[1]); + dataInterval[0] < dataExtent[0] && (dataInterval[0] = dataExtent[0]); + dataInterval[1] < dataExtent[0] && (dataInterval[1] = dataExtent[0]); + return dataInterval; + }; + /** + * @override + */ + + + ContinuousModel.prototype.getValueState = function (value) { + var range = this.option.range; + var dataExtent = this.getExtent(); // When range[0] === dataExtent[0], any value larger than dataExtent[0] maps to 'inRange'. + // range[1] is processed likewise. + + return (range[0] <= dataExtent[0] || range[0] <= value) && (range[1] >= dataExtent[1] || value <= range[1]) ? 'inRange' : 'outOfRange'; + }; + + ContinuousModel.prototype.findTargetDataIndices = function (range) { + var result = []; + this.eachTargetSeries(function (seriesModel) { + var dataIndices = []; + var data = seriesModel.getData(); + data.each(this.getDataDimensionIndex(data), function (value, dataIndex) { + range[0] <= value && value <= range[1] && dataIndices.push(dataIndex); + }, this); + result.push({ + seriesId: seriesModel.id, + dataIndex: dataIndices + }); + }, this); + return result; + }; + /** + * @implement + */ + + + ContinuousModel.prototype.getVisualMeta = function (getColorVisual) { + var oVals = getColorStopValues(this, 'outOfRange', this.getExtent()); + var iVals = getColorStopValues(this, 'inRange', this.option.range.slice()); + var stops = []; + + function setStop(value, valueState) { + stops.push({ + value: value, + color: getColorVisual(value, valueState) + }); + } // Format to: outOfRange -- inRange -- outOfRange. + + + var iIdx = 0; + var oIdx = 0; + var iLen = iVals.length; + var oLen = oVals.length; + + for (; oIdx < oLen && (!iVals.length || oVals[oIdx] <= iVals[0]); oIdx++) { + // If oVal[oIdx] === iVals[iIdx], oVal[oIdx] should be ignored. + if (oVals[oIdx] < iVals[iIdx]) { + setStop(oVals[oIdx], 'outOfRange'); + } + } + + for (var first = 1; iIdx < iLen; iIdx++, first = 0) { + // If range is full, value beyond min, max will be clamped. + // make a singularity + first && stops.length && setStop(iVals[iIdx], 'outOfRange'); + setStop(iVals[iIdx], 'inRange'); + } + + for (var first = 1; oIdx < oLen; oIdx++) { + if (!iVals.length || iVals[iVals.length - 1] < oVals[oIdx]) { + // make a singularity + if (first) { + stops.length && setStop(stops[stops.length - 1].value, 'outOfRange'); + first = 0; + } + + setStop(oVals[oIdx], 'outOfRange'); + } + } + + var stopsLen = stops.length; + return { + stops: stops, + outerColors: [stopsLen ? stops[0].color : 'transparent', stopsLen ? stops[stopsLen - 1].color : 'transparent'] + }; + }; + + ContinuousModel.type = 'visualMap.continuous'; + ContinuousModel.defaultOption = inheritDefaultOption(VisualMapModel.defaultOption, { + align: 'auto', + calculable: false, + hoverLink: true, + realtime: true, + handleIcon: 'path://M-11.39,9.77h0a3.5,3.5,0,0,1-3.5,3.5h-22a3.5,3.5,0,0,1-3.5-3.5h0a3.5,3.5,0,0,1,3.5-3.5h22A3.5,3.5,0,0,1-11.39,9.77Z', + handleSize: '120%', + handleStyle: { + borderColor: '#fff', + borderWidth: 1 + }, + indicatorIcon: 'circle', + indicatorSize: '50%', + indicatorStyle: { + borderColor: '#fff', + borderWidth: 2, + shadowBlur: 2, + shadowOffsetX: 1, + shadowOffsetY: 1, + shadowColor: 'rgba(0,0,0,0.2)' + } // emphasis: { + // handleStyle: { + // shadowBlur: 3, + // shadowOffsetX: 1, + // shadowOffsetY: 1, + // shadowColor: 'rgba(0,0,0,0.2)' + // } + // } + + }); + return ContinuousModel; + }(VisualMapModel); + + function getColorStopValues(visualMapModel, valueState, dataExtent) { + if (dataExtent[0] === dataExtent[1]) { + return dataExtent.slice(); + } // When using colorHue mapping, it is not linear color any more. + // Moreover, canvas gradient seems not to be accurate linear. + // FIXME + // Should be arbitrary value 100? or based on pixel size? + + + var count = 200; + var step = (dataExtent[1] - dataExtent[0]) / count; + var value = dataExtent[0]; + var stopValues = []; + + for (var i = 0; i <= count && value < dataExtent[1]; i++) { + stopValues.push(value); + value += step; + } + + stopValues.push(dataExtent[1]); + return stopValues; + } + + var VisualMapView = + /** @class */ + function (_super) { + __extends(VisualMapView, _super); + + function VisualMapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = VisualMapView.type; + _this.autoPositionValues = { + left: 1, + right: 1, + top: 1, + bottom: 1 + }; + return _this; + } + + VisualMapView.prototype.init = function (ecModel, api) { + this.ecModel = ecModel; + this.api = api; + }; + /** + * @protected + */ + + + VisualMapView.prototype.render = function (visualMapModel, ecModel, api, payload // TODO: TYPE + ) { + this.visualMapModel = visualMapModel; + + if (visualMapModel.get('show') === false) { + this.group.removeAll(); + return; + } + + this.doRender(visualMapModel, ecModel, api, payload); + }; + /** + * @protected + */ + + + VisualMapView.prototype.renderBackground = function (group) { + var visualMapModel = this.visualMapModel; + var padding = normalizeCssArray$1(visualMapModel.get('padding') || 0); + var rect = group.getBoundingRect(); + group.add(new Rect({ + z2: -1, + silent: true, + shape: { + x: rect.x - padding[3], + y: rect.y - padding[0], + width: rect.width + padding[3] + padding[1], + height: rect.height + padding[0] + padding[2] + }, + style: { + fill: visualMapModel.get('backgroundColor'), + stroke: visualMapModel.get('borderColor'), + lineWidth: visualMapModel.get('borderWidth') + } + })); + }; + /** + * @protected + * @param targetValue can be Infinity or -Infinity + * @param visualCluster Only can be 'color' 'opacity' 'symbol' 'symbolSize' + * @param opts + * @param opts.forceState Specify state, instead of using getValueState method. + * @param opts.convertOpacityToAlpha For color gradient in controller widget. + * @return {*} Visual value. + */ + + + VisualMapView.prototype.getControllerVisual = function (targetValue, visualCluster, opts) { + opts = opts || {}; + var forceState = opts.forceState; + var visualMapModel = this.visualMapModel; + var visualObj = {}; // Default values. + + if (visualCluster === 'color') { + var defaultColor = visualMapModel.get('contentColor'); + visualObj.color = defaultColor; + } + + function getter(key) { + return visualObj[key]; + } + + function setter(key, value) { + visualObj[key] = value; + } + + var mappings = visualMapModel.controllerVisuals[forceState || visualMapModel.getValueState(targetValue)]; + var visualTypes = VisualMapping.prepareVisualTypes(mappings); + each(visualTypes, function (type) { + var visualMapping = mappings[type]; + + if (opts.convertOpacityToAlpha && type === 'opacity') { + type = 'colorAlpha'; + visualMapping = mappings.__alphaForOpacity; + } + + if (VisualMapping.dependsOn(type, visualCluster)) { + visualMapping && visualMapping.applyVisual(targetValue, getter, setter); + } + }); + return visualObj[visualCluster]; + }; + + VisualMapView.prototype.positionGroup = function (group) { + var model = this.visualMapModel; + var api = this.api; + positionElement(group, model.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + }; + + VisualMapView.prototype.doRender = function (visualMapModel, ecModel, api, payload) {}; + + VisualMapView.type = 'visualMap'; + return VisualMapView; + }(ComponentView); + + var paramsSet = [['left', 'right', 'width'], ['top', 'bottom', 'height']]; + /** + * @param visualMapModel + * @param api + * @param itemSize always [short, long] + * @return {string} 'left' or 'right' or 'top' or 'bottom' + */ + + function getItemAlign(visualMapModel, api, itemSize) { + var modelOption = visualMapModel.option; + var itemAlign = modelOption.align; + + if (itemAlign != null && itemAlign !== 'auto') { + return itemAlign; + } // Auto decision align. + + + var ecSize = { + width: api.getWidth(), + height: api.getHeight() + }; + var realIndex = modelOption.orient === 'horizontal' ? 1 : 0; + var reals = paramsSet[realIndex]; + var fakeValue = [0, null, 10]; + var layoutInput = {}; + + for (var i = 0; i < 3; i++) { + layoutInput[paramsSet[1 - realIndex][i]] = fakeValue[i]; + layoutInput[reals[i]] = i === 2 ? itemSize[0] : modelOption[reals[i]]; + } + + var rParam = [['x', 'width', 3], ['y', 'height', 0]][realIndex]; + var rect = getLayoutRect(layoutInput, ecSize, modelOption.padding); + return reals[(rect.margin[rParam[2]] || 0) + rect[rParam[0]] + rect[rParam[1]] * 0.5 < ecSize[rParam[1]] * 0.5 ? 0 : 1]; + } + /** + * Prepare dataIndex for outside usage, where dataIndex means rawIndex, and + * dataIndexInside means filtered index. + */ + // TODO: TYPE more specified payload types. + + function makeHighDownBatch(batch, visualMapModel) { + each(batch || [], function (batchItem) { + if (batchItem.dataIndex != null) { + batchItem.dataIndexInside = batchItem.dataIndex; + batchItem.dataIndex = null; + } + + batchItem.highlightKey = 'visualMap' + (visualMapModel ? visualMapModel.componentIndex : ''); + }); + return batch; + } + + var linearMap$2 = linearMap; + var each$e = each; + var mathMin$a = Math.min; + var mathMax$a = Math.max; // Arbitrary value + + var HOVER_LINK_SIZE = 12; + var HOVER_LINK_OUT = 6; // Notice: + // Any "interval" should be by the order of [low, high]. + // "handle0" (handleIndex === 0) maps to + // low data value: this._dataInterval[0] and has low coord. + // "handle1" (handleIndex === 1) maps to + // high data value: this._dataInterval[1] and has high coord. + // The logic of transform is implemented in this._createBarGroup. + + var ContinuousView = + /** @class */ + function (_super) { + __extends(ContinuousView, _super); + + function ContinuousView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ContinuousView.type; + _this._shapes = {}; + _this._dataInterval = []; + _this._handleEnds = []; + _this._hoverLinkDataIndices = []; + return _this; + } + + ContinuousView.prototype.doRender = function (visualMapModel, ecModel, api, payload) { + this._api = api; + + if (!payload || payload.type !== 'selectDataRange' || payload.from !== this.uid) { + this._buildView(); + } + }; + + ContinuousView.prototype._buildView = function () { + this.group.removeAll(); + var visualMapModel = this.visualMapModel; + var thisGroup = this.group; + this._orient = visualMapModel.get('orient'); + this._useHandle = visualMapModel.get('calculable'); + + this._resetInterval(); + + this._renderBar(thisGroup); + + var dataRangeText = visualMapModel.get('text'); + + this._renderEndsText(thisGroup, dataRangeText, 0); + + this._renderEndsText(thisGroup, dataRangeText, 1); // Do this for background size calculation. + + + this._updateView(true); // After updating view, inner shapes is built completely, + // and then background can be rendered. + + + this.renderBackground(thisGroup); // Real update view + + this._updateView(); + + this._enableHoverLinkToSeries(); + + this._enableHoverLinkFromSeries(); + + this.positionGroup(thisGroup); + }; + + ContinuousView.prototype._renderEndsText = function (group, dataRangeText, endsIndex) { + if (!dataRangeText) { + return; + } // Compatible with ec2, text[0] map to high value, text[1] map low value. + + + var text = dataRangeText[1 - endsIndex]; + text = text != null ? text + '' : ''; + var visualMapModel = this.visualMapModel; + var textGap = visualMapModel.get('textGap'); + var itemSize = visualMapModel.itemSize; + var barGroup = this._shapes.mainGroup; + + var position = this._applyTransform([itemSize[0] / 2, endsIndex === 0 ? -textGap : itemSize[1] + textGap], barGroup); + + var align = this._applyTransform(endsIndex === 0 ? 'bottom' : 'top', barGroup); + + var orient = this._orient; + var textStyleModel = this.visualMapModel.textStyleModel; + this.group.add(new ZRText({ + style: createTextStyle(textStyleModel, { + x: position[0], + y: position[1], + verticalAlign: orient === 'horizontal' ? 'middle' : align, + align: orient === 'horizontal' ? align : 'center', + text: text + }) + })); + }; + + ContinuousView.prototype._renderBar = function (targetGroup) { + var visualMapModel = this.visualMapModel; + var shapes = this._shapes; + var itemSize = visualMapModel.itemSize; + var orient = this._orient; + var useHandle = this._useHandle; + var itemAlign = getItemAlign(visualMapModel, this.api, itemSize); + + var mainGroup = shapes.mainGroup = this._createBarGroup(itemAlign); + + var gradientBarGroup = new Group(); + mainGroup.add(gradientBarGroup); // Bar + + gradientBarGroup.add(shapes.outOfRange = createPolygon()); + gradientBarGroup.add(shapes.inRange = createPolygon(null, useHandle ? getCursor$1(this._orient) : null, bind(this._dragHandle, this, 'all', false), bind(this._dragHandle, this, 'all', true))); // A border radius clip. + + gradientBarGroup.setClipPath(new Rect({ + shape: { + x: 0, + y: 0, + width: itemSize[0], + height: itemSize[1], + r: 3 + } + })); + var textRect = visualMapModel.textStyleModel.getTextRect('国'); + var textSize = mathMax$a(textRect.width, textRect.height); // Handle + + if (useHandle) { + shapes.handleThumbs = []; + shapes.handleLabels = []; + shapes.handleLabelPoints = []; + + this._createHandle(visualMapModel, mainGroup, 0, itemSize, textSize, orient); + + this._createHandle(visualMapModel, mainGroup, 1, itemSize, textSize, orient); + } + + this._createIndicator(visualMapModel, mainGroup, itemSize, textSize, orient); + + targetGroup.add(mainGroup); + }; + + ContinuousView.prototype._createHandle = function (visualMapModel, mainGroup, handleIndex, itemSize, textSize, orient) { + var onDrift = bind(this._dragHandle, this, handleIndex, false); + var onDragEnd = bind(this._dragHandle, this, handleIndex, true); + var handleSize = parsePercent(visualMapModel.get('handleSize'), itemSize[0]); + var handleThumb = createSymbol(visualMapModel.get('handleIcon'), -handleSize / 2, -handleSize / 2, handleSize, handleSize, null, true); + var cursor = getCursor$1(this._orient); + handleThumb.attr({ + cursor: cursor, + draggable: true, + drift: onDrift, + ondragend: onDragEnd, + onmousemove: function (e) { + stop(e.event); + } + }); + handleThumb.x = itemSize[0] / 2; + handleThumb.useStyle(visualMapModel.getModel('handleStyle').getItemStyle()); + handleThumb.setStyle({ + strokeNoScale: true, + strokeFirst: true + }); + handleThumb.style.lineWidth *= 2; + handleThumb.ensureState('emphasis').style = visualMapModel.getModel(['emphasis', 'handleStyle']).getItemStyle(); + setAsHighDownDispatcher(handleThumb, true); + mainGroup.add(handleThumb); // Text is always horizontal layout but should not be effected by + // transform (orient/inverse). So label is built separately but not + // use zrender/graphic/helper/RectText, and is located based on view + // group (according to handleLabelPoint) but not barGroup. + + var textStyleModel = this.visualMapModel.textStyleModel; + var handleLabel = new ZRText({ + cursor: cursor, + draggable: true, + drift: onDrift, + onmousemove: function (e) { + // Fot mobile devicem, prevent screen slider on the button. + stop(e.event); + }, + ondragend: onDragEnd, + style: createTextStyle(textStyleModel, { + x: 0, + y: 0, + text: '' + }) + }); + handleLabel.ensureState('blur').style = { + opacity: 0.1 + }; + handleLabel.stateTransition = { + duration: 200 + }; + this.group.add(handleLabel); + var handleLabelPoint = [handleSize, 0]; + var shapes = this._shapes; + shapes.handleThumbs[handleIndex] = handleThumb; + shapes.handleLabelPoints[handleIndex] = handleLabelPoint; + shapes.handleLabels[handleIndex] = handleLabel; + }; + + ContinuousView.prototype._createIndicator = function (visualMapModel, mainGroup, itemSize, textSize, orient) { + var scale = parsePercent(visualMapModel.get('indicatorSize'), itemSize[0]); + var indicator = createSymbol(visualMapModel.get('indicatorIcon'), -scale / 2, -scale / 2, scale, scale, null, true); + indicator.attr({ + cursor: 'move', + invisible: true, + silent: true, + x: itemSize[0] / 2 + }); + var indicatorStyle = visualMapModel.getModel('indicatorStyle').getItemStyle(); + + if (indicator instanceof ZRImage) { + var pathStyle = indicator.style; + indicator.useStyle(extend({ + // TODO other properties like x, y ? + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, indicatorStyle)); + } else { + indicator.useStyle(indicatorStyle); + } + + mainGroup.add(indicator); + var textStyleModel = this.visualMapModel.textStyleModel; + var indicatorLabel = new ZRText({ + silent: true, + invisible: true, + style: createTextStyle(textStyleModel, { + x: 0, + y: 0, + text: '' + }) + }); + this.group.add(indicatorLabel); + var indicatorLabelPoint = [(orient === 'horizontal' ? textSize / 2 : HOVER_LINK_OUT) + itemSize[0] / 2, 0]; + var shapes = this._shapes; + shapes.indicator = indicator; + shapes.indicatorLabel = indicatorLabel; + shapes.indicatorLabelPoint = indicatorLabelPoint; + this._firstShowIndicator = true; + }; + + ContinuousView.prototype._dragHandle = function (handleIndex, isEnd, // dx is event from ondragend if isEnd is true. It's not used + dx, dy) { + if (!this._useHandle) { + return; + } + + this._dragging = !isEnd; + + if (!isEnd) { + // Transform dx, dy to bar coordination. + var vertex = this._applyTransform([dx, dy], this._shapes.mainGroup, true); + + this._updateInterval(handleIndex, vertex[1]); + + this._hideIndicator(); // Considering realtime, update view should be executed + // before dispatch action. + + + this._updateView(); + } // dragEnd do not dispatch action when realtime. + + + if (isEnd === !this.visualMapModel.get('realtime')) { + // jshint ignore:line + this.api.dispatchAction({ + type: 'selectDataRange', + from: this.uid, + visualMapId: this.visualMapModel.id, + selected: this._dataInterval.slice() + }); + } + + if (isEnd) { + !this._hovering && this._clearHoverLinkToSeries(); + } else if (useHoverLinkOnHandle(this.visualMapModel)) { + this._doHoverLinkToSeries(this._handleEnds[handleIndex], false); + } + }; + + ContinuousView.prototype._resetInterval = function () { + var visualMapModel = this.visualMapModel; + var dataInterval = this._dataInterval = visualMapModel.getSelected(); + var dataExtent = visualMapModel.getExtent(); + var sizeExtent = [0, visualMapModel.itemSize[1]]; + this._handleEnds = [linearMap$2(dataInterval[0], dataExtent, sizeExtent, true), linearMap$2(dataInterval[1], dataExtent, sizeExtent, true)]; + }; + /** + * @private + * @param {(number|string)} handleIndex 0 or 1 or 'all' + * @param {number} dx + * @param {number} dy + */ + + + ContinuousView.prototype._updateInterval = function (handleIndex, delta) { + delta = delta || 0; + var visualMapModel = this.visualMapModel; + var handleEnds = this._handleEnds; + var sizeExtent = [0, visualMapModel.itemSize[1]]; + sliderMove(delta, handleEnds, sizeExtent, handleIndex, // cross is forbiden + 0); + var dataExtent = visualMapModel.getExtent(); // Update data interval. + + this._dataInterval = [linearMap$2(handleEnds[0], sizeExtent, dataExtent, true), linearMap$2(handleEnds[1], sizeExtent, dataExtent, true)]; + }; + + ContinuousView.prototype._updateView = function (forSketch) { + var visualMapModel = this.visualMapModel; + var dataExtent = visualMapModel.getExtent(); + var shapes = this._shapes; + var outOfRangeHandleEnds = [0, visualMapModel.itemSize[1]]; + var inRangeHandleEnds = forSketch ? outOfRangeHandleEnds : this._handleEnds; + + var visualInRange = this._createBarVisual(this._dataInterval, dataExtent, inRangeHandleEnds, 'inRange'); + + var visualOutOfRange = this._createBarVisual(dataExtent, dataExtent, outOfRangeHandleEnds, 'outOfRange'); + + shapes.inRange.setStyle({ + fill: visualInRange.barColor // opacity: visualInRange.opacity + + }).setShape('points', visualInRange.barPoints); + shapes.outOfRange.setStyle({ + fill: visualOutOfRange.barColor // opacity: visualOutOfRange.opacity + + }).setShape('points', visualOutOfRange.barPoints); + + this._updateHandle(inRangeHandleEnds, visualInRange); + }; + + ContinuousView.prototype._createBarVisual = function (dataInterval, dataExtent, handleEnds, forceState) { + var opts = { + forceState: forceState, + convertOpacityToAlpha: true + }; + + var colorStops = this._makeColorGradient(dataInterval, opts); + + var symbolSizes = [this.getControllerVisual(dataInterval[0], 'symbolSize', opts), this.getControllerVisual(dataInterval[1], 'symbolSize', opts)]; + + var barPoints = this._createBarPoints(handleEnds, symbolSizes); + + return { + barColor: new LinearGradient(0, 0, 0, 1, colorStops), + barPoints: barPoints, + handlesColor: [colorStops[0].color, colorStops[colorStops.length - 1].color] + }; + }; + + ContinuousView.prototype._makeColorGradient = function (dataInterval, opts) { + // Considering colorHue, which is not linear, so we have to sample + // to calculate gradient color stops, but not only caculate head + // and tail. + var sampleNumber = 100; // Arbitrary value. + + var colorStops = []; + var step = (dataInterval[1] - dataInterval[0]) / sampleNumber; + colorStops.push({ + color: this.getControllerVisual(dataInterval[0], 'color', opts), + offset: 0 + }); + + for (var i = 1; i < sampleNumber; i++) { + var currValue = dataInterval[0] + step * i; + + if (currValue > dataInterval[1]) { + break; + } + + colorStops.push({ + color: this.getControllerVisual(currValue, 'color', opts), + offset: i / sampleNumber + }); + } + + colorStops.push({ + color: this.getControllerVisual(dataInterval[1], 'color', opts), + offset: 1 + }); + return colorStops; + }; + + ContinuousView.prototype._createBarPoints = function (handleEnds, symbolSizes) { + var itemSize = this.visualMapModel.itemSize; + return [[itemSize[0] - symbolSizes[0], handleEnds[0]], [itemSize[0], handleEnds[0]], [itemSize[0], handleEnds[1]], [itemSize[0] - symbolSizes[1], handleEnds[1]]]; + }; + + ContinuousView.prototype._createBarGroup = function (itemAlign) { + var orient = this._orient; + var inverse = this.visualMapModel.get('inverse'); + return new Group(orient === 'horizontal' && !inverse ? { + scaleX: itemAlign === 'bottom' ? 1 : -1, + rotation: Math.PI / 2 + } : orient === 'horizontal' && inverse ? { + scaleX: itemAlign === 'bottom' ? -1 : 1, + rotation: -Math.PI / 2 + } : orient === 'vertical' && !inverse ? { + scaleX: itemAlign === 'left' ? 1 : -1, + scaleY: -1 + } : { + scaleX: itemAlign === 'left' ? 1 : -1 + }); + }; + + ContinuousView.prototype._updateHandle = function (handleEnds, visualInRange) { + if (!this._useHandle) { + return; + } + + var shapes = this._shapes; + var visualMapModel = this.visualMapModel; + var handleThumbs = shapes.handleThumbs; + var handleLabels = shapes.handleLabels; + var itemSize = visualMapModel.itemSize; + var dataExtent = visualMapModel.getExtent(); + each$e([0, 1], function (handleIndex) { + var handleThumb = handleThumbs[handleIndex]; + handleThumb.setStyle('fill', visualInRange.handlesColor[handleIndex]); + handleThumb.y = handleEnds[handleIndex]; + var val = linearMap$2(handleEnds[handleIndex], [0, itemSize[1]], dataExtent, true); + var symbolSize = this.getControllerVisual(val, 'symbolSize'); + handleThumb.scaleX = handleThumb.scaleY = symbolSize / itemSize[0]; + handleThumb.x = itemSize[0] - symbolSize / 2; // Update handle label position. + + var textPoint = applyTransform$1(shapes.handleLabelPoints[handleIndex], getTransform(handleThumb, this.group)); + handleLabels[handleIndex].setStyle({ + x: textPoint[0], + y: textPoint[1], + text: visualMapModel.formatValueText(this._dataInterval[handleIndex]), + verticalAlign: 'middle', + align: this._orient === 'vertical' ? this._applyTransform('left', shapes.mainGroup) : 'center' + }); + }, this); + }; + + ContinuousView.prototype._showIndicator = function (cursorValue, textValue, rangeSymbol, halfHoverLinkSize) { + var visualMapModel = this.visualMapModel; + var dataExtent = visualMapModel.getExtent(); + var itemSize = visualMapModel.itemSize; + var sizeExtent = [0, itemSize[1]]; + var shapes = this._shapes; + var indicator = shapes.indicator; + + if (!indicator) { + return; + } + + indicator.attr('invisible', false); + var opts = { + convertOpacityToAlpha: true + }; + var color = this.getControllerVisual(cursorValue, 'color', opts); + var symbolSize = this.getControllerVisual(cursorValue, 'symbolSize'); + var y = linearMap$2(cursorValue, dataExtent, sizeExtent, true); + var x = itemSize[0] - symbolSize / 2; + var oldIndicatorPos = { + x: indicator.x, + y: indicator.y + }; // Update handle label position. + + indicator.y = y; + indicator.x = x; + var textPoint = applyTransform$1(shapes.indicatorLabelPoint, getTransform(indicator, this.group)); + var indicatorLabel = shapes.indicatorLabel; + indicatorLabel.attr('invisible', false); + + var align = this._applyTransform('left', shapes.mainGroup); + + var orient = this._orient; + var isHorizontal = orient === 'horizontal'; + indicatorLabel.setStyle({ + text: (rangeSymbol ? rangeSymbol : '') + visualMapModel.formatValueText(textValue), + verticalAlign: isHorizontal ? align : 'middle', + align: isHorizontal ? 'center' : align + }); + var indicatorNewProps = { + x: x, + y: y, + style: { + fill: color + } + }; + var labelNewProps = { + style: { + x: textPoint[0], + y: textPoint[1] + } + }; + + if (visualMapModel.ecModel.isAnimationEnabled() && !this._firstShowIndicator) { + var animationCfg = { + duration: 100, + easing: 'cubicInOut', + additive: true + }; + indicator.x = oldIndicatorPos.x; + indicator.y = oldIndicatorPos.y; + indicator.animateTo(indicatorNewProps, animationCfg); + indicatorLabel.animateTo(labelNewProps, animationCfg); + } else { + indicator.attr(indicatorNewProps); + indicatorLabel.attr(labelNewProps); + } + + this._firstShowIndicator = false; + var handleLabels = this._shapes.handleLabels; + + if (handleLabels) { + for (var i = 0; i < handleLabels.length; i++) { + // Fade out handle labels. + // NOTE: Must use api enter/leave on emphasis/blur/select state. Or the global states manager will change it. + this._api.enterBlur(handleLabels[i]); + } + } + }; + + ContinuousView.prototype._enableHoverLinkToSeries = function () { + var self = this; + + this._shapes.mainGroup.on('mousemove', function (e) { + self._hovering = true; + + if (!self._dragging) { + var itemSize = self.visualMapModel.itemSize; + + var pos = self._applyTransform([e.offsetX, e.offsetY], self._shapes.mainGroup, true, true); // For hover link show when hover handle, which might be + // below or upper than sizeExtent. + + + pos[1] = mathMin$a(mathMax$a(0, pos[1]), itemSize[1]); + + self._doHoverLinkToSeries(pos[1], 0 <= pos[0] && pos[0] <= itemSize[0]); + } + }).on('mouseout', function () { + // When mouse is out of handle, hoverLink still need + // to be displayed when realtime is set as false. + self._hovering = false; + !self._dragging && self._clearHoverLinkToSeries(); + }); + }; + + ContinuousView.prototype._enableHoverLinkFromSeries = function () { + var zr = this.api.getZr(); + + if (this.visualMapModel.option.hoverLink) { + zr.on('mouseover', this._hoverLinkFromSeriesMouseOver, this); + zr.on('mouseout', this._hideIndicator, this); + } else { + this._clearHoverLinkFromSeries(); + } + }; + + ContinuousView.prototype._doHoverLinkToSeries = function (cursorPos, hoverOnBar) { + var visualMapModel = this.visualMapModel; + var itemSize = visualMapModel.itemSize; + + if (!visualMapModel.option.hoverLink) { + return; + } + + var sizeExtent = [0, itemSize[1]]; + var dataExtent = visualMapModel.getExtent(); // For hover link show when hover handle, which might be below or upper than sizeExtent. + + cursorPos = mathMin$a(mathMax$a(sizeExtent[0], cursorPos), sizeExtent[1]); + var halfHoverLinkSize = getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent); + var hoverRange = [cursorPos - halfHoverLinkSize, cursorPos + halfHoverLinkSize]; + var cursorValue = linearMap$2(cursorPos, sizeExtent, dataExtent, true); + var valueRange = [linearMap$2(hoverRange[0], sizeExtent, dataExtent, true), linearMap$2(hoverRange[1], sizeExtent, dataExtent, true)]; // Consider data range is out of visualMap range, see test/visualMap-continuous.html, + // where china and india has very large population. + + hoverRange[0] < sizeExtent[0] && (valueRange[0] = -Infinity); + hoverRange[1] > sizeExtent[1] && (valueRange[1] = Infinity); // Do not show indicator when mouse is over handle, + // otherwise labels overlap, especially when dragging. + + if (hoverOnBar) { + if (valueRange[0] === -Infinity) { + this._showIndicator(cursorValue, valueRange[1], '< ', halfHoverLinkSize); + } else if (valueRange[1] === Infinity) { + this._showIndicator(cursorValue, valueRange[0], '> ', halfHoverLinkSize); + } else { + this._showIndicator(cursorValue, cursorValue, '≈ ', halfHoverLinkSize); + } + } // When realtime is set as false, handles, which are in barGroup, + // also trigger hoverLink, which help user to realize where they + // focus on when dragging. (see test/heatmap-large.html) + // When realtime is set as true, highlight will not show when hover + // handle, because the label on handle, which displays a exact value + // but not range, might mislead users. + + + var oldBatch = this._hoverLinkDataIndices; + var newBatch = []; + + if (hoverOnBar || useHoverLinkOnHandle(visualMapModel)) { + newBatch = this._hoverLinkDataIndices = visualMapModel.findTargetDataIndices(valueRange); + } + + var resultBatches = compressBatches(oldBatch, newBatch); + + this._dispatchHighDown('downplay', makeHighDownBatch(resultBatches[0], visualMapModel)); + + this._dispatchHighDown('highlight', makeHighDownBatch(resultBatches[1], visualMapModel)); + }; + + ContinuousView.prototype._hoverLinkFromSeriesMouseOver = function (e) { + var el = e.target; + var visualMapModel = this.visualMapModel; + + if (!el || getECData(el).dataIndex == null) { + return; + } + + var ecData = getECData(el); + var dataModel = this.ecModel.getSeriesByIndex(ecData.seriesIndex); + + if (!visualMapModel.isTargetSeries(dataModel)) { + return; + } + + var data = dataModel.getData(ecData.dataType); + var value = data.getStore().get(visualMapModel.getDataDimensionIndex(data), ecData.dataIndex); + + if (!isNaN(value)) { + this._showIndicator(value, value); + } + }; + + ContinuousView.prototype._hideIndicator = function () { + var shapes = this._shapes; + shapes.indicator && shapes.indicator.attr('invisible', true); + shapes.indicatorLabel && shapes.indicatorLabel.attr('invisible', true); + var handleLabels = this._shapes.handleLabels; + + if (handleLabels) { + for (var i = 0; i < handleLabels.length; i++) { + // Fade out handle labels. + // NOTE: Must use api enter/leave on emphasis/blur/select state. Or the global states manager will change it. + this._api.leaveBlur(handleLabels[i]); + } + } + }; + + ContinuousView.prototype._clearHoverLinkToSeries = function () { + this._hideIndicator(); + + var indices = this._hoverLinkDataIndices; + + this._dispatchHighDown('downplay', makeHighDownBatch(indices, this.visualMapModel)); + + indices.length = 0; + }; + + ContinuousView.prototype._clearHoverLinkFromSeries = function () { + this._hideIndicator(); + + var zr = this.api.getZr(); + zr.off('mouseover', this._hoverLinkFromSeriesMouseOver); + zr.off('mouseout', this._hideIndicator); + }; + + ContinuousView.prototype._applyTransform = function (vertex, element, inverse, global) { + var transform = getTransform(element, global ? null : this.group); + return isArray(vertex) ? applyTransform$1(vertex, transform, inverse) : transformDirection(vertex, transform, inverse); + }; // TODO: TYPE more specified payload types. + + + ContinuousView.prototype._dispatchHighDown = function (type, batch) { + batch && batch.length && this.api.dispatchAction({ + type: type, + batch: batch + }); + }; + /** + * @override + */ + + + ContinuousView.prototype.dispose = function () { + this._clearHoverLinkFromSeries(); + + this._clearHoverLinkToSeries(); + }; + /** + * @override + */ + + + ContinuousView.prototype.remove = function () { + this._clearHoverLinkFromSeries(); + + this._clearHoverLinkToSeries(); + }; + + ContinuousView.type = 'visualMap.continuous'; + return ContinuousView; + }(VisualMapView); + + function createPolygon(points, cursor, onDrift, onDragEnd) { + return new Polygon({ + shape: { + points: points + }, + draggable: !!onDrift, + cursor: cursor, + drift: onDrift, + onmousemove: function (e) { + // Fot mobile devicem, prevent screen slider on the button. + stop(e.event); + }, + ondragend: onDragEnd + }); + } + + function getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent) { + var halfHoverLinkSize = HOVER_LINK_SIZE / 2; + var hoverLinkDataSize = visualMapModel.get('hoverLinkDataSize'); + + if (hoverLinkDataSize) { + halfHoverLinkSize = linearMap$2(hoverLinkDataSize, dataExtent, sizeExtent, true) / 2; + } + + return halfHoverLinkSize; + } + + function useHoverLinkOnHandle(visualMapModel) { + var hoverLinkOnHandle = visualMapModel.get('hoverLinkOnHandle'); + return !!(hoverLinkOnHandle == null ? visualMapModel.get('realtime') : hoverLinkOnHandle); + } + + function getCursor$1(orient) { + return orient === 'vertical' ? 'ns-resize' : 'ew-resize'; + } + + /* + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * 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. + */ + var visualMapActionInfo = { + type: 'selectDataRange', + event: 'dataRangeSelected', + // FIXME use updateView appears wrong + update: 'update' + }; + var visualMapActionHander = function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'visualMap', + query: payload + }, function (model) { + model.setSelected(payload.selected); + }); + }; + + var visualMapEncodingHandlers = [{ + createOnAllSeries: true, + reset: function (seriesModel, ecModel) { + var resetDefines = []; + ecModel.eachComponent('visualMap', function (visualMapModel) { + var pipelineContext = seriesModel.pipelineContext; + + if (!visualMapModel.isTargetSeries(seriesModel) || pipelineContext && pipelineContext.large) { + return; + } + + resetDefines.push(incrementalApplyVisual(visualMapModel.stateList, visualMapModel.targetVisuals, bind(visualMapModel.getValueState, visualMapModel), visualMapModel.getDataDimensionIndex(seriesModel.getData()))); + }); + return resetDefines; + } + }, // Only support color. + { + createOnAllSeries: true, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + var visualMetaList = []; + ecModel.eachComponent('visualMap', function (visualMapModel) { + if (visualMapModel.isTargetSeries(seriesModel)) { + var visualMeta = visualMapModel.getVisualMeta(bind(getColorVisual, null, seriesModel, visualMapModel)) || { + stops: [], + outerColors: [] + }; + var dimIdx = visualMapModel.getDataDimensionIndex(data); + + if (dimIdx >= 0) { + // visualMeta.dimension should be dimension index, but not concrete dimension. + visualMeta.dimension = dimIdx; + visualMetaList.push(visualMeta); + } + } + }); // console.log(JSON.stringify(visualMetaList.map(a => a.stops))); + + seriesModel.getData().setVisual('visualMeta', visualMetaList); + } + }]; // FIXME + // performance and export for heatmap? + // value can be Infinity or -Infinity + + function getColorVisual(seriesModel, visualMapModel, value, valueState) { + var mappings = visualMapModel.targetVisuals[valueState]; + var visualTypes = VisualMapping.prepareVisualTypes(mappings); + var resultVisual = { + color: getVisualFromData(seriesModel.getData(), 'color') // default color. + + }; + + for (var i = 0, len = visualTypes.length; i < len; i++) { + var type = visualTypes[i]; + var mapping = mappings[type === 'opacity' ? '__alphaForOpacity' : type]; + mapping && mapping.applyVisual(value, getVisual, setVisual); + } + + return resultVisual.color; + + function getVisual(key) { + return resultVisual[key]; + } + + function setVisual(key, value) { + resultVisual[key] = value; + } + } + + var each$f = each; + function visualMapPreprocessor(option) { + var visualMap = option && option.visualMap; + + if (!isArray(visualMap)) { + visualMap = visualMap ? [visualMap] : []; + } + + each$f(visualMap, function (opt) { + if (!opt) { + return; + } // rename splitList to pieces + + + if (has$1(opt, 'splitList') && !has$1(opt, 'pieces')) { + opt.pieces = opt.splitList; + delete opt.splitList; + } + + var pieces = opt.pieces; + + if (pieces && isArray(pieces)) { + each$f(pieces, function (piece) { + if (isObject(piece)) { + if (has$1(piece, 'start') && !has$1(piece, 'min')) { + piece.min = piece.start; + } + + if (has$1(piece, 'end') && !has$1(piece, 'max')) { + piece.max = piece.end; + } + } + }); + } + }); + } + + function has$1(obj, name) { + return obj && obj.hasOwnProperty && obj.hasOwnProperty(name); + } + + var installed$1 = false; + function installCommon$1(registers) { + if (installed$1) { + return; + } + + installed$1 = true; + registers.registerSubTypeDefaulter('visualMap', function (option) { + // Compatible with ec2, when splitNumber === 0, continuous visualMap will be used. + return !option.categories && (!(option.pieces ? option.pieces.length > 0 : option.splitNumber > 0) || option.calculable) ? 'continuous' : 'piecewise'; + }); + registers.registerAction(visualMapActionInfo, visualMapActionHander); + each(visualMapEncodingHandlers, function (handler) { + registers.registerVisual(registers.PRIORITY.VISUAL.COMPONENT, handler); + }); + registers.registerPreprocessor(visualMapPreprocessor); + } + + function install$N(registers) { + registers.registerComponentModel(ContinuousModel); + registers.registerComponentView(ContinuousView); + installCommon$1(registers); + } + + var PiecewiseModel = + /** @class */ + function (_super) { + __extends(PiecewiseModel, _super); + + function PiecewiseModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PiecewiseModel.type; + /** + * The order is always [low, ..., high]. + * [{text: string, interval: Array.<number>}, ...] + */ + + _this._pieceList = []; + return _this; + } + + PiecewiseModel.prototype.optionUpdated = function (newOption, isInit) { + _super.prototype.optionUpdated.apply(this, arguments); + + this.resetExtent(); + + var mode = this._mode = this._determineMode(); + + this._pieceList = []; + + resetMethods[this._mode].call(this, this._pieceList); + + this._resetSelected(newOption, isInit); + + var categories = this.option.categories; + this.resetVisual(function (mappingOption, state) { + if (mode === 'categories') { + mappingOption.mappingMethod = 'category'; + mappingOption.categories = clone(categories); + } else { + mappingOption.dataExtent = this.getExtent(); + mappingOption.mappingMethod = 'piecewise'; + mappingOption.pieceList = map(this._pieceList, function (piece) { + piece = clone(piece); + + if (state !== 'inRange') { + // FIXME + // outOfRange do not support special visual in pieces. + piece.visual = null; + } + + return piece; + }); + } + }); + }; + /** + * @protected + * @override + */ + + + PiecewiseModel.prototype.completeVisualOption = function () { + // Consider this case: + // visualMap: { + // pieces: [{symbol: 'circle', lt: 0}, {symbol: 'rect', gte: 0}] + // } + // where no inRange/outOfRange set but only pieces. So we should make + // default inRange/outOfRange for this case, otherwise visuals that only + // appear in `pieces` will not be taken into account in visual encoding. + var option = this.option; + var visualTypesInPieces = {}; + var visualTypes = VisualMapping.listVisualTypes(); + var isCategory = this.isCategory(); + each(option.pieces, function (piece) { + each(visualTypes, function (visualType) { + if (piece.hasOwnProperty(visualType)) { + visualTypesInPieces[visualType] = 1; + } + }); + }); + each(visualTypesInPieces, function (v, visualType) { + var exists = false; + each(this.stateList, function (state) { + exists = exists || has(option, state, visualType) || has(option.target, state, visualType); + }, this); + !exists && each(this.stateList, function (state) { + (option[state] || (option[state] = {}))[visualType] = visualDefault.get(visualType, state === 'inRange' ? 'active' : 'inactive', isCategory); + }); + }, this); + + function has(obj, state, visualType) { + return obj && obj[state] && obj[state].hasOwnProperty(visualType); + } + + _super.prototype.completeVisualOption.apply(this, arguments); + }; + + PiecewiseModel.prototype._resetSelected = function (newOption, isInit) { + var thisOption = this.option; + var pieceList = this._pieceList; // Selected do not merge but all override. + + var selected = (isInit ? thisOption : newOption).selected || {}; + thisOption.selected = selected; // Consider 'not specified' means true. + + each(pieceList, function (piece, index) { + var key = this.getSelectedMapKey(piece); + + if (!selected.hasOwnProperty(key)) { + selected[key] = true; + } + }, this); + + if (thisOption.selectedMode === 'single') { + // Ensure there is only one selected. + var hasSel_1 = false; + each(pieceList, function (piece, index) { + var key = this.getSelectedMapKey(piece); + + if (selected[key]) { + hasSel_1 ? selected[key] = false : hasSel_1 = true; + } + }, this); + } // thisOption.selectedMode === 'multiple', default: all selected. + + }; + /** + * @public + */ + + + PiecewiseModel.prototype.getItemSymbol = function () { + return this.get('itemSymbol'); + }; + /** + * @public + */ + + + PiecewiseModel.prototype.getSelectedMapKey = function (piece) { + return this._mode === 'categories' ? piece.value + '' : piece.index + ''; + }; + /** + * @public + */ + + + PiecewiseModel.prototype.getPieceList = function () { + return this._pieceList; + }; + /** + * @return {string} + */ + + + PiecewiseModel.prototype._determineMode = function () { + var option = this.option; + return option.pieces && option.pieces.length > 0 ? 'pieces' : this.option.categories ? 'categories' : 'splitNumber'; + }; + /** + * @override + */ + + + PiecewiseModel.prototype.setSelected = function (selected) { + this.option.selected = clone(selected); + }; + /** + * @override + */ + + + PiecewiseModel.prototype.getValueState = function (value) { + var index = VisualMapping.findPieceIndex(value, this._pieceList); + return index != null ? this.option.selected[this.getSelectedMapKey(this._pieceList[index])] ? 'inRange' : 'outOfRange' : 'outOfRange'; + }; + /** + * @public + * @param pieceIndex piece index in visualMapModel.getPieceList() + */ + + + PiecewiseModel.prototype.findTargetDataIndices = function (pieceIndex) { + var result = []; + var pieceList = this._pieceList; + this.eachTargetSeries(function (seriesModel) { + var dataIndices = []; + var data = seriesModel.getData(); + data.each(this.getDataDimensionIndex(data), function (value, dataIndex) { + // Should always base on model pieceList, because it is order sensitive. + var pIdx = VisualMapping.findPieceIndex(value, pieceList); + pIdx === pieceIndex && dataIndices.push(dataIndex); + }, this); + result.push({ + seriesId: seriesModel.id, + dataIndex: dataIndices + }); + }, this); + return result; + }; + /** + * @private + * @param piece piece.value or piece.interval is required. + * @return Can be Infinity or -Infinity + */ + + + PiecewiseModel.prototype.getRepresentValue = function (piece) { + var representValue; + + if (this.isCategory()) { + representValue = piece.value; + } else { + if (piece.value != null) { + representValue = piece.value; + } else { + var pieceInterval = piece.interval || []; + representValue = pieceInterval[0] === -Infinity && pieceInterval[1] === Infinity ? 0 : (pieceInterval[0] + pieceInterval[1]) / 2; + } + } + + return representValue; + }; + + PiecewiseModel.prototype.getVisualMeta = function (getColorVisual) { + // Do not support category. (category axis is ordinal, numerical) + if (this.isCategory()) { + return; + } + + var stops = []; + var outerColors = ['', '']; + var visualMapModel = this; + + function setStop(interval, valueState) { + var representValue = visualMapModel.getRepresentValue({ + interval: interval + }); // Not category + + if (!valueState) { + valueState = visualMapModel.getValueState(representValue); + } + + var color = getColorVisual(representValue, valueState); + + if (interval[0] === -Infinity) { + outerColors[0] = color; + } else if (interval[1] === Infinity) { + outerColors[1] = color; + } else { + stops.push({ + value: interval[0], + color: color + }, { + value: interval[1], + color: color + }); + } + } // Suplement + + + var pieceList = this._pieceList.slice(); + + if (!pieceList.length) { + pieceList.push({ + interval: [-Infinity, Infinity] + }); + } else { + var edge = pieceList[0].interval[0]; + edge !== -Infinity && pieceList.unshift({ + interval: [-Infinity, edge] + }); + edge = pieceList[pieceList.length - 1].interval[1]; + edge !== Infinity && pieceList.push({ + interval: [edge, Infinity] + }); + } + + var curr = -Infinity; + each(pieceList, function (piece) { + var interval = piece.interval; + + if (interval) { + // Fulfill gap. + interval[0] > curr && setStop([curr, interval[0]], 'outOfRange'); + setStop(interval.slice()); + curr = interval[1]; + } + }, this); + return { + stops: stops, + outerColors: outerColors + }; + }; + + PiecewiseModel.type = 'visualMap.piecewise'; + PiecewiseModel.defaultOption = inheritDefaultOption(VisualMapModel.defaultOption, { + selected: null, + minOpen: false, + maxOpen: false, + align: 'auto', + itemWidth: 20, + itemHeight: 14, + itemSymbol: 'roundRect', + pieces: null, + categories: null, + splitNumber: 5, + selectedMode: 'multiple', + itemGap: 10, + hoverLink: true // Enable hover highlight. + + }); + return PiecewiseModel; + }(VisualMapModel); + /** + * Key is this._mode + * @type {Object} + * @this {module:echarts/component/viusalMap/PiecewiseMode} + */ + + var resetMethods = { + splitNumber: function (outPieceList) { + var thisOption = this.option; + var precision = Math.min(thisOption.precision, 20); + var dataExtent = this.getExtent(); + var splitNumber = thisOption.splitNumber; + splitNumber = Math.max(parseInt(splitNumber, 10), 1); + thisOption.splitNumber = splitNumber; + var splitStep = (dataExtent[1] - dataExtent[0]) / splitNumber; // Precision auto-adaption + + while (+splitStep.toFixed(precision) !== splitStep && precision < 5) { + precision++; + } + + thisOption.precision = precision; + splitStep = +splitStep.toFixed(precision); + + if (thisOption.minOpen) { + outPieceList.push({ + interval: [-Infinity, dataExtent[0]], + close: [0, 0] + }); + } + + for (var index = 0, curr = dataExtent[0]; index < splitNumber; curr += splitStep, index++) { + var max = index === splitNumber - 1 ? dataExtent[1] : curr + splitStep; + outPieceList.push({ + interval: [curr, max], + close: [1, 1] + }); + } + + if (thisOption.maxOpen) { + outPieceList.push({ + interval: [dataExtent[1], Infinity], + close: [0, 0] + }); + } + + reformIntervals(outPieceList); + each(outPieceList, function (piece, index) { + piece.index = index; + piece.text = this.formatValueText(piece.interval); + }, this); + }, + categories: function (outPieceList) { + var thisOption = this.option; + each(thisOption.categories, function (cate) { + // FIXME category模式也使用pieceList,但在visualMapping中不是使用pieceList。 + // 是否改一致。 + outPieceList.push({ + text: this.formatValueText(cate, true), + value: cate + }); + }, this); // See "Order Rule". + + normalizeReverse(thisOption, outPieceList); + }, + pieces: function (outPieceList) { + var thisOption = this.option; + each(thisOption.pieces, function (pieceListItem, index) { + if (!isObject(pieceListItem)) { + pieceListItem = { + value: pieceListItem + }; + } + + var item = { + text: '', + index: index + }; + + if (pieceListItem.label != null) { + item.text = pieceListItem.label; + } + + if (pieceListItem.hasOwnProperty('value')) { + var value = item.value = pieceListItem.value; + item.interval = [value, value]; + item.close = [1, 1]; + } else { + // `min` `max` is legacy option. + // `lt` `gt` `lte` `gte` is recommanded. + var interval = item.interval = []; + var close_1 = item.close = [0, 0]; + var closeList = [1, 0, 1]; + var infinityList = [-Infinity, Infinity]; + var useMinMax = []; + + for (var lg = 0; lg < 2; lg++) { + var names = [['gte', 'gt', 'min'], ['lte', 'lt', 'max']][lg]; + + for (var i = 0; i < 3 && interval[lg] == null; i++) { + interval[lg] = pieceListItem[names[i]]; + close_1[lg] = closeList[i]; + useMinMax[lg] = i === 2; + } + + interval[lg] == null && (interval[lg] = infinityList[lg]); + } + + useMinMax[0] && interval[1] === Infinity && (close_1[0] = 0); + useMinMax[1] && interval[0] === -Infinity && (close_1[1] = 0); + + if ("development" !== 'production') { + if (interval[0] > interval[1]) { + console.warn('Piece ' + index + 'is illegal: ' + interval + ' lower bound should not greater then uppper bound.'); + } + } + + if (interval[0] === interval[1] && close_1[0] && close_1[1]) { + // Consider: [{min: 5, max: 5, visual: {...}}, {min: 0, max: 5}], + // we use value to lift the priority when min === max + item.value = interval[0]; + } + } + + item.visual = VisualMapping.retrieveVisuals(pieceListItem); + outPieceList.push(item); + }, this); // See "Order Rule". + + normalizeReverse(thisOption, outPieceList); // Only pieces + + reformIntervals(outPieceList); + each(outPieceList, function (piece) { + var close = piece.close; + var edgeSymbols = [['<', '≤'][close[1]], ['>', '≥'][close[0]]]; + piece.text = piece.text || this.formatValueText(piece.value != null ? piece.value : piece.interval, false, edgeSymbols); + }, this); + } + }; + + function normalizeReverse(thisOption, pieceList) { + var inverse = thisOption.inverse; + + if (thisOption.orient === 'vertical' ? !inverse : inverse) { + pieceList.reverse(); + } + } + + var PiecewiseVisualMapView = + /** @class */ + function (_super) { + __extends(PiecewiseVisualMapView, _super); + + function PiecewiseVisualMapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PiecewiseVisualMapView.type; + return _this; + } + + PiecewiseVisualMapView.prototype.doRender = function () { + var thisGroup = this.group; + thisGroup.removeAll(); + var visualMapModel = this.visualMapModel; + var textGap = visualMapModel.get('textGap'); + var textStyleModel = visualMapModel.textStyleModel; + var textFont = textStyleModel.getFont(); + var textFill = textStyleModel.getTextColor(); + + var itemAlign = this._getItemAlign(); + + var itemSize = visualMapModel.itemSize; + + var viewData = this._getViewData(); + + var endsText = viewData.endsText; + var showLabel = retrieve(visualMapModel.get('showLabel', true), !endsText); + endsText && this._renderEndsText(thisGroup, endsText[0], itemSize, showLabel, itemAlign); + each(viewData.viewPieceList, function (item) { + var piece = item.piece; + var itemGroup = new Group(); + itemGroup.onclick = bind(this._onItemClick, this, piece); + + this._enableHoverLink(itemGroup, item.indexInModelPieceList); // TODO Category + + + var representValue = visualMapModel.getRepresentValue(piece); + + this._createItemSymbol(itemGroup, representValue, [0, 0, itemSize[0], itemSize[1]]); + + if (showLabel) { + var visualState = this.visualMapModel.getValueState(representValue); + itemGroup.add(new ZRText({ + style: { + x: itemAlign === 'right' ? -textGap : itemSize[0] + textGap, + y: itemSize[1] / 2, + text: piece.text, + verticalAlign: 'middle', + align: itemAlign, + font: textFont, + fill: textFill, + opacity: visualState === 'outOfRange' ? 0.5 : 1 + } + })); + } + + thisGroup.add(itemGroup); + }, this); + endsText && this._renderEndsText(thisGroup, endsText[1], itemSize, showLabel, itemAlign); + box(visualMapModel.get('orient'), thisGroup, visualMapModel.get('itemGap')); + this.renderBackground(thisGroup); + this.positionGroup(thisGroup); + }; + + PiecewiseVisualMapView.prototype._enableHoverLink = function (itemGroup, pieceIndex) { + var _this = this; + + itemGroup.on('mouseover', function () { + return onHoverLink('highlight'); + }).on('mouseout', function () { + return onHoverLink('downplay'); + }); + + var onHoverLink = function (method) { + var visualMapModel = _this.visualMapModel; // TODO: TYPE More detailed action types + + visualMapModel.option.hoverLink && _this.api.dispatchAction({ + type: method, + batch: makeHighDownBatch(visualMapModel.findTargetDataIndices(pieceIndex), visualMapModel) + }); + }; + }; + + PiecewiseVisualMapView.prototype._getItemAlign = function () { + var visualMapModel = this.visualMapModel; + var modelOption = visualMapModel.option; + + if (modelOption.orient === 'vertical') { + return getItemAlign(visualMapModel, this.api, visualMapModel.itemSize); + } else { + // horizontal, most case left unless specifying right. + var align = modelOption.align; + + if (!align || align === 'auto') { + align = 'left'; + } + + return align; + } + }; + + PiecewiseVisualMapView.prototype._renderEndsText = function (group, text, itemSize, showLabel, itemAlign) { + if (!text) { + return; + } + + var itemGroup = new Group(); + var textStyleModel = this.visualMapModel.textStyleModel; + itemGroup.add(new ZRText({ + style: createTextStyle(textStyleModel, { + x: showLabel ? itemAlign === 'right' ? itemSize[0] : 0 : itemSize[0] / 2, + y: itemSize[1] / 2, + verticalAlign: 'middle', + align: showLabel ? itemAlign : 'center', + text: text + }) + })); + group.add(itemGroup); + }; + /** + * @private + * @return {Object} {peiceList, endsText} The order is the same as screen pixel order. + */ + + + PiecewiseVisualMapView.prototype._getViewData = function () { + var visualMapModel = this.visualMapModel; + var viewPieceList = map(visualMapModel.getPieceList(), function (piece, index) { + return { + piece: piece, + indexInModelPieceList: index + }; + }); + var endsText = visualMapModel.get('text'); // Consider orient and inverse. + + var orient = visualMapModel.get('orient'); + var inverse = visualMapModel.get('inverse'); // Order of model pieceList is always [low, ..., high] + + if (orient === 'horizontal' ? inverse : !inverse) { + viewPieceList.reverse(); + } // Origin order of endsText is [high, low] + else if (endsText) { + endsText = endsText.slice().reverse(); + } + + return { + viewPieceList: viewPieceList, + endsText: endsText + }; + }; + + PiecewiseVisualMapView.prototype._createItemSymbol = function (group, representValue, shapeParam) { + group.add(createSymbol( // symbol will be string + this.getControllerVisual(representValue, 'symbol'), shapeParam[0], shapeParam[1], shapeParam[2], shapeParam[3], // color will be string + this.getControllerVisual(representValue, 'color'))); + }; + + PiecewiseVisualMapView.prototype._onItemClick = function (piece) { + var visualMapModel = this.visualMapModel; + var option = visualMapModel.option; + var selectedMode = option.selectedMode; + + if (!selectedMode) { + return; + } + + var selected = clone(option.selected); + var newKey = visualMapModel.getSelectedMapKey(piece); + + if (selectedMode === 'single' || selectedMode === true) { + selected[newKey] = true; + each(selected, function (o, key) { + selected[key] = key === newKey; + }); + } else { + selected[newKey] = !selected[newKey]; + } + + this.api.dispatchAction({ + type: 'selectDataRange', + from: this.uid, + visualMapId: this.visualMapModel.id, + selected: selected + }); + }; + + PiecewiseVisualMapView.type = 'visualMap.piecewise'; + return PiecewiseVisualMapView; + }(VisualMapView); + + function install$O(registers) { + registers.registerComponentModel(PiecewiseModel); + registers.registerComponentView(PiecewiseVisualMapView); + installCommon$1(registers); + } + + function install$P(registers) { + use(install$N); + use(install$O); // Do not install './dataZoomSelect', + // since it only work for toolbox dataZoom. + } + + var DEFAULT_OPTION = { + label: { + enabled: true + }, + decal: { + show: false + } + }; + var inner$l = makeInner(); + var decalPaletteScope = {}; + function ariaVisual(ecModel, api) { + var ariaModel = ecModel.getModel('aria'); // See "area enabled" detection code in `GlobalModel.ts`. + + if (!ariaModel.get('enabled')) { + return; + } + + var defaultOption = clone(DEFAULT_OPTION); + merge(defaultOption.label, ecModel.getLocaleModel().get('aria'), false); + merge(ariaModel.option, defaultOption, false); + setDecal(); + setLabel(); + + function setDecal() { + var decalModel = ariaModel.getModel('decal'); + var useDecal = decalModel.get('show'); + + if (useDecal) { + // Each type of series use one scope. + // Pie and funnel are using diferrent scopes + var paletteScopeGroupByType_1 = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.isColorBySeries()) { + return; + } + + var decalScope = paletteScopeGroupByType_1.get(seriesModel.type); + + if (!decalScope) { + decalScope = {}; + paletteScopeGroupByType_1.set(seriesModel.type, decalScope); + } + + inner$l(seriesModel).scope = decalScope; + }); + ecModel.eachRawSeries(function (seriesModel) { + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + if (isFunction(seriesModel.enableAriaDecal)) { + // Let series define how to use decal palette on data + seriesModel.enableAriaDecal(); + return; + } + + var data = seriesModel.getData(); + + if (!seriesModel.isColorBySeries()) { + var dataAll_1 = seriesModel.getRawData(); + var idxMap_1 = {}; + var decalScope_1 = inner$l(seriesModel).scope; + data.each(function (idx) { + var rawIdx = data.getRawIndex(idx); + idxMap_1[rawIdx] = idx; + }); + var dataCount_1 = dataAll_1.count(); + dataAll_1.each(function (rawIdx) { + var idx = idxMap_1[rawIdx]; + var name = dataAll_1.getName(rawIdx) || rawIdx + ''; + var paletteDecal = getDecalFromPalette(seriesModel.ecModel, name, decalScope_1, dataCount_1); + var specifiedDecal = data.getItemVisual(idx, 'decal'); + data.setItemVisual(idx, 'decal', mergeDecal(specifiedDecal, paletteDecal)); + }); + } else { + var paletteDecal = getDecalFromPalette(seriesModel.ecModel, seriesModel.name, decalPaletteScope, ecModel.getSeriesCount()); + var specifiedDecal = data.getVisual('decal'); + data.setVisual('decal', mergeDecal(specifiedDecal, paletteDecal)); + } + + function mergeDecal(specifiedDecal, paletteDecal) { + // Merge decal from palette to decal from itemStyle. + // User do not need to specify all of the decal props. + var resultDecal = specifiedDecal ? extend(extend({}, paletteDecal), specifiedDecal) : paletteDecal; + resultDecal.dirty = true; + return resultDecal; + } + }); + } + } + + function setLabel() { + var labelLocale = ecModel.getLocaleModel().get('aria'); + var labelModel = ariaModel.getModel('label'); + labelModel.option = defaults(labelModel.option, labelLocale); + + if (!labelModel.get('enabled')) { + return; + } + + var dom = api.getZr().dom; + + if (labelModel.get('description')) { + dom.setAttribute('aria-label', labelModel.get('description')); + return; + } + + var seriesCnt = ecModel.getSeriesCount(); + var maxDataCnt = labelModel.get(['data', 'maxCount']) || 10; + var maxSeriesCnt = labelModel.get(['series', 'maxCount']) || 10; + var displaySeriesCnt = Math.min(seriesCnt, maxSeriesCnt); + var ariaLabel; + + if (seriesCnt < 1) { + // No series, no aria label + return; + } else { + var title = getTitle(); + + if (title) { + var withTitle = labelModel.get(['general', 'withTitle']); + ariaLabel = replace(withTitle, { + title: title + }); + } else { + ariaLabel = labelModel.get(['general', 'withoutTitle']); + } + + var seriesLabels_1 = []; + var prefix = seriesCnt > 1 ? labelModel.get(['series', 'multiple', 'prefix']) : labelModel.get(['series', 'single', 'prefix']); + ariaLabel += replace(prefix, { + seriesCount: seriesCnt + }); + ecModel.eachSeries(function (seriesModel, idx) { + if (idx < displaySeriesCnt) { + var seriesLabel = void 0; + var seriesName = seriesModel.get('name'); + var withName = seriesName ? 'withName' : 'withoutName'; + seriesLabel = seriesCnt > 1 ? labelModel.get(['series', 'multiple', withName]) : labelModel.get(['series', 'single', withName]); + seriesLabel = replace(seriesLabel, { + seriesId: seriesModel.seriesIndex, + seriesName: seriesModel.get('name'), + seriesType: getSeriesTypeName(seriesModel.subType) + }); + var data = seriesModel.getData(); + + if (data.count() > maxDataCnt) { + // Show part of data + var partialLabel = labelModel.get(['data', 'partialData']); + seriesLabel += replace(partialLabel, { + displayCnt: maxDataCnt + }); + } else { + seriesLabel += labelModel.get(['data', 'allData']); + } + + var middleSeparator_1 = labelModel.get(['data', 'separator', 'middle']); + var endSeparator_1 = labelModel.get(['data', 'separator', 'end']); + var dataLabels = []; + + for (var i = 0; i < data.count(); i++) { + if (i < maxDataCnt) { + var name_1 = data.getName(i); + var value = data.getValues(i); + var dataLabel = labelModel.get(['data', name_1 ? 'withName' : 'withoutName']); + dataLabels.push(replace(dataLabel, { + name: name_1, + value: value.join(middleSeparator_1) + })); + } + } + + seriesLabel += dataLabels.join(middleSeparator_1) + endSeparator_1; + seriesLabels_1.push(seriesLabel); + } + }); + var separatorModel = labelModel.getModel(['series', 'multiple', 'separator']); + var middleSeparator = separatorModel.get('middle'); + var endSeparator = separatorModel.get('end'); + ariaLabel += seriesLabels_1.join(middleSeparator) + endSeparator; + dom.setAttribute('aria-label', ariaLabel); + } + } + + function replace(str, keyValues) { + if (!isString(str)) { + return str; + } + + var result = str; + each(keyValues, function (value, key) { + result = result.replace(new RegExp('\\{\\s*' + key + '\\s*\\}', 'g'), value); + }); + return result; + } + + function getTitle() { + var title = ecModel.get('title'); + + if (title && title.length) { + title = title[0]; + } + + return title && title.text; + } + + function getSeriesTypeName(type) { + return ecModel.getLocaleModel().get(['series', 'typeNames'])[type] || '自定义图'; + } + } + + function ariaPreprocessor(option) { + if (!option || !option.aria) { + return; + } + + var aria = option.aria; // aria.show is deprecated and should use aria.enabled instead + + if (aria.show != null) { + aria.enabled = aria.show; + } + + aria.label = aria.label || {}; // move description, general, series, data to be under aria.label + + each(['description', 'general', 'series', 'data'], function (name) { + if (aria[name] != null) { + aria.label[name] = aria[name]; + } + }); + } + + function install$Q(registers) { + registers.registerPreprocessor(ariaPreprocessor); + registers.registerVisual(registers.PRIORITY.VISUAL.ARIA, ariaVisual); + } + + var RELATIONAL_EXPRESSION_OP_ALIAS_MAP = { + value: 'eq', + // PENDING: not good for literal semantic? + '<': 'lt', + '<=': 'lte', + '>': 'gt', + '>=': 'gte', + '=': 'eq', + '!=': 'ne', + '<>': 'ne' // Might mileading for sake of the different between '==' and '===', + // So dont support them. + // '==': 'eq', + // '===': 'seq', + // '!==': 'sne' + // PENDING: Whether support some common alias "ge", "le", "neq"? + // ge: 'gte', + // le: 'lte', + // neq: 'ne', + + }; // type RelationalExpressionOpEvaluate = (tarVal: unknown, condVal: unknown) => boolean; + + var RegExpEvaluator = + /** @class */ + function () { + function RegExpEvaluator(rVal) { + // Support condVal: RegExp | string + var condValue = this._condVal = isString(rVal) ? new RegExp(rVal) : isRegExp(rVal) ? rVal : null; + + if (condValue == null) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('Illegal regexp', rVal, 'in'); + } + + throwError(errMsg); + } + } + + RegExpEvaluator.prototype.evaluate = function (lVal) { + var type = typeof lVal; + return isString(type) ? this._condVal.test(lVal) : isNumber(type) ? this._condVal.test(lVal + '') : false; + }; + + return RegExpEvaluator; + }(); + + var ConstConditionInternal = + /** @class */ + function () { + function ConstConditionInternal() {} + + ConstConditionInternal.prototype.evaluate = function () { + return this.value; + }; + + return ConstConditionInternal; + }(); + + var AndConditionInternal = + /** @class */ + function () { + function AndConditionInternal() {} + + AndConditionInternal.prototype.evaluate = function () { + var children = this.children; + + for (var i = 0; i < children.length; i++) { + if (!children[i].evaluate()) { + return false; + } + } + + return true; + }; + + return AndConditionInternal; + }(); + + var OrConditionInternal = + /** @class */ + function () { + function OrConditionInternal() {} + + OrConditionInternal.prototype.evaluate = function () { + var children = this.children; + + for (var i = 0; i < children.length; i++) { + if (children[i].evaluate()) { + return true; + } + } + + return false; + }; + + return OrConditionInternal; + }(); + + var NotConditionInternal = + /** @class */ + function () { + function NotConditionInternal() {} + + NotConditionInternal.prototype.evaluate = function () { + return !this.child.evaluate(); + }; + + return NotConditionInternal; + }(); + + var RelationalConditionInternal = + /** @class */ + function () { + function RelationalConditionInternal() {} + + RelationalConditionInternal.prototype.evaluate = function () { + var needParse = !!this.valueParser; // Call getValue with no `this`. + + var getValue = this.getValue; + var tarValRaw = getValue(this.valueGetterParam); + var tarValParsed = needParse ? this.valueParser(tarValRaw) : null; // Relational cond follow "and" logic internally. + + for (var i = 0; i < this.subCondList.length; i++) { + if (!this.subCondList[i].evaluate(needParse ? tarValParsed : tarValRaw)) { + return false; + } + } + + return true; + }; + + return RelationalConditionInternal; + }(); + + function parseOption(exprOption, getters) { + if (exprOption === true || exprOption === false) { + var cond = new ConstConditionInternal(); + cond.value = exprOption; + return cond; + } + + var errMsg = ''; + + if (!isObjectNotArray(exprOption)) { + if ("development" !== 'production') { + errMsg = makePrintable('Illegal config. Expect a plain object but actually', exprOption); + } + + throwError(errMsg); + } + + if (exprOption.and) { + return parseAndOrOption('and', exprOption, getters); + } else if (exprOption.or) { + return parseAndOrOption('or', exprOption, getters); + } else if (exprOption.not) { + return parseNotOption(exprOption, getters); + } + + return parseRelationalOption(exprOption, getters); + } + + function parseAndOrOption(op, exprOption, getters) { + var subOptionArr = exprOption[op]; + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('"and"/"or" condition should only be `' + op + ': [...]` and must not be empty array.', 'Illegal condition:', exprOption); + } + + if (!isArray(subOptionArr)) { + throwError(errMsg); + } + + if (!subOptionArr.length) { + throwError(errMsg); + } + + var cond = op === 'and' ? new AndConditionInternal() : new OrConditionInternal(); + cond.children = map(subOptionArr, function (subOption) { + return parseOption(subOption, getters); + }); + + if (!cond.children.length) { + throwError(errMsg); + } + + return cond; + } + + function parseNotOption(exprOption, getters) { + var subOption = exprOption.not; + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('"not" condition should only be `not: {}`.', 'Illegal condition:', exprOption); + } + + if (!isObjectNotArray(subOption)) { + throwError(errMsg); + } + + var cond = new NotConditionInternal(); + cond.child = parseOption(subOption, getters); + + if (!cond.child) { + throwError(errMsg); + } + + return cond; + } + + function parseRelationalOption(exprOption, getters) { + var errMsg = ''; + var valueGetterParam = getters.prepareGetValue(exprOption); + var subCondList = []; + var exprKeys = keys(exprOption); + var parserName = exprOption.parser; + var valueParser = parserName ? getRawValueParser(parserName) : null; + + for (var i = 0; i < exprKeys.length; i++) { + var keyRaw = exprKeys[i]; + + if (keyRaw === 'parser' || getters.valueGetterAttrMap.get(keyRaw)) { + continue; + } + + var op = hasOwn(RELATIONAL_EXPRESSION_OP_ALIAS_MAP, keyRaw) ? RELATIONAL_EXPRESSION_OP_ALIAS_MAP[keyRaw] : keyRaw; + var condValueRaw = exprOption[keyRaw]; + var condValueParsed = valueParser ? valueParser(condValueRaw) : condValueRaw; + var evaluator = createFilterComparator(op, condValueParsed) || op === 'reg' && new RegExpEvaluator(condValueParsed); + + if (!evaluator) { + if ("development" !== 'production') { + errMsg = makePrintable('Illegal relational operation: "' + keyRaw + '" in condition:', exprOption); + } + + throwError(errMsg); + } + + subCondList.push(evaluator); + } + + if (!subCondList.length) { + if ("development" !== 'production') { + errMsg = makePrintable('Relational condition must have at least one operator.', 'Illegal condition:', exprOption); + } // No relational operator always disabled in case of dangers result. + + + throwError(errMsg); + } + + var cond = new RelationalConditionInternal(); + cond.valueGetterParam = valueGetterParam; + cond.valueParser = valueParser; + cond.getValue = getters.getValue; + cond.subCondList = subCondList; + return cond; + } + + function isObjectNotArray(val) { + return isObject(val) && !isArrayLike(val); + } + + var ConditionalExpressionParsed = + /** @class */ + function () { + function ConditionalExpressionParsed(exprOption, getters) { + this._cond = parseOption(exprOption, getters); + } + + ConditionalExpressionParsed.prototype.evaluate = function () { + return this._cond.evaluate(); + }; + + return ConditionalExpressionParsed; + }(); + function parseConditionalExpression(exprOption, getters) { + return new ConditionalExpressionParsed(exprOption, getters); + } + + var filterTransform = { + type: 'echarts:filter', + // PEDING: enhance to filter by index rather than create new data + transform: function (params) { + // [Caveat] Fail-Fast: + // Do not return the whole dataset unless user config indicate it explicitly. + // For example, if no condition specified by mistake, return an empty result + // is better than return the entire raw soruce for user to find the mistake. + var upstream = params.upstream; + var rawItem; + var condition = parseConditionalExpression(params.config, { + valueGetterAttrMap: createHashMap({ + dimension: true + }), + prepareGetValue: function (exprOption) { + var errMsg = ''; + var dimLoose = exprOption.dimension; + + if (!hasOwn(exprOption, 'dimension')) { + if ("development" !== 'production') { + errMsg = makePrintable('Relation condition must has prop "dimension" specified.', 'Illegal condition:', exprOption); + } + + throwError(errMsg); + } + + var dimInfo = upstream.getDimensionInfo(dimLoose); + + if (!dimInfo) { + if ("development" !== 'production') { + errMsg = makePrintable('Can not find dimension info via: ' + dimLoose + '.\n', 'Existing dimensions: ', upstream.cloneAllDimensionInfo(), '.\n', 'Illegal condition:', exprOption, '.\n'); + } + + throwError(errMsg); + } + + return { + dimIdx: dimInfo.index + }; + }, + getValue: function (param) { + return upstream.retrieveValueFromItem(rawItem, param.dimIdx); + } + }); + var resultData = []; + + for (var i = 0, len = upstream.count(); i < len; i++) { + rawItem = upstream.getRawDataItem(i); + + if (condition.evaluate()) { + resultData.push(rawItem); + } + } + + return { + data: resultData + }; + } + }; + + var sampleLog = ''; + + if ("development" !== 'production') { + sampleLog = ['Valid config is like:', '{ dimension: "age", order: "asc" }', 'or [{ dimension: "age", order: "asc"], { dimension: "date", order: "desc" }]'].join(' '); + } + + var sortTransform = { + type: 'echarts:sort', + transform: function (params) { + var upstream = params.upstream; + var config = params.config; + var errMsg = ''; // Normalize + // const orderExprList: OrderExpression[] = isArray(config[0]) + // ? config as OrderExpression[] + // : [config as OrderExpression]; + + var orderExprList = normalizeToArray(config); + + if (!orderExprList.length) { + if ("development" !== 'production') { + errMsg = 'Empty `config` in sort transform.'; + } + + throwError(errMsg); + } + + var orderDefList = []; + each(orderExprList, function (orderExpr) { + var dimLoose = orderExpr.dimension; + var order = orderExpr.order; + var parserName = orderExpr.parser; + var incomparable = orderExpr.incomparable; + + if (dimLoose == null) { + if ("development" !== 'production') { + errMsg = 'Sort transform config must has "dimension" specified.' + sampleLog; + } + + throwError(errMsg); + } + + if (order !== 'asc' && order !== 'desc') { + if ("development" !== 'production') { + errMsg = 'Sort transform config must has "order" specified.' + sampleLog; + } + + throwError(errMsg); + } + + if (incomparable && incomparable !== 'min' && incomparable !== 'max') { + var errMsg_1 = ''; + + if ("development" !== 'production') { + errMsg_1 = 'incomparable must be "min" or "max" rather than "' + incomparable + '".'; + } + + throwError(errMsg_1); + } + + if (order !== 'asc' && order !== 'desc') { + var errMsg_2 = ''; + + if ("development" !== 'production') { + errMsg_2 = 'order must be "asc" or "desc" rather than "' + order + '".'; + } + + throwError(errMsg_2); + } + + var dimInfo = upstream.getDimensionInfo(dimLoose); + + if (!dimInfo) { + if ("development" !== 'production') { + errMsg = makePrintable('Can not find dimension info via: ' + dimLoose + '.\n', 'Existing dimensions: ', upstream.cloneAllDimensionInfo(), '.\n', 'Illegal config:', orderExpr, '.\n'); + } + + throwError(errMsg); + } + + var parser = parserName ? getRawValueParser(parserName) : null; + + if (parserName && !parser) { + if ("development" !== 'production') { + errMsg = makePrintable('Invalid parser name ' + parserName + '.\n', 'Illegal config:', orderExpr, '.\n'); + } + + throwError(errMsg); + } + + orderDefList.push({ + dimIdx: dimInfo.index, + parser: parser, + comparator: new SortOrderComparator(order, incomparable) + }); + }); // TODO: support it? + + var sourceFormat = upstream.sourceFormat; + + if (sourceFormat !== SOURCE_FORMAT_ARRAY_ROWS && sourceFormat !== SOURCE_FORMAT_OBJECT_ROWS) { + if ("development" !== 'production') { + errMsg = 'sourceFormat "' + sourceFormat + '" is not supported yet'; + } + + throwError(errMsg); + } // Other upstream format are all array. + + + var resultData = []; + + for (var i = 0, len = upstream.count(); i < len; i++) { + resultData.push(upstream.getRawDataItem(i)); + } + + resultData.sort(function (item0, item1) { + for (var i = 0; i < orderDefList.length; i++) { + var orderDef = orderDefList[i]; + var val0 = upstream.retrieveValueFromItem(item0, orderDef.dimIdx); + var val1 = upstream.retrieveValueFromItem(item1, orderDef.dimIdx); + + if (orderDef.parser) { + val0 = orderDef.parser(val0); + val1 = orderDef.parser(val1); + } + + var result = orderDef.comparator.evaluate(val0, val1); + + if (result !== 0) { + return result; + } + } + + return 0; + }); + return { + data: resultData + }; + } + }; + + function install$R(registers) { + registers.registerTransform(filterTransform); + registers.registerTransform(sortTransform); + } + + var DatasetModel = + /** @class */ + function (_super) { + __extends(DatasetModel, _super); + + function DatasetModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'dataset'; + return _this; + } + + DatasetModel.prototype.init = function (option, parentModel, ecModel) { + _super.prototype.init.call(this, option, parentModel, ecModel); + + this._sourceManager = new SourceManager(this); + disableTransformOptionMerge(this); + }; + + DatasetModel.prototype.mergeOption = function (newOption, ecModel) { + _super.prototype.mergeOption.call(this, newOption, ecModel); + + disableTransformOptionMerge(this); + }; + + DatasetModel.prototype.optionUpdated = function () { + this._sourceManager.dirty(); + }; + + DatasetModel.prototype.getSourceManager = function () { + return this._sourceManager; + }; + + DatasetModel.type = 'dataset'; + DatasetModel.defaultOption = { + seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN + }; + return DatasetModel; + }(ComponentModel); + + var DatasetView = + /** @class */ + function (_super) { + __extends(DatasetView, _super); + + function DatasetView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'dataset'; + return _this; + } + + DatasetView.type = 'dataset'; + return DatasetView; + }(ComponentView); + + function install$S(registers) { + registers.registerComponentModel(DatasetModel); + registers.registerComponentView(DatasetView); + } + + var CMD$4 = PathProxy.CMD; + function aroundEqual(a, b) { + return Math.abs(a - b) < 1e-5; + } + function pathToBezierCurves(path) { + var data = path.data; + var len = path.len(); + var bezierArrayGroups = []; + var currentSubpath; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + function createNewSubpath(x, y) { + if (currentSubpath && currentSubpath.length > 2) { + bezierArrayGroups.push(currentSubpath); + } + currentSubpath = [x, y]; + } + function addLine(x0, y0, x1, y1) { + if (!(aroundEqual(x0, x1) && aroundEqual(y0, y1))) { + currentSubpath.push(x0, y0, x1, y1, x1, y1); + } + } + function addArc(startAngle, endAngle, cx, cy, rx, ry) { + var delta = Math.abs(endAngle - startAngle); + var len = Math.tan(delta / 4) * 4 / 3; + var dir = endAngle < startAngle ? -1 : 1; + var c1 = Math.cos(startAngle); + var s1 = Math.sin(startAngle); + var c2 = Math.cos(endAngle); + var s2 = Math.sin(endAngle); + var x1 = c1 * rx + cx; + var y1 = s1 * ry + cy; + var x4 = c2 * rx + cx; + var y4 = s2 * ry + cy; + var hx = rx * len * dir; + var hy = ry * len * dir; + currentSubpath.push(x1 - hx * s1, y1 + hy * c1, x4 + hx * s2, y4 - hy * c2, x4, y4); + } + var x1; + var y1; + var x2; + var y2; + for (var i = 0; i < len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + if (cmd === CMD$4.L || cmd === CMD$4.C || cmd === CMD$4.Q) { + currentSubpath = [x0, y0]; + } + } + switch (cmd) { + case CMD$4.M: + xi = x0 = data[i++]; + yi = y0 = data[i++]; + createNewSubpath(x0, y0); + break; + case CMD$4.L: + x1 = data[i++]; + y1 = data[i++]; + addLine(xi, yi, x1, y1); + xi = x1; + yi = y1; + break; + case CMD$4.C: + currentSubpath.push(data[i++], data[i++], data[i++], data[i++], xi = data[i++], yi = data[i++]); + break; + case CMD$4.Q: + x1 = data[i++]; + y1 = data[i++]; + x2 = data[i++]; + y2 = data[i++]; + currentSubpath.push(xi + 2 / 3 * (x1 - xi), yi + 2 / 3 * (y1 - yi), x2 + 2 / 3 * (x1 - x2), y2 + 2 / 3 * (y1 - y2), x2, y2); + xi = x2; + yi = y2; + break; + case CMD$4.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++]; + var endAngle = data[i++] + startAngle; + i += 1; + var anticlockwise = !data[i++]; + x1 = Math.cos(startAngle) * rx + cx; + y1 = Math.sin(startAngle) * ry + cy; + if (isFirst) { + x0 = x1; + y0 = y1; + createNewSubpath(x0, y0); + } + else { + addLine(xi, yi, x1, y1); + } + xi = Math.cos(endAngle) * rx + cx; + yi = Math.sin(endAngle) * ry + cy; + var step = (anticlockwise ? -1 : 1) * Math.PI / 2; + for (var angle = startAngle; anticlockwise ? angle > endAngle : angle < endAngle; angle += step) { + var nextAngle = anticlockwise ? Math.max(angle + step, endAngle) + : Math.min(angle + step, endAngle); + addArc(angle, nextAngle, cx, cy, rx, ry); + } + break; + case CMD$4.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + x1 = x0 + data[i++]; + y1 = y0 + data[i++]; + createNewSubpath(x1, y0); + addLine(x1, y0, x1, y1); + addLine(x1, y1, x0, y1); + addLine(x0, y1, x0, y0); + addLine(x0, y0, x1, y0); + break; + case CMD$4.Z: + currentSubpath && addLine(xi, yi, x0, y0); + xi = x0; + yi = y0; + break; + } + } + if (currentSubpath && currentSubpath.length > 2) { + bezierArrayGroups.push(currentSubpath); + } + return bezierArrayGroups; + } + function adpativeBezier(x0, y0, x1, y1, x2, y2, x3, y3, out, scale) { + if (aroundEqual(x0, x1) && aroundEqual(y0, y1) && aroundEqual(x2, x3) && aroundEqual(y2, y3)) { + out.push(x3, y3); + return; + } + var PIXEL_DISTANCE = 2 / scale; + var PIXEL_DISTANCE_SQR = PIXEL_DISTANCE * PIXEL_DISTANCE; + var dx = x3 - x0; + var dy = y3 - y0; + var d = Math.sqrt(dx * dx + dy * dy); + dx /= d; + dy /= d; + var dx1 = x1 - x0; + var dy1 = y1 - y0; + var dx2 = x2 - x3; + var dy2 = y2 - y3; + var cp1LenSqr = dx1 * dx1 + dy1 * dy1; + var cp2LenSqr = dx2 * dx2 + dy2 * dy2; + if (cp1LenSqr < PIXEL_DISTANCE_SQR && cp2LenSqr < PIXEL_DISTANCE_SQR) { + out.push(x3, y3); + return; + } + var projLen1 = dx * dx1 + dy * dy1; + var projLen2 = -dx * dx2 - dy * dy2; + var d1Sqr = cp1LenSqr - projLen1 * projLen1; + var d2Sqr = cp2LenSqr - projLen2 * projLen2; + if (d1Sqr < PIXEL_DISTANCE_SQR && projLen1 >= 0 + && d2Sqr < PIXEL_DISTANCE_SQR && projLen2 >= 0) { + out.push(x3, y3); + return; + } + var tmpSegX = []; + var tmpSegY = []; + cubicSubdivide(x0, x1, x2, x3, 0.5, tmpSegX); + cubicSubdivide(y0, y1, y2, y3, 0.5, tmpSegY); + adpativeBezier(tmpSegX[0], tmpSegY[0], tmpSegX[1], tmpSegY[1], tmpSegX[2], tmpSegY[2], tmpSegX[3], tmpSegY[3], out, scale); + adpativeBezier(tmpSegX[4], tmpSegY[4], tmpSegX[5], tmpSegY[5], tmpSegX[6], tmpSegY[6], tmpSegX[7], tmpSegY[7], out, scale); + } + function pathToPolygons(path, scale) { + var bezierArrayGroups = pathToBezierCurves(path); + var polygons = []; + scale = scale || 1; + for (var i = 0; i < bezierArrayGroups.length; i++) { + var beziers = bezierArrayGroups[i]; + var polygon = []; + var x0 = beziers[0]; + var y0 = beziers[1]; + polygon.push(x0, y0); + for (var k = 2; k < beziers.length;) { + var x1 = beziers[k++]; + var y1 = beziers[k++]; + var x2 = beziers[k++]; + var y2 = beziers[k++]; + var x3 = beziers[k++]; + var y3 = beziers[k++]; + adpativeBezier(x0, y0, x1, y1, x2, y2, x3, y3, polygon, scale); + x0 = x3; + y0 = y3; + } + polygons.push(polygon); + } + return polygons; + } + + function getDividingGrids(dimSize, rowDim, count) { + var rowSize = dimSize[rowDim]; + var columnSize = dimSize[1 - rowDim]; + var ratio = Math.abs(rowSize / columnSize); + var rowCount = Math.ceil(Math.sqrt(ratio * count)); + var columnCount = Math.floor(count / rowCount); + if (columnCount === 0) { + columnCount = 1; + rowCount = count; + } + var grids = []; + for (var i = 0; i < rowCount; i++) { + grids.push(columnCount); + } + var currentCount = rowCount * columnCount; + var remained = count - currentCount; + if (remained > 0) { + for (var i = 0; i < remained; i++) { + grids[i % rowCount] += 1; + } + } + return grids; + } + function divideSector(sectorShape, count, outShapes) { + var r0 = sectorShape.r0; + var r = sectorShape.r; + var startAngle = sectorShape.startAngle; + var endAngle = sectorShape.endAngle; + var angle = Math.abs(endAngle - startAngle); + var arcLen = angle * r; + var deltaR = r - r0; + var isAngleRow = arcLen > Math.abs(deltaR); + var grids = getDividingGrids([arcLen, deltaR], isAngleRow ? 0 : 1, count); + var rowSize = (isAngleRow ? angle : deltaR) / grids.length; + for (var row = 0; row < grids.length; row++) { + var columnSize = (isAngleRow ? deltaR : angle) / grids[row]; + for (var column = 0; column < grids[row]; column++) { + var newShape = {}; + if (isAngleRow) { + newShape.startAngle = startAngle + rowSize * row; + newShape.endAngle = startAngle + rowSize * (row + 1); + newShape.r0 = r0 + columnSize * column; + newShape.r = r0 + columnSize * (column + 1); + } + else { + newShape.startAngle = startAngle + columnSize * column; + newShape.endAngle = startAngle + columnSize * (column + 1); + newShape.r0 = r0 + rowSize * row; + newShape.r = r0 + rowSize * (row + 1); + } + newShape.clockwise = sectorShape.clockwise; + newShape.cx = sectorShape.cx; + newShape.cy = sectorShape.cy; + outShapes.push(newShape); + } + } + } + function divideRect(rectShape, count, outShapes) { + var width = rectShape.width; + var height = rectShape.height; + var isHorizontalRow = width > height; + var grids = getDividingGrids([width, height], isHorizontalRow ? 0 : 1, count); + var rowSizeDim = isHorizontalRow ? 'width' : 'height'; + var columnSizeDim = isHorizontalRow ? 'height' : 'width'; + var rowDim = isHorizontalRow ? 'x' : 'y'; + var columnDim = isHorizontalRow ? 'y' : 'x'; + var rowSize = rectShape[rowSizeDim] / grids.length; + for (var row = 0; row < grids.length; row++) { + var columnSize = rectShape[columnSizeDim] / grids[row]; + for (var column = 0; column < grids[row]; column++) { + var newShape = {}; + newShape[rowDim] = row * rowSize; + newShape[columnDim] = column * columnSize; + newShape[rowSizeDim] = rowSize; + newShape[columnSizeDim] = columnSize; + newShape.x += rectShape.x; + newShape.y += rectShape.y; + outShapes.push(newShape); + } + } + } + function crossProduct2d$1(x1, y1, x2, y2) { + return x1 * y2 - x2 * y1; + } + function lineLineIntersect$1(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) { + var mx = a2x - a1x; + var my = a2y - a1y; + var nx = b2x - b1x; + var ny = b2y - b1y; + var nmCrossProduct = crossProduct2d$1(nx, ny, mx, my); + if (Math.abs(nmCrossProduct) < 1e-6) { + return null; + } + var b1a1x = a1x - b1x; + var b1a1y = a1y - b1y; + var p = crossProduct2d$1(b1a1x, b1a1y, nx, ny) / nmCrossProduct; + if (p < 0 || p > 1) { + return null; + } + return new Point(p * mx + a1x, p * my + a1y); + } + function projPtOnLine(pt, lineA, lineB) { + var dir = new Point(); + Point.sub(dir, lineB, lineA); + dir.normalize(); + var dir2 = new Point(); + Point.sub(dir2, pt, lineA); + var len = dir2.dot(dir); + return len; + } + function addToPoly(poly, pt) { + var last = poly[poly.length - 1]; + if (last && last[0] === pt[0] && last[1] === pt[1]) { + return; + } + poly.push(pt); + } + function splitPolygonByLine(points, lineA, lineB) { + var len = points.length; + var intersections = []; + for (var i = 0; i < len; i++) { + var p0 = points[i]; + var p1 = points[(i + 1) % len]; + var intersectionPt = lineLineIntersect$1(p0[0], p0[1], p1[0], p1[1], lineA.x, lineA.y, lineB.x, lineB.y); + if (intersectionPt) { + intersections.push({ + projPt: projPtOnLine(intersectionPt, lineA, lineB), + pt: intersectionPt, + idx: i + }); + } + } + if (intersections.length < 2) { + return [{ points: points }, { points: points }]; + } + intersections.sort(function (a, b) { + return a.projPt - b.projPt; + }); + var splitPt0 = intersections[0]; + var splitPt1 = intersections[intersections.length - 1]; + if (splitPt1.idx < splitPt0.idx) { + var tmp = splitPt0; + splitPt0 = splitPt1; + splitPt1 = tmp; + } + var splitPt0Arr = [splitPt0.pt.x, splitPt0.pt.y]; + var splitPt1Arr = [splitPt1.pt.x, splitPt1.pt.y]; + var newPolyA = [splitPt0Arr]; + var newPolyB = [splitPt1Arr]; + for (var i = splitPt0.idx + 1; i <= splitPt1.idx; i++) { + addToPoly(newPolyA, points[i].slice()); + } + addToPoly(newPolyA, splitPt1Arr); + addToPoly(newPolyA, splitPt0Arr); + for (var i = splitPt1.idx + 1; i <= splitPt0.idx + len; i++) { + addToPoly(newPolyB, points[i % len].slice()); + } + addToPoly(newPolyB, splitPt0Arr); + addToPoly(newPolyB, splitPt1Arr); + return [{ + points: newPolyA + }, { + points: newPolyB + }]; + } + function binaryDividePolygon(polygonShape) { + var points = polygonShape.points; + var min = []; + var max = []; + fromPoints(points, min, max); + var boundingRect = new BoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]); + var width = boundingRect.width; + var height = boundingRect.height; + var x = boundingRect.x; + var y = boundingRect.y; + var pt0 = new Point(); + var pt1 = new Point(); + if (width > height) { + pt0.x = pt1.x = x + width / 2; + pt0.y = y; + pt1.y = y + height; + } + else { + pt0.y = pt1.y = y + height / 2; + pt0.x = x; + pt1.x = x + width; + } + return splitPolygonByLine(points, pt0, pt1); + } + function binaryDivideRecursive(divider, shape, count, out) { + if (count === 1) { + out.push(shape); + } + else { + var mid = Math.floor(count / 2); + var sub = divider(shape); + binaryDivideRecursive(divider, sub[0], mid, out); + binaryDivideRecursive(divider, sub[1], count - mid, out); + } + return out; + } + function clone$4(path, count) { + var paths = []; + for (var i = 0; i < count; i++) { + paths.push(clonePath(path)); + } + return paths; + } + function copyPathProps(source, target) { + target.setStyle(source.style); + target.z = source.z; + target.z2 = source.z2; + target.zlevel = source.zlevel; + } + function polygonConvert(points) { + var out = []; + for (var i = 0; i < points.length;) { + out.push([points[i++], points[i++]]); + } + return out; + } + function split(path, count) { + var outShapes = []; + var shape = path.shape; + var OutShapeCtor; + switch (path.type) { + case 'rect': + divideRect(shape, count, outShapes); + OutShapeCtor = Rect; + break; + case 'sector': + divideSector(shape, count, outShapes); + OutShapeCtor = Sector; + break; + case 'circle': + divideSector({ + r0: 0, r: shape.r, startAngle: 0, endAngle: Math.PI * 2, + cx: shape.cx, cy: shape.cy + }, count, outShapes); + OutShapeCtor = Sector; + break; + default: + var m = path.getComputedTransform(); + var scale = m ? Math.sqrt(Math.max(m[0] * m[0] + m[1] * m[1], m[2] * m[2] + m[3] * m[3])) : 1; + var polygons = map(pathToPolygons(path.getUpdatedPathProxy(), scale), function (poly) { return polygonConvert(poly); }); + var polygonCount = polygons.length; + if (polygonCount === 0) { + binaryDivideRecursive(binaryDividePolygon, { + points: polygons[0] + }, count, outShapes); + } + else if (polygonCount === count) { + for (var i = 0; i < polygonCount; i++) { + outShapes.push({ + points: polygons[i] + }); + } + } + else { + var totalArea_1 = 0; + var items = map(polygons, function (poly) { + var min = []; + var max = []; + fromPoints(poly, min, max); + var area = (max[1] - min[1]) * (max[0] - min[0]); + totalArea_1 += area; + return { poly: poly, area: area }; + }); + items.sort(function (a, b) { return b.area - a.area; }); + var left = count; + for (var i = 0; i < polygonCount; i++) { + var item = items[i]; + if (left <= 0) { + break; + } + var selfCount = i === polygonCount - 1 + ? left + : Math.ceil(item.area / totalArea_1 * count); + if (selfCount < 0) { + continue; + } + binaryDivideRecursive(binaryDividePolygon, { + points: item.poly + }, selfCount, outShapes); + left -= selfCount; + } + } + OutShapeCtor = Polygon; + break; + } + if (!OutShapeCtor) { + return clone$4(path, count); + } + var out = []; + for (var i = 0; i < outShapes.length; i++) { + var subPath = new OutShapeCtor(); + subPath.setShape(outShapes[i]); + copyPathProps(path, subPath); + out.push(subPath); + } + return out; + } + + function alignSubpath(subpath1, subpath2) { + var len1 = subpath1.length; + var len2 = subpath2.length; + if (len1 === len2) { + return [subpath1, subpath2]; + } + var tmpSegX = []; + var tmpSegY = []; + var shorterPath = len1 < len2 ? subpath1 : subpath2; + var shorterLen = Math.min(len1, len2); + var diff = Math.abs(len2 - len1) / 6; + var shorterBezierCount = (shorterLen - 2) / 6; + var eachCurveSubDivCount = Math.ceil(diff / shorterBezierCount) + 1; + var newSubpath = [shorterPath[0], shorterPath[1]]; + var remained = diff; + for (var i = 2; i < shorterLen;) { + var x0 = shorterPath[i - 2]; + var y0 = shorterPath[i - 1]; + var x1 = shorterPath[i++]; + var y1 = shorterPath[i++]; + var x2 = shorterPath[i++]; + var y2 = shorterPath[i++]; + var x3 = shorterPath[i++]; + var y3 = shorterPath[i++]; + if (remained <= 0) { + newSubpath.push(x1, y1, x2, y2, x3, y3); + continue; + } + var actualSubDivCount = Math.min(remained, eachCurveSubDivCount - 1) + 1; + for (var k = 1; k <= actualSubDivCount; k++) { + var p = k / actualSubDivCount; + cubicSubdivide(x0, x1, x2, x3, p, tmpSegX); + cubicSubdivide(y0, y1, y2, y3, p, tmpSegY); + x0 = tmpSegX[3]; + y0 = tmpSegY[3]; + newSubpath.push(tmpSegX[1], tmpSegY[1], tmpSegX[2], tmpSegY[2], x0, y0); + x1 = tmpSegX[5]; + y1 = tmpSegY[5]; + x2 = tmpSegX[6]; + y2 = tmpSegY[6]; + } + remained -= actualSubDivCount - 1; + } + return shorterPath === subpath1 ? [newSubpath, subpath2] : [subpath1, newSubpath]; + } + function createSubpath(lastSubpathSubpath, otherSubpath) { + var len = lastSubpathSubpath.length; + var lastX = lastSubpathSubpath[len - 2]; + var lastY = lastSubpathSubpath[len - 1]; + var newSubpath = []; + for (var i = 0; i < otherSubpath.length;) { + newSubpath[i++] = lastX; + newSubpath[i++] = lastY; + } + return newSubpath; + } + function alignBezierCurves(array1, array2) { + var _a; + var lastSubpath1; + var lastSubpath2; + var newArray1 = []; + var newArray2 = []; + for (var i = 0; i < Math.max(array1.length, array2.length); i++) { + var subpath1 = array1[i]; + var subpath2 = array2[i]; + var newSubpath1 = void 0; + var newSubpath2 = void 0; + if (!subpath1) { + newSubpath1 = createSubpath(lastSubpath1 || subpath2, subpath2); + newSubpath2 = subpath2; + } + else if (!subpath2) { + newSubpath2 = createSubpath(lastSubpath2 || subpath1, subpath1); + newSubpath1 = subpath1; + } + else { + _a = alignSubpath(subpath1, subpath2), newSubpath1 = _a[0], newSubpath2 = _a[1]; + lastSubpath1 = newSubpath1; + lastSubpath2 = newSubpath2; + } + newArray1.push(newSubpath1); + newArray2.push(newSubpath2); + } + return [newArray1, newArray2]; + } + function centroid$1(array) { + var signedArea = 0; + var cx = 0; + var cy = 0; + var len = array.length; + for (var i = 0, j = len - 2; i < len; j = i, i += 2) { + var x0 = array[j]; + var y0 = array[j + 1]; + var x1 = array[i]; + var y1 = array[i + 1]; + var a = x0 * y1 - x1 * y0; + signedArea += a; + cx += (x0 + x1) * a; + cy += (y0 + y1) * a; + } + if (signedArea === 0) { + return [array[0] || 0, array[1] || 0]; + } + return [cx / signedArea / 3, cy / signedArea / 3, signedArea]; + } + function findBestRingOffset(fromSubBeziers, toSubBeziers, fromCp, toCp) { + var bezierCount = (fromSubBeziers.length - 2) / 6; + var bestScore = Infinity; + var bestOffset = 0; + var len = fromSubBeziers.length; + var len2 = len - 2; + for (var offset = 0; offset < bezierCount; offset++) { + var cursorOffset = offset * 6; + var score = 0; + for (var k = 0; k < len; k += 2) { + var idx = k === 0 ? cursorOffset : ((cursorOffset + k - 2) % len2 + 2); + var x0 = fromSubBeziers[idx] - fromCp[0]; + var y0 = fromSubBeziers[idx + 1] - fromCp[1]; + var x1 = toSubBeziers[k] - toCp[0]; + var y1 = toSubBeziers[k + 1] - toCp[1]; + var dx = x1 - x0; + var dy = y1 - y0; + score += dx * dx + dy * dy; + } + if (score < bestScore) { + bestScore = score; + bestOffset = offset; + } + } + return bestOffset; + } + function reverse(array) { + var newArr = []; + var len = array.length; + for (var i = 0; i < len; i += 2) { + newArr[i] = array[len - i - 2]; + newArr[i + 1] = array[len - i - 1]; + } + return newArr; + } + function findBestMorphingRotation(fromArr, toArr, searchAngleIteration, searchAngleRange) { + var result = []; + var fromNeedsReverse; + for (var i = 0; i < fromArr.length; i++) { + var fromSubpathBezier = fromArr[i]; + var toSubpathBezier = toArr[i]; + var fromCp = centroid$1(fromSubpathBezier); + var toCp = centroid$1(toSubpathBezier); + if (fromNeedsReverse == null) { + fromNeedsReverse = fromCp[2] < 0 !== toCp[2] < 0; + } + var newFromSubpathBezier = []; + var newToSubpathBezier = []; + var bestAngle = 0; + var bestScore = Infinity; + var tmpArr = []; + var len = fromSubpathBezier.length; + if (fromNeedsReverse) { + fromSubpathBezier = reverse(fromSubpathBezier); + } + var offset = findBestRingOffset(fromSubpathBezier, toSubpathBezier, fromCp, toCp) * 6; + var len2 = len - 2; + for (var k = 0; k < len2; k += 2) { + var idx = (offset + k) % len2 + 2; + newFromSubpathBezier[k + 2] = fromSubpathBezier[idx] - fromCp[0]; + newFromSubpathBezier[k + 3] = fromSubpathBezier[idx + 1] - fromCp[1]; + } + newFromSubpathBezier[0] = fromSubpathBezier[offset] - fromCp[0]; + newFromSubpathBezier[1] = fromSubpathBezier[offset + 1] - fromCp[1]; + if (searchAngleIteration > 0) { + var step = searchAngleRange / searchAngleIteration; + for (var angle = -searchAngleRange / 2; angle <= searchAngleRange / 2; angle += step) { + var sa = Math.sin(angle); + var ca = Math.cos(angle); + var score = 0; + for (var k = 0; k < fromSubpathBezier.length; k += 2) { + var x0 = newFromSubpathBezier[k]; + var y0 = newFromSubpathBezier[k + 1]; + var x1 = toSubpathBezier[k] - toCp[0]; + var y1 = toSubpathBezier[k + 1] - toCp[1]; + var newX1 = x1 * ca - y1 * sa; + var newY1 = x1 * sa + y1 * ca; + tmpArr[k] = newX1; + tmpArr[k + 1] = newY1; + var dx = newX1 - x0; + var dy = newY1 - y0; + score += dx * dx + dy * dy; + } + if (score < bestScore) { + bestScore = score; + bestAngle = angle; + for (var m = 0; m < tmpArr.length; m++) { + newToSubpathBezier[m] = tmpArr[m]; + } + } + } + } + else { + for (var i_1 = 0; i_1 < len; i_1 += 2) { + newToSubpathBezier[i_1] = toSubpathBezier[i_1] - toCp[0]; + newToSubpathBezier[i_1 + 1] = toSubpathBezier[i_1 + 1] - toCp[1]; + } + } + result.push({ + from: newFromSubpathBezier, + to: newToSubpathBezier, + fromCp: fromCp, + toCp: toCp, + rotation: -bestAngle + }); + } + return result; + } + function isCombineMorphing(path) { + return path.__isCombineMorphing; + } + var SAVED_METHOD_PREFIX = '__mOriginal_'; + function saveAndModifyMethod(obj, methodName, modifiers) { + var savedMethodName = SAVED_METHOD_PREFIX + methodName; + var originalMethod = obj[savedMethodName] || obj[methodName]; + if (!obj[savedMethodName]) { + obj[savedMethodName] = obj[methodName]; + } + var replace = modifiers.replace; + var after = modifiers.after; + var before = modifiers.before; + obj[methodName] = function () { + var args = arguments; + var res; + before && before.apply(this, args); + if (replace) { + res = replace.apply(this, args); + } + else { + res = originalMethod.apply(this, args); + } + after && after.apply(this, args); + return res; + }; + } + function restoreMethod(obj, methodName) { + var savedMethodName = SAVED_METHOD_PREFIX + methodName; + if (obj[savedMethodName]) { + obj[methodName] = obj[savedMethodName]; + obj[savedMethodName] = null; + } + } + function applyTransformOnBeziers(bezierCurves, mm) { + for (var i = 0; i < bezierCurves.length; i++) { + var subBeziers = bezierCurves[i]; + for (var k = 0; k < subBeziers.length;) { + var x = subBeziers[k]; + var y = subBeziers[k + 1]; + subBeziers[k++] = mm[0] * x + mm[2] * y + mm[4]; + subBeziers[k++] = mm[1] * x + mm[3] * y + mm[5]; + } + } + } + function prepareMorphPath(fromPath, toPath) { + var fromPathProxy = fromPath.getUpdatedPathProxy(); + var toPathProxy = toPath.getUpdatedPathProxy(); + var _a = alignBezierCurves(pathToBezierCurves(fromPathProxy), pathToBezierCurves(toPathProxy)), fromBezierCurves = _a[0], toBezierCurves = _a[1]; + var fromPathTransform = fromPath.getComputedTransform(); + var toPathTransform = toPath.getComputedTransform(); + function updateIdentityTransform() { + this.transform = null; + } + fromPathTransform && applyTransformOnBeziers(fromBezierCurves, fromPathTransform); + toPathTransform && applyTransformOnBeziers(toBezierCurves, toPathTransform); + saveAndModifyMethod(toPath, 'updateTransform', { replace: updateIdentityTransform }); + toPath.transform = null; + var morphingData = findBestMorphingRotation(fromBezierCurves, toBezierCurves, 10, Math.PI); + var tmpArr = []; + saveAndModifyMethod(toPath, 'buildPath', { replace: function (path) { + var t = toPath.__morphT; + var onet = 1 - t; + var newCp = []; + for (var i = 0; i < morphingData.length; i++) { + var item = morphingData[i]; + var from = item.from; + var to = item.to; + var angle = item.rotation * t; + var fromCp = item.fromCp; + var toCp = item.toCp; + var sa = Math.sin(angle); + var ca = Math.cos(angle); + lerp(newCp, fromCp, toCp, t); + for (var m = 0; m < from.length; m += 2) { + var x0_1 = from[m]; + var y0_1 = from[m + 1]; + var x1 = to[m]; + var y1 = to[m + 1]; + var x = x0_1 * onet + x1 * t; + var y = y0_1 * onet + y1 * t; + tmpArr[m] = (x * ca - y * sa) + newCp[0]; + tmpArr[m + 1] = (x * sa + y * ca) + newCp[1]; + } + var x0 = tmpArr[0]; + var y0 = tmpArr[1]; + path.moveTo(x0, y0); + for (var m = 2; m < from.length;) { + var x1 = tmpArr[m++]; + var y1 = tmpArr[m++]; + var x2 = tmpArr[m++]; + var y2 = tmpArr[m++]; + var x3 = tmpArr[m++]; + var y3 = tmpArr[m++]; + if (x0 === x1 && y0 === y1 && x2 === x3 && y2 === y3) { + path.lineTo(x3, y3); + } + else { + path.bezierCurveTo(x1, y1, x2, y2, x3, y3); + } + x0 = x3; + y0 = y3; + } + } + } }); + } + function morphPath(fromPath, toPath, animationOpts) { + if (!fromPath || !toPath) { + return toPath; + } + var oldDone = animationOpts.done; + var oldDuring = animationOpts.during; + prepareMorphPath(fromPath, toPath); + toPath.__morphT = 0; + function restoreToPath() { + restoreMethod(toPath, 'buildPath'); + restoreMethod(toPath, 'updateTransform'); + toPath.__morphT = -1; + toPath.createPathProxy(); + toPath.dirtyShape(); + } + toPath.animateTo({ + __morphT: 1 + }, defaults({ + during: function (p) { + toPath.dirtyShape(); + oldDuring && oldDuring(p); + }, + done: function () { + restoreToPath(); + oldDone && oldDone(); + } + }, animationOpts)); + return toPath; + } + function hilbert(x, y, minX, minY, maxX, maxY) { + var bits = 16; + x = (maxX === minX) ? 0 : Math.round(32767 * (x - minX) / (maxX - minX)); + y = (maxY === minY) ? 0 : Math.round(32767 * (y - minY) / (maxY - minY)); + var d = 0; + var tmp; + for (var s = (1 << bits) / 2; s > 0; s /= 2) { + var rx = 0; + var ry = 0; + if ((x & s) > 0) { + rx = 1; + } + if ((y & s) > 0) { + ry = 1; + } + d += s * s * ((3 * rx) ^ ry); + if (ry === 0) { + if (rx === 1) { + x = s - 1 - x; + y = s - 1 - y; + } + tmp = x; + x = y; + y = tmp; + } + } + return d; + } + function sortPaths(pathList) { + var xMin = Infinity; + var yMin = Infinity; + var xMax = -Infinity; + var yMax = -Infinity; + var cps = map(pathList, function (path) { + var rect = path.getBoundingRect(); + var m = path.getComputedTransform(); + var x = rect.x + rect.width / 2 + (m ? m[4] : 0); + var y = rect.y + rect.height / 2 + (m ? m[5] : 0); + xMin = Math.min(x, xMin); + yMin = Math.min(y, yMin); + xMax = Math.max(x, xMax); + yMax = Math.max(y, yMax); + return [x, y]; + }); + var items = map(cps, function (cp, idx) { + return { + cp: cp, + z: hilbert(cp[0], cp[1], xMin, yMin, xMax, yMax), + path: pathList[idx] + }; + }); + return items.sort(function (a, b) { return a.z - b.z; }).map(function (item) { return item.path; }); + } + function defaultDividePath(param) { + return split(param.path, param.count); + } + function createEmptyReturn() { + return { + fromIndividuals: [], + toIndividuals: [], + count: 0 + }; + } + function combineMorph(fromList, toPath, animationOpts) { + var fromPathList = []; + function addFromPath(fromList) { + for (var i = 0; i < fromList.length; i++) { + var from = fromList[i]; + if (isCombineMorphing(from)) { + addFromPath(from.childrenRef()); + } + else if (from instanceof Path) { + fromPathList.push(from); + } + } + } + addFromPath(fromList); + var separateCount = fromPathList.length; + if (!separateCount) { + return createEmptyReturn(); + } + var dividePath = animationOpts.dividePath || defaultDividePath; + var toSubPathList = dividePath({ + path: toPath, count: separateCount + }); + if (toSubPathList.length !== separateCount) { + console.error('Invalid morphing: unmatched splitted path'); + return createEmptyReturn(); + } + fromPathList = sortPaths(fromPathList); + toSubPathList = sortPaths(toSubPathList); + var oldDone = animationOpts.done; + var oldDuring = animationOpts.during; + var individualDelay = animationOpts.individualDelay; + var identityTransform = new Transformable(); + for (var i = 0; i < separateCount; i++) { + var from = fromPathList[i]; + var to = toSubPathList[i]; + to.parent = toPath; + to.copyTransform(identityTransform); + if (!individualDelay) { + prepareMorphPath(from, to); + } + } + toPath.__isCombineMorphing = true; + toPath.childrenRef = function () { + return toSubPathList; + }; + function addToSubPathListToZr(zr) { + for (var i = 0; i < toSubPathList.length; i++) { + toSubPathList[i].addSelfToZr(zr); + } + } + saveAndModifyMethod(toPath, 'addSelfToZr', { + after: function (zr) { + addToSubPathListToZr(zr); + } + }); + saveAndModifyMethod(toPath, 'removeSelfFromZr', { + after: function (zr) { + for (var i = 0; i < toSubPathList.length; i++) { + toSubPathList[i].removeSelfFromZr(zr); + } + } + }); + function restoreToPath() { + toPath.__isCombineMorphing = false; + toPath.__morphT = -1; + toPath.childrenRef = null; + restoreMethod(toPath, 'addSelfToZr'); + restoreMethod(toPath, 'removeSelfFromZr'); + } + var toLen = toSubPathList.length; + if (individualDelay) { + var animating_1 = toLen; + var eachDone = function () { + animating_1--; + if (animating_1 === 0) { + restoreToPath(); + oldDone && oldDone(); + } + }; + for (var i = 0; i < toLen; i++) { + var indivdualAnimationOpts = individualDelay ? defaults({ + delay: (animationOpts.delay || 0) + individualDelay(i, toLen, fromPathList[i], toSubPathList[i]), + done: eachDone + }, animationOpts) : animationOpts; + morphPath(fromPathList[i], toSubPathList[i], indivdualAnimationOpts); + } + } + else { + toPath.__morphT = 0; + toPath.animateTo({ + __morphT: 1 + }, defaults({ + during: function (p) { + for (var i = 0; i < toLen; i++) { + var child = toSubPathList[i]; + child.__morphT = toPath.__morphT; + child.dirtyShape(); + } + oldDuring && oldDuring(p); + }, + done: function () { + restoreToPath(); + for (var i = 0; i < fromList.length; i++) { + restoreMethod(fromList[i], 'updateTransform'); + } + oldDone && oldDone(); + } + }, animationOpts)); + } + if (toPath.__zr) { + addToSubPathListToZr(toPath.__zr); + } + return { + fromIndividuals: fromPathList, + toIndividuals: toSubPathList, + count: toLen + }; + } + function separateMorph(fromPath, toPathList, animationOpts) { + var toLen = toPathList.length; + var fromPathList = []; + var dividePath = animationOpts.dividePath || defaultDividePath; + function addFromPath(fromList) { + for (var i = 0; i < fromList.length; i++) { + var from = fromList[i]; + if (isCombineMorphing(from)) { + addFromPath(from.childrenRef()); + } + else if (from instanceof Path) { + fromPathList.push(from); + } + } + } + if (isCombineMorphing(fromPath)) { + addFromPath(fromPath.childrenRef()); + var fromLen = fromPathList.length; + if (fromLen < toLen) { + var k = 0; + for (var i = fromLen; i < toLen; i++) { + fromPathList.push(clonePath(fromPathList[k++ % fromLen])); + } + } + fromPathList.length = toLen; + } + else { + fromPathList = dividePath({ path: fromPath, count: toLen }); + var fromPathTransform = fromPath.getComputedTransform(); + for (var i = 0; i < fromPathList.length; i++) { + fromPathList[i].setLocalTransform(fromPathTransform); + } + if (fromPathList.length !== toLen) { + console.error('Invalid morphing: unmatched splitted path'); + return createEmptyReturn(); + } + } + fromPathList = sortPaths(fromPathList); + toPathList = sortPaths(toPathList); + var individualDelay = animationOpts.individualDelay; + for (var i = 0; i < toLen; i++) { + var indivdualAnimationOpts = individualDelay ? defaults({ + delay: (animationOpts.delay || 0) + individualDelay(i, toLen, fromPathList[i], toPathList[i]) + }, animationOpts) : animationOpts; + morphPath(fromPathList[i], toPathList[i], indivdualAnimationOpts); + } + return { + fromIndividuals: fromPathList, + toIndividuals: toPathList, + count: toPathList.length + }; + } + + function isMultiple(elements) { + return isArray(elements[0]); + } + + function prepareMorphBatches(one, many) { + var batches = []; + var batchCount = one.length; + + for (var i = 0; i < batchCount; i++) { + batches.push({ + one: one[i], + many: [] + }); + } + + for (var i = 0; i < many.length; i++) { + var len = many[i].length; + var k = void 0; + + for (k = 0; k < len; k++) { + batches[k % batchCount].many.push(many[i][k]); + } + } + + var off = 0; // If one has more paths than each one of many. average them. + + for (var i = batchCount - 1; i >= 0; i--) { + if (!batches[i].many.length) { + var moveFrom = batches[off].many; + + if (moveFrom.length <= 1) { + // Not enough + // Start from the first one. + if (off) { + off = 0; + } else { + return batches; + } + } + + var len = moveFrom.length; + var mid = Math.ceil(len / 2); + batches[i].many = moveFrom.slice(mid, len); + batches[off].many = moveFrom.slice(0, mid); + off++; + } + } + + return batches; + } + + var pathDividers = { + clone: function (params) { + var ret = []; // Fitting the alpha + + var approxOpacity = 1 - Math.pow(1 - params.path.style.opacity, 1 / params.count); + + for (var i = 0; i < params.count; i++) { + var cloned = clonePath(params.path); + cloned.setStyle('opacity', approxOpacity); + ret.push(cloned); + } + + return ret; + }, + // Use the default divider + split: null + }; + function applyMorphAnimation(from, to, divideShape, seriesModel, dataIndex, animateOtherProps) { + if (!from.length || !to.length) { + return; + } + + var updateAnimationCfg = getAnimationConfig('update', seriesModel, dataIndex); + + if (!(updateAnimationCfg && updateAnimationCfg.duration > 0)) { + return; + } + + var animationDelay = seriesModel.getModel('universalTransition').get('delay'); + var animationCfg = Object.assign({ + // Need to setToFinal so the further calculation based on the style can be correct. + // Like emphasis color. + setToFinal: true + }, updateAnimationCfg); + var many; + var one; + + if (isMultiple(from)) { + // manyToOne + many = from; + one = to; + } + + if (isMultiple(to)) { + // oneToMany + many = to; + one = from; + } + + function morphOneBatch(batch, fromIsMany, animateIndex, animateCount, forceManyOne) { + var batchMany = batch.many; + var batchOne = batch.one; + + if (batchMany.length === 1 && !forceManyOne) { + // Is one to one + var batchFrom = fromIsMany ? batchMany[0] : batchOne; + var batchTo = fromIsMany ? batchOne : batchMany[0]; + + if (isCombineMorphing(batchFrom)) { + // Keep doing combine animation. + morphOneBatch({ + many: [batchFrom], + one: batchTo + }, true, animateIndex, animateCount, true); + } else { + var individualAnimationCfg = animationDelay ? defaults({ + delay: animationDelay(animateIndex, animateCount) + }, animationCfg) : animationCfg; + morphPath(batchFrom, batchTo, individualAnimationCfg); + animateOtherProps(batchFrom, batchTo, batchFrom, batchTo, individualAnimationCfg); + } + } else { + var separateAnimationCfg = defaults({ + dividePath: pathDividers[divideShape], + individualDelay: animationDelay && function (idx, count, fromPath, toPath) { + return animationDelay(idx + animateIndex, animateCount); + } + }, animationCfg); + + var _a = fromIsMany ? combineMorph(batchMany, batchOne, separateAnimationCfg) : separateMorph(batchOne, batchMany, separateAnimationCfg), + fromIndividuals = _a.fromIndividuals, + toIndividuals = _a.toIndividuals; + + var count = fromIndividuals.length; + + for (var k = 0; k < count; k++) { + var individualAnimationCfg = animationDelay ? defaults({ + delay: animationDelay(k, count) + }, animationCfg) : animationCfg; + animateOtherProps(fromIndividuals[k], toIndividuals[k], fromIsMany ? batchMany[k] : batch.one, fromIsMany ? batch.one : batchMany[k], individualAnimationCfg); + } + } + } + + var fromIsMany = many ? many === from // Is one to one. If the path number not match. also needs do merge and separate morphing. + : from.length > to.length; + var morphBatches = many ? prepareMorphBatches(one, many) : prepareMorphBatches(fromIsMany ? to : from, [fromIsMany ? from : to]); + var animateCount = 0; + + for (var i = 0; i < morphBatches.length; i++) { + animateCount += morphBatches[i].many.length; + } + + var animateIndex = 0; + + for (var i = 0; i < morphBatches.length; i++) { + morphOneBatch(morphBatches[i], fromIsMany, animateIndex, animateCount); + animateIndex += morphBatches[i].many.length; + } + } + function getPathList(elements) { + if (!elements) { + return []; + } + + if (isArray(elements)) { + var pathList_1 = []; + + for (var i = 0; i < elements.length; i++) { + pathList_1.push(getPathList(elements[i])); + } + + return pathList_1; + } + + var pathList = []; + elements.traverse(function (el) { + if (el instanceof Path && !el.disableMorphing && !el.invisible && !el.ignore) { + pathList.push(el); + } + }); + return pathList; + } + + var DATA_COUNT_THRESHOLD = 1e4; + var getUniversalTransitionGlobalStore = makeInner(); + + function getGroupIdDimension(data) { + var dimensions = data.dimensions; + + for (var i = 0; i < dimensions.length; i++) { + var dimInfo = data.getDimensionInfo(dimensions[i]); + + if (dimInfo && dimInfo.otherDims.itemGroupId === 0) { + return dimensions[i]; + } + } + } + + function flattenDataDiffItems(list) { + var items = []; + each(list, function (seriesInfo) { + var data = seriesInfo.data; + + if (data.count() > DATA_COUNT_THRESHOLD) { + if ("development" !== 'production') { + warn('Universal transition is disabled on large data > 10k.'); + } + + return; + } + + var indices = data.getIndices(); + var groupDim = getGroupIdDimension(data); + + for (var dataIndex = 0; dataIndex < indices.length; dataIndex++) { + items.push({ + data: data, + dim: seriesInfo.dim || groupDim, + divide: seriesInfo.divide, + dataIndex: dataIndex + }); + } + }); + return items; + } + + function fadeInElement(newEl, newSeries, newIndex) { + newEl.traverse(function (el) { + if (el instanceof Path) { + // TODO use fade in animation for target element. + initProps(el, { + style: { + opacity: 0 + } + }, newSeries, { + dataIndex: newIndex, + isFrom: true + }); + } + }); + } + + function removeEl$1(el) { + if (el.parent) { + // Bake parent transform to element. + // So it can still have proper transform to transition after it's removed. + var computedTransform = el.getComputedTransform(); + el.setLocalTransform(computedTransform); + el.parent.remove(el); + } + } + + function stopAnimation(el) { + el.stopAnimation(); + + if (el.isGroup) { + el.traverse(function (child) { + child.stopAnimation(); + }); + } + } + + function animateElementStyles(el, dataIndex, seriesModel) { + var animationConfig = getAnimationConfig('update', seriesModel, dataIndex); + animationConfig && el.traverse(function (child) { + if (child instanceof Displayable) { + var oldStyle = getOldStyle(child); + + if (oldStyle) { + child.animateFrom({ + style: oldStyle + }, animationConfig); + } + } + }); + } + + function isAllIdSame(oldDiffItems, newDiffItems) { + var len = oldDiffItems.length; + + if (len !== newDiffItems.length) { + return false; + } + + for (var i = 0; i < len; i++) { + var oldItem = oldDiffItems[i]; + var newItem = newDiffItems[i]; + + if (oldItem.data.getId(oldItem.dataIndex) !== newItem.data.getId(newItem.dataIndex)) { + return false; + } + } + + return true; + } + + function transitionBetween(oldList, newList, api) { + var oldDiffItems = flattenDataDiffItems(oldList); + var newDiffItems = flattenDataDiffItems(newList); + + function updateMorphingPathProps(from, to, rawFrom, rawTo, animationCfg) { + if (rawFrom || from) { + to.animateFrom({ + style: rawFrom && rawFrom !== from ? // dividingMethod like clone may override the style(opacity) + // So extend it to raw style. + extend(extend({}, rawFrom.style), from.style) : from.style + }, animationCfg); + } + } + + function findKeyDim(items) { + for (var i = 0; i < items.length; i++) { + if (items[i].dim) { + return items[i].dim; + } + } + } + + var oldKeyDim = findKeyDim(oldDiffItems); + var newKeyDim = findKeyDim(newDiffItems); + var hasMorphAnimation = false; + + function createKeyGetter(isOld, onlyGetId) { + return function (diffItem) { + var data = diffItem.data; + var dataIndex = diffItem.dataIndex; // TODO if specified dim + + if (onlyGetId) { + return data.getId(dataIndex); + } // Use group id as transition key by default. + // So we can achieve multiple to multiple animation like drilldown / up naturally. + // If group id not exits. Use id instead. If so, only one to one transition will be applied. + + + var dataGroupId = data.hostModel && data.hostModel.get('dataGroupId'); // If specified key dimension(itemGroupId by default). Use this same dimension from other data. + // PENDING: If only use key dimension of newData. + + var keyDim = isOld ? oldKeyDim || newKeyDim : newKeyDim || oldKeyDim; + var dimInfo = keyDim && data.getDimensionInfo(keyDim); + var dimOrdinalMeta = dimInfo && dimInfo.ordinalMeta; + + if (dimInfo) { + // Get from encode.itemGroupId. + var key = data.get(dimInfo.name, dataIndex); + + if (dimOrdinalMeta) { + return dimOrdinalMeta.categories[key] || key + ''; + } + + return key + ''; + } // Get groupId from raw item. { groupId: '' } + + + var itemVal = data.getRawDataItem(dataIndex); + + if (itemVal && itemVal.groupId) { + return itemVal.groupId + ''; + } + + return dataGroupId || data.getId(dataIndex); + }; + } // Use id if it's very likely to be an one to one animation + // It's more robust than groupId + // TODO Check if key dimension is specified. + + + var useId = isAllIdSame(oldDiffItems, newDiffItems); + var isElementStillInChart = {}; + + if (!useId) { + // We may have different diff strategy with basicTransition if we use other dimension as key. + // If so, we can't simply check if oldEl is same with newEl. We need a map to check if oldEl is still being used in the new chart. + // We can't use the elements that already being morphed. Let it keep it's original basic transition. + for (var i = 0; i < newDiffItems.length; i++) { + var newItem = newDiffItems[i]; + var el = newItem.data.getItemGraphicEl(newItem.dataIndex); + + if (el) { + isElementStillInChart[el.id] = true; + } + } + } + + function updateOneToOne(newIndex, oldIndex) { + var oldItem = oldDiffItems[oldIndex]; + var newItem = newDiffItems[newIndex]; + var newSeries = newItem.data.hostModel; // TODO Mark this elements is morphed and don't morph them anymore + + var oldEl = oldItem.data.getItemGraphicEl(oldItem.dataIndex); + var newEl = newItem.data.getItemGraphicEl(newItem.dataIndex); // Can't handle same elements. + + if (oldEl === newEl) { + newEl && animateElementStyles(newEl, newItem.dataIndex, newSeries); + return; + } + + if ( // We can't use the elements that already being morphed + oldEl && isElementStillInChart[oldEl.id]) { + return; + } + + if (newEl) { + // TODO: If keep animating the group in case + // some of the elements don't want to be morphed. + // TODO Label? + stopAnimation(newEl); + + if (oldEl) { + stopAnimation(oldEl); // If old element is doing leaving animation. stop it and remove it immediately. + + removeEl$1(oldEl); + hasMorphAnimation = true; + applyMorphAnimation(getPathList(oldEl), getPathList(newEl), newItem.divide, newSeries, newIndex, updateMorphingPathProps); + } else { + fadeInElement(newEl, newSeries, newIndex); + } + } // else keep oldEl leaving animation. + + } + + new DataDiffer(oldDiffItems, newDiffItems, createKeyGetter(true, useId), createKeyGetter(false, useId), null, 'multiple').update(updateOneToOne).updateManyToOne(function (newIndex, oldIndices) { + var newItem = newDiffItems[newIndex]; + var newData = newItem.data; + var newSeries = newData.hostModel; + var newEl = newData.getItemGraphicEl(newItem.dataIndex); + var oldElsList = filter(map(oldIndices, function (idx) { + return oldDiffItems[idx].data.getItemGraphicEl(oldDiffItems[idx].dataIndex); + }), function (oldEl) { + return oldEl && oldEl !== newEl && !isElementStillInChart[oldEl.id]; + }); + + if (newEl) { + stopAnimation(newEl); + + if (oldElsList.length) { + // If old element is doing leaving animation. stop it and remove it immediately. + each(oldElsList, function (oldEl) { + stopAnimation(oldEl); + removeEl$1(oldEl); + }); + hasMorphAnimation = true; + applyMorphAnimation(getPathList(oldElsList), getPathList(newEl), newItem.divide, newSeries, newIndex, updateMorphingPathProps); + } else { + fadeInElement(newEl, newSeries, newItem.dataIndex); + } + } // else keep oldEl leaving animation. + + }).updateOneToMany(function (newIndices, oldIndex) { + var oldItem = oldDiffItems[oldIndex]; + var oldEl = oldItem.data.getItemGraphicEl(oldItem.dataIndex); // We can't use the elements that already being morphed + + if (oldEl && isElementStillInChart[oldEl.id]) { + return; + } + + var newElsList = filter(map(newIndices, function (idx) { + return newDiffItems[idx].data.getItemGraphicEl(newDiffItems[idx].dataIndex); + }), function (el) { + return el && el !== oldEl; + }); + var newSeris = newDiffItems[newIndices[0]].data.hostModel; + + if (newElsList.length) { + each(newElsList, function (newEl) { + return stopAnimation(newEl); + }); + + if (oldEl) { + stopAnimation(oldEl); // If old element is doing leaving animation. stop it and remove it immediately. + + removeEl$1(oldEl); + hasMorphAnimation = true; + applyMorphAnimation(getPathList(oldEl), getPathList(newElsList), oldItem.divide, // Use divide on old. + newSeris, newIndices[0], updateMorphingPathProps); + } else { + each(newElsList, function (newEl) { + return fadeInElement(newEl, newSeris, newIndices[0]); + }); + } + } // else keep oldEl leaving animation. + + }).updateManyToMany(function (newIndices, oldIndices) { + // If two data are same and both have groupId. + // Normally they should be diff by id. + new DataDiffer(oldIndices, newIndices, function (rawIdx) { + return oldDiffItems[rawIdx].data.getId(oldDiffItems[rawIdx].dataIndex); + }, function (rawIdx) { + return newDiffItems[rawIdx].data.getId(newDiffItems[rawIdx].dataIndex); + }).update(function (newIndex, oldIndex) { + // Use the original index + updateOneToOne(newIndices[newIndex], oldIndices[oldIndex]); + }).execute(); + }).execute(); + + if (hasMorphAnimation) { + each(newList, function (_a) { + var data = _a.data; + var seriesModel = data.hostModel; + var view = seriesModel && api.getViewOfSeriesModel(seriesModel); + var animationCfg = getAnimationConfig('update', seriesModel, 0); // use 0 index. + + if (view && seriesModel.isAnimationEnabled() && animationCfg && animationCfg.duration > 0) { + view.group.traverse(function (el) { + if (el instanceof Path && !el.animators.length) { + // We can't accept there still exists element that has no animation + // if universalTransition is enabled + el.animateFrom({ + style: { + opacity: 0 + } + }, animationCfg); + } + }); + } + }); + } + } + + function getSeriesTransitionKey(series) { + var seriesKey = series.getModel('universalTransition').get('seriesKey'); + + if (!seriesKey) { + // Use series id by default. + return series.id; + } + + return seriesKey; + } + + function convertArraySeriesKeyToString(seriesKey) { + if (isArray(seriesKey)) { + // Order independent. + return seriesKey.sort().join(','); + } + + return seriesKey; + } + + function getDivideShapeFromData(data) { + if (data.hostModel) { + return data.hostModel.getModel('universalTransition').get('divideShape'); + } + } + + function findTransitionSeriesBatches(globalStore, params) { + var updateBatches = createHashMap(); + var oldDataMap = createHashMap(); // Map that only store key in array seriesKey. + // Which is used to query the old data when transition from one to multiple series. + + var oldDataMapForSplit = createHashMap(); + each(globalStore.oldSeries, function (series, idx) { + var oldData = globalStore.oldData[idx]; + var transitionKey = getSeriesTransitionKey(series); + var transitionKeyStr = convertArraySeriesKeyToString(transitionKey); + oldDataMap.set(transitionKeyStr, oldData); + + if (isArray(transitionKey)) { + // Same key can't in different array seriesKey. + each(transitionKey, function (key) { + oldDataMapForSplit.set(key, { + data: oldData, + key: transitionKeyStr + }); + }); + } + }); + + function checkTransitionSeriesKeyDuplicated(transitionKeyStr) { + if (updateBatches.get(transitionKeyStr)) { + warn("Duplicated seriesKey in universalTransition " + transitionKeyStr); + } + } + + each(params.updatedSeries, function (series) { + if (series.isUniversalTransitionEnabled() && series.isAnimationEnabled()) { + var newData = series.getData(); + var transitionKey = getSeriesTransitionKey(series); + var transitionKeyStr = convertArraySeriesKeyToString(transitionKey); // Only transition between series with same id. + + var oldData = oldDataMap.get(transitionKeyStr); // string transition key is the best match. + + if (oldData) { + if ("development" !== 'production') { + checkTransitionSeriesKeyDuplicated(transitionKeyStr); + } // TODO check if data is same? + + + updateBatches.set(transitionKeyStr, { + oldSeries: [{ + divide: getDivideShapeFromData(oldData), + data: oldData + }], + newSeries: [{ + divide: getDivideShapeFromData(newData), + data: newData + }] + }); + } else { + // Transition from multiple series. + if (isArray(transitionKey)) { + if ("development" !== 'production') { + checkTransitionSeriesKeyDuplicated(transitionKeyStr); + } + + var oldSeries_1 = []; + each(transitionKey, function (key) { + var oldData = oldDataMap.get(key); + + if (oldData) { + oldSeries_1.push({ + divide: getDivideShapeFromData(oldData), + data: oldData + }); + } + }); + + if (oldSeries_1.length) { + updateBatches.set(transitionKeyStr, { + oldSeries: oldSeries_1, + newSeries: [{ + data: newData, + divide: getDivideShapeFromData(newData) + }] + }); + } + } else { + // Try transition to multiple series. + var oldData_1 = oldDataMapForSplit.get(transitionKey); + + if (oldData_1) { + var batch = updateBatches.get(oldData_1.key); + + if (!batch) { + batch = { + oldSeries: [{ + data: oldData_1.data, + divide: getDivideShapeFromData(oldData_1.data) + }], + newSeries: [] + }; + updateBatches.set(oldData_1.key, batch); + } + + batch.newSeries.push({ + data: newData, + divide: getDivideShapeFromData(newData) + }); + } + } + } + } + }); + return updateBatches; + } + + function querySeries(series, finder) { + for (var i = 0; i < series.length; i++) { + var found = finder.seriesIndex != null && finder.seriesIndex === series[i].seriesIndex || finder.seriesId != null && finder.seriesId === series[i].id; + + if (found) { + return i; + } + } + } + + function transitionSeriesFromOpt(transitionOpt, globalStore, params, api) { + var from = []; + var to = []; + each(normalizeToArray(transitionOpt.from), function (finder) { + var idx = querySeries(globalStore.oldSeries, finder); + + if (idx >= 0) { + from.push({ + data: globalStore.oldData[idx], + // TODO can specify divideShape in transition. + divide: getDivideShapeFromData(globalStore.oldData[idx]), + dim: finder.dimension + }); + } + }); + each(normalizeToArray(transitionOpt.to), function (finder) { + var idx = querySeries(params.updatedSeries, finder); + + if (idx >= 0) { + var data = params.updatedSeries[idx].getData(); + to.push({ + data: data, + divide: getDivideShapeFromData(data), + dim: finder.dimension + }); + } + }); + + if (from.length > 0 && to.length > 0) { + transitionBetween(from, to, api); + } + } + + function installUniversalTransition(registers) { + registers.registerUpdateLifecycle('series:beforeupdate', function (ecMOdel, api, params) { + each(normalizeToArray(params.seriesTransition), function (transOpt) { + each(normalizeToArray(transOpt.to), function (finder) { + var series = params.updatedSeries; + + for (var i = 0; i < series.length; i++) { + if (finder.seriesIndex != null && finder.seriesIndex === series[i].seriesIndex || finder.seriesId != null && finder.seriesId === series[i].id) { + series[i][SERIES_UNIVERSAL_TRANSITION_PROP] = true; + } + } + }); + }); + }); + registers.registerUpdateLifecycle('series:transition', function (ecModel, api, params) { + // TODO api provide an namespace that can save stuff per instance + var globalStore = getUniversalTransitionGlobalStore(api); // TODO multiple to multiple series. + + if (globalStore.oldSeries && params.updatedSeries && params.optionChanged) { + // Use give transition config if its' give; + var transitionOpt = params.seriesTransition; + + if (transitionOpt) { + each(normalizeToArray(transitionOpt), function (opt) { + transitionSeriesFromOpt(opt, globalStore, params, api); + }); + } else { + // Else guess from series based on transition series key. + var updateBatches_1 = findTransitionSeriesBatches(globalStore, params); + each(updateBatches_1.keys(), function (key) { + var batch = updateBatches_1.get(key); + transitionBetween(batch.oldSeries, batch.newSeries, api); + }); + } // Reset + + + each(params.updatedSeries, function (series) { + // Reset; + if (series[SERIES_UNIVERSAL_TRANSITION_PROP]) { + series[SERIES_UNIVERSAL_TRANSITION_PROP] = false; + } + }); + } // Save all series of current update. Not only the updated one. + + + var allSeries = ecModel.getSeries(); + var savedSeries = globalStore.oldSeries = []; + var savedData = globalStore.oldData = []; + + for (var i = 0; i < allSeries.length; i++) { + var data = allSeries[i].getData(); // Only save the data that can have transition. + // Avoid large data costing too much extra memory + + if (data.count() < DATA_COUNT_THRESHOLD) { + savedSeries.push(allSeries[i]); + savedData.push(data); + } + } + }); + } + + // Render engines + // ----------------- + // Render via Canvas. + // echarts.init(dom, null, { renderer: 'canvas' }) + + use([install$1]); // Render via SVG. + // echarts.init(dom, null, { renderer: 'svg' }) + + use([install]); // ---------------- + // Charts (series) + // ---------------- + // All of the series types, for example: + // chart.setOption({ + // series: [{ + // type: 'line' // or 'bar', 'pie', ... + // }] + // }); + + use([install$2, install$3, install$4, install$6, install$8, install$a, install$b, install$c, install$d, install$e, install$f, install$h, install$i, install$j, install$k, install$l, install$m, install$n, install$o, install$p, install$q, install$r]); // ------------------- + // Coordinate systems + // ------------------- + // All of the axis modules have been included in the + // coordinate system module below, do not need to + // make extra import. + // `cartesian` coordinate system. For some historical + // reasons, it is named as grid, for example: + // chart.setOption({ + // grid: {...}, + // xAxis: {...}, + // yAxis: {...}, + // series: [{...}] + // }); + + use(install$t); // `polar` coordinate system, for example: + // chart.setOption({ + // polar: {...}, + // radiusAxis: {...}, + // angleAxis: {...}, + // series: [{ + // coordinateSystem: 'polar' + // }] + // }); + + use(install$u); // `geo` coordinate system, for example: + // chart.setOption({ + // geo: {...}, + // series: [{ + // coordinateSystem: 'geo' + // }] + // }); + + use(install$9); // `singleAxis` coordinate system (notice, it is a coordinate system + // with only one axis, work for chart like theme river), for example: + // chart.setOption({ + // singleAxis: {...} + // series: [{type: 'themeRiver', ...}] + // }); + + use(install$v); // `parallel` coordinate system, only work for parallel series, for example: + // chart.setOption({ + // parallel: {...}, + // parallelAxis: [{...}, ...], + // series: [{ + // type: 'parallel' + // }] + // }); + + use(install$g); // `calendar` coordinate system. for example, + // chart.setOptionp({ + // calendar: {...}, + // series: [{ + // coordinateSystem: 'calendar' + // }] + // ); + + use(install$w); // ------------------ + // Other components + // ------------------ + // `graphic` component, for example: + // chart.setOption({ + // graphic: {...} + // }); + + use(install$x); // `toolbox` component, for example: + // chart.setOption({ + // toolbox: {...} + // }); + + use(install$z); // `tooltip` component, for example: + // chart.setOption({ + // tooltip: {...} + // }); + + use(install$A); // `axisPointer` component, for example: + // chart.setOption({ + // tooltip: {axisPointer: {...}, ...} + // }); + // Or + // chart.setOption({ + // axisPointer: {...} + // }); + + use(install$s); // `brush` component, for example: + // chart.setOption({ + // brush: {...} + // }); + // Or + // chart.setOption({ + // tooltip: {feature: {brush: {...}} + // }) + + use(install$B); // `title` component, for example: + // chart.setOption({ + // title: {...} + // }); + + use(install$C); // `timeline` component, for example: + // chart.setOption({ + // timeline: {...} + // }); + + use(install$D); // `markPoint` component, for example: + // chart.setOption({ + // series: [{markPoint: {...}}] + // }); + + use(install$E); // `markLine` component, for example: + // chart.setOption({ + // series: [{markLine: {...}}] + // }); + + use(install$F); // `markArea` component, for example: + // chart.setOption({ + // series: [{markArea: {...}}] + // }); + + use(install$G); // `legend` component not scrollable. for example: + // chart.setOption({ + // legend: {...} + // }); + + use(install$J); // `dataZoom` component including both `dataZoomInside` and `dataZoomSlider`. + + use(install$M); // `dataZoom` component providing drag, pinch, wheel behaviors + // inside coodinate system, for example: + // chart.setOption({ + // dataZoom: {type: 'inside'} + // }); + + use(install$K); // `dataZoom` component providing a slider bar, for example: + // chart.setOption({ + // dataZoom: {type: 'slider'} + // }); + + use(install$L); // `visualMap` component including both `visualMapContinuous` and `visualMapPiecewise`. + + use(install$P); // `visualMap` component providing continuous bar, for example: + // chart.setOption({ + // visualMap: {type: 'continuous'} + // }); + + use(install$N); // `visualMap` component providing pieces bar, for example: + // chart.setOption({ + // visualMap: {type: 'piecewise'} + // }); + + use(install$O); // `aria` component providing aria, for example: + // chart.setOption({ + // aria: {...} + // }); + + use(install$Q); // dataset transform + // chart.setOption({ + // dataset: { + // transform: [] + // } + // }); + + use(install$R); + use(install$S); // universal transition + // chart.setOption({ + // series: { + // universalTransition: { enabled: true } + // } + // }) + + use(installUniversalTransition); // label layout + // chart.setOption({ + // series: { + // labelLayout: { hideOverlap: true } + // } + // }) + + use(installLabelLayout); + + exports.Axis = Axis; + exports.ChartView = ChartView; + exports.ComponentModel = ComponentModel; + exports.ComponentView = ComponentView; + exports.List = SeriesData; + exports.Model = Model; + exports.PRIORITY = PRIORITY; + exports.SeriesModel = SeriesModel; + exports.color = color; + exports.connect = connect; + exports.dataTool = dataTool; + exports.dependencies = dependencies; + exports.disConnect = disConnect; + exports.disconnect = disconnect; + exports.dispose = dispose$1; + exports.env = env; + exports.extendChartView = extendChartView; + exports.extendComponentModel = extendComponentModel; + exports.extendComponentView = extendComponentView; + exports.extendSeriesModel = extendSeriesModel; + exports.format = format$1; + exports.getCoordinateSystemDimensions = getCoordinateSystemDimensions; + exports.getInstanceByDom = getInstanceByDom; + exports.getInstanceById = getInstanceById; + exports.getMap = getMap; + exports.graphic = graphic$1; + exports.helper = helper; + exports.init = init$1; + exports.innerDrawElementOnCanvas = brushSingle; + exports.matrix = matrix; + exports.number = number; + exports.parseGeoJSON = parseGeoJSON; + exports.parseGeoJson = parseGeoJSON; + exports.registerAction = registerAction; + exports.registerCoordinateSystem = registerCoordinateSystem; + exports.registerLayout = registerLayout; + exports.registerLoading = registerLoading; + exports.registerLocale = registerLocale; + exports.registerMap = registerMap; + exports.registerPostInit = registerPostInit; + exports.registerPostUpdate = registerPostUpdate; + exports.registerPreprocessor = registerPreprocessor; + exports.registerProcessor = registerProcessor; + exports.registerTheme = registerTheme; + exports.registerTransform = registerTransform; + exports.registerUpdateLifecycle = registerUpdateLifecycle; + exports.registerVisual = registerVisual; + exports.setCanvasCreator = setCanvasCreator; + exports.setPlatformAPI = setPlatformAPI; + exports.throttle = throttle; + exports.time = time; + exports.use = use; + exports.util = util$1; + exports.vector = vector; + exports.version = version$1; + exports.zrUtil = util; + exports.zrender = zrender; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=echarts.js.map diff --git a/view/js/echarts_5.5.3.min.js b/view/js/echarts_5.5.3.min.js new file mode 100644 index 0000000..0b1ab37 --- /dev/null +++ b/view/js/echarts_5.5.3.min.js @@ -0,0 +1,45 @@ + +/* +* 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. +*/ + +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).echarts={})}(this,(function(t){"use strict"; +/*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(t,n)};function n(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}var i=function(){this.firefox=!1,this.ie=!1,this.edge=!1,this.newEdge=!1,this.weChat=!1},r=new function(){this.browser=new i,this.node=!1,this.wxa=!1,this.worker=!1,this.svgSupported=!1,this.touchEventsSupported=!1,this.pointerEventsSupported=!1,this.domSupported=!1,this.transformSupported=!1,this.transform3dSupported=!1,this.hasGlobalWindow="undefined"!=typeof window};"object"==typeof wx&&"function"==typeof wx.getSystemInfoSync?(r.wxa=!0,r.touchEventsSupported=!0):"undefined"==typeof document&&"undefined"!=typeof self?r.worker=!0:"undefined"==typeof navigator?(r.node=!0,r.svgSupported=!0):function(t,e){var n=e.browser,i=t.match(/Firefox\/([\d.]+)/),r=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),o=t.match(/Edge?\/([\d.]+)/),a=/micromessenger/i.test(t);i&&(n.firefox=!0,n.version=i[1]);r&&(n.ie=!0,n.version=r[1]);o&&(n.edge=!0,n.version=o[1],n.newEdge=+o[1].split(".")[0]>18);a&&(n.weChat=!0);e.svgSupported="undefined"!=typeof SVGRect,e.touchEventsSupported="ontouchstart"in window&&!n.ie&&!n.edge,e.pointerEventsSupported="onpointerdown"in window&&(n.edge||n.ie&&+n.version>=11),e.domSupported="undefined"!=typeof document;var s=document.documentElement.style;e.transform3dSupported=(n.ie&&"transition"in s||n.edge||"WebKitCSSMatrix"in window&&"m11"in new WebKitCSSMatrix||"MozPerspective"in s)&&!("OTransition"in s),e.transformSupported=e.transform3dSupported||n.ie&&+n.version>=9}(navigator.userAgent,r);var o="sans-serif",a="12px sans-serif";var s,l,u=function(t){var e={};if("undefined"==typeof JSON)return e;for(var n=0;n<t.length;n++){var i=String.fromCharCode(n+32),r=(t.charCodeAt(n)-20)/100;e[i]=r}return e}("007LLmW'55;N0500LLLLLLLLLL00NNNLzWW\\\\WQb\\0FWLg\\bWb\\WQ\\WrWWQ000CL5LLFLL0LL**F*gLLLL5F0LF\\FFF5.5N"),h={createCanvas:function(){return"undefined"!=typeof document&&document.createElement("canvas")},measureText:function(t,e){if(!s){var n=h.createCanvas();s=n&&n.getContext("2d")}if(s)return l!==e&&(l=s.font=e||a),s.measureText(t);t=t||"";var i=/^([0-9]*?)px$/.exec(e=e||a),r=+(i&&i[1])||12,o=0;if(e.indexOf("mono")>=0)o=r*t.length;else for(var c=0;c<t.length;c++){var p=u[t[c]];o+=null==p?r:p*r}return{width:o}},loadImage:function(t,e,n){var i=new Image;return i.onload=e,i.onerror=n,i.src=t,i}};function c(t){for(var e in h)t[e]&&(h[e]=t[e])}var p=V(["Function","RegExp","Date","Error","CanvasGradient","CanvasPattern","Image","Canvas"],(function(t,e){return t["[object "+e+"]"]=!0,t}),{}),d=V(["Int8","Uint8","Uint8Clamped","Int16","Uint16","Int32","Uint32","Float32","Float64"],(function(t,e){return t["[object "+e+"Array]"]=!0,t}),{}),f=Object.prototype.toString,g=Array.prototype,y=g.forEach,v=g.filter,m=g.slice,x=g.map,_=function(){}.constructor,b=_?_.prototype:null,w="__proto__",S=2311;function M(){return S++}function I(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];"undefined"!=typeof console&&console.error.apply(console,t)}function T(t){if(null==t||"object"!=typeof t)return t;var e=t,n=f.call(t);if("[object Array]"===n){if(!pt(t)){e=[];for(var i=0,r=t.length;i<r;i++)e[i]=T(t[i])}}else if(d[n]){if(!pt(t)){var o=t.constructor;if(o.from)e=o.from(t);else{e=new o(t.length);for(i=0,r=t.length;i<r;i++)e[i]=t[i]}}}else if(!p[n]&&!pt(t)&&!J(t))for(var a in e={},t)t.hasOwnProperty(a)&&a!==w&&(e[a]=T(t[a]));return e}function C(t,e,n){if(!q(e)||!q(t))return n?T(e):t;for(var i in e)if(e.hasOwnProperty(i)&&i!==w){var r=t[i],o=e[i];!q(o)||!q(r)||Y(o)||Y(r)||J(o)||J(r)||K(o)||K(r)||pt(o)||pt(r)?!n&&i in t||(t[i]=T(e[i])):C(r,o,n)}return t}function D(t,e){for(var n=t[0],i=1,r=t.length;i<r;i++)n=C(n,t[i],e);return n}function A(t,e){if(Object.assign)Object.assign(t,e);else for(var n in e)e.hasOwnProperty(n)&&n!==w&&(t[n]=e[n]);return t}function k(t,e,n){for(var i=G(e),r=0;r<i.length;r++){var o=i[r];(n?null!=e[o]:null==t[o])&&(t[o]=e[o])}return t}var L=h.createCanvas;function P(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var n=0,i=t.length;n<i;n++)if(t[n]===e)return n}return-1}function O(t,e){var n=t.prototype;function i(){}for(var r in i.prototype=e.prototype,t.prototype=new i,n)n.hasOwnProperty(r)&&(t.prototype[r]=n[r]);t.prototype.constructor=t,t.superClass=e}function R(t,e,n){if(t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,Object.getOwnPropertyNames)for(var i=Object.getOwnPropertyNames(e),r=0;r<i.length;r++){var o=i[r];"constructor"!==o&&(n?null!=e[o]:null==t[o])&&(t[o]=e[o])}else k(t,e,n)}function N(t){return!!t&&("string"!=typeof t&&"number"==typeof t.length)}function E(t,e,n){if(t&&e)if(t.forEach&&t.forEach===y)t.forEach(e,n);else if(t.length===+t.length)for(var i=0,r=t.length;i<r;i++)e.call(n,t[i],i,t);else for(var o in t)t.hasOwnProperty(o)&&e.call(n,t[o],o,t)}function z(t,e,n){if(!t)return[];if(!e)return at(t);if(t.map&&t.map===x)return t.map(e,n);for(var i=[],r=0,o=t.length;r<o;r++)i.push(e.call(n,t[r],r,t));return i}function V(t,e,n,i){if(t&&e){for(var r=0,o=t.length;r<o;r++)n=e.call(i,n,t[r],r,t);return n}}function B(t,e,n){if(!t)return[];if(!e)return at(t);if(t.filter&&t.filter===v)return t.filter(e,n);for(var i=[],r=0,o=t.length;r<o;r++)e.call(n,t[r],r,t)&&i.push(t[r]);return i}function F(t,e,n){if(t&&e)for(var i=0,r=t.length;i<r;i++)if(e.call(n,t[i],i,t))return t[i]}function G(t){if(!t)return[];if(Object.keys)return Object.keys(t);var e=[];for(var n in t)t.hasOwnProperty(n)&&e.push(n);return e}var W=b&&U(b.bind)?b.call.bind(b.bind):function(t,e){for(var n=[],i=2;i<arguments.length;i++)n[i-2]=arguments[i];return function(){return t.apply(e,n.concat(m.call(arguments)))}};function H(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];return function(){return t.apply(this,e.concat(m.call(arguments)))}}function Y(t){return Array.isArray?Array.isArray(t):"[object Array]"===f.call(t)}function U(t){return"function"==typeof t}function X(t){return"string"==typeof t}function Z(t){return"[object String]"===f.call(t)}function j(t){return"number"==typeof t}function q(t){var e=typeof t;return"function"===e||!!t&&"object"===e}function K(t){return!!p[f.call(t)]}function $(t){return!!d[f.call(t)]}function J(t){return"object"==typeof t&&"number"==typeof t.nodeType&&"object"==typeof t.ownerDocument}function Q(t){return null!=t.colorStops}function tt(t){return null!=t.image}function et(t){return"[object RegExp]"===f.call(t)}function nt(t){return t!=t}function it(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];for(var n=0,i=t.length;n<i;n++)if(null!=t[n])return t[n]}function rt(t,e){return null!=t?t:e}function ot(t,e,n){return null!=t?t:null!=e?e:n}function at(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];return m.apply(t,e)}function st(t){if("number"==typeof t)return[t,t,t,t];var e=t.length;return 2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t}function lt(t,e){if(!t)throw new Error(e)}function ut(t){return null==t?null:"function"==typeof t.trim?t.trim():t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}var ht="__ec_primitive__";function ct(t){t[ht]=!0}function pt(t){return t[ht]}var dt=function(){function t(e){this.data={};var n=Y(e);this.data={};var i=this;function r(t,e){n?i.set(t,e):i.set(e,t)}e instanceof t?e.each(r):e&&E(e,r)}return t.prototype.get=function(t){return this.data.hasOwnProperty(t)?this.data[t]:null},t.prototype.set=function(t,e){return this.data[t]=e},t.prototype.each=function(t,e){for(var n in this.data)this.data.hasOwnProperty(n)&&t.call(e,this.data[n],n)},t.prototype.keys=function(){return G(this.data)},t.prototype.removeKey=function(t){delete this.data[t]},t}();function ft(t){return new dt(t)}function gt(t,e){for(var n=new t.constructor(t.length+e.length),i=0;i<t.length;i++)n[i]=t[i];var r=t.length;for(i=0;i<e.length;i++)n[i+r]=e[i];return n}function yt(t,e){var n;if(Object.create)n=Object.create(t);else{var i=function(){};i.prototype=t,n=new i}return e&&A(n,e),n}function vt(t){var e=t.style;e.webkitUserSelect="none",e.userSelect="none",e.webkitTapHighlightColor="rgba(0,0,0,0)",e["-webkit-touch-callout"]="none"}function mt(t,e){return t.hasOwnProperty(e)}function xt(){}var _t=180/Math.PI,bt=Object.freeze({__proto__:null,guid:M,logError:I,clone:T,merge:C,mergeAll:D,extend:A,defaults:k,createCanvas:L,indexOf:P,inherits:O,mixin:R,isArrayLike:N,each:E,map:z,reduce:V,filter:B,find:F,keys:G,bind:W,curry:H,isArray:Y,isFunction:U,isString:X,isStringSafe:Z,isNumber:j,isObject:q,isBuiltInObject:K,isTypedArray:$,isDom:J,isGradientObject:Q,isImagePatternObject:tt,isRegExp:et,eqNaN:nt,retrieve:it,retrieve2:rt,retrieve3:ot,slice:at,normalizeCssArray:st,assert:lt,trim:ut,setAsPrimitive:ct,isPrimitive:pt,HashMap:dt,createHashMap:ft,concatArray:gt,createObject:yt,disableUserSelect:vt,hasOwn:mt,noop:xt,RADIAN_TO_DEGREE:_t});function wt(t,e){return null==t&&(t=0),null==e&&(e=0),[t,e]}function St(t,e){return t[0]=e[0],t[1]=e[1],t}function Mt(t){return[t[0],t[1]]}function It(t,e,n){return t[0]=e,t[1]=n,t}function Tt(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t}function Ct(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t}function Dt(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t}function At(t){return Math.sqrt(Lt(t))}var kt=At;function Lt(t){return t[0]*t[0]+t[1]*t[1]}var Pt=Lt;function Ot(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t}function Rt(t,e){var n=At(e);return 0===n?(t[0]=0,t[1]=0):(t[0]=e[0]/n,t[1]=e[1]/n),t}function Nt(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))}var Et=Nt;function zt(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])}var Vt=zt;function Bt(t,e,n,i){return t[0]=e[0]+i*(n[0]-e[0]),t[1]=e[1]+i*(n[1]-e[1]),t}function Ft(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[2]*r+n[4],t[1]=n[1]*i+n[3]*r+n[5],t}function Gt(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t}function Wt(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t}var Ht=Object.freeze({__proto__:null,create:wt,copy:St,clone:Mt,set:It,add:Tt,scaleAndAdd:Ct,sub:Dt,len:At,length:kt,lenSquare:Lt,lengthSquare:Pt,mul:function(t,e,n){return t[0]=e[0]*n[0],t[1]=e[1]*n[1],t},div:function(t,e,n){return t[0]=e[0]/n[0],t[1]=e[1]/n[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:Ot,normalize:Rt,distance:Nt,dist:Et,distanceSquare:zt,distSquare:Vt,negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:Bt,applyTransform:Ft,min:Gt,max:Wt}),Yt=function(t,e){this.target=t,this.topTarget=e&&e.topTarget},Ut=function(){function t(t){this.handler=t,t.on("mousedown",this._dragStart,this),t.on("mousemove",this._drag,this),t.on("mouseup",this._dragEnd,this)}return t.prototype._dragStart=function(t){for(var e=t.target;e&&!e.draggable;)e=e.parent||e.__hostTarget;e&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.handler.dispatchToElement(new Yt(e,t),"dragstart",t.event))},t.prototype._drag=function(t){var e=this._draggingTarget;if(e){var n=t.offsetX,i=t.offsetY,r=n-this._x,o=i-this._y;this._x=n,this._y=i,e.drift(r,o,t),this.handler.dispatchToElement(new Yt(e,t),"drag",t.event);var a=this.handler.findHover(n,i,e).target,s=this._dropTarget;this._dropTarget=a,e!==a&&(s&&a!==s&&this.handler.dispatchToElement(new Yt(s,t),"dragleave",t.event),a&&a!==s&&this.handler.dispatchToElement(new Yt(a,t),"dragenter",t.event))}},t.prototype._dragEnd=function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.handler.dispatchToElement(new Yt(e,t),"dragend",t.event),this._dropTarget&&this.handler.dispatchToElement(new Yt(this._dropTarget,t),"drop",t.event),this._draggingTarget=null,this._dropTarget=null},t}(),Xt=function(){function t(t){t&&(this._$eventProcessor=t)}return t.prototype.on=function(t,e,n,i){this._$handlers||(this._$handlers={});var r=this._$handlers;if("function"==typeof e&&(i=n,n=e,e=null),!n||!t)return this;var o=this._$eventProcessor;null!=e&&o&&o.normalizeQuery&&(e=o.normalizeQuery(e)),r[t]||(r[t]=[]);for(var a=0;a<r[t].length;a++)if(r[t][a].h===n)return this;var s={h:n,query:e,ctx:i||this,callAtLast:n.zrEventfulCallAtLast},l=r[t].length-1,u=r[t][l];return u&&u.callAtLast?r[t].splice(l,0,s):r[t].push(s),this},t.prototype.isSilent=function(t){var e=this._$handlers;return!e||!e[t]||!e[t].length},t.prototype.off=function(t,e){var n=this._$handlers;if(!n)return this;if(!t)return this._$handlers={},this;if(e){if(n[t]){for(var i=[],r=0,o=n[t].length;r<o;r++)n[t][r].h!==e&&i.push(n[t][r]);n[t]=i}n[t]&&0===n[t].length&&delete n[t]}else delete n[t];return this},t.prototype.trigger=function(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];if(!this._$handlers)return this;var i=this._$handlers[t],r=this._$eventProcessor;if(i)for(var o=e.length,a=i.length,s=0;s<a;s++){var l=i[s];if(!r||!r.filter||null==l.query||r.filter(t,l.query))switch(o){case 0:l.h.call(l.ctx);break;case 1:l.h.call(l.ctx,e[0]);break;case 2:l.h.call(l.ctx,e[0],e[1]);break;default:l.h.apply(l.ctx,e)}}return r&&r.afterTrigger&&r.afterTrigger(t),this},t.prototype.triggerWithContext=function(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];if(!this._$handlers)return this;var i=this._$handlers[t],r=this._$eventProcessor;if(i)for(var o=e.length,a=e[o-1],s=i.length,l=0;l<s;l++){var u=i[l];if(!r||!r.filter||null==u.query||r.filter(t,u.query))switch(o){case 0:u.h.call(a);break;case 1:u.h.call(a,e[0]);break;case 2:u.h.call(a,e[0],e[1]);break;default:u.h.apply(a,e.slice(1,o-1))}}return r&&r.afterTrigger&&r.afterTrigger(t),this},t}(),Zt=Math.log(2);function jt(t,e,n,i,r,o){var a=i+"-"+r,s=t.length;if(o.hasOwnProperty(a))return o[a];if(1===e){var l=Math.round(Math.log((1<<s)-1&~r)/Zt);return t[n][l]}for(var u=i|1<<n,h=n+1;i&1<<h;)h++;for(var c=0,p=0,d=0;p<s;p++){var f=1<<p;f&r||(c+=(d%2?-1:1)*t[n][p]*jt(t,e-1,h,u,r|f,o),d++)}return o[a]=c,c}function qt(t,e){var n=[[t[0],t[1],1,0,0,0,-e[0]*t[0],-e[0]*t[1]],[0,0,0,t[0],t[1],1,-e[1]*t[0],-e[1]*t[1]],[t[2],t[3],1,0,0,0,-e[2]*t[2],-e[2]*t[3]],[0,0,0,t[2],t[3],1,-e[3]*t[2],-e[3]*t[3]],[t[4],t[5],1,0,0,0,-e[4]*t[4],-e[4]*t[5]],[0,0,0,t[4],t[5],1,-e[5]*t[4],-e[5]*t[5]],[t[6],t[7],1,0,0,0,-e[6]*t[6],-e[6]*t[7]],[0,0,0,t[6],t[7],1,-e[7]*t[6],-e[7]*t[7]]],i={},r=jt(n,8,0,0,0,i);if(0!==r){for(var o=[],a=0;a<8;a++)for(var s=0;s<8;s++)null==o[s]&&(o[s]=0),o[s]+=((a+s)%2?-1:1)*jt(n,7,0===a?1:0,1<<a,1<<s,i)/r*e[a];return function(t,e,n){var i=e*o[6]+n*o[7]+1;t[0]=(e*o[0]+n*o[1]+o[2])/i,t[1]=(e*o[3]+n*o[4]+o[5])/i}}}var Kt=[];function $t(t,e,n,i,o){if(e.getBoundingClientRect&&r.domSupported&&!Jt(e)){var a=e.___zrEVENTSAVED||(e.___zrEVENTSAVED={}),s=function(t,e,n){for(var i=n?"invTrans":"trans",r=e[i],o=e.srcCoords,a=[],s=[],l=!0,u=0;u<4;u++){var h=t[u].getBoundingClientRect(),c=2*u,p=h.left,d=h.top;a.push(p,d),l=l&&o&&p===o[c]&&d===o[c+1],s.push(t[u].offsetLeft,t[u].offsetTop)}return l&&r?r:(e.srcCoords=a,e[i]=n?qt(s,a):qt(a,s))}(function(t,e){var n=e.markers;if(n)return n;n=e.markers=[];for(var i=["left","right"],r=["top","bottom"],o=0;o<4;o++){var a=document.createElement("div"),s=o%2,l=(o>>1)%2;a.style.cssText=["position: absolute","visibility: hidden","padding: 0","margin: 0","border-width: 0","user-select: none","width:0","height:0",i[s]+":0",r[l]+":0",i[1-s]+":auto",r[1-l]+":auto",""].join("!important;"),t.appendChild(a),n.push(a)}return n}(e,a),a,o);if(s)return s(t,n,i),!0}return!1}function Jt(t){return"CANVAS"===t.nodeName.toUpperCase()}var Qt=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,te=[],ee=r.browser.firefox&&+r.browser.version.split(".")[0]<39;function ne(t,e,n,i){return n=n||{},i?ie(t,e,n):ee&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):ie(t,e,n),n}function ie(t,e,n){if(r.domSupported&&t.getBoundingClientRect){var i=e.clientX,o=e.clientY;if(Jt(t)){var a=t.getBoundingClientRect();return n.zrX=i-a.left,void(n.zrY=o-a.top)}if($t(te,t,i,o))return n.zrX=te[0],void(n.zrY=te[1])}n.zrX=n.zrY=0}function re(t){return t||window.event}function oe(t,e,n){if(null!=(e=re(e)).zrX)return e;var i=e.type;if(i&&i.indexOf("touch")>=0){var r="touchend"!==i?e.targetTouches[0]:e.changedTouches[0];r&&ne(t,r,e,n)}else{ne(t,e,e,n);var o=function(t){var e=t.wheelDelta;if(e)return e;var n=t.deltaX,i=t.deltaY;if(null==n||null==i)return e;return 3*(0!==i?Math.abs(i):Math.abs(n))*(i>0?-1:i<0?1:n>0?-1:1)}(e);e.zrDelta=o?o/120:-(e.detail||0)/3}var a=e.button;return null==e.which&&void 0!==a&&Qt.test(e.type)&&(e.which=1&a?1:2&a?3:4&a?2:0),e}function ae(t,e,n,i){t.addEventListener(e,n,i)}var se=function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0};function le(t){return 2===t.which||3===t.which}var ue=function(){function t(){this._track=[]}return t.prototype.recognize=function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},t.prototype.clear=function(){return this._track.length=0,this},t.prototype._doTrack=function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},o=0,a=i.length;o<a;o++){var s=i[o],l=ne(n,s,{});r.points.push([l.zrX,l.zrY]),r.touches.push(s)}this._track.push(r)}},t.prototype._recognize=function(t){for(var e in ce)if(ce.hasOwnProperty(e)){var n=ce[e](this._track,t);if(n)return n}},t}();function he(t){var e=t[1][0]-t[0][0],n=t[1][1]-t[0][1];return Math.sqrt(e*e+n*n)}var ce={pinch:function(t,e){var n=t.length;if(n){var i,r=(t[n-1]||{}).points,o=(t[n-2]||{}).points||r;if(o&&o.length>1&&r&&r.length>1){var a=he(r)/he(o);!isFinite(a)&&(a=1),e.pinchScale=a;var s=[((i=r)[0][0]+i[1][0])/2,(i[0][1]+i[1][1])/2];return e.pinchX=s[0],e.pinchY=s[1],{type:"pinch",target:t[0].target,event:e}}}}},pe="silent";function de(){se(this.event)}var fe=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.handler=null,e}return n(e,t),e.prototype.dispose=function(){},e.prototype.setCursor=function(){},e}(Xt),ge=function(t,e){this.x=t,this.y=e},ye=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],ve=function(t){function e(e,n,i,r){var o=t.call(this)||this;return o._hovered=new ge(0,0),o.storage=e,o.painter=n,o.painterRoot=r,i=i||new fe,o.proxy=null,o.setHandlerProxy(i),o._draggingMgr=new Ut(o),o}return n(e,t),e.prototype.setHandlerProxy=function(t){this.proxy&&this.proxy.dispose(),t&&(E(ye,(function(e){t.on&&t.on(e,this[e],this)}),this),t.handler=this),this.proxy=t},e.prototype.mousemove=function(t){var e=t.zrX,n=t.zrY,i=xe(this,e,n),r=this._hovered,o=r.target;o&&!o.__zr&&(o=(r=this.findHover(r.x,r.y)).target);var a=this._hovered=i?new ge(e,n):this.findHover(e,n),s=a.target,l=this.proxy;l.setCursor&&l.setCursor(s?s.cursor:"default"),o&&s!==o&&this.dispatchToElement(r,"mouseout",t),this.dispatchToElement(a,"mousemove",t),s&&s!==o&&this.dispatchToElement(a,"mouseover",t)},e.prototype.mouseout=function(t){var e=t.zrEventControl;"only_globalout"!==e&&this.dispatchToElement(this._hovered,"mouseout",t),"no_globalout"!==e&&this.trigger("globalout",{type:"globalout",event:t})},e.prototype.resize=function(){this._hovered=new ge(0,0)},e.prototype.dispatch=function(t,e){var n=this[t];n&&n.call(this,e)},e.prototype.dispose=function(){this.proxy.dispose(),this.storage=null,this.proxy=null,this.painter=null},e.prototype.setCursorStyle=function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},e.prototype.dispatchToElement=function(t,e,n){var i=(t=t||{}).target;if(!i||!i.silent){for(var r="on"+e,o=function(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch,which:n.which,stop:de}}(e,t,n);i&&(i[r]&&(o.cancelBubble=!!i[r].call(i,o)),i.trigger(e,o),i=i.__hostTarget?i.__hostTarget:i.parent,!o.cancelBubble););o.cancelBubble||(this.trigger(e,o),this.painter&&this.painter.eachOtherLayer&&this.painter.eachOtherLayer((function(t){"function"==typeof t[r]&&t[r].call(t,o),t.trigger&&t.trigger(e,o)})))}},e.prototype.findHover=function(t,e,n){for(var i=this.storage.getDisplayList(),r=new ge(t,e),o=i.length-1;o>=0;o--){var a=void 0;if(i[o]!==n&&!i[o].ignore&&(a=me(i[o],t,e))&&(!r.topTarget&&(r.topTarget=i[o]),a!==pe)){r.target=i[o];break}}return r},e.prototype.processGesture=function(t,e){this._gestureMgr||(this._gestureMgr=new ue);var n=this._gestureMgr;"start"===e&&n.clear();var i=n.recognize(t,this.findHover(t.zrX,t.zrY,null).target,this.proxy.dom);if("end"===e&&n.clear(),i){var r=i.type;t.gestureEvent=r;var o=new ge;o.target=i.target,this.dispatchToElement(o,r,i.event)}},e}(Xt);function me(t,e,n){if(t[t.rectHover?"rectContain":"contain"](e,n)){for(var i=t,r=void 0,o=!1;i;){if(i.ignoreClip&&(o=!0),!o){var a=i.getClipPath();if(a&&!a.contain(e,n))return!1;i.silent&&(r=!0)}var s=i.__hostTarget;i=s||i.parent}return!r||pe}return!1}function xe(t,e,n){var i=t.painter;return e<0||e>i.getWidth()||n<0||n>i.getHeight()}E(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],(function(t){ve.prototype[t]=function(e){var n,i,r=e.zrX,o=e.zrY,a=xe(this,r,o);if("mouseup"===t&&a||(i=(n=this.findHover(r,o)).target),"mousedown"===t)this._downEl=i,this._downPoint=[e.zrX,e.zrY],this._upEl=i;else if("mouseup"===t)this._upEl=i;else if("click"===t){if(this._downEl!==this._upEl||!this._downPoint||Et(this._downPoint,[e.zrX,e.zrY])>4)return;this._downPoint=null}this.dispatchToElement(n,t,e)}}));function _e(t,e,n,i){var r=e+1;if(r===n)return 1;if(i(t[r++],t[e])<0){for(;r<n&&i(t[r],t[r-1])<0;)r++;!function(t,e,n){n--;for(;e<n;){var i=t[e];t[e++]=t[n],t[n--]=i}}(t,e,r)}else for(;r<n&&i(t[r],t[r-1])>=0;)r++;return r-e}function be(t,e,n,i,r){for(i===e&&i++;i<n;i++){for(var o,a=t[i],s=e,l=i;s<l;)r(a,t[o=s+l>>>1])<0?l=o:s=o+1;var u=i-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;u>0;)t[s+u]=t[s+u-1],u--}t[s]=a}}function we(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])>0){for(s=i-r;l<s&&o(t,e[n+r+l])>0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}else{for(s=r+1;l<s&&o(t,e[n+r-l])<=0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s);var u=a;a=r-l,l=r-u}for(a++;a<l;){var h=a+(l-a>>>1);o(t,e[n+h])>0?a=h+1:l=h}return l}function Se(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])<0){for(s=r+1;l<s&&o(t,e[n+r-l])<0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s);var u=a;a=r-l,l=r-u}else{for(s=i-r;l<s&&o(t,e[n+r+l])>=0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}for(a++;a<l;){var h=a+(l-a>>>1);o(t,e[n+h])<0?l=h:a=h+1}return l}function Me(t,e){var n,i,r=7,o=0;t.length;var a=[];function s(s){var l=n[s],u=i[s],h=n[s+1],c=i[s+1];i[s]=u+c,s===o-3&&(n[s+1]=n[s+2],i[s+1]=i[s+2]),o--;var p=Se(t[h],t,l,u,0,e);l+=p,0!==(u-=p)&&0!==(c=we(t[l+u-1],t,h,c,c-1,e))&&(u<=c?function(n,i,o,s){var l=0;for(l=0;l<i;l++)a[l]=t[n+l];var u=0,h=o,c=n;if(t[c++]=t[h++],0==--s){for(l=0;l<i;l++)t[c+l]=a[u+l];return}if(1===i){for(l=0;l<s;l++)t[c+l]=t[h+l];return void(t[c+s]=a[u])}var p,d,f,g=r;for(;;){p=0,d=0,f=!1;do{if(e(t[h],a[u])<0){if(t[c++]=t[h++],d++,p=0,0==--s){f=!0;break}}else if(t[c++]=a[u++],p++,d=0,1==--i){f=!0;break}}while((p|d)<g);if(f)break;do{if(0!==(p=Se(t[h],a,u,i,0,e))){for(l=0;l<p;l++)t[c+l]=a[u+l];if(c+=p,u+=p,(i-=p)<=1){f=!0;break}}if(t[c++]=t[h++],0==--s){f=!0;break}if(0!==(d=we(a[u],t,h,s,0,e))){for(l=0;l<d;l++)t[c+l]=t[h+l];if(c+=d,h+=d,0===(s-=d)){f=!0;break}}if(t[c++]=a[u++],1==--i){f=!0;break}g--}while(p>=7||d>=7);if(f)break;g<0&&(g=0),g+=2}if((r=g)<1&&(r=1),1===i){for(l=0;l<s;l++)t[c+l]=t[h+l];t[c+s]=a[u]}else{if(0===i)throw new Error;for(l=0;l<i;l++)t[c+l]=a[u+l]}}(l,u,h,c):function(n,i,o,s){var l=0;for(l=0;l<s;l++)a[l]=t[o+l];var u=n+i-1,h=s-1,c=o+s-1,p=0,d=0;if(t[c--]=t[u--],0==--i){for(p=c-(s-1),l=0;l<s;l++)t[p+l]=a[l];return}if(1===s){for(d=(c-=i)+1,p=(u-=i)+1,l=i-1;l>=0;l--)t[d+l]=t[p+l];return void(t[c]=a[h])}var f=r;for(;;){var g=0,y=0,v=!1;do{if(e(a[h],t[u])<0){if(t[c--]=t[u--],g++,y=0,0==--i){v=!0;break}}else if(t[c--]=a[h--],y++,g=0,1==--s){v=!0;break}}while((g|y)<f);if(v)break;do{if(0!==(g=i-Se(a[h],t,n,i,i-1,e))){for(i-=g,d=(c-=g)+1,p=(u-=g)+1,l=g-1;l>=0;l--)t[d+l]=t[p+l];if(0===i){v=!0;break}}if(t[c--]=a[h--],1==--s){v=!0;break}if(0!==(y=s-we(t[u],a,0,s,s-1,e))){for(s-=y,d=(c-=y)+1,p=(h-=y)+1,l=0;l<y;l++)t[d+l]=a[p+l];if(s<=1){v=!0;break}}if(t[c--]=t[u--],0==--i){v=!0;break}f--}while(g>=7||y>=7);if(v)break;f<0&&(f=0),f+=2}(r=f)<1&&(r=1);if(1===s){for(d=(c-=i)+1,p=(u-=i)+1,l=i-1;l>=0;l--)t[d+l]=t[p+l];t[c]=a[h]}else{if(0===s)throw new Error;for(p=c-(s-1),l=0;l<s;l++)t[p+l]=a[l]}}(l,u,h,c))}return n=[],i=[],{mergeRuns:function(){for(;o>1;){var t=o-2;if(t>=1&&i[t-1]<=i[t]+i[t+1]||t>=2&&i[t-2]<=i[t]+i[t-1])i[t-1]<i[t+1]&&t--;else if(i[t]>i[t+1])break;s(t)}},forceMergeRuns:function(){for(;o>1;){var t=o-2;t>0&&i[t-1]<i[t+1]&&t--,s(t)}},pushRun:function(t,e){n[o]=t,i[o]=e,o+=1}}}function Ie(t,e,n,i){n||(n=0),i||(i=t.length);var r=i-n;if(!(r<2)){var o=0;if(r<32)be(t,n,i,n+(o=_e(t,n,i,e)),e);else{var a=Me(t,e),s=function(t){for(var e=0;t>=32;)e|=1&t,t>>=1;return t+e}(r);do{if((o=_e(t,n,i,e))<s){var l=r;l>s&&(l=s),be(t,n,n+l,n+o,e),o=l}a.pushRun(n,o),a.mergeRuns(),r-=o,n+=o}while(0!==r);a.forceMergeRuns()}}}var Te=!1;function Ce(){Te||(Te=!0,console.warn("z / z2 / zlevel of displayable is invalid, which may cause unexpected errors"))}function De(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var Ae=function(){function t(){this._roots=[],this._displayList=[],this._displayListLen=0,this.displayableSortFunc=De}return t.prototype.traverse=function(t,e){for(var n=0;n<this._roots.length;n++)this._roots[n].traverse(t,e)},t.prototype.getDisplayList=function(t,e){e=e||!1;var n=this._displayList;return!t&&n.length||this.updateDisplayList(e),n},t.prototype.updateDisplayList=function(t){this._displayListLen=0;for(var e=this._roots,n=this._displayList,i=0,r=e.length;i<r;i++)this._updateAndAddDisplayable(e[i],null,t);n.length=this._displayListLen,Ie(n,De)},t.prototype._updateAndAddDisplayable=function(t,e,n){if(!t.ignore||n){t.beforeUpdate(),t.update(),t.afterUpdate();var i=t.getClipPath();if(t.ignoreClip)e=null;else if(i){e=e?e.slice():[];for(var r=i,o=t;r;)r.parent=o,r.updateTransform(),e.push(r),o=r,r=r.getClipPath()}if(t.childrenRef){for(var a=t.childrenRef(),s=0;s<a.length;s++){var l=a[s];t.__dirty&&(l.__dirty|=1),this._updateAndAddDisplayable(l,e,n)}t.__dirty=0}else{var u=t;e&&e.length?u.__clipPaths=e:u.__clipPaths&&u.__clipPaths.length>0&&(u.__clipPaths=[]),isNaN(u.z)&&(Ce(),u.z=0),isNaN(u.z2)&&(Ce(),u.z2=0),isNaN(u.zlevel)&&(Ce(),u.zlevel=0),this._displayList[this._displayListLen++]=u}var h=t.getDecalElement&&t.getDecalElement();h&&this._updateAndAddDisplayable(h,e,n);var c=t.getTextGuideLine();c&&this._updateAndAddDisplayable(c,e,n);var p=t.getTextContent();p&&this._updateAndAddDisplayable(p,e,n)}},t.prototype.addRoot=function(t){t.__zr&&t.__zr.storage===this||this._roots.push(t)},t.prototype.delRoot=function(t){if(t instanceof Array)for(var e=0,n=t.length;e<n;e++)this.delRoot(t[e]);else{var i=P(this._roots,t);i>=0&&this._roots.splice(i,1)}},t.prototype.delAllRoots=function(){this._roots=[],this._displayList=[],this._displayListLen=0},t.prototype.getRoots=function(){return this._roots},t.prototype.dispose=function(){this._displayList=null,this._roots=null},t}(),ke=r.hasGlobalWindow&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){return setTimeout(t,16)},Le={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4))},elasticOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=i*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((e+1)*t-e)*.5:.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-Le.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*Le.bounceIn(2*t):.5*Le.bounceOut(2*t-1)+.5}},Pe=Math.pow,Oe=Math.sqrt,Re=1e-8,Ne=1e-4,Ee=Oe(3),ze=1/3,Ve=wt(),Be=wt(),Fe=wt();function Ge(t){return t>-1e-8&&t<Re}function We(t){return t>Re||t<-1e-8}function He(t,e,n,i,r){var o=1-r;return o*o*(o*t+3*r*e)+r*r*(r*i+3*o*n)}function Ye(t,e,n,i,r){var o=1-r;return 3*(((e-t)*o+2*(n-e)*r)*o+(i-n)*r*r)}function Ue(t,e,n,i,r,o){var a=i+3*(e-n)-t,s=3*(n-2*e+t),l=3*(e-t),u=t-r,h=s*s-3*a*l,c=s*l-9*a*u,p=l*l-3*s*u,d=0;if(Ge(h)&&Ge(c)){if(Ge(s))o[0]=0;else(M=-l/s)>=0&&M<=1&&(o[d++]=M)}else{var f=c*c-4*h*p;if(Ge(f)){var g=c/h,y=-g/2;(M=-s/a+g)>=0&&M<=1&&(o[d++]=M),y>=0&&y<=1&&(o[d++]=y)}else if(f>0){var v=Oe(f),m=h*s+1.5*a*(-c+v),x=h*s+1.5*a*(-c-v);(M=(-s-((m=m<0?-Pe(-m,ze):Pe(m,ze))+(x=x<0?-Pe(-x,ze):Pe(x,ze))))/(3*a))>=0&&M<=1&&(o[d++]=M)}else{var _=(2*h*s-3*a*c)/(2*Oe(h*h*h)),b=Math.acos(_)/3,w=Oe(h),S=Math.cos(b),M=(-s-2*w*S)/(3*a),I=(y=(-s+w*(S+Ee*Math.sin(b)))/(3*a),(-s+w*(S-Ee*Math.sin(b)))/(3*a));M>=0&&M<=1&&(o[d++]=M),y>=0&&y<=1&&(o[d++]=y),I>=0&&I<=1&&(o[d++]=I)}}return d}function Xe(t,e,n,i,r){var o=6*n-12*e+6*t,a=9*e+3*i-3*t-9*n,s=3*e-3*t,l=0;if(Ge(a)){if(We(o))(h=-s/o)>=0&&h<=1&&(r[l++]=h)}else{var u=o*o-4*a*s;if(Ge(u))r[0]=-o/(2*a);else if(u>0){var h,c=Oe(u),p=(-o-c)/(2*a);(h=(-o+c)/(2*a))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}function Ze(t,e,n,i,r,o){var a=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,u=(s-a)*r+a,h=(l-s)*r+s,c=(h-u)*r+u;o[0]=t,o[1]=a,o[2]=u,o[3]=c,o[4]=c,o[5]=h,o[6]=l,o[7]=i}function je(t,e,n,i,r,o,a,s,l,u,h){var c,p,d,f,g,y=.005,v=1/0;Ve[0]=l,Ve[1]=u;for(var m=0;m<1;m+=.05)Be[0]=He(t,n,r,a,m),Be[1]=He(e,i,o,s,m),(f=Vt(Ve,Be))<v&&(c=m,v=f);v=1/0;for(var x=0;x<32&&!(y<Ne);x++)p=c-y,d=c+y,Be[0]=He(t,n,r,a,p),Be[1]=He(e,i,o,s,p),f=Vt(Be,Ve),p>=0&&f<v?(c=p,v=f):(Fe[0]=He(t,n,r,a,d),Fe[1]=He(e,i,o,s,d),g=Vt(Fe,Ve),d<=1&&g<v?(c=d,v=g):y*=.5);return h&&(h[0]=He(t,n,r,a,c),h[1]=He(e,i,o,s,c)),Oe(v)}function qe(t,e,n,i,r,o,a,s,l){for(var u=t,h=e,c=0,p=1/l,d=1;d<=l;d++){var f=d*p,g=He(t,n,r,a,f),y=He(e,i,o,s,f),v=g-u,m=y-h;c+=Math.sqrt(v*v+m*m),u=g,h=y}return c}function Ke(t,e,n,i){var r=1-i;return r*(r*t+2*i*e)+i*i*n}function $e(t,e,n,i){return 2*((1-i)*(e-t)+i*(n-e))}function Je(t,e,n){var i=t+n-2*e;return 0===i?.5:(t-e)/i}function Qe(t,e,n,i,r){var o=(e-t)*i+t,a=(n-e)*i+e,s=(a-o)*i+o;r[0]=t,r[1]=o,r[2]=s,r[3]=s,r[4]=a,r[5]=n}function tn(t,e,n,i,r,o,a,s,l){var u,h=.005,c=1/0;Ve[0]=a,Ve[1]=s;for(var p=0;p<1;p+=.05){Be[0]=Ke(t,n,r,p),Be[1]=Ke(e,i,o,p),(y=Vt(Ve,Be))<c&&(u=p,c=y)}c=1/0;for(var d=0;d<32&&!(h<Ne);d++){var f=u-h,g=u+h;Be[0]=Ke(t,n,r,f),Be[1]=Ke(e,i,o,f);var y=Vt(Be,Ve);if(f>=0&&y<c)u=f,c=y;else{Fe[0]=Ke(t,n,r,g),Fe[1]=Ke(e,i,o,g);var v=Vt(Fe,Ve);g<=1&&v<c?(u=g,c=v):h*=.5}}return l&&(l[0]=Ke(t,n,r,u),l[1]=Ke(e,i,o,u)),Oe(c)}function en(t,e,n,i,r,o,a){for(var s=t,l=e,u=0,h=1/a,c=1;c<=a;c++){var p=c*h,d=Ke(t,n,r,p),f=Ke(e,i,o,p),g=d-s,y=f-l;u+=Math.sqrt(g*g+y*y),s=d,l=f}return u}var nn=/cubic-bezier\(([0-9,\.e ]+)\)/;function rn(t){var e=t&&nn.exec(t);if(e){var n=e[1].split(","),i=+ut(n[0]),r=+ut(n[1]),o=+ut(n[2]),a=+ut(n[3]);if(isNaN(i+r+o+a))return;var s=[];return function(t){return t<=0?0:t>=1?1:Ue(0,i,o,1,t,s)&&He(0,r,a,1,s[0])}}}var on=function(){function t(t){this._inited=!1,this._startTime=0,this._pausedTime=0,this._paused=!1,this._life=t.life||1e3,this._delay=t.delay||0,this.loop=t.loop||!1,this.onframe=t.onframe||xt,this.ondestroy=t.ondestroy||xt,this.onrestart=t.onrestart||xt,t.easing&&this.setEasing(t.easing)}return t.prototype.step=function(t,e){if(this._inited||(this._startTime=t+this._delay,this._inited=!0),!this._paused){var n=this._life,i=t-this._startTime-this._pausedTime,r=i/n;r<0&&(r=0),r=Math.min(r,1);var o=this.easingFunc,a=o?o(r):r;if(this.onframe(a),1===r){if(!this.loop)return!0;var s=i%n;this._startTime=t-s,this._pausedTime=0,this.onrestart()}return!1}this._pausedTime+=e},t.prototype.pause=function(){this._paused=!0},t.prototype.resume=function(){this._paused=!1},t.prototype.setEasing=function(t){this.easing=t,this.easingFunc=U(t)?t:Le[t]||rn(t)},t}(),an=function(t){this.value=t},sn=function(){function t(){this._len=0}return t.prototype.insert=function(t){var e=new an(t);return this.insertEntry(e),e},t.prototype.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},t.prototype.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},t.prototype.len=function(){return this._len},t.prototype.clear=function(){this.head=this.tail=null,this._len=0},t}(),ln=function(){function t(t){this._list=new sn,this._maxSize=10,this._map={},this._maxSize=t}return t.prototype.put=function(t,e){var n=this._list,i=this._map,r=null;if(null==i[t]){var o=n.len(),a=this._lastRemovedEntry;if(o>=this._maxSize&&o>0){var s=n.head;n.remove(s),delete i[s.key],r=s.value,this._lastRemovedEntry=s}a?a.value=e:a=new an(e),a.key=t,n.insertEntry(a),i[t]=a}return r},t.prototype.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},t.prototype.clear=function(){this._list.clear(),this._map={}},t.prototype.len=function(){return this._list.len()},t}(),un={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};function hn(t){return(t=Math.round(t))<0?0:t>255?255:t}function cn(t){return t<0?0:t>1?1:t}function pn(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?hn(parseFloat(e)/100*255):hn(parseInt(e,10))}function dn(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?cn(parseFloat(e)/100):cn(parseFloat(e))}function fn(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function gn(t,e,n){return t+(e-t)*n}function yn(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function vn(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}var mn=new ln(20),xn=null;function _n(t,e){xn&&vn(xn,e),xn=mn.put(t,xn||e.slice())}function bn(t,e){if(t){e=e||[];var n=mn.get(t);if(n)return vn(e,n);var i=(t+="").replace(/ /g,"").toLowerCase();if(i in un)return vn(e,un[i]),_n(t,e),e;var r,o=i.length;if("#"===i.charAt(0))return 4===o||5===o?(r=parseInt(i.slice(1,4),16))>=0&&r<=4095?(yn(e,(3840&r)>>4|(3840&r)>>8,240&r|(240&r)>>4,15&r|(15&r)<<4,5===o?parseInt(i.slice(4),16)/15:1),_n(t,e),e):void yn(e,0,0,0,1):7===o||9===o?(r=parseInt(i.slice(1,7),16))>=0&&r<=16777215?(yn(e,(16711680&r)>>16,(65280&r)>>8,255&r,9===o?parseInt(i.slice(7),16)/255:1),_n(t,e),e):void yn(e,0,0,0,1):void 0;var a=i.indexOf("("),s=i.indexOf(")");if(-1!==a&&s+1===o){var l=i.substr(0,a),u=i.substr(a+1,s-(a+1)).split(","),h=1;switch(l){case"rgba":if(4!==u.length)return 3===u.length?yn(e,+u[0],+u[1],+u[2],1):yn(e,0,0,0,1);h=dn(u.pop());case"rgb":return 3!==u.length?void yn(e,0,0,0,1):(yn(e,pn(u[0]),pn(u[1]),pn(u[2]),h),_n(t,e),e);case"hsla":return 4!==u.length?void yn(e,0,0,0,1):(u[3]=dn(u[3]),wn(u,e),_n(t,e),e);case"hsl":return 3!==u.length?void yn(e,0,0,0,1):(wn(u,e),_n(t,e),e);default:return}}yn(e,0,0,0,1)}}function wn(t,e){var n=(parseFloat(t[0])%360+360)%360/360,i=dn(t[1]),r=dn(t[2]),o=r<=.5?r*(i+1):r+i-r*i,a=2*r-o;return yn(e=e||[],hn(255*fn(a,o,n+1/3)),hn(255*fn(a,o,n)),hn(255*fn(a,o,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function Sn(t,e){var n=bn(t);if(n){for(var i=0;i<3;i++)n[i]=e<0?n[i]*(1-e)|0:(255-n[i])*e+n[i]|0,n[i]>255?n[i]=255:n[i]<0&&(n[i]=0);return kn(n,4===n.length?"rgba":"rgb")}}function Mn(t,e,n){if(e&&e.length&&t>=0&&t<=1){n=n||[];var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=e[r],s=e[o],l=i-r;return n[0]=hn(gn(a[0],s[0],l)),n[1]=hn(gn(a[1],s[1],l)),n[2]=hn(gn(a[2],s[2],l)),n[3]=cn(gn(a[3],s[3],l)),n}}var In=Mn;function Tn(t,e,n){if(e&&e.length&&t>=0&&t<=1){var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=bn(e[r]),s=bn(e[o]),l=i-r,u=kn([hn(gn(a[0],s[0],l)),hn(gn(a[1],s[1],l)),hn(gn(a[2],s[2],l)),cn(gn(a[3],s[3],l))],"rgba");return n?{color:u,leftIndex:r,rightIndex:o,value:i}:u}}var Cn=Tn;function Dn(t,e,n,i){var r=bn(t);if(t)return r=function(t){if(t){var e,n,i=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(i,r,o),s=Math.max(i,r,o),l=s-a,u=(s+a)/2;if(0===l)e=0,n=0;else{n=u<.5?l/(s+a):l/(2-s-a);var h=((s-i)/6+l/2)/l,c=((s-r)/6+l/2)/l,p=((s-o)/6+l/2)/l;i===s?e=p-c:r===s?e=1/3+h-p:o===s&&(e=2/3+c-h),e<0&&(e+=1),e>1&&(e-=1)}var d=[360*e,n,u];return null!=t[3]&&d.push(t[3]),d}}(r),null!=e&&(r[0]=function(t){return(t=Math.round(t))<0?0:t>360?360:t}(e)),null!=n&&(r[1]=dn(n)),null!=i&&(r[2]=dn(i)),kn(wn(r),"rgba")}function An(t,e){var n=bn(t);if(n&&null!=e)return n[3]=cn(e),kn(n,"rgba")}function kn(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}function Ln(t,e){var n=bn(t);return n?(.299*n[0]+.587*n[1]+.114*n[2])*n[3]/255+(1-n[3])*e:0}var Pn=Object.freeze({__proto__:null,parse:bn,lift:Sn,toHex:function(t){var e=bn(t);if(e)return((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1)},fastLerp:Mn,fastMapToColor:In,lerp:Tn,mapToColor:Cn,modifyHSL:Dn,modifyAlpha:An,stringify:kn,lum:Ln,random:function(){return kn([Math.round(255*Math.random()),Math.round(255*Math.random()),Math.round(255*Math.random())],"rgb")}}),On=Math.round;function Rn(t){var e;if(t&&"transparent"!==t){if("string"==typeof t&&t.indexOf("rgba")>-1){var n=bn(t);n&&(t="rgb("+n[0]+","+n[1]+","+n[2]+")",e=n[3])}}else t="none";return{color:t,opacity:null==e?1:e}}var Nn=1e-4;function En(t){return t<Nn&&t>-1e-4}function zn(t){return On(1e3*t)/1e3}function Vn(t){return On(1e4*t)/1e4}var Bn={left:"start",right:"end",center:"middle",middle:"middle"};function Fn(t){return t&&!!t.image}function Gn(t){return"linear"===t.type}function Wn(t){return"radial"===t.type}function Hn(t){return"url(#"+t+")"}function Yn(t){var e=t.getGlobalScale(),n=Math.max(e[0],e[1]);return Math.max(Math.ceil(Math.log(n)/Math.log(10)),1)}function Un(t){var e=t.x||0,n=t.y||0,i=(t.rotation||0)*_t,r=rt(t.scaleX,1),o=rt(t.scaleY,1),a=t.skewX||0,s=t.skewY||0,l=[];return(e||n)&&l.push("translate("+e+"px,"+n+"px)"),i&&l.push("rotate("+i+")"),1===r&&1===o||l.push("scale("+r+","+o+")"),(a||s)&&l.push("skew("+On(a*_t)+"deg, "+On(s*_t)+"deg)"),l.join(" ")}var Xn=r.hasGlobalWindow&&U(window.btoa)?function(t){return window.btoa(unescape(t))}:"undefined"!=typeof Buffer?function(t){return Buffer.from(t).toString("base64")}:function(t){return null},Zn=Array.prototype.slice;function jn(t,e,n){return(e-t)*n+t}function qn(t,e,n,i){for(var r=e.length,o=0;o<r;o++)t[o]=jn(e[o],n[o],i);return t}function Kn(t,e,n,i){for(var r=e.length,o=0;o<r;o++)t[o]=e[o]+n[o]*i;return t}function $n(t,e,n,i){for(var r=e.length,o=r&&e[0].length,a=0;a<r;a++){t[a]||(t[a]=[]);for(var s=0;s<o;s++)t[a][s]=e[a][s]+n[a][s]*i}return t}function Jn(t,e){for(var n=t.length,i=e.length,r=n>i?e:t,o=Math.min(n,i),a=r[o-1]||{color:[0,0,0,0],offset:0},s=o;s<Math.max(n,i);s++)r.push({offset:a.offset,color:a.color.slice()})}function Qn(t,e,n){var i=t,r=e;if(i.push&&r.push){var o=i.length,a=r.length;if(o!==a)if(o>a)i.length=a;else for(var s=o;s<a;s++)i.push(1===n?r[s]:Zn.call(r[s]));var l=i[0]&&i[0].length;for(s=0;s<i.length;s++)if(1===n)isNaN(i[s])&&(i[s]=r[s]);else for(var u=0;u<l;u++)isNaN(i[s][u])&&(i[s][u]=r[s][u])}}function ti(t){if(N(t)){var e=t.length;if(N(t[0])){for(var n=[],i=0;i<e;i++)n.push(Zn.call(t[i]));return n}return Zn.call(t)}return t}function ei(t){return t[0]=Math.floor(t[0])||0,t[1]=Math.floor(t[1])||0,t[2]=Math.floor(t[2])||0,t[3]=null==t[3]?1:t[3],"rgba("+t.join(",")+")"}function ni(t){return 4===t||5===t}function ii(t){return 1===t||2===t}var ri=[0,0,0,0],oi=function(){function t(t){this.keyframes=[],this.discrete=!1,this._invalid=!1,this._needsSort=!1,this._lastFr=0,this._lastFrP=0,this.propName=t}return t.prototype.isFinished=function(){return this._finished},t.prototype.setFinished=function(){this._finished=!0,this._additiveTrack&&this._additiveTrack.setFinished()},t.prototype.needsAnimate=function(){return this.keyframes.length>=1},t.prototype.getAdditiveTrack=function(){return this._additiveTrack},t.prototype.addKeyframe=function(t,e,n){this._needsSort=!0;var i=this.keyframes,r=i.length,o=!1,a=6,s=e;if(N(e)){var l=function(t){return N(t&&t[0])?2:1}(e);a=l,(1===l&&!j(e[0])||2===l&&!j(e[0][0]))&&(o=!0)}else if(j(e)&&!nt(e))a=0;else if(X(e))if(isNaN(+e)){var u=bn(e);u&&(s=u,a=3)}else a=0;else if(Q(e)){var h=A({},s);h.colorStops=z(e.colorStops,(function(t){return{offset:t.offset,color:bn(t.color)}})),Gn(e)?a=4:Wn(e)&&(a=5),s=h}0===r?this.valType=a:a===this.valType&&6!==a||(o=!0),this.discrete=this.discrete||o;var c={time:t,value:s,rawValue:e,percent:0};return n&&(c.easing=n,c.easingFunc=U(n)?n:Le[n]||rn(n)),i.push(c),c},t.prototype.prepare=function(t,e){var n=this.keyframes;this._needsSort&&n.sort((function(t,e){return t.time-e.time}));for(var i=this.valType,r=n.length,o=n[r-1],a=this.discrete,s=ii(i),l=ni(i),u=0;u<r;u++){var h=n[u],c=h.value,p=o.value;h.percent=h.time/t,a||(s&&u!==r-1?Qn(c,p,i):l&&Jn(c.colorStops,p.colorStops))}if(!a&&5!==i&&e&&this.needsAnimate()&&e.needsAnimate()&&i===e.valType&&!e._finished){this._additiveTrack=e;var d=n[0].value;for(u=0;u<r;u++)0===i?n[u].additiveValue=n[u].value-d:3===i?n[u].additiveValue=Kn([],n[u].value,d,-1):ii(i)&&(n[u].additiveValue=1===i?Kn([],n[u].value,d,-1):$n([],n[u].value,d,-1))}},t.prototype.step=function(t,e){if(!this._finished){this._additiveTrack&&this._additiveTrack._finished&&(this._additiveTrack=null);var n,i,r,o=null!=this._additiveTrack,a=o?"additiveValue":"value",s=this.valType,l=this.keyframes,u=l.length,h=this.propName,c=3===s,p=this._lastFr,d=Math.min;if(1===u)i=r=l[0];else{if(e<0)n=0;else if(e<this._lastFrP){for(n=d(p+1,u-1);n>=0&&!(l[n].percent<=e);n--);n=d(n,u-2)}else{for(n=p;n<u&&!(l[n].percent>e);n++);n=d(n-1,u-2)}r=l[n+1],i=l[n]}if(i&&r){this._lastFr=n,this._lastFrP=e;var f=r.percent-i.percent,g=0===f?1:d((e-i.percent)/f,1);r.easingFunc&&(g=r.easingFunc(g));var y=o?this._additiveValue:c?ri:t[h];if(!ii(s)&&!c||y||(y=this._additiveValue=[]),this.discrete)t[h]=g<1?i.rawValue:r.rawValue;else if(ii(s))1===s?qn(y,i[a],r[a],g):function(t,e,n,i){for(var r=e.length,o=r&&e[0].length,a=0;a<r;a++){t[a]||(t[a]=[]);for(var s=0;s<o;s++)t[a][s]=jn(e[a][s],n[a][s],i)}}(y,i[a],r[a],g);else if(ni(s)){var v=i[a],m=r[a],x=4===s;t[h]={type:x?"linear":"radial",x:jn(v.x,m.x,g),y:jn(v.y,m.y,g),colorStops:z(v.colorStops,(function(t,e){var n=m.colorStops[e];return{offset:jn(t.offset,n.offset,g),color:ei(qn([],t.color,n.color,g))}})),global:m.global},x?(t[h].x2=jn(v.x2,m.x2,g),t[h].y2=jn(v.y2,m.y2,g)):t[h].r=jn(v.r,m.r,g)}else if(c)qn(y,i[a],r[a],g),o||(t[h]=ei(y));else{var _=jn(i[a],r[a],g);o?this._additiveValue=_:t[h]=_}o&&this._addToTarget(t)}}},t.prototype._addToTarget=function(t){var e=this.valType,n=this.propName,i=this._additiveValue;0===e?t[n]=t[n]+i:3===e?(bn(t[n],ri),Kn(ri,ri,i,1),t[n]=ei(ri)):1===e?Kn(t[n],t[n],i,1):2===e&&$n(t[n],t[n],i,1)},t}(),ai=function(){function t(t,e,n,i){this._tracks={},this._trackKeys=[],this._maxTime=0,this._started=0,this._clip=null,this._target=t,this._loop=e,e&&i?I("Can' use additive animation on looped animation."):(this._additiveAnimators=i,this._allowDiscrete=n)}return t.prototype.getMaxTime=function(){return this._maxTime},t.prototype.getDelay=function(){return this._delay},t.prototype.getLoop=function(){return this._loop},t.prototype.getTarget=function(){return this._target},t.prototype.changeTarget=function(t){this._target=t},t.prototype.when=function(t,e,n){return this.whenWithKeys(t,e,G(e),n)},t.prototype.whenWithKeys=function(t,e,n,i){for(var r=this._tracks,o=0;o<n.length;o++){var a=n[o],s=r[a];if(!s){s=r[a]=new oi(a);var l=void 0,u=this._getAdditiveTrack(a);if(u){var h=u.keyframes,c=h[h.length-1];l=c&&c.value,3===u.valType&&l&&(l=ei(l))}else l=this._target[a];if(null==l)continue;t>0&&s.addKeyframe(0,ti(l),i),this._trackKeys.push(a)}s.addKeyframe(t,ti(e[a]),i)}return this._maxTime=Math.max(this._maxTime,t),this},t.prototype.pause=function(){this._clip.pause(),this._paused=!0},t.prototype.resume=function(){this._clip.resume(),this._paused=!1},t.prototype.isPaused=function(){return!!this._paused},t.prototype.duration=function(t){return this._maxTime=t,this._force=!0,this},t.prototype._doneCallback=function(){this._setTracksFinished(),this._clip=null;var t=this._doneCbs;if(t)for(var e=t.length,n=0;n<e;n++)t[n].call(this)},t.prototype._abortedCallback=function(){this._setTracksFinished();var t=this.animation,e=this._abortedCbs;if(t&&t.removeClip(this._clip),this._clip=null,e)for(var n=0;n<e.length;n++)e[n].call(this)},t.prototype._setTracksFinished=function(){for(var t=this._tracks,e=this._trackKeys,n=0;n<e.length;n++)t[e[n]].setFinished()},t.prototype._getAdditiveTrack=function(t){var e,n=this._additiveAnimators;if(n)for(var i=0;i<n.length;i++){var r=n[i].getTrack(t);r&&(e=r)}return e},t.prototype.start=function(t){if(!(this._started>0)){this._started=1;for(var e=this,n=[],i=this._maxTime||0,r=0;r<this._trackKeys.length;r++){var o=this._trackKeys[r],a=this._tracks[o],s=this._getAdditiveTrack(o),l=a.keyframes,u=l.length;if(a.prepare(i,s),a.needsAnimate())if(!this._allowDiscrete&&a.discrete){var h=l[u-1];h&&(e._target[a.propName]=h.rawValue),a.setFinished()}else n.push(a)}if(n.length||this._force){var c=new on({life:i,loop:this._loop,delay:this._delay||0,onframe:function(t){e._started=2;var i=e._additiveAnimators;if(i){for(var r=!1,o=0;o<i.length;o++)if(i[o]._clip){r=!0;break}r||(e._additiveAnimators=null)}for(o=0;o<n.length;o++)n[o].step(e._target,t);var a=e._onframeCbs;if(a)for(o=0;o<a.length;o++)a[o](e._target,t)},ondestroy:function(){e._doneCallback()}});this._clip=c,this.animation&&this.animation.addClip(c),t&&c.setEasing(t)}else this._doneCallback();return this}},t.prototype.stop=function(t){if(this._clip){var e=this._clip;t&&e.onframe(1),this._abortedCallback()}},t.prototype.delay=function(t){return this._delay=t,this},t.prototype.during=function(t){return t&&(this._onframeCbs||(this._onframeCbs=[]),this._onframeCbs.push(t)),this},t.prototype.done=function(t){return t&&(this._doneCbs||(this._doneCbs=[]),this._doneCbs.push(t)),this},t.prototype.aborted=function(t){return t&&(this._abortedCbs||(this._abortedCbs=[]),this._abortedCbs.push(t)),this},t.prototype.getClip=function(){return this._clip},t.prototype.getTrack=function(t){return this._tracks[t]},t.prototype.getTracks=function(){var t=this;return z(this._trackKeys,(function(e){return t._tracks[e]}))},t.prototype.stopTracks=function(t,e){if(!t.length||!this._clip)return!0;for(var n=this._tracks,i=this._trackKeys,r=0;r<t.length;r++){var o=n[t[r]];o&&!o.isFinished()&&(e?o.step(this._target,1):1===this._started&&o.step(this._target,0),o.setFinished())}var a=!0;for(r=0;r<i.length;r++)if(!n[i[r]].isFinished()){a=!1;break}return a&&this._abortedCallback(),a},t.prototype.saveTo=function(t,e,n){if(t){e=e||this._trackKeys;for(var i=0;i<e.length;i++){var r=e[i],o=this._tracks[r];if(o&&!o.isFinished()){var a=o.keyframes,s=a[n?0:a.length-1];s&&(t[r]=ti(s.rawValue))}}}},t.prototype.__changeFinalValue=function(t,e){e=e||G(t);for(var n=0;n<e.length;n++){var i=e[n],r=this._tracks[i];if(r){var o=r.keyframes;if(o.length>1){var a=o.pop();r.addKeyframe(a.time,t[i]),r.prepare(this._maxTime,r.getAdditiveTrack())}}}},t}();function si(){return(new Date).getTime()}var li,ui,hi=function(t){function e(e){var n=t.call(this)||this;return n._running=!1,n._time=0,n._pausedTime=0,n._pauseStart=0,n._paused=!1,e=e||{},n.stage=e.stage||{},n}return n(e,t),e.prototype.addClip=function(t){t.animation&&this.removeClip(t),this._head?(this._tail.next=t,t.prev=this._tail,t.next=null,this._tail=t):this._head=this._tail=t,t.animation=this},e.prototype.addAnimator=function(t){t.animation=this;var e=t.getClip();e&&this.addClip(e)},e.prototype.removeClip=function(t){if(t.animation){var e=t.prev,n=t.next;e?e.next=n:this._head=n,n?n.prev=e:this._tail=e,t.next=t.prev=t.animation=null}},e.prototype.removeAnimator=function(t){var e=t.getClip();e&&this.removeClip(e),t.animation=null},e.prototype.update=function(t){for(var e=si()-this._pausedTime,n=e-this._time,i=this._head;i;){var r=i.next;i.step(e,n)?(i.ondestroy(),this.removeClip(i),i=r):i=r}this._time=e,t||(this.trigger("frame",n),this.stage.update&&this.stage.update())},e.prototype._startLoop=function(){var t=this;this._running=!0,ke((function e(){t._running&&(ke(e),!t._paused&&t.update())}))},e.prototype.start=function(){this._running||(this._time=si(),this._pausedTime=0,this._startLoop())},e.prototype.stop=function(){this._running=!1},e.prototype.pause=function(){this._paused||(this._pauseStart=si(),this._paused=!0)},e.prototype.resume=function(){this._paused&&(this._pausedTime+=si()-this._pauseStart,this._paused=!1)},e.prototype.clear=function(){for(var t=this._head;t;){var e=t.next;t.prev=t.next=t.animation=null,t=e}this._head=this._tail=null},e.prototype.isFinished=function(){return null==this._head},e.prototype.animate=function(t,e){e=e||{},this.start();var n=new ai(t,e.loop);return this.addAnimator(n),n},e}(Xt),ci=r.domSupported,pi=(ui={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},{mouse:li=["click","dblclick","mousewheel","wheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],touch:["touchstart","touchend","touchmove"],pointer:z(li,(function(t){var e=t.replace("mouse","pointer");return ui.hasOwnProperty(e)?e:t}))}),di=["mousemove","mouseup"],fi=["pointermove","pointerup"],gi=!1;function yi(t){var e=t.pointerType;return"pen"===e||"touch"===e}function vi(t){t&&(t.zrByTouch=!0)}function mi(t,e){for(var n=e,i=!1;n&&9!==n.nodeType&&!(i=n.domBelongToZr||n!==e&&n===t.painterRoot);)n=n.parentNode;return i}var xi=function(t,e){this.stopPropagation=xt,this.stopImmediatePropagation=xt,this.preventDefault=xt,this.type=e.type,this.target=this.currentTarget=t.dom,this.pointerType=e.pointerType,this.clientX=e.clientX,this.clientY=e.clientY},_i={mousedown:function(t){t=oe(this.dom,t),this.__mayPointerCapture=[t.zrX,t.zrY],this.trigger("mousedown",t)},mousemove:function(t){t=oe(this.dom,t);var e=this.__mayPointerCapture;!e||t.zrX===e[0]&&t.zrY===e[1]||this.__togglePointerCapture(!0),this.trigger("mousemove",t)},mouseup:function(t){t=oe(this.dom,t),this.__togglePointerCapture(!1),this.trigger("mouseup",t)},mouseout:function(t){mi(this,(t=oe(this.dom,t)).toElement||t.relatedTarget)||(this.__pointerCapturing&&(t.zrEventControl="no_globalout"),this.trigger("mouseout",t))},wheel:function(t){gi=!0,t=oe(this.dom,t),this.trigger("mousewheel",t)},mousewheel:function(t){gi||(t=oe(this.dom,t),this.trigger("mousewheel",t))},touchstart:function(t){vi(t=oe(this.dom,t)),this.__lastTouchMoment=new Date,this.handler.processGesture(t,"start"),_i.mousemove.call(this,t),_i.mousedown.call(this,t)},touchmove:function(t){vi(t=oe(this.dom,t)),this.handler.processGesture(t,"change"),_i.mousemove.call(this,t)},touchend:function(t){vi(t=oe(this.dom,t)),this.handler.processGesture(t,"end"),_i.mouseup.call(this,t),+new Date-+this.__lastTouchMoment<300&&_i.click.call(this,t)},pointerdown:function(t){_i.mousedown.call(this,t)},pointermove:function(t){yi(t)||_i.mousemove.call(this,t)},pointerup:function(t){_i.mouseup.call(this,t)},pointerout:function(t){yi(t)||_i.mouseout.call(this,t)}};E(["click","dblclick","contextmenu"],(function(t){_i[t]=function(e){e=oe(this.dom,e),this.trigger(t,e)}}));var bi={pointermove:function(t){yi(t)||bi.mousemove.call(this,t)},pointerup:function(t){bi.mouseup.call(this,t)},mousemove:function(t){this.trigger("mousemove",t)},mouseup:function(t){var e=this.__pointerCapturing;this.__togglePointerCapture(!1),this.trigger("mouseup",t),e&&(t.zrEventControl="only_globalout",this.trigger("mouseout",t))}};function wi(t,e){var n=e.domHandlers;r.pointerEventsSupported?E(pi.pointer,(function(i){Mi(e,i,(function(e){n[i].call(t,e)}))})):(r.touchEventsSupported&&E(pi.touch,(function(i){Mi(e,i,(function(r){n[i].call(t,r),function(t){t.touching=!0,null!=t.touchTimer&&(clearTimeout(t.touchTimer),t.touchTimer=null),t.touchTimer=setTimeout((function(){t.touching=!1,t.touchTimer=null}),700)}(e)}))})),E(pi.mouse,(function(i){Mi(e,i,(function(r){r=re(r),e.touching||n[i].call(t,r)}))})))}function Si(t,e){function n(n){Mi(e,n,(function(i){i=re(i),mi(t,i.target)||(i=function(t,e){return oe(t.dom,new xi(t,e),!0)}(t,i),e.domHandlers[n].call(t,i))}),{capture:!0})}r.pointerEventsSupported?E(fi,n):r.touchEventsSupported||E(di,n)}function Mi(t,e,n,i){t.mounted[e]=n,t.listenerOpts[e]=i,ae(t.domTarget,e,n,i)}function Ii(t){var e,n,i,r,o=t.mounted;for(var a in o)o.hasOwnProperty(a)&&(e=t.domTarget,n=a,i=o[a],r=t.listenerOpts[a],e.removeEventListener(n,i,r));t.mounted={}}var Ti=function(t,e){this.mounted={},this.listenerOpts={},this.touching=!1,this.domTarget=t,this.domHandlers=e},Ci=function(t){function e(e,n){var i=t.call(this)||this;return i.__pointerCapturing=!1,i.dom=e,i.painterRoot=n,i._localHandlerScope=new Ti(e,_i),ci&&(i._globalHandlerScope=new Ti(document,bi)),wi(i,i._localHandlerScope),i}return n(e,t),e.prototype.dispose=function(){Ii(this._localHandlerScope),ci&&Ii(this._globalHandlerScope)},e.prototype.setCursor=function(t){this.dom.style&&(this.dom.style.cursor=t||"default")},e.prototype.__togglePointerCapture=function(t){if(this.__mayPointerCapture=null,ci&&+this.__pointerCapturing^+t){this.__pointerCapturing=t;var e=this._globalHandlerScope;t?Si(this,e):Ii(e)}},e}(Xt),Di=1;r.hasGlobalWindow&&(Di=Math.max(window.devicePixelRatio||window.screen&&window.screen.deviceXDPI/window.screen.logicalXDPI||1,1));var Ai=Di,ki="#333",Li="#ccc";function Pi(){return[1,0,0,1,0,0]}function Oi(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function Ri(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t}function Ni(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],o=e[0]*n[2]+e[2]*n[3],a=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=o,t[3]=a,t[4]=s,t[5]=l,t}function Ei(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t}function zi(t,e,n){var i=e[0],r=e[2],o=e[4],a=e[1],s=e[3],l=e[5],u=Math.sin(n),h=Math.cos(n);return t[0]=i*h+a*u,t[1]=-i*u+a*h,t[2]=r*h+s*u,t[3]=-r*u+h*s,t[4]=h*o+u*l,t[5]=h*l-u*o,t}function Vi(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t}function Bi(t,e){var n=e[0],i=e[2],r=e[4],o=e[1],a=e[3],s=e[5],l=n*a-o*i;return l?(l=1/l,t[0]=a*l,t[1]=-o*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-a*r)*l,t[5]=(o*r-n*s)*l,t):null}function Fi(t){var e=[1,0,0,1,0,0];return Ri(e,t),e}var Gi=Object.freeze({__proto__:null,create:Pi,identity:Oi,copy:Ri,mul:Ni,translate:Ei,rotate:zi,scale:Vi,invert:Bi,clone:Fi}),Wi=Oi,Hi=5e-5;function Yi(t){return t>Hi||t<-5e-5}var Ui=[],Xi=[],Zi=[1,0,0,1,0,0],ji=Math.abs,qi=function(){function t(){}return t.prototype.getLocalTransform=function(e){return t.getLocalTransform(this,e)},t.prototype.setPosition=function(t){this.x=t[0],this.y=t[1]},t.prototype.setScale=function(t){this.scaleX=t[0],this.scaleY=t[1]},t.prototype.setSkew=function(t){this.skewX=t[0],this.skewY=t[1]},t.prototype.setOrigin=function(t){this.originX=t[0],this.originY=t[1]},t.prototype.needLocalTransform=function(){return Yi(this.rotation)||Yi(this.x)||Yi(this.y)||Yi(this.scaleX-1)||Yi(this.scaleY-1)||Yi(this.skewX)||Yi(this.skewY)},t.prototype.updateTransform=function(){var t=this.parent&&this.parent.transform,e=this.needLocalTransform(),n=this.transform;e||t?(n=n||[1,0,0,1,0,0],e?this.getLocalTransform(n):Wi(n),t&&(e?Ni(n,t,n):Ri(n,t)),this.transform=n,this._resolveGlobalScaleRatio(n)):n&&Wi(n)},t.prototype._resolveGlobalScaleRatio=function(t){var e=this.globalScaleRatio;if(null!=e&&1!==e){this.getGlobalScale(Ui);var n=Ui[0]<0?-1:1,i=Ui[1]<0?-1:1,r=((Ui[0]-n)*e+n)/Ui[0]||0,o=((Ui[1]-i)*e+i)/Ui[1]||0;t[0]*=r,t[1]*=r,t[2]*=o,t[3]*=o}this.invTransform=this.invTransform||[1,0,0,1,0,0],Bi(this.invTransform,t)},t.prototype.getComputedTransform=function(){for(var t=this,e=[];t;)e.push(t),t=t.parent;for(;t=e.pop();)t.updateTransform();return this.transform},t.prototype.setLocalTransform=function(t){if(t){var e=t[0]*t[0]+t[1]*t[1],n=t[2]*t[2]+t[3]*t[3],i=Math.atan2(t[1],t[0]),r=Math.PI/2+i-Math.atan2(t[3],t[2]);n=Math.sqrt(n)*Math.cos(r),e=Math.sqrt(e),this.skewX=r,this.skewY=0,this.rotation=-i,this.x=+t[4],this.y=+t[5],this.scaleX=e,this.scaleY=n,this.originX=0,this.originY=0}},t.prototype.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(Ni(Xi,t.invTransform,e),e=Xi);var n=this.originX,i=this.originY;(n||i)&&(Zi[4]=n,Zi[5]=i,Ni(Xi,e,Zi),Xi[4]-=n,Xi[5]-=i,e=Xi),this.setLocalTransform(e)}},t.prototype.getGlobalScale=function(t){var e=this.transform;return t=t||[],e?(t[0]=Math.sqrt(e[0]*e[0]+e[1]*e[1]),t[1]=Math.sqrt(e[2]*e[2]+e[3]*e[3]),e[0]<0&&(t[0]=-t[0]),e[3]<0&&(t[1]=-t[1]),t):(t[0]=1,t[1]=1,t)},t.prototype.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&Ft(n,n,i),n},t.prototype.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&Ft(n,n,i),n},t.prototype.getLineScale=function(){var t=this.transform;return t&&ji(t[0]-1)>1e-10&&ji(t[3]-1)>1e-10?Math.sqrt(ji(t[0]*t[3]-t[2]*t[1])):1},t.prototype.copyTransform=function(t){$i(this,t)},t.getLocalTransform=function(t,e){e=e||[];var n=t.originX||0,i=t.originY||0,r=t.scaleX,o=t.scaleY,a=t.anchorX,s=t.anchorY,l=t.rotation||0,u=t.x,h=t.y,c=t.skewX?Math.tan(t.skewX):0,p=t.skewY?Math.tan(-t.skewY):0;if(n||i||a||s){var d=n+a,f=i+s;e[4]=-d*r-c*f*o,e[5]=-f*o-p*d*r}else e[4]=e[5]=0;return e[0]=r,e[3]=o,e[1]=p*r,e[2]=c*o,l&&zi(e,e,l),e[4]+=n+u,e[5]+=i+h,e},t.initDefaultProps=function(){var e=t.prototype;e.scaleX=e.scaleY=e.globalScaleRatio=1,e.x=e.y=e.originX=e.originY=e.skewX=e.skewY=e.rotation=e.anchorX=e.anchorY=0}(),t}(),Ki=["x","y","originX","originY","anchorX","anchorY","rotation","scaleX","scaleY","skewX","skewY"];function $i(t,e){for(var n=0;n<Ki.length;n++){var i=Ki[n];t[i]=e[i]}}var Ji=function(){function t(t,e){this.x=t||0,this.y=e||0}return t.prototype.copy=function(t){return this.x=t.x,this.y=t.y,this},t.prototype.clone=function(){return new t(this.x,this.y)},t.prototype.set=function(t,e){return this.x=t,this.y=e,this},t.prototype.equal=function(t){return t.x===this.x&&t.y===this.y},t.prototype.add=function(t){return this.x+=t.x,this.y+=t.y,this},t.prototype.scale=function(t){this.x*=t,this.y*=t},t.prototype.scaleAndAdd=function(t,e){this.x+=t.x*e,this.y+=t.y*e},t.prototype.sub=function(t){return this.x-=t.x,this.y-=t.y,this},t.prototype.dot=function(t){return this.x*t.x+this.y*t.y},t.prototype.len=function(){return Math.sqrt(this.x*this.x+this.y*this.y)},t.prototype.lenSquare=function(){return this.x*this.x+this.y*this.y},t.prototype.normalize=function(){var t=this.len();return this.x/=t,this.y/=t,this},t.prototype.distance=function(t){var e=this.x-t.x,n=this.y-t.y;return Math.sqrt(e*e+n*n)},t.prototype.distanceSquare=function(t){var e=this.x-t.x,n=this.y-t.y;return e*e+n*n},t.prototype.negate=function(){return this.x=-this.x,this.y=-this.y,this},t.prototype.transform=function(t){if(t){var e=this.x,n=this.y;return this.x=t[0]*e+t[2]*n+t[4],this.y=t[1]*e+t[3]*n+t[5],this}},t.prototype.toArray=function(t){return t[0]=this.x,t[1]=this.y,t},t.prototype.fromArray=function(t){this.x=t[0],this.y=t[1]},t.set=function(t,e,n){t.x=e,t.y=n},t.copy=function(t,e){t.x=e.x,t.y=e.y},t.len=function(t){return Math.sqrt(t.x*t.x+t.y*t.y)},t.lenSquare=function(t){return t.x*t.x+t.y*t.y},t.dot=function(t,e){return t.x*e.x+t.y*e.y},t.add=function(t,e,n){t.x=e.x+n.x,t.y=e.y+n.y},t.sub=function(t,e,n){t.x=e.x-n.x,t.y=e.y-n.y},t.scale=function(t,e,n){t.x=e.x*n,t.y=e.y*n},t.scaleAndAdd=function(t,e,n,i){t.x=e.x+n.x*i,t.y=e.y+n.y*i},t.lerp=function(t,e,n,i){var r=1-i;t.x=r*e.x+i*n.x,t.y=r*e.y+i*n.y},t}(),Qi=Math.min,tr=Math.max,er=new Ji,nr=new Ji,ir=new Ji,rr=new Ji,or=new Ji,ar=new Ji,sr=function(){function t(t,e,n,i){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i),this.x=t,this.y=e,this.width=n,this.height=i}return t.prototype.union=function(t){var e=Qi(t.x,this.x),n=Qi(t.y,this.y);isFinite(this.x)&&isFinite(this.width)?this.width=tr(t.x+t.width,this.x+this.width)-e:this.width=t.width,isFinite(this.y)&&isFinite(this.height)?this.height=tr(t.y+t.height,this.y+this.height)-n:this.height=t.height,this.x=e,this.y=n},t.prototype.applyTransform=function(e){t.applyTransform(this,this,e)},t.prototype.calculateTransform=function(t){var e=this,n=t.width/e.width,i=t.height/e.height,r=[1,0,0,1,0,0];return Ei(r,r,[-e.x,-e.y]),Vi(r,r,[n,i]),Ei(r,r,[t.x,t.y]),r},t.prototype.intersect=function(e,n){if(!e)return!1;e instanceof t||(e=t.create(e));var i=this,r=i.x,o=i.x+i.width,a=i.y,s=i.y+i.height,l=e.x,u=e.x+e.width,h=e.y,c=e.y+e.height,p=!(o<l||u<r||s<h||c<a);if(n){var d=1/0,f=0,g=Math.abs(o-l),y=Math.abs(u-r),v=Math.abs(s-h),m=Math.abs(c-a),x=Math.min(g,y),_=Math.min(v,m);o<l||u<r?x>f&&(f=x,g<y?Ji.set(ar,-g,0):Ji.set(ar,y,0)):x<d&&(d=x,g<y?Ji.set(or,g,0):Ji.set(or,-y,0)),s<h||c<a?_>f&&(f=_,v<m?Ji.set(ar,0,-v):Ji.set(ar,0,m)):x<d&&(d=x,v<m?Ji.set(or,0,v):Ji.set(or,0,-m))}return n&&Ji.copy(n,p?or:ar),p},t.prototype.contain=function(t,e){var n=this;return t>=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height)},t.prototype.copy=function(e){t.copy(this,e)},t.prototype.plain=function(){return{x:this.x,y:this.y,width:this.width,height:this.height}},t.prototype.isFinite=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)},t.prototype.isZero=function(){return 0===this.width||0===this.height},t.create=function(e){return new t(e.x,e.y,e.width,e.height)},t.copy=function(t,e){t.x=e.x,t.y=e.y,t.width=e.width,t.height=e.height},t.applyTransform=function(e,n,i){if(i){if(i[1]<1e-5&&i[1]>-1e-5&&i[2]<1e-5&&i[2]>-1e-5){var r=i[0],o=i[3],a=i[4],s=i[5];return e.x=n.x*r+a,e.y=n.y*o+s,e.width=n.width*r,e.height=n.height*o,e.width<0&&(e.x+=e.width,e.width=-e.width),void(e.height<0&&(e.y+=e.height,e.height=-e.height))}er.x=ir.x=n.x,er.y=rr.y=n.y,nr.x=rr.x=n.x+n.width,nr.y=ir.y=n.y+n.height,er.transform(i),rr.transform(i),nr.transform(i),ir.transform(i),e.x=Qi(er.x,nr.x,ir.x,rr.x),e.y=Qi(er.y,nr.y,ir.y,rr.y);var l=tr(er.x,nr.x,ir.x,rr.x),u=tr(er.y,nr.y,ir.y,rr.y);e.width=l-e.x,e.height=u-e.y}else e!==n&&t.copy(e,n)},t}(),lr={};function ur(t,e){var n=lr[e=e||a];n||(n=lr[e]=new ln(500));var i=n.get(t);return null==i&&(i=h.measureText(t,e).width,n.put(t,i)),i}function hr(t,e,n,i){var r=ur(t,e),o=fr(e),a=pr(0,r,n),s=dr(0,o,i);return new sr(a,s,r,o)}function cr(t,e,n,i){var r=((t||"")+"").split("\n");if(1===r.length)return hr(r[0],e,n,i);for(var o=new sr(0,0,0,0),a=0;a<r.length;a++){var s=hr(r[a],e,n,i);0===a?o.copy(s):o.union(s)}return o}function pr(t,e,n){return"right"===n?t-=e:"center"===n&&(t-=e/2),t}function dr(t,e,n){return"middle"===n?t-=e/2:"bottom"===n&&(t-=e),t}function fr(t){return ur("国",t)}function gr(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}function yr(t,e,n){var i=e.position||"inside",r=null!=e.distance?e.distance:5,o=n.height,a=n.width,s=o/2,l=n.x,u=n.y,h="left",c="top";if(i instanceof Array)l+=gr(i[0],n.width),u+=gr(i[1],n.height),h=null,c=null;else switch(i){case"left":l-=r,u+=s,h="right",c="middle";break;case"right":l+=r+a,u+=s,c="middle";break;case"top":l+=a/2,u-=r,h="center",c="bottom";break;case"bottom":l+=a/2,u+=o+r,h="center";break;case"inside":l+=a/2,u+=s,h="center",c="middle";break;case"insideLeft":l+=r,u+=s,c="middle";break;case"insideRight":l+=a-r,u+=s,h="right",c="middle";break;case"insideTop":l+=a/2,u+=r,h="center";break;case"insideBottom":l+=a/2,u+=o-r,h="center",c="bottom";break;case"insideTopLeft":l+=r,u+=r;break;case"insideTopRight":l+=a-r,u+=r,h="right";break;case"insideBottomLeft":l+=r,u+=o-r,c="bottom";break;case"insideBottomRight":l+=a-r,u+=o-r,h="right",c="bottom"}return(t=t||{}).x=l,t.y=u,t.align=h,t.verticalAlign=c,t}var vr="__zr_normal__",mr=Ki.concat(["ignore"]),xr=V(Ki,(function(t,e){return t[e]=!0,t}),{ignore:!1}),_r={},br=new sr(0,0,0,0),wr=function(){function t(t){this.id=M(),this.animators=[],this.currentStates=[],this.states={},this._init(t)}return t.prototype._init=function(t){this.attr(t)},t.prototype.drift=function(t,e,n){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.markRedraw()},t.prototype.beforeUpdate=function(){},t.prototype.afterUpdate=function(){},t.prototype.update=function(){this.updateTransform(),this.__dirty&&this.updateInnerText()},t.prototype.updateInnerText=function(t){var e=this._textContent;if(e&&(!e.ignore||t)){this.textConfig||(this.textConfig={});var n=this.textConfig,i=n.local,r=e.innerTransformable,o=void 0,a=void 0,s=!1;r.parent=i?this:null;var l=!1;if(r.copyTransform(e),null!=n.position){var u=br;n.layoutRect?u.copy(n.layoutRect):u.copy(this.getBoundingRect()),i||u.applyTransform(this.transform),this.calculateTextPosition?this.calculateTextPosition(_r,n,u):yr(_r,n,u),r.x=_r.x,r.y=_r.y,o=_r.align,a=_r.verticalAlign;var h=n.origin;if(h&&null!=n.rotation){var c=void 0,p=void 0;"center"===h?(c=.5*u.width,p=.5*u.height):(c=gr(h[0],u.width),p=gr(h[1],u.height)),l=!0,r.originX=-r.x+c+(i?0:u.x),r.originY=-r.y+p+(i?0:u.y)}}null!=n.rotation&&(r.rotation=n.rotation);var d=n.offset;d&&(r.x+=d[0],r.y+=d[1],l||(r.originX=-d[0],r.originY=-d[1]));var f=null==n.inside?"string"==typeof n.position&&n.position.indexOf("inside")>=0:n.inside,g=this._innerTextDefaultStyle||(this._innerTextDefaultStyle={}),y=void 0,v=void 0,m=void 0;f&&this.canBeInsideText()?(y=n.insideFill,v=n.insideStroke,null!=y&&"auto"!==y||(y=this.getInsideTextFill()),null!=v&&"auto"!==v||(v=this.getInsideTextStroke(y),m=!0)):(y=n.outsideFill,v=n.outsideStroke,null!=y&&"auto"!==y||(y=this.getOutsideFill()),null!=v&&"auto"!==v||(v=this.getOutsideStroke(y),m=!0)),(y=y||"#000")===g.fill&&v===g.stroke&&m===g.autoStroke&&o===g.align&&a===g.verticalAlign||(s=!0,g.fill=y,g.stroke=v,g.autoStroke=m,g.align=o,g.verticalAlign=a,e.setDefaultTextStyle(g)),e.__dirty|=1,s&&e.dirtyStyle(!0)}},t.prototype.canBeInsideText=function(){return!0},t.prototype.getInsideTextFill=function(){return"#fff"},t.prototype.getInsideTextStroke=function(t){return"#000"},t.prototype.getOutsideFill=function(){return this.__zr&&this.__zr.isDarkMode()?Li:ki},t.prototype.getOutsideStroke=function(t){var e=this.__zr&&this.__zr.getBackgroundColor(),n="string"==typeof e&&bn(e);n||(n=[255,255,255,1]);for(var i=n[3],r=this.__zr.isDarkMode(),o=0;o<3;o++)n[o]=n[o]*i+(r?0:255)*(1-i);return n[3]=1,kn(n,"rgba")},t.prototype.traverse=function(t,e){},t.prototype.attrKV=function(t,e){"textConfig"===t?this.setTextConfig(e):"textContent"===t?this.setTextContent(e):"clipPath"===t?this.setClipPath(e):"extra"===t?(this.extra=this.extra||{},A(this.extra,e)):this[t]=e},t.prototype.hide=function(){this.ignore=!0,this.markRedraw()},t.prototype.show=function(){this.ignore=!1,this.markRedraw()},t.prototype.attr=function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(q(t))for(var n=G(t),i=0;i<n.length;i++){var r=n[i];this.attrKV(r,t[r])}return this.markRedraw(),this},t.prototype.saveCurrentToNormalState=function(t){this._innerSaveToNormal(t);for(var e=this._normalState,n=0;n<this.animators.length;n++){var i=this.animators[n],r=i.__fromStateTransition;if(!(i.getLoop()||r&&r!==vr)){var o=i.targetName,a=o?e[o]:e;i.saveTo(a)}}},t.prototype._innerSaveToNormal=function(t){var e=this._normalState;e||(e=this._normalState={}),t.textConfig&&!e.textConfig&&(e.textConfig=this.textConfig),this._savePrimaryToNormal(t,e,mr)},t.prototype._savePrimaryToNormal=function(t,e,n){for(var i=0;i<n.length;i++){var r=n[i];null==t[r]||r in e||(e[r]=this[r])}},t.prototype.hasState=function(){return this.currentStates.length>0},t.prototype.getState=function(t){return this.states[t]},t.prototype.ensureState=function(t){var e=this.states;return e[t]||(e[t]={}),e[t]},t.prototype.clearStates=function(t){this.useState(vr,!1,t)},t.prototype.useState=function(t,e,n,i){var r=t===vr;if(this.hasState()||!r){var o=this.currentStates,a=this.stateTransition;if(!(P(o,t)>=0)||!e&&1!==o.length){var s;if(this.stateProxy&&!r&&(s=this.stateProxy(t)),s||(s=this.states&&this.states[t]),s||r){r||this.saveCurrentToNormalState(s);var l=!!(s&&s.hoverLayer||i);l&&this._toggleHoverLayerFlag(!0),this._applyStateObj(t,s,this._normalState,e,!n&&!this.__inHover&&a&&a.duration>0,a);var u=this._textContent,h=this._textGuide;return u&&u.useState(t,e,n,l),h&&h.useState(t,e,n,l),r?(this.currentStates=[],this._normalState={}):e?this.currentStates.push(t):this.currentStates=[t],this._updateAnimationTargets(),this.markRedraw(),!l&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=-2),s}I("State "+t+" not exists.")}}},t.prototype.useStates=function(t,e,n){if(t.length){var i=[],r=this.currentStates,o=t.length,a=o===r.length;if(a)for(var s=0;s<o;s++)if(t[s]!==r[s]){a=!1;break}if(a)return;for(s=0;s<o;s++){var l=t[s],u=void 0;this.stateProxy&&(u=this.stateProxy(l,t)),u||(u=this.states[l]),u&&i.push(u)}var h=i[o-1],c=!!(h&&h.hoverLayer||n);c&&this._toggleHoverLayerFlag(!0);var p=this._mergeStates(i),d=this.stateTransition;this.saveCurrentToNormalState(p),this._applyStateObj(t.join(","),p,this._normalState,!1,!e&&!this.__inHover&&d&&d.duration>0,d);var f=this._textContent,g=this._textGuide;f&&f.useStates(t,e,c),g&&g.useStates(t,e,c),this._updateAnimationTargets(),this.currentStates=t.slice(),this.markRedraw(),!c&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=-2)}else this.clearStates()},t.prototype._updateAnimationTargets=function(){for(var t=0;t<this.animators.length;t++){var e=this.animators[t];e.targetName&&e.changeTarget(this[e.targetName])}},t.prototype.removeState=function(t){var e=P(this.currentStates,t);if(e>=0){var n=this.currentStates.slice();n.splice(e,1),this.useStates(n)}},t.prototype.replaceState=function(t,e,n){var i=this.currentStates.slice(),r=P(i,t),o=P(i,e)>=0;r>=0?o?i.splice(r,1):i[r]=e:n&&!o&&i.push(e),this.useStates(i)},t.prototype.toggleState=function(t,e){e?this.useState(t,!0):this.removeState(t)},t.prototype._mergeStates=function(t){for(var e,n={},i=0;i<t.length;i++){var r=t[i];A(n,r),r.textConfig&&A(e=e||{},r.textConfig)}return e&&(n.textConfig=e),n},t.prototype._applyStateObj=function(t,e,n,i,r,o){var a=!(e&&i);e&&e.textConfig?(this.textConfig=A({},i?this.textConfig:n.textConfig),A(this.textConfig,e.textConfig)):a&&n.textConfig&&(this.textConfig=n.textConfig);for(var s={},l=!1,u=0;u<mr.length;u++){var h=mr[u],c=r&&xr[h];e&&null!=e[h]?c?(l=!0,s[h]=e[h]):this[h]=e[h]:a&&null!=n[h]&&(c?(l=!0,s[h]=n[h]):this[h]=n[h])}if(!r)for(u=0;u<this.animators.length;u++){var p=this.animators[u],d=p.targetName;p.getLoop()||p.__changeFinalValue(d?(e||n)[d]:e||n)}l&&this._transitionState(t,s,o)},t.prototype._attachComponent=function(t){if((!t.__zr||t.__hostTarget)&&t!==this){var e=this.__zr;e&&t.addSelfToZr(e),t.__zr=e,t.__hostTarget=this}},t.prototype._detachComponent=function(t){t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__hostTarget=null},t.prototype.getClipPath=function(){return this._clipPath},t.prototype.setClipPath=function(t){this._clipPath&&this._clipPath!==t&&this.removeClipPath(),this._attachComponent(t),this._clipPath=t,this.markRedraw()},t.prototype.removeClipPath=function(){var t=this._clipPath;t&&(this._detachComponent(t),this._clipPath=null,this.markRedraw())},t.prototype.getTextContent=function(){return this._textContent},t.prototype.setTextContent=function(t){var e=this._textContent;e!==t&&(e&&e!==t&&this.removeTextContent(),t.innerTransformable=new qi,this._attachComponent(t),this._textContent=t,this.markRedraw())},t.prototype.setTextConfig=function(t){this.textConfig||(this.textConfig={}),A(this.textConfig,t),this.markRedraw()},t.prototype.removeTextConfig=function(){this.textConfig=null,this.markRedraw()},t.prototype.removeTextContent=function(){var t=this._textContent;t&&(t.innerTransformable=null,this._detachComponent(t),this._textContent=null,this._innerTextDefaultStyle=null,this.markRedraw())},t.prototype.getTextGuideLine=function(){return this._textGuide},t.prototype.setTextGuideLine=function(t){this._textGuide&&this._textGuide!==t&&this.removeTextGuideLine(),this._attachComponent(t),this._textGuide=t,this.markRedraw()},t.prototype.removeTextGuideLine=function(){var t=this._textGuide;t&&(this._detachComponent(t),this._textGuide=null,this.markRedraw())},t.prototype.markRedraw=function(){this.__dirty|=1;var t=this.__zr;t&&(this.__inHover?t.refreshHover():t.refresh()),this.__hostTarget&&this.__hostTarget.markRedraw()},t.prototype.dirty=function(){this.markRedraw()},t.prototype._toggleHoverLayerFlag=function(t){this.__inHover=t;var e=this._textContent,n=this._textGuide;e&&(e.__inHover=t),n&&(n.__inHover=t)},t.prototype.addSelfToZr=function(t){if(this.__zr!==t){this.__zr=t;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.addAnimator(e[n]);this._clipPath&&this._clipPath.addSelfToZr(t),this._textContent&&this._textContent.addSelfToZr(t),this._textGuide&&this._textGuide.addSelfToZr(t)}},t.prototype.removeSelfFromZr=function(t){if(this.__zr){this.__zr=null;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.removeAnimator(e[n]);this._clipPath&&this._clipPath.removeSelfFromZr(t),this._textContent&&this._textContent.removeSelfFromZr(t),this._textGuide&&this._textGuide.removeSelfFromZr(t)}},t.prototype.animate=function(t,e,n){var i=t?this[t]:this;var r=new ai(i,e,n);return t&&(r.targetName=t),this.addAnimator(r,t),r},t.prototype.addAnimator=function(t,e){var n=this.__zr,i=this;t.during((function(){i.updateDuringAnimation(e)})).done((function(){var e=i.animators,n=P(e,t);n>=0&&e.splice(n,1)})),this.animators.push(t),n&&n.animation.addAnimator(t),n&&n.wakeUp()},t.prototype.updateDuringAnimation=function(t){this.markRedraw()},t.prototype.stopAnimation=function(t,e){for(var n=this.animators,i=n.length,r=[],o=0;o<i;o++){var a=n[o];t&&t!==a.scope?r.push(a):a.stop(e)}return this.animators=r,this},t.prototype.animateTo=function(t,e,n){Sr(this,t,e,n)},t.prototype.animateFrom=function(t,e,n){Sr(this,t,e,n,!0)},t.prototype._transitionState=function(t,e,n,i){for(var r=Sr(this,e,n,i),o=0;o<r.length;o++)r[o].__fromStateTransition=t},t.prototype.getBoundingRect=function(){return null},t.prototype.getPaintRect=function(){return null},t.initDefaultProps=function(){var e=t.prototype;e.type="element",e.name="",e.ignore=e.silent=e.isGroup=e.draggable=e.dragging=e.ignoreClip=e.__inHover=!1,e.__dirty=1;function n(t,n,i,r){function o(t,e){Object.defineProperty(e,0,{get:function(){return t[i]},set:function(e){t[i]=e}}),Object.defineProperty(e,1,{get:function(){return t[r]},set:function(e){t[r]=e}})}Object.defineProperty(e,t,{get:function(){this[n]||o(this,this[n]=[]);return this[n]},set:function(t){this[i]=t[0],this[r]=t[1],this[n]=t,o(this,t)}})}Object.defineProperty&&(n("position","_legacyPos","x","y"),n("scale","_legacyScale","scaleX","scaleY"),n("origin","_legacyOrigin","originX","originY"))}(),t}();function Sr(t,e,n,i,r){var o=[];Tr(t,"",t,e,n=n||{},i,o,r);var a=o.length,s=!1,l=n.done,u=n.aborted,h=function(){s=!0,--a<=0&&(s?l&&l():u&&u())},c=function(){--a<=0&&(s?l&&l():u&&u())};a||l&&l(),o.length>0&&n.during&&o[0].during((function(t,e){n.during(e)}));for(var p=0;p<o.length;p++){var d=o[p];h&&d.done(h),c&&d.aborted(c),n.force&&d.duration(n.duration),d.start(n.easing)}return o}function Mr(t,e,n){for(var i=0;i<n;i++)t[i]=e[i]}function Ir(t,e,n){if(N(e[n]))if(N(t[n])||(t[n]=[]),$(e[n])){var i=e[n].length;t[n].length!==i&&(t[n]=new e[n].constructor(i),Mr(t[n],e[n],i))}else{var r=e[n],o=t[n],a=r.length;if(N(r[0]))for(var s=r[0].length,l=0;l<a;l++)o[l]?Mr(o[l],r[l],s):o[l]=Array.prototype.slice.call(r[l]);else Mr(o,r,a);o.length=r.length}else t[n]=e[n]}function Tr(t,e,n,i,r,o,a,s){for(var l=G(i),u=r.duration,h=r.delay,c=r.additive,p=r.setToFinal,d=!q(o),f=t.animators,g=[],y=0;y<l.length;y++){var v=l[y],m=i[v];if(null!=m&&null!=n[v]&&(d||o[v]))if(!q(m)||N(m)||Q(m))g.push(v);else{if(e){s||(n[v]=m,t.updateDuringAnimation(e));continue}Tr(t,v,n[v],m,r,o&&o[v],a,s)}else s||(n[v]=m,t.updateDuringAnimation(e),g.push(v))}var x=g.length;if(!c&&x)for(var _=0;_<f.length;_++){if((w=f[_]).targetName===e)if(w.stopTracks(g)){var b=P(f,w);f.splice(b,1)}}if(r.force||(x=(g=B(g,(function(t){return e=i[t],r=n[t],!(e===r||N(e)&&N(r)&&function(t,e){var n=t.length;if(n!==e.length)return!1;for(var i=0;i<n;i++)if(t[i]!==e[i])return!1;return!0}(e,r));var e,r}))).length),x>0||r.force&&!a.length){var w,S=void 0,M=void 0,I=void 0;if(s){M={},p&&(S={});for(_=0;_<x;_++){M[v=g[_]]=n[v],p?S[v]=i[v]:n[v]=i[v]}}else if(p){I={};for(_=0;_<x;_++){I[v=g[_]]=ti(n[v]),Ir(n,i,v)}}(w=new ai(n,!1,!1,c?B(f,(function(t){return t.targetName===e})):null)).targetName=e,r.scope&&(w.scope=r.scope),p&&S&&w.whenWithKeys(0,S,g),I&&w.whenWithKeys(0,I,g),w.whenWithKeys(null==u?500:u,s?M:i,g).delay(h||0),t.addAnimator(w,e),a.push(w)}}R(wr,Xt),R(wr,qi);var Cr=function(t){function e(e){var n=t.call(this)||this;return n.isGroup=!0,n._children=[],n.attr(e),n}return n(e,t),e.prototype.childrenRef=function(){return this._children},e.prototype.children=function(){return this._children.slice()},e.prototype.childAt=function(t){return this._children[t]},e.prototype.childOfName=function(t){for(var e=this._children,n=0;n<e.length;n++)if(e[n].name===t)return e[n]},e.prototype.childCount=function(){return this._children.length},e.prototype.add=function(t){return t&&t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),this},e.prototype.addBefore=function(t,e){if(t&&t!==this&&t.parent!==this&&e&&e.parent===this){var n=this._children,i=n.indexOf(e);i>=0&&(n.splice(i,0,t),this._doAdd(t))}return this},e.prototype.replace=function(t,e){var n=P(this._children,t);return n>=0&&this.replaceAt(e,n),this},e.prototype.replaceAt=function(t,e){var n=this._children,i=n[e];if(t&&t!==this&&t.parent!==this&&t!==i){n[e]=t,i.parent=null;var r=this.__zr;r&&i.removeSelfFromZr(r),this._doAdd(t)}return this},e.prototype._doAdd=function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__zr;e&&e!==t.__zr&&t.addSelfToZr(e),e&&e.refresh()},e.prototype.remove=function(t){var e=this.__zr,n=this._children,i=P(n,t);return i<0||(n.splice(i,1),t.parent=null,e&&t.removeSelfFromZr(e),e&&e.refresh()),this},e.prototype.removeAll=function(){for(var t=this._children,e=this.__zr,n=0;n<t.length;n++){var i=t[n];e&&i.removeSelfFromZr(e),i.parent=null}return t.length=0,this},e.prototype.eachChild=function(t,e){for(var n=this._children,i=0;i<n.length;i++){var r=n[i];t.call(e,r,i)}return this},e.prototype.traverse=function(t,e){for(var n=0;n<this._children.length;n++){var i=this._children[n],r=t.call(e,i);i.isGroup&&!r&&i.traverse(t,e)}return this},e.prototype.addSelfToZr=function(e){t.prototype.addSelfToZr.call(this,e);for(var n=0;n<this._children.length;n++){this._children[n].addSelfToZr(e)}},e.prototype.removeSelfFromZr=function(e){t.prototype.removeSelfFromZr.call(this,e);for(var n=0;n<this._children.length;n++){this._children[n].removeSelfFromZr(e)}},e.prototype.getBoundingRect=function(t){for(var e=new sr(0,0,0,0),n=t||this._children,i=[],r=null,o=0;o<n.length;o++){var a=n[o];if(!a.ignore&&!a.invisible){var s=a.getBoundingRect(),l=a.getLocalTransform(i);l?(sr.applyTransform(e,s,l),(r=r||e.clone()).union(e)):(r=r||s.clone()).union(s)}}return r||e},e}(wr);Cr.prototype.type="group"; +/*! + * ZRender, a high performance 2d drawing library. + * + * Copyright (c) 2013, Baidu Inc. + * All rights reserved. + * + * LICENSE + * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt + */ +var Dr={},Ar={};var kr=function(){function t(t,e,n){var i=this;this._sleepAfterStill=10,this._stillFrameAccum=0,this._needsRefresh=!0,this._needsRefreshHover=!0,this._darkMode=!1,n=n||{},this.dom=e,this.id=t;var o=new Ae,a=n.renderer||"canvas";Dr[a]||(a=G(Dr)[0]),n.useDirtyRect=null!=n.useDirtyRect&&n.useDirtyRect;var s=new Dr[a](e,o,n,t),l=n.ssr||s.ssrOnly;this.storage=o,this.painter=s;var u=r.node||r.worker||l?null:new Ci(s.getViewportRoot(),s.root);this.handler=new ve(o,s,u,s.root),this.animation=new hi({stage:{update:l?null:function(){return i._flush(!0)}}}),l||this.animation.start()}return t.prototype.add=function(t){t&&(this.storage.addRoot(t),t.addSelfToZr(this),this.refresh())},t.prototype.remove=function(t){t&&(this.storage.delRoot(t),t.removeSelfFromZr(this),this.refresh())},t.prototype.configLayer=function(t,e){this.painter.configLayer&&this.painter.configLayer(t,e),this.refresh()},t.prototype.setBackgroundColor=function(t){this.painter.setBackgroundColor&&this.painter.setBackgroundColor(t),this.refresh(),this._backgroundColor=t,this._darkMode=function(t){if(!t)return!1;if("string"==typeof t)return Ln(t,1)<.4;if(t.colorStops){for(var e=t.colorStops,n=0,i=e.length,r=0;r<i;r++)n+=Ln(e[r].color,1);return(n/=i)<.4}return!1}(t)},t.prototype.getBackgroundColor=function(){return this._backgroundColor},t.prototype.setDarkMode=function(t){this._darkMode=t},t.prototype.isDarkMode=function(){return this._darkMode},t.prototype.refreshImmediately=function(t){t||this.animation.update(!0),this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},t.prototype.refresh=function(){this._needsRefresh=!0,this.animation.start()},t.prototype.flush=function(){this._flush(!1)},t.prototype._flush=function(t){var e,n=si();this._needsRefresh&&(e=!0,this.refreshImmediately(t)),this._needsRefreshHover&&(e=!0,this.refreshHoverImmediately());var i=si();e?(this._stillFrameAccum=0,this.trigger("rendered",{elapsedTime:i-n})):this._sleepAfterStill>0&&(this._stillFrameAccum++,this._stillFrameAccum>this._sleepAfterStill&&this.animation.stop())},t.prototype.setSleepAfterStill=function(t){this._sleepAfterStill=t},t.prototype.wakeUp=function(){this.animation.start(),this._stillFrameAccum=0},t.prototype.refreshHover=function(){this._needsRefreshHover=!0},t.prototype.refreshHoverImmediately=function(){this._needsRefreshHover=!1,this.painter.refreshHover&&"canvas"===this.painter.getType()&&this.painter.refreshHover()},t.prototype.resize=function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},t.prototype.clearAnimation=function(){this.animation.clear()},t.prototype.getWidth=function(){return this.painter.getWidth()},t.prototype.getHeight=function(){return this.painter.getHeight()},t.prototype.setCursorStyle=function(t){this.handler.setCursorStyle(t)},t.prototype.findHover=function(t,e){return this.handler.findHover(t,e)},t.prototype.on=function(t,e,n){return this.handler.on(t,e,n),this},t.prototype.off=function(t,e){this.handler.off(t,e)},t.prototype.trigger=function(t,e){this.handler.trigger(t,e)},t.prototype.clear=function(){for(var t=this.storage.getRoots(),e=0;e<t.length;e++)t[e]instanceof Cr&&t[e].removeSelfFromZr(this);this.storage.delAllRoots(),this.painter.clear()},t.prototype.dispose=function(){var t;this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,t=this.id,delete Ar[t]},t}();function Lr(t,e){var n=new kr(M(),t,e);return Ar[n.id]=n,n}function Pr(t,e){Dr[t]=e}var Or=Object.freeze({__proto__:null,init:Lr,dispose:function(t){t.dispose()},disposeAll:function(){for(var t in Ar)Ar.hasOwnProperty(t)&&Ar[t].dispose();Ar={}},getInstance:function(t){return Ar[t]},registerPainter:Pr,version:"5.3.2"}),Rr=1e-4;function Nr(t,e,n,i){var r=e[0],o=e[1],a=n[0],s=n[1],l=o-r,u=s-a;if(0===l)return 0===u?a:(a+s)/2;if(i)if(l>0){if(t<=r)return a;if(t>=o)return s}else{if(t>=r)return a;if(t<=o)return s}else{if(t===r)return a;if(t===o)return s}return(t-r)/l*u+a}function Er(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return X(t)?(n=t,n.replace(/^\s+|\s+$/g,"")).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t;var n}function zr(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t}function Vr(t){return t.sort((function(t,e){return t-e})),t}function Br(t){if(t=+t,isNaN(t))return 0;if(t>1e-14)for(var e=1,n=0;n<15;n++,e*=10)if(Math.round(t*e)/e===t)return n;return Fr(t)}function Fr(t){var e=t.toString().toLowerCase(),n=e.indexOf("e"),i=n>0?+e.slice(n+1):0,r=n>0?n:e.length,o=e.indexOf("."),a=o<0?0:r-1-o;return Math.max(0,a-i)}function Gr(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),o=Math.round(n(Math.abs(e[1]-e[0]))/i),a=Math.min(Math.max(-r+o,0),20);return isFinite(a)?a:20}function Wr(t,e,n){if(!t[e])return 0;var i=V(t,(function(t,e){return t+(isNaN(e)?0:e)}),0);if(0===i)return 0;for(var r=Math.pow(10,n),o=z(t,(function(t){return(isNaN(t)?0:t)/i*r*100})),a=100*r,s=z(o,(function(t){return Math.floor(t)})),l=V(s,(function(t,e){return t+e}),0),u=z(o,(function(t,e){return t-s[e]}));l<a;){for(var h=Number.NEGATIVE_INFINITY,c=null,p=0,d=u.length;p<d;++p)u[p]>h&&(h=u[p],c=p);++s[c],u[c]=0,++l}return s[e]/r}function Hr(t,e){var n=Math.max(Br(t),Br(e)),i=t+e;return n>20?i:zr(i,n)}var Yr=9007199254740991;function Ur(t){var e=2*Math.PI;return(t%e+e)%e}function Xr(t){return t>-1e-4&&t<Rr}var Zr=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d{1,2})(?::(\d{1,2})(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/;function jr(t){if(t instanceof Date)return t;if(X(t)){var e=Zr.exec(t);if(!e)return new Date(NaN);if(e[8]){var n=+e[4]||0;return"Z"!==e[8].toUpperCase()&&(n-=+e[8].slice(0,3)),new Date(Date.UTC(+e[1],+(e[2]||1)-1,+e[3]||1,n,+(e[5]||0),+e[6]||0,e[7]?+e[7].substring(0,3):0))}return new Date(+e[1],+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0),+e[6]||0,e[7]?+e[7].substring(0,3):0)}return null==t?new Date(NaN):new Date(Math.round(t))}function qr(t){return Math.pow(10,Kr(t))}function Kr(t){if(0===t)return 0;var e=Math.floor(Math.log(t)/Math.LN10);return t/Math.pow(10,e)>=10&&e++,e}function $r(t,e){var n=Kr(t),i=Math.pow(10,n),r=t/i;return t=(e?r<1.5?1:r<2.5?2:r<4?3:r<7?5:10:r<1?1:r<2?2:r<3?3:r<5?5:10)*i,n>=-20?+t.toFixed(n<0?-n:0):t}function Jr(t,e){var n=(t.length-1)*e+1,i=Math.floor(n),r=+t[i-1],o=n-i;return o?r+o*(t[i]-r):r}function Qr(t){t.sort((function(t,e){return s(t,e,0)?-1:1}));for(var e=-1/0,n=1,i=0;i<t.length;){for(var r=t[i].interval,o=t[i].close,a=0;a<2;a++)r[a]<=e&&(r[a]=e,o[a]=a?1:1-n),e=r[a],n=o[a];r[0]===r[1]&&o[0]*o[1]!=1?t.splice(i,1):i++}return t;function s(t,e,n){return t.interval[n]<e.interval[n]||t.interval[n]===e.interval[n]&&(t.close[n]-e.close[n]==(n?-1:1)||!n&&s(t,e,1))}}function to(t){var e=parseFloat(t);return e==t&&(0!==e||!X(t)||t.indexOf("x")<=0)?e:NaN}function eo(t){return!isNaN(to(t))}function no(){return Math.round(9*Math.random())}function io(t,e){return 0===e?t:io(e,t%e)}function ro(t,e){return null==t?e:null==e?t:t*e/io(t,e)}"undefined"!=typeof console&&console.warn&&console.log;function oo(t){0}function ao(t){throw new Error(t)}function so(t,e,n){return(e-t)*n+t}var lo="series\0",uo="\0_ec_\0";function ho(t){return t instanceof Array?t:null==t?[]:[t]}function co(t,e,n){if(t){t[e]=t[e]||{},t.emphasis=t.emphasis||{},t.emphasis[e]=t.emphasis[e]||{};for(var i=0,r=n.length;i<r;i++){var o=n[i];!t.emphasis[e].hasOwnProperty(o)&&t[e].hasOwnProperty(o)&&(t.emphasis[e][o]=t[e][o])}}}var po=["fontStyle","fontWeight","fontSize","fontFamily","rich","tag","color","textBorderColor","textBorderWidth","width","height","lineHeight","align","verticalAlign","baseline","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","textShadowColor","textShadowBlur","textShadowOffsetX","textShadowOffsetY","backgroundColor","borderColor","borderWidth","borderRadius","padding"];function fo(t){return!q(t)||Y(t)||t instanceof Date?t:t.value}function go(t){return q(t)&&!(t instanceof Array)}function yo(t,e,n){var i="normalMerge"===n,r="replaceMerge"===n,o="replaceAll"===n;t=t||[],e=(e||[]).slice();var a=ft();E(e,(function(t,n){q(t)||(e[n]=null)}));var s,l,u=function(t,e,n){var i=[];if("replaceAll"===n)return i;for(var r=0;r<t.length;r++){var o=t[r];o&&null!=o.id&&e.set(o.id,r),i.push({existing:"replaceMerge"===n||bo(o)?null:o,newOption:null,keyInfo:null,brandNew:null})}return i}(t,a,n);return(i||r)&&function(t,e,n,i){E(i,(function(r,o){if(r&&null!=r.id){var a=mo(r.id),s=n.get(a);if(null!=s){var l=t[s];lt(!l.newOption,'Duplicated option on id "'+a+'".'),l.newOption=r,l.existing=e[s],i[o]=null}}}))}(u,t,a,e),i&&function(t,e){E(e,(function(n,i){if(n&&null!=n.name)for(var r=0;r<t.length;r++){var o=t[r].existing;if(!t[r].newOption&&o&&(null==o.id||null==n.id)&&!bo(n)&&!bo(o)&&vo("name",o,n))return t[r].newOption=n,void(e[i]=null)}}))}(u,e),i||r?function(t,e,n){E(e,(function(e){if(e){for(var i,r=0;(i=t[r])&&(i.newOption||bo(i.existing)||i.existing&&null!=e.id&&!vo("id",e,i.existing));)r++;i?(i.newOption=e,i.brandNew=n):t.push({newOption:e,brandNew:n,existing:null,keyInfo:null}),r++}}))}(u,e,r):o&&function(t,e){E(e,(function(e){t.push({newOption:e,brandNew:!0,existing:null,keyInfo:null})}))}(u,e),s=u,l=ft(),E(s,(function(t){var e=t.existing;e&&l.set(e.id,t)})),E(s,(function(t){var e=t.newOption;lt(!e||null==e.id||!l.get(e.id)||l.get(e.id)===t,"id duplicates: "+(e&&e.id)),e&&null!=e.id&&l.set(e.id,t),!t.keyInfo&&(t.keyInfo={})})),E(s,(function(t,e){var n=t.existing,i=t.newOption,r=t.keyInfo;if(q(i)){if(r.name=null!=i.name?mo(i.name):n?n.name:lo+e,n)r.id=mo(n.id);else if(null!=i.id)r.id=mo(i.id);else{var o=0;do{r.id="\0"+r.name+"\0"+o++}while(l.get(r.id))}l.set(r.id,t)}})),u}function vo(t,e,n){var i=xo(e[t],null),r=xo(n[t],null);return null!=i&&null!=r&&i===r}function mo(t){return xo(t,"")}function xo(t,e){return null==t?e:X(t)?t:j(t)||Z(t)?t+"":e}function _o(t){var e=t.name;return!(!e||!e.indexOf(lo))}function bo(t){return t&&null!=t.id&&0===mo(t.id).indexOf(uo)}function wo(t,e){return null!=e.dataIndexInside?e.dataIndexInside:null!=e.dataIndex?Y(e.dataIndex)?z(e.dataIndex,(function(e){return t.indexOfRawIndex(e)})):t.indexOfRawIndex(e.dataIndex):null!=e.name?Y(e.name)?z(e.name,(function(e){return t.indexOfName(e)})):t.indexOfName(e.name):void 0}function So(){var t="__ec_inner_"+Mo++;return function(e){return e[t]||(e[t]={})}}var Mo=no();function Io(t,e,n){var i=To(e,n),r=i.mainTypeSpecified,o=i.queryOptionMap,a=i.others,s=n?n.defaultMainType:null;return!r&&s&&o.set(s,{}),o.each((function(e,i){var r=Ao(t,i,e,{useDefault:s===i,enableAll:!n||null==n.enableAll||n.enableAll,enableNone:!n||null==n.enableNone||n.enableNone});a[i+"Models"]=r.models,a[i+"Model"]=r.models[0]})),a}function To(t,e){var n;if(X(t)){var i={};i[t+"Index"]=0,n=i}else n=t;var r=ft(),o={},a=!1;return E(n,(function(t,n){if("dataIndex"!==n&&"dataIndexInside"!==n){var i=n.match(/^(\w+)(Index|Id|Name)$/)||[],s=i[1],l=(i[2]||"").toLowerCase();if(s&&l&&!(e&&e.includeMainTypes&&P(e.includeMainTypes,s)<0))a=a||!!s,(r.get(s)||r.set(s,{}))[l]=t}else o[n]=t})),{mainTypeSpecified:a,queryOptionMap:r,others:o}}var Co={useDefault:!0,enableAll:!1,enableNone:!1},Do={useDefault:!1,enableAll:!0,enableNone:!0};function Ao(t,e,n,i){i=i||Co;var r=n.index,o=n.id,a=n.name,s={models:null,specified:null!=r||null!=o||null!=a};if(!s.specified){var l=void 0;return s.models=i.useDefault&&(l=t.getComponent(e))?[l]:[],s}return"none"===r||!1===r?(lt(i.enableNone,'`"none"` or `false` is not a valid value on index option.'),s.models=[],s):("all"===r&&(lt(i.enableAll,'`"all"` is not a valid value on index option.'),r=o=a=null),s.models=t.queryComponents({mainType:e,index:r,id:o,name:a}),s)}function ko(t,e,n){t.setAttribute?t.setAttribute(e,n):t[e]=n}function Lo(t,e){var n=ft(),i=[];return E(t,(function(t){var r=e(t);(n.get(r)||(i.push(r),n.set(r,[]))).push(t)})),{keys:i,buckets:n}}function Po(t,e,n,i,r){var o=null==e||"auto"===e;if(null==i)return i;if(j(i))return zr(f=so(n||0,i,r),o?Math.max(Br(n||0),Br(i)):e);if(X(i))return r<1?n:i;for(var a=[],s=n,l=i,u=Math.max(s?s.length:0,l.length),h=0;h<u;++h){var c=t.getDimensionInfo(h);if(c&&"ordinal"===c.type)a[h]=(r<1&&s?s:l)[h];else{var p=s&&s[h]?s[h]:0,d=l[h],f=so(p,d,r);a[h]=zr(f,o?Math.max(Br(p),Br(d)):e)}}return a}var Oo="___EC__COMPONENT__CONTAINER___",Ro="___EC__EXTENDED_CLASS___";function No(t){var e={main:"",sub:""};if(t){var n=t.split(".");e.main=n[0]||"",e.sub=n[1]||""}return e}function Eo(t,e){t.$constructor=t,t.extend=function(t){var e,i,r=this;return U(i=r)&&/^class\s/.test(Function.prototype.toString.call(i))?e=function(t){function e(){return t.apply(this,arguments)||this}return n(e,t),e}(r):O(e=function(){(t.$constructor||r).apply(this,arguments)},this),A(e.prototype,t),e[Ro]=!0,e.extend=this.extend,e.superCall=Bo,e.superApply=Fo,e.superClass=r,e}}function zo(t,e){t.extend=e.extend}var Vo=Math.round(10*Math.random());function Bo(t,e){for(var n=[],i=2;i<arguments.length;i++)n[i-2]=arguments[i];return this.superClass.prototype[e].apply(t,n)}function Fo(t,e,n){return this.superClass.prototype[e].apply(t,n)}function Go(t){var e={};t.registerClass=function(t){var n,i=t.type||t.prototype.type;if(i){lt(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(n=i),'componentType "'+n+'" illegal'),t.prototype.type=i;var r=No(i);if(r.sub){if(r.sub!==Oo){(function(t){var n=e[t.main];n&&n[Oo]||((n=e[t.main]={})[Oo]=!0);return n}(r))[r.sub]=t}}else e[r.main]=t}return t},t.getClass=function(t,n,i){var r=e[t];if(r&&r[Oo]&&(r=n?r[n]:null),i&&!r)throw new Error(n?"Component "+t+"."+(n||"")+" is used but not imported.":t+".type should be specified.");return r},t.getClassesByMainType=function(t){var n=No(t),i=[],r=e[n.main];return r&&r[Oo]?E(r,(function(t,e){e!==Oo&&i.push(t)})):i.push(r),i},t.hasClass=function(t){var n=No(t);return!!e[n.main]},t.getAllClassMainTypes=function(){var t=[];return E(e,(function(e,n){t.push(n)})),t},t.hasSubTypes=function(t){var n=No(t),i=e[n.main];return i&&i[Oo]}}function Wo(t,e){for(var n=0;n<t.length;n++)t[n][1]||(t[n][1]=t[n][0]);return e=e||!1,function(n,i,r){for(var o={},a=0;a<t.length;a++){var s=t[a][1];if(!(i&&P(i,s)>=0||r&&P(r,s)<0)){var l=n.getShallow(s,e);null!=l&&(o[t[a][0]]=l)}}return o}}var Ho=Wo([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),Yo=function(){function t(){}return t.prototype.getAreaStyle=function(t,e){return Ho(this,t,e)},t}(),Uo=new ln(50);function Xo(t){if("string"==typeof t){var e=Uo.get(t);return e&&e.image}return t}function Zo(t,e,n,i,r){if(t){if("string"==typeof t){if(e&&e.__zrImageSrc===t||!n)return e;var o=Uo.get(t),a={hostEl:n,cb:i,cbPayload:r};return o?!qo(e=o.image)&&o.pending.push(a):((e=h.loadImage(t,jo,jo)).__zrImageSrc=t,Uo.put(t,e.__cachedImgObj={image:e,pending:[a]})),e}return t}return e}function jo(){var t=this.__cachedImgObj;this.onload=this.onerror=this.__cachedImgObj=null;for(var e=0;e<t.pending.length;e++){var n=t.pending[e],i=n.cb;i&&i(this,n.cbPayload),n.hostEl.dirty()}t.pending.length=0}function qo(t){return t&&t.width&&t.height}var Ko=/\{([a-zA-Z0-9_]+)\|([^}]*)\}/g;function $o(t,e,n,i,r){if(!e)return"";var o=(t+"").split("\n");r=Jo(e,n,i,r);for(var a=0,s=o.length;a<s;a++)o[a]=Qo(o[a],r);return o.join("\n")}function Jo(t,e,n,i){var r=A({},i=i||{});r.font=e,n=rt(n,"..."),r.maxIterations=rt(i.maxIterations,2);var o=r.minChar=rt(i.minChar,0);r.cnCharWidth=ur("国",e);var a=r.ascCharWidth=ur("a",e);r.placeholder=rt(i.placeholder,"");for(var s=t=Math.max(0,t-1),l=0;l<o&&s>=a;l++)s-=a;var u=ur(n,e);return u>s&&(n="",u=0),s=t-u,r.ellipsis=n,r.ellipsisWidth=u,r.contentWidth=s,r.containerWidth=t,r}function Qo(t,e){var n=e.containerWidth,i=e.font,r=e.contentWidth;if(!n)return"";var o=ur(t,i);if(o<=n)return t;for(var a=0;;a++){if(o<=r||a>=e.maxIterations){t+=e.ellipsis;break}var s=0===a?ta(t,r,e.ascCharWidth,e.cnCharWidth):o>0?Math.floor(t.length*r/o):0;o=ur(t=t.substr(0,s),i)}return""===t&&(t=e.placeholder),t}function ta(t,e,n,i){for(var r=0,o=0,a=t.length;o<a&&r<e;o++){var s=t.charCodeAt(o);r+=0<=s&&s<=127?n:i}return o}var ea=function(){},na=function(t){this.tokens=[],t&&(this.tokens=t)},ia=function(){this.width=0,this.height=0,this.contentWidth=0,this.contentHeight=0,this.outerWidth=0,this.outerHeight=0,this.lines=[]};function ra(t,e,n,i,r){var o,a,s=""===e,l=r&&n.rich[r]||{},u=t.lines,h=l.font||n.font,c=!1;if(i){var p=l.padding,d=p?p[1]+p[3]:0;if(null!=l.width&&"auto"!==l.width){var f=gr(l.width,i.width)+d;u.length>0&&f+i.accumWidth>i.width&&(o=e.split("\n"),c=!0),i.accumWidth=f}else{var g=sa(e,h,i.width,i.breakAll,i.accumWidth);i.accumWidth=g.accumWidth+d,a=g.linesWidths,o=g.lines}}else o=e.split("\n");for(var y=0;y<o.length;y++){var v=o[y],m=new ea;if(m.styleName=r,m.text=v,m.isLineHolder=!v&&!s,"number"==typeof l.width?m.width=l.width:m.width=a?a[y]:ur(v,h),y||c)u.push(new na([m]));else{var x=(u[u.length-1]||(u[0]=new na)).tokens,_=x.length;1===_&&x[0].isLineHolder?x[0]=m:(v||!_||s)&&x.push(m)}}}var oa=V(",&?/;] ".split(""),(function(t,e){return t[e]=!0,t}),{});function aa(t){return!function(t){var e=t.charCodeAt(0);return e>=33&&e<=383}(t)||!!oa[t]}function sa(t,e,n,i,r){for(var o=[],a=[],s="",l="",u=0,h=0,c=0;c<t.length;c++){var p=t.charAt(c);if("\n"!==p){var d=ur(p,e),f=!i&&!aa(p);(o.length?h+d>n:r+h+d>n)?h?(s||l)&&(f?(s||(s=l,l="",h=u=0),o.push(s),a.push(h-u),l+=p,s="",h=u+=d):(l&&(s+=l,l="",u=0),o.push(s),a.push(h),s=p,h=d)):f?(o.push(l),a.push(u),l=p,u=d):(o.push(p),a.push(d)):(h+=d,f?(l+=p,u+=d):(l&&(s+=l,l="",u=0),s+=p))}else l&&(s+=l,h+=u),o.push(s),a.push(h),s="",l="",u=0,h=0}return o.length||s||(s=t,l="",u=0),l&&(s+=l),s&&(o.push(s),a.push(h)),1===o.length&&(h+=r),{accumWidth:h,lines:o,linesWidths:a}}var la="__zr_style_"+Math.round(10*Math.random()),ua={shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,shadowColor:"#000",opacity:1,blend:"source-over"},ha={style:{shadowBlur:!0,shadowOffsetX:!0,shadowOffsetY:!0,shadowColor:!0,opacity:!0}};ua[la]=!0;var ca=["z","z2","invisible"],pa=["invisible"],da=function(t){function e(e){return t.call(this,e)||this}var i;return n(e,t),e.prototype._init=function(e){for(var n=G(e),i=0;i<n.length;i++){var r=n[i];"style"===r?this.useStyle(e[r]):t.prototype.attrKV.call(this,r,e[r])}this.style||this.useStyle({})},e.prototype.beforeBrush=function(){},e.prototype.afterBrush=function(){},e.prototype.innerBeforeBrush=function(){},e.prototype.innerAfterBrush=function(){},e.prototype.shouldBePainted=function(t,e,n,i){var r=this.transform;if(this.ignore||this.invisible||0===this.style.opacity||this.culling&&function(t,e,n){fa.copy(t.getBoundingRect()),t.transform&&fa.applyTransform(t.transform);return ga.width=e,ga.height=n,!fa.intersect(ga)}(this,t,e)||r&&!r[0]&&!r[3])return!1;if(n&&this.__clipPaths)for(var o=0;o<this.__clipPaths.length;++o)if(this.__clipPaths[o].isZeroArea())return!1;if(i&&this.parent)for(var a=this.parent;a;){if(a.ignore)return!1;a=a.parent}return!0},e.prototype.contain=function(t,e){return this.rectContain(t,e)},e.prototype.traverse=function(t,e){t.call(e,this)},e.prototype.rectContain=function(t,e){var n=this.transformCoordToLocal(t,e);return this.getBoundingRect().contain(n[0],n[1])},e.prototype.getPaintRect=function(){var t=this._paintRect;if(!this._paintRect||this.__dirty){var e=this.transform,n=this.getBoundingRect(),i=this.style,r=i.shadowBlur||0,o=i.shadowOffsetX||0,a=i.shadowOffsetY||0;t=this._paintRect||(this._paintRect=new sr(0,0,0,0)),e?sr.applyTransform(t,n,e):t.copy(n),(r||o||a)&&(t.width+=2*r+Math.abs(o),t.height+=2*r+Math.abs(a),t.x=Math.min(t.x,t.x+o-r),t.y=Math.min(t.y,t.y+a-r));var s=this.dirtyRectTolerance;t.isZero()||(t.x=Math.floor(t.x-s),t.y=Math.floor(t.y-s),t.width=Math.ceil(t.width+1+2*s),t.height=Math.ceil(t.height+1+2*s))}return t},e.prototype.setPrevPaintRect=function(t){t?(this._prevPaintRect=this._prevPaintRect||new sr(0,0,0,0),this._prevPaintRect.copy(t)):this._prevPaintRect=null},e.prototype.getPrevPaintRect=function(){return this._prevPaintRect},e.prototype.animateStyle=function(t){return this.animate("style",t)},e.prototype.updateDuringAnimation=function(t){"style"===t?this.dirtyStyle():this.markRedraw()},e.prototype.attrKV=function(e,n){"style"!==e?t.prototype.attrKV.call(this,e,n):this.style?this.setStyle(n):this.useStyle(n)},e.prototype.setStyle=function(t,e){return"string"==typeof t?this.style[t]=e:A(this.style,t),this.dirtyStyle(),this},e.prototype.dirtyStyle=function(t){t||this.markRedraw(),this.__dirty|=2,this._rect&&(this._rect=null)},e.prototype.dirty=function(){this.dirtyStyle()},e.prototype.styleChanged=function(){return!!(2&this.__dirty)},e.prototype.styleUpdated=function(){this.__dirty&=-3},e.prototype.createStyle=function(t){return yt(ua,t)},e.prototype.useStyle=function(t){t[la]||(t=this.createStyle(t)),this.__inHover?this.__hoverStyle=t:this.style=t,this.dirtyStyle()},e.prototype.isStyleObject=function(t){return t[la]},e.prototype._innerSaveToNormal=function(e){t.prototype._innerSaveToNormal.call(this,e);var n=this._normalState;e.style&&!n.style&&(n.style=this._mergeStyle(this.createStyle(),this.style)),this._savePrimaryToNormal(e,n,ca)},e.prototype._applyStateObj=function(e,n,i,r,o,a){t.prototype._applyStateObj.call(this,e,n,i,r,o,a);var s,l=!(n&&r);if(n&&n.style?o?r?s=n.style:(s=this._mergeStyle(this.createStyle(),i.style),this._mergeStyle(s,n.style)):(s=this._mergeStyle(this.createStyle(),r?this.style:i.style),this._mergeStyle(s,n.style)):l&&(s=i.style),s)if(o){var u=this.style;if(this.style=this.createStyle(l?{}:u),l)for(var h=G(u),c=0;c<h.length;c++){(d=h[c])in s&&(s[d]=s[d],this.style[d]=u[d])}var p=G(s);for(c=0;c<p.length;c++){var d=p[c];this.style[d]=this.style[d]}this._transitionState(e,{style:s},a,this.getAnimationStyleProps())}else this.useStyle(s);var f=this.__inHover?pa:ca;for(c=0;c<f.length;c++){d=f[c];n&&null!=n[d]?this[d]=n[d]:l&&null!=i[d]&&(this[d]=i[d])}},e.prototype._mergeStates=function(e){for(var n,i=t.prototype._mergeStates.call(this,e),r=0;r<e.length;r++){var o=e[r];o.style&&(n=n||{},this._mergeStyle(n,o.style))}return n&&(i.style=n),i},e.prototype._mergeStyle=function(t,e){return A(t,e),t},e.prototype.getAnimationStyleProps=function(){return ha},e.initDefaultProps=((i=e.prototype).type="displayable",i.invisible=!1,i.z=0,i.z2=0,i.zlevel=0,i.culling=!1,i.cursor="pointer",i.rectHover=!1,i.incremental=!1,i._rect=null,i.dirtyRectTolerance=0,void(i.__dirty=3)),e}(wr),fa=new sr(0,0,0,0),ga=new sr(0,0,0,0);var ya=Math.min,va=Math.max,ma=Math.sin,xa=Math.cos,_a=2*Math.PI,ba=wt(),wa=wt(),Sa=wt();function Ma(t,e,n){if(0!==t.length){for(var i=t[0],r=i[0],o=i[0],a=i[1],s=i[1],l=1;l<t.length;l++)i=t[l],r=ya(r,i[0]),o=va(o,i[0]),a=ya(a,i[1]),s=va(s,i[1]);e[0]=r,e[1]=a,n[0]=o,n[1]=s}}function Ia(t,e,n,i,r,o){r[0]=ya(t,n),r[1]=ya(e,i),o[0]=va(t,n),o[1]=va(e,i)}var Ta=[],Ca=[];function Da(t,e,n,i,r,o,a,s,l,u){var h=Xe,c=He,p=h(t,n,r,a,Ta);l[0]=1/0,l[1]=1/0,u[0]=-1/0,u[1]=-1/0;for(var d=0;d<p;d++){var f=c(t,n,r,a,Ta[d]);l[0]=ya(f,l[0]),u[0]=va(f,u[0])}p=h(e,i,o,s,Ca);for(d=0;d<p;d++){var g=c(e,i,o,s,Ca[d]);l[1]=ya(g,l[1]),u[1]=va(g,u[1])}l[0]=ya(t,l[0]),u[0]=va(t,u[0]),l[0]=ya(a,l[0]),u[0]=va(a,u[0]),l[1]=ya(e,l[1]),u[1]=va(e,u[1]),l[1]=ya(s,l[1]),u[1]=va(s,u[1])}function Aa(t,e,n,i,r,o,a,s){var l=Je,u=Ke,h=va(ya(l(t,n,r),1),0),c=va(ya(l(e,i,o),1),0),p=u(t,n,r,h),d=u(e,i,o,c);a[0]=ya(t,r,p),a[1]=ya(e,o,d),s[0]=va(t,r,p),s[1]=va(e,o,d)}function ka(t,e,n,i,r,o,a,s,l){var u=Gt,h=Wt,c=Math.abs(r-o);if(c%_a<1e-4&&c>1e-4)return s[0]=t-n,s[1]=e-i,l[0]=t+n,void(l[1]=e+i);if(ba[0]=xa(r)*n+t,ba[1]=ma(r)*i+e,wa[0]=xa(o)*n+t,wa[1]=ma(o)*i+e,u(s,ba,wa),h(l,ba,wa),(r%=_a)<0&&(r+=_a),(o%=_a)<0&&(o+=_a),r>o&&!a?o+=_a:r<o&&a&&(r+=_a),a){var p=o;o=r,r=p}for(var d=0;d<o;d+=Math.PI/2)d>r&&(Sa[0]=xa(d)*n+t,Sa[1]=ma(d)*i+e,u(s,Sa,s),h(l,Sa,l))}var La={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},Pa=[],Oa=[],Ra=[],Na=[],Ea=[],za=[],Va=Math.min,Ba=Math.max,Fa=Math.cos,Ga=Math.sin,Wa=Math.abs,Ha=Math.PI,Ya=2*Ha,Ua="undefined"!=typeof Float32Array,Xa=[];function Za(t){return Math.round(t/Ha*1e8)/1e8%2*Ha}function ja(t,e){var n=Za(t[0]);n<0&&(n+=Ya);var i=n-t[0],r=t[1];r+=i,!e&&r-n>=Ya?r=n+Ya:e&&n-r>=Ya?r=n-Ya:!e&&n>r?r=n+(Ya-Za(n-r)):e&&n<r&&(r=n-(Ya-Za(r-n))),t[0]=n,t[1]=r}var qa=function(){function t(t){this.dpr=1,this._xi=0,this._yi=0,this._x0=0,this._y0=0,this._len=0,t&&(this._saveData=!1),this._saveData&&(this.data=[])}return t.prototype.increaseVersion=function(){this._version++},t.prototype.getVersion=function(){return this._version},t.prototype.setScale=function(t,e,n){(n=n||0)>0&&(this._ux=Wa(n/Ai/t)||0,this._uy=Wa(n/Ai/e)||0)},t.prototype.setDPR=function(t){this.dpr=t},t.prototype.setContext=function(t){this._ctx=t},t.prototype.getContext=function(){return this._ctx},t.prototype.beginPath=function(){return this._ctx&&this._ctx.beginPath(),this.reset(),this},t.prototype.reset=function(){this._saveData&&(this._len=0),this._pathSegLen&&(this._pathSegLen=null,this._pathLen=0),this._version++},t.prototype.moveTo=function(t,e){return this._drawPendingPt(),this.addData(La.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},t.prototype.lineTo=function(t,e){var n=Wa(t-this._xi),i=Wa(e-this._yi),r=n>this._ux||i>this._uy;if(this.addData(La.L,t,e),this._ctx&&r&&this._ctx.lineTo(t,e),r)this._xi=t,this._yi=e,this._pendingPtDist=0;else{var o=n*n+i*i;o>this._pendingPtDist&&(this._pendingPtX=t,this._pendingPtY=e,this._pendingPtDist=o)}return this},t.prototype.bezierCurveTo=function(t,e,n,i,r,o){return this._drawPendingPt(),this.addData(La.C,t,e,n,i,r,o),this._ctx&&this._ctx.bezierCurveTo(t,e,n,i,r,o),this._xi=r,this._yi=o,this},t.prototype.quadraticCurveTo=function(t,e,n,i){return this._drawPendingPt(),this.addData(La.Q,t,e,n,i),this._ctx&&this._ctx.quadraticCurveTo(t,e,n,i),this._xi=n,this._yi=i,this},t.prototype.arc=function(t,e,n,i,r,o){this._drawPendingPt(),Xa[0]=i,Xa[1]=r,ja(Xa,o),i=Xa[0];var a=(r=Xa[1])-i;return this.addData(La.A,t,e,n,n,i,a,0,o?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,o),this._xi=Fa(r)*n+t,this._yi=Ga(r)*n+e,this},t.prototype.arcTo=function(t,e,n,i,r){return this._drawPendingPt(),this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},t.prototype.rect=function(t,e,n,i){return this._drawPendingPt(),this._ctx&&this._ctx.rect(t,e,n,i),this.addData(La.R,t,e,n,i),this},t.prototype.closePath=function(){this._drawPendingPt(),this.addData(La.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&t.closePath(),this._xi=e,this._yi=n,this},t.prototype.fill=function(t){t&&t.fill(),this.toStatic()},t.prototype.stroke=function(t){t&&t.stroke(),this.toStatic()},t.prototype.len=function(){return this._len},t.prototype.setData=function(t){var e=t.length;this.data&&this.data.length===e||!Ua||(this.data=new Float32Array(e));for(var n=0;n<e;n++)this.data[n]=t[n];this._len=e},t.prototype.appendPath=function(t){t instanceof Array||(t=[t]);for(var e=t.length,n=0,i=this._len,r=0;r<e;r++)n+=t[r].len();Ua&&this.data instanceof Float32Array&&(this.data=new Float32Array(i+n));for(r=0;r<e;r++)for(var o=t[r].data,a=0;a<o.length;a++)this.data[i++]=o[a];this._len=i},t.prototype.addData=function(t,e,n,i,r,o,a,s,l){if(this._saveData){var u=this.data;this._len+arguments.length>u.length&&(this._expandData(),u=this.data);for(var h=0;h<arguments.length;h++)u[this._len++]=arguments[h]}},t.prototype._drawPendingPt=function(){this._pendingPtDist>0&&(this._ctx&&this._ctx.lineTo(this._pendingPtX,this._pendingPtY),this._pendingPtDist=0)},t.prototype._expandData=function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},t.prototype.toStatic=function(){if(this._saveData){this._drawPendingPt();var t=this.data;t instanceof Array&&(t.length=this._len,Ua&&this._len>11&&(this.data=new Float32Array(t)))}},t.prototype.getBoundingRect=function(){Ra[0]=Ra[1]=Ea[0]=Ea[1]=Number.MAX_VALUE,Na[0]=Na[1]=za[0]=za[1]=-Number.MAX_VALUE;var t,e=this.data,n=0,i=0,r=0,o=0;for(t=0;t<this._len;){var a=e[t++],s=1===t;switch(s&&(r=n=e[t],o=i=e[t+1]),a){case La.M:n=r=e[t++],i=o=e[t++],Ea[0]=r,Ea[1]=o,za[0]=r,za[1]=o;break;case La.L:Ia(n,i,e[t],e[t+1],Ea,za),n=e[t++],i=e[t++];break;case La.C:Da(n,i,e[t++],e[t++],e[t++],e[t++],e[t],e[t+1],Ea,za),n=e[t++],i=e[t++];break;case La.Q:Aa(n,i,e[t++],e[t++],e[t],e[t+1],Ea,za),n=e[t++],i=e[t++];break;case La.A:var l=e[t++],u=e[t++],h=e[t++],c=e[t++],p=e[t++],d=e[t++]+p;t+=1;var f=!e[t++];s&&(r=Fa(p)*h+l,o=Ga(p)*c+u),ka(l,u,h,c,p,d,f,Ea,za),n=Fa(d)*h+l,i=Ga(d)*c+u;break;case La.R:Ia(r=n=e[t++],o=i=e[t++],r+e[t++],o+e[t++],Ea,za);break;case La.Z:n=r,i=o}Gt(Ra,Ra,Ea),Wt(Na,Na,za)}return 0===t&&(Ra[0]=Ra[1]=Na[0]=Na[1]=0),new sr(Ra[0],Ra[1],Na[0]-Ra[0],Na[1]-Ra[1])},t.prototype._calculateLength=function(){var t=this.data,e=this._len,n=this._ux,i=this._uy,r=0,o=0,a=0,s=0;this._pathSegLen||(this._pathSegLen=[]);for(var l=this._pathSegLen,u=0,h=0,c=0;c<e;){var p=t[c++],d=1===c;d&&(a=r=t[c],s=o=t[c+1]);var f=-1;switch(p){case La.M:r=a=t[c++],o=s=t[c++];break;case La.L:var g=t[c++],y=(x=t[c++])-o;(Wa(A=g-r)>n||Wa(y)>i||c===e-1)&&(f=Math.sqrt(A*A+y*y),r=g,o=x);break;case La.C:var v=t[c++],m=t[c++],x=(g=t[c++],t[c++]),_=t[c++],b=t[c++];f=qe(r,o,v,m,g,x,_,b,10),r=_,o=b;break;case La.Q:f=en(r,o,v=t[c++],m=t[c++],g=t[c++],x=t[c++],10),r=g,o=x;break;case La.A:var w=t[c++],S=t[c++],M=t[c++],I=t[c++],T=t[c++],C=t[c++],D=C+T;c+=1;t[c++];d&&(a=Fa(T)*M+w,s=Ga(T)*I+S),f=Ba(M,I)*Va(Ya,Math.abs(C)),r=Fa(D)*M+w,o=Ga(D)*I+S;break;case La.R:a=r=t[c++],s=o=t[c++],f=2*t[c++]+2*t[c++];break;case La.Z:var A=a-r;y=s-o;f=Math.sqrt(A*A+y*y),r=a,o=s}f>=0&&(l[h++]=f,u+=f)}return this._pathLen=u,u},t.prototype.rebuildPath=function(t,e){var n,i,r,o,a,s,l,u,h,c,p=this.data,d=this._ux,f=this._uy,g=this._len,y=e<1,v=0,m=0,x=0;if(!y||(this._pathSegLen||this._calculateLength(),l=this._pathSegLen,u=e*this._pathLen))t:for(var _=0;_<g;){var b=p[_++],w=1===_;switch(w&&(n=r=p[_],i=o=p[_+1]),b!==La.L&&x>0&&(t.lineTo(h,c),x=0),b){case La.M:n=r=p[_++],i=o=p[_++],t.moveTo(r,o);break;case La.L:a=p[_++],s=p[_++];var S=Wa(a-r),M=Wa(s-o);if(S>d||M>f){if(y){if(v+(j=l[m++])>u){var I=(u-v)/j;t.lineTo(r*(1-I)+a*I,o*(1-I)+s*I);break t}v+=j}t.lineTo(a,s),r=a,o=s,x=0}else{var T=S*S+M*M;T>x&&(h=a,c=s,x=T)}break;case La.C:var C=p[_++],D=p[_++],A=p[_++],k=p[_++],L=p[_++],P=p[_++];if(y){if(v+(j=l[m++])>u){Ze(r,C,A,L,I=(u-v)/j,Pa),Ze(o,D,k,P,I,Oa),t.bezierCurveTo(Pa[1],Oa[1],Pa[2],Oa[2],Pa[3],Oa[3]);break t}v+=j}t.bezierCurveTo(C,D,A,k,L,P),r=L,o=P;break;case La.Q:C=p[_++],D=p[_++],A=p[_++],k=p[_++];if(y){if(v+(j=l[m++])>u){Qe(r,C,A,I=(u-v)/j,Pa),Qe(o,D,k,I,Oa),t.quadraticCurveTo(Pa[1],Oa[1],Pa[2],Oa[2]);break t}v+=j}t.quadraticCurveTo(C,D,A,k),r=A,o=k;break;case La.A:var O=p[_++],R=p[_++],N=p[_++],E=p[_++],z=p[_++],V=p[_++],B=p[_++],F=!p[_++],G=N>E?N:E,W=Wa(N-E)>.001,H=z+V,Y=!1;if(y)v+(j=l[m++])>u&&(H=z+V*(u-v)/j,Y=!0),v+=j;if(W&&t.ellipse?t.ellipse(O,R,N,E,B,z,H,F):t.arc(O,R,G,z,H,F),Y)break t;w&&(n=Fa(z)*N+O,i=Ga(z)*E+R),r=Fa(H)*N+O,o=Ga(H)*E+R;break;case La.R:n=r=p[_],i=o=p[_+1],a=p[_++],s=p[_++];var U=p[_++],X=p[_++];if(y){if(v+(j=l[m++])>u){var Z=u-v;t.moveTo(a,s),t.lineTo(a+Va(Z,U),s),(Z-=U)>0&&t.lineTo(a+U,s+Va(Z,X)),(Z-=X)>0&&t.lineTo(a+Ba(U-Z,0),s+X),(Z-=U)>0&&t.lineTo(a,s+Ba(X-Z,0));break t}v+=j}t.rect(a,s,U,X);break;case La.Z:if(y){var j;if(v+(j=l[m++])>u){I=(u-v)/j;t.lineTo(r*(1-I)+n*I,o*(1-I)+i*I);break t}v+=j}t.closePath(),r=n,o=i}}},t.prototype.clone=function(){var e=new t,n=this.data;return e.data=n.slice?n.slice():Array.prototype.slice.call(n),e._len=this._len,e},t.CMD=La,t.initDefaultProps=function(){var e=t.prototype;e._saveData=!0,e._ux=0,e._uy=0,e._pendingPtDist=0,e._version=0}(),t}();function Ka(t,e,n,i,r,o,a){if(0===r)return!1;var s=r,l=0;if(a>e+s&&a>i+s||a<e-s&&a<i-s||o>t+s&&o>n+s||o<t-s&&o<n-s)return!1;if(t===n)return Math.abs(o-t)<=s/2;var u=(l=(e-i)/(t-n))*o-a+(t*i-n*e)/(t-n);return u*u/(l*l+1)<=s/2*s/2}function $a(t,e,n,i,r,o,a,s,l,u,h){if(0===l)return!1;var c=l;return!(h>e+c&&h>i+c&&h>o+c&&h>s+c||h<e-c&&h<i-c&&h<o-c&&h<s-c||u>t+c&&u>n+c&&u>r+c&&u>a+c||u<t-c&&u<n-c&&u<r-c&&u<a-c)&&je(t,e,n,i,r,o,a,s,u,h,null)<=c/2}function Ja(t,e,n,i,r,o,a,s,l){if(0===a)return!1;var u=a;return!(l>e+u&&l>i+u&&l>o+u||l<e-u&&l<i-u&&l<o-u||s>t+u&&s>n+u&&s>r+u||s<t-u&&s<n-u&&s<r-u)&&tn(t,e,n,i,r,o,s,l,null)<=u/2}var Qa=2*Math.PI;function ts(t){return(t%=Qa)<0&&(t+=Qa),t}var es=2*Math.PI;function ns(t,e,n,i,r,o,a,s,l){if(0===a)return!1;var u=a;s-=t,l-=e;var h=Math.sqrt(s*s+l*l);if(h-u>n||h+u<n)return!1;if(Math.abs(i-r)%es<1e-4)return!0;if(o){var c=i;i=ts(r),r=ts(c)}else i=ts(i),r=ts(r);i>r&&(r+=es);var p=Math.atan2(l,s);return p<0&&(p+=es),p>=i&&p<=r||p+es>=i&&p+es<=r}function is(t,e,n,i,r,o){if(o>e&&o>i||o<e&&o<i)return 0;if(i===e)return 0;var a=(o-e)/(i-e),s=i<e?1:-1;1!==a&&0!==a||(s=i<e?.5:-.5);var l=a*(n-t)+t;return l===r?1/0:l>r?s:0}var rs=qa.CMD,os=2*Math.PI;var as=[-1,-1,-1],ss=[-1,-1];function ls(t,e,n,i,r,o,a,s,l,u){if(u>e&&u>i&&u>o&&u>s||u<e&&u<i&&u<o&&u<s)return 0;var h,c=Ue(e,i,o,s,u,as);if(0===c)return 0;for(var p=0,d=-1,f=void 0,g=void 0,y=0;y<c;y++){var v=as[y],m=0===v||1===v?.5:1;He(t,n,r,a,v)<l||(d<0&&(d=Xe(e,i,o,s,ss),ss[1]<ss[0]&&d>1&&(h=void 0,h=ss[0],ss[0]=ss[1],ss[1]=h),f=He(e,i,o,s,ss[0]),d>1&&(g=He(e,i,o,s,ss[1]))),2===d?v<ss[0]?p+=f<e?m:-m:v<ss[1]?p+=g<f?m:-m:p+=s<g?m:-m:v<ss[0]?p+=f<e?m:-m:p+=s<f?m:-m)}return p}function us(t,e,n,i,r,o,a,s){if(s>e&&s>i&&s>o||s<e&&s<i&&s<o)return 0;var l=function(t,e,n,i,r){var o=t-2*e+n,a=2*(e-t),s=t-i,l=0;if(Ge(o))We(a)&&(h=-s/a)>=0&&h<=1&&(r[l++]=h);else{var u=a*a-4*o*s;if(Ge(u))(h=-a/(2*o))>=0&&h<=1&&(r[l++]=h);else if(u>0){var h,c=Oe(u),p=(-a-c)/(2*o);(h=(-a+c)/(2*o))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}(e,i,o,s,as);if(0===l)return 0;var u=Je(e,i,o);if(u>=0&&u<=1){for(var h=0,c=Ke(e,i,o,u),p=0;p<l;p++){var d=0===as[p]||1===as[p]?.5:1;Ke(t,n,r,as[p])<a||(as[p]<u?h+=c<e?d:-d:h+=o<c?d:-d)}return h}d=0===as[0]||1===as[0]?.5:1;return Ke(t,n,r,as[0])<a?0:o<e?d:-d}function hs(t,e,n,i,r,o,a,s){if((s-=e)>n||s<-n)return 0;var l=Math.sqrt(n*n-s*s);as[0]=-l,as[1]=l;var u=Math.abs(i-r);if(u<1e-4)return 0;if(u>=os-1e-4){i=0,r=os;var h=o?1:-1;return a>=as[0]+t&&a<=as[1]+t?h:0}if(i>r){var c=i;i=r,r=c}i<0&&(i+=os,r+=os);for(var p=0,d=0;d<2;d++){var f=as[d];if(f+t>a){var g=Math.atan2(s,f);h=o?1:-1;g<0&&(g=os+g),(g>=i&&g<=r||g+os>=i&&g+os<=r)&&(g>Math.PI/2&&g<1.5*Math.PI&&(h=-h),p+=h)}}return p}function cs(t,e,n,i,r){for(var o,a,s,l,u=t.data,h=t.len(),c=0,p=0,d=0,f=0,g=0,y=0;y<h;){var v=u[y++],m=1===y;switch(v===rs.M&&y>1&&(n||(c+=is(p,d,f,g,i,r))),m&&(f=p=u[y],g=d=u[y+1]),v){case rs.M:p=f=u[y++],d=g=u[y++];break;case rs.L:if(n){if(Ka(p,d,u[y],u[y+1],e,i,r))return!0}else c+=is(p,d,u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case rs.C:if(n){if($a(p,d,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=ls(p,d,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case rs.Q:if(n){if(Ja(p,d,u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=us(p,d,u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case rs.A:var x=u[y++],_=u[y++],b=u[y++],w=u[y++],S=u[y++],M=u[y++];y+=1;var I=!!(1-u[y++]);o=Math.cos(S)*b+x,a=Math.sin(S)*w+_,m?(f=o,g=a):c+=is(p,d,o,a,i,r);var T=(i-x)*w/b+x;if(n){if(ns(x,_,w,S,S+M,I,e,T,r))return!0}else c+=hs(x,_,w,S,S+M,I,T,r);p=Math.cos(S+M)*b+x,d=Math.sin(S+M)*w+_;break;case rs.R:if(f=p=u[y++],g=d=u[y++],o=f+u[y++],a=g+u[y++],n){if(Ka(f,g,o,g,e,i,r)||Ka(o,g,o,a,e,i,r)||Ka(o,a,f,a,e,i,r)||Ka(f,a,f,g,e,i,r))return!0}else c+=is(o,g,o,a,i,r),c+=is(f,a,f,g,i,r);break;case rs.Z:if(n){if(Ka(p,d,f,g,e,i,r))return!0}else c+=is(p,d,f,g,i,r);p=f,d=g}}return n||(s=d,l=g,Math.abs(s-l)<1e-4)||(c+=is(p,d,f,g,i,r)||0),0!==c}var ps=k({fill:"#000",stroke:null,strokePercent:1,fillOpacity:1,strokeOpacity:1,lineDashOffset:0,lineWidth:1,lineCap:"butt",miterLimit:10,strokeNoScale:!1,strokeFirst:!1},ua),ds={style:k({fill:!0,stroke:!0,strokePercent:!0,fillOpacity:!0,strokeOpacity:!0,lineDashOffset:!0,lineWidth:!0,miterLimit:!0},ha.style)},fs=Ki.concat(["invisible","culling","z","z2","zlevel","parent"]),gs=function(t){function e(e){return t.call(this,e)||this}var i;return n(e,t),e.prototype.update=function(){var n=this;t.prototype.update.call(this);var i=this.style;if(i.decal){var r=this._decalEl=this._decalEl||new e;r.buildPath===e.prototype.buildPath&&(r.buildPath=function(t){n.buildPath(t,n.shape)}),r.silent=!0;var o=r.style;for(var a in i)o[a]!==i[a]&&(o[a]=i[a]);o.fill=i.fill?i.decal:null,o.decal=null,o.shadowColor=null,i.strokeFirst&&(o.stroke=null);for(var s=0;s<fs.length;++s)r[fs[s]]=this[fs[s]];r.__dirty|=1}else this._decalEl&&(this._decalEl=null)},e.prototype.getDecalElement=function(){return this._decalEl},e.prototype._init=function(e){var n=G(e);this.shape=this.getDefaultShape();var i=this.getDefaultStyle();i&&this.useStyle(i);for(var r=0;r<n.length;r++){var o=n[r],a=e[o];"style"===o?this.style?A(this.style,a):this.useStyle(a):"shape"===o?A(this.shape,a):t.prototype.attrKV.call(this,o,a)}this.style||this.useStyle({})},e.prototype.getDefaultStyle=function(){return null},e.prototype.getDefaultShape=function(){return{}},e.prototype.canBeInsideText=function(){return this.hasFill()},e.prototype.getInsideTextFill=function(){var t=this.style.fill;if("none"!==t){if(X(t)){var e=Ln(t,0);return e>.5?ki:e>.2?"#eee":Li}if(t)return Li}return ki},e.prototype.getInsideTextStroke=function(t){var e=this.style.fill;if(X(e)){var n=this.__zr;if(!(!n||!n.isDarkMode())===Ln(t,0)<.4)return e}},e.prototype.buildPath=function(t,e,n){},e.prototype.pathUpdated=function(){this.__dirty&=-5},e.prototype.getUpdatedPathProxy=function(t){return!this.path&&this.createPathProxy(),this.path.beginPath(),this.buildPath(this.path,this.shape,t),this.path},e.prototype.createPathProxy=function(){this.path=new qa(!1)},e.prototype.hasStroke=function(){var t=this.style,e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))},e.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},e.prototype.getBoundingRect=function(){var t=this._rect,e=this.style,n=!t;if(n){var i=!1;this.path||(i=!0,this.createPathProxy());var r=this.path;(i||4&this.__dirty)&&(r.beginPath(),this.buildPath(r,this.shape,!1),this.pathUpdated()),t=r.getBoundingRect()}if(this._rect=t,this.hasStroke()&&this.path&&this.path.len()>0){var o=this._rectStroke||(this._rectStroke=t.clone());if(this.__dirty||n){o.copy(t);var a=e.strokeNoScale?this.getLineScale():1,s=e.lineWidth;if(!this.hasFill()){var l=this.strokeContainThreshold;s=Math.max(s,null==l?4:l)}a>1e-10&&(o.width+=s/a,o.height+=s/a,o.x-=s/a/2,o.y-=s/a/2)}return o}return t},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var o=this.path;if(this.hasStroke()){var a=r.lineWidth,s=r.strokeNoScale?this.getLineScale():1;if(s>1e-10&&(this.hasFill()||(a=Math.max(a,this.strokeContainThreshold)),function(t,e,n,i){return cs(t,e,!0,n,i)}(o,a/s,t,e)))return!0}if(this.hasFill())return function(t,e,n){return cs(t,0,!1,e,n)}(o,t,e)}return!1},e.prototype.dirtyShape=function(){this.__dirty|=4,this._rect&&(this._rect=null),this._decalEl&&this._decalEl.dirtyShape(),this.markRedraw()},e.prototype.dirty=function(){this.dirtyStyle(),this.dirtyShape()},e.prototype.animateShape=function(t){return this.animate("shape",t)},e.prototype.updateDuringAnimation=function(t){"style"===t?this.dirtyStyle():"shape"===t?this.dirtyShape():this.markRedraw()},e.prototype.attrKV=function(e,n){"shape"===e?this.setShape(n):t.prototype.attrKV.call(this,e,n)},e.prototype.setShape=function(t,e){var n=this.shape;return n||(n=this.shape={}),"string"==typeof t?n[t]=e:A(n,t),this.dirtyShape(),this},e.prototype.shapeChanged=function(){return!!(4&this.__dirty)},e.prototype.createStyle=function(t){return yt(ps,t)},e.prototype._innerSaveToNormal=function(e){t.prototype._innerSaveToNormal.call(this,e);var n=this._normalState;e.shape&&!n.shape&&(n.shape=A({},this.shape))},e.prototype._applyStateObj=function(e,n,i,r,o,a){t.prototype._applyStateObj.call(this,e,n,i,r,o,a);var s,l=!(n&&r);if(n&&n.shape?o?r?s=n.shape:(s=A({},i.shape),A(s,n.shape)):(s=A({},r?this.shape:i.shape),A(s,n.shape)):l&&(s=i.shape),s)if(o){this.shape=A({},this.shape);for(var u={},h=G(s),c=0;c<h.length;c++){var p=h[c];"object"==typeof s[p]?this.shape[p]=s[p]:u[p]=s[p]}this._transitionState(e,{shape:u},a)}else this.shape=s,this.dirtyShape()},e.prototype._mergeStates=function(e){for(var n,i=t.prototype._mergeStates.call(this,e),r=0;r<e.length;r++){var o=e[r];o.shape&&(n=n||{},this._mergeStyle(n,o.shape))}return n&&(i.shape=n),i},e.prototype.getAnimationStyleProps=function(){return ds},e.prototype.isZeroArea=function(){return!1},e.extend=function(t){var i=function(e){function i(n){var i=e.call(this,n)||this;return t.init&&t.init.call(i,n),i}return n(i,e),i.prototype.getDefaultStyle=function(){return T(t.style)},i.prototype.getDefaultShape=function(){return T(t.shape)},i}(e);for(var r in t)"function"==typeof t[r]&&(i.prototype[r]=t[r]);return i},e.initDefaultProps=((i=e.prototype).type="path",i.strokeContainThreshold=5,i.segmentIgnoreThreshold=0,i.subPixelOptimize=!1,i.autoBatch=!1,void(i.__dirty=7)),e}(da),ys=k({strokeFirst:!0,font:a,x:0,y:0,textAlign:"left",textBaseline:"top",miterLimit:2},ps),vs=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.hasStroke=function(){var t=this.style,e=t.stroke;return null!=e&&"none"!==e&&t.lineWidth>0},e.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},e.prototype.createStyle=function(t){return yt(ys,t)},e.prototype.setBoundingRect=function(t){this._rect=t},e.prototype.getBoundingRect=function(){var t=this.style;if(!this._rect){var e=t.text;null!=e?e+="":e="";var n=cr(e,t.font,t.textAlign,t.textBaseline);if(n.x+=t.x||0,n.y+=t.y||0,this.hasStroke()){var i=t.lineWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect},e.initDefaultProps=void(e.prototype.dirtyRectTolerance=10),e}(da);vs.prototype.type="tspan";var ms=k({x:0,y:0},ua),xs={style:k({x:!0,y:!0,width:!0,height:!0,sx:!0,sy:!0,sWidth:!0,sHeight:!0},ha.style)};var _s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.createStyle=function(t){return yt(ms,t)},e.prototype._getSize=function(t){var e=this.style,n=e[t];if(null!=n)return n;var i,r=(i=e.image)&&"string"!=typeof i&&i.width&&i.height?e.image:this.__image;if(!r)return 0;var o="width"===t?"height":"width",a=e[o];return null==a?r[t]:r[t]/r[o]*a},e.prototype.getWidth=function(){return this._getSize("width")},e.prototype.getHeight=function(){return this._getSize("height")},e.prototype.getAnimationStyleProps=function(){return xs},e.prototype.getBoundingRect=function(){var t=this.style;return this._rect||(this._rect=new sr(t.x||0,t.y||0,this.getWidth(),this.getHeight())),this._rect},e}(da);_s.prototype.type="image";var bs=Math.round;function ws(t,e,n){if(e){var i=e.x1,r=e.x2,o=e.y1,a=e.y2;t.x1=i,t.x2=r,t.y1=o,t.y2=a;var s=n&&n.lineWidth;return s?(bs(2*i)===bs(2*r)&&(t.x1=t.x2=Ms(i,s,!0)),bs(2*o)===bs(2*a)&&(t.y1=t.y2=Ms(o,s,!0)),t):t}}function Ss(t,e,n){if(e){var i=e.x,r=e.y,o=e.width,a=e.height;t.x=i,t.y=r,t.width=o,t.height=a;var s=n&&n.lineWidth;return s?(t.x=Ms(i,s,!0),t.y=Ms(r,s,!0),t.width=Math.max(Ms(i+o,s,!1)-t.x,0===o?0:1),t.height=Math.max(Ms(r+a,s,!1)-t.y,0===a?0:1),t):t}}function Ms(t,e,n){if(!e)return t;var i=bs(2*t);return(i+bs(e))%2==0?i/2:(i+(n?1:-1))/2}var Is=function(){this.x=0,this.y=0,this.width=0,this.height=0},Ts={},Cs=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Is},e.prototype.buildPath=function(t,e){var n,i,r,o;if(this.subPixelOptimize){var a=Ss(Ts,e,this.style);n=a.x,i=a.y,r=a.width,o=a.height,a.r=e.r,e=a}else n=e.x,i=e.y,r=e.width,o=e.height;e.r?function(t,e){var n,i,r,o,a,s=e.x,l=e.y,u=e.width,h=e.height,c=e.r;u<0&&(s+=u,u=-u),h<0&&(l+=h,h=-h),"number"==typeof c?n=i=r=o=c:c instanceof Array?1===c.length?n=i=r=o=c[0]:2===c.length?(n=r=c[0],i=o=c[1]):3===c.length?(n=c[0],i=o=c[1],r=c[2]):(n=c[0],i=c[1],r=c[2],o=c[3]):n=i=r=o=0,n+i>u&&(n*=u/(a=n+i),i*=u/a),r+o>u&&(r*=u/(a=r+o),o*=u/a),i+r>h&&(i*=h/(a=i+r),r*=h/a),n+o>h&&(n*=h/(a=n+o),o*=h/a),t.moveTo(s+n,l),t.lineTo(s+u-i,l),0!==i&&t.arc(s+u-i,l+i,i,-Math.PI/2,0),t.lineTo(s+u,l+h-r),0!==r&&t.arc(s+u-r,l+h-r,r,0,Math.PI/2),t.lineTo(s+o,l+h),0!==o&&t.arc(s+o,l+h-o,o,Math.PI/2,Math.PI),t.lineTo(s,l+n),0!==n&&t.arc(s+n,l+n,n,Math.PI,1.5*Math.PI)}(t,e):t.rect(n,i,r,o)},e.prototype.isZeroArea=function(){return!this.shape.width||!this.shape.height},e}(gs);Cs.prototype.type="rect";var Ds={fill:"#000"},As={style:k({fill:!0,stroke:!0,fillOpacity:!0,strokeOpacity:!0,lineWidth:!0,fontSize:!0,lineHeight:!0,width:!0,height:!0,textShadowColor:!0,textShadowBlur:!0,textShadowOffsetX:!0,textShadowOffsetY:!0,backgroundColor:!0,padding:!0,borderColor:!0,borderWidth:!0,borderRadius:!0},ha.style)},ks=function(t){function e(e){var n=t.call(this)||this;return n.type="text",n._children=[],n._defaultStyle=Ds,n.attr(e),n}return n(e,t),e.prototype.childrenRef=function(){return this._children},e.prototype.update=function(){t.prototype.update.call(this),this.styleChanged()&&this._updateSubTexts();for(var e=0;e<this._children.length;e++){var n=this._children[e];n.zlevel=this.zlevel,n.z=this.z,n.z2=this.z2,n.culling=this.culling,n.cursor=this.cursor,n.invisible=this.invisible}},e.prototype.updateTransform=function(){var e=this.innerTransformable;e?(e.updateTransform(),e.transform&&(this.transform=e.transform)):t.prototype.updateTransform.call(this)},e.prototype.getLocalTransform=function(e){var n=this.innerTransformable;return n?n.getLocalTransform(e):t.prototype.getLocalTransform.call(this,e)},e.prototype.getComputedTransform=function(){return this.__hostTarget&&(this.__hostTarget.getComputedTransform(),this.__hostTarget.updateInnerText(!0)),t.prototype.getComputedTransform.call(this)},e.prototype._updateSubTexts=function(){var t;this._childCursor=0,zs(t=this.style),E(t.rich,zs),this.style.rich?this._updateRichTexts():this._updatePlainTexts(),this._children.length=this._childCursor,this.styleUpdated()},e.prototype.addSelfToZr=function(e){t.prototype.addSelfToZr.call(this,e);for(var n=0;n<this._children.length;n++)this._children[n].__zr=e},e.prototype.removeSelfFromZr=function(e){t.prototype.removeSelfFromZr.call(this,e);for(var n=0;n<this._children.length;n++)this._children[n].__zr=null},e.prototype.getBoundingRect=function(){if(this.styleChanged()&&this._updateSubTexts(),!this._rect){for(var t=new sr(0,0,0,0),e=this._children,n=[],i=null,r=0;r<e.length;r++){var o=e[r],a=o.getBoundingRect(),s=o.getLocalTransform(n);s?(t.copy(a),t.applyTransform(s),(i=i||t.clone()).union(t)):(i=i||a.clone()).union(a)}this._rect=i||t}return this._rect},e.prototype.setDefaultTextStyle=function(t){this._defaultStyle=t||Ds},e.prototype.setTextContent=function(t){0},e.prototype._mergeStyle=function(t,e){if(!e)return t;var n=e.rich,i=t.rich||n&&{};return A(t,e),n&&i?(this._mergeRich(i,n),t.rich=i):i&&(t.rich=i),t},e.prototype._mergeRich=function(t,e){for(var n=G(e),i=0;i<n.length;i++){var r=n[i];t[r]=t[r]||{},A(t[r],e[r])}},e.prototype.getAnimationStyleProps=function(){return As},e.prototype._getOrCreateChild=function(t){var e=this._children[this._childCursor];return e&&e instanceof t||(e=new t),this._children[this._childCursor++]=e,e.__zr=this.__zr,e.parent=this,e},e.prototype._updatePlainTexts=function(){var t=this.style,e=t.font||a,n=t.padding,i=function(t,e){null!=t&&(t+="");var n,i=e.overflow,r=e.padding,o=e.font,a="truncate"===i,s=fr(o),l=rt(e.lineHeight,s),u=!!e.backgroundColor,h="truncate"===e.lineOverflow,c=e.width,p=(n=null==c||"break"!==i&&"breakAll"!==i?t?t.split("\n"):[]:t?sa(t,e.font,c,"breakAll"===i,0).lines:[]).length*l,d=rt(e.height,p);if(p>d&&h){var f=Math.floor(d/l);n=n.slice(0,f)}if(t&&a&&null!=c)for(var g=Jo(c,o,e.ellipsis,{minChar:e.truncateMinChar,placeholder:e.placeholder}),y=0;y<n.length;y++)n[y]=Qo(n[y],g);var v=d,m=0;for(y=0;y<n.length;y++)m=Math.max(ur(n[y],o),m);null==c&&(c=m);var x=m;return r&&(v+=r[0]+r[2],x+=r[1]+r[3],c+=r[1]+r[3]),u&&(x=c),{lines:n,height:d,outerWidth:x,outerHeight:v,lineHeight:l,calculatedLineHeight:s,contentWidth:m,contentHeight:p,width:c}}(Gs(t),t),r=Ws(t),o=!!t.backgroundColor,s=i.outerHeight,l=i.outerWidth,u=i.contentWidth,h=i.lines,c=i.lineHeight,p=this._defaultStyle,d=t.x||0,f=t.y||0,g=t.align||p.align||"left",y=t.verticalAlign||p.verticalAlign||"top",v=d,m=dr(f,i.contentHeight,y);if(r||n){var x=pr(d,l,g),_=dr(f,s,y);r&&this._renderBackground(t,t,x,_,l,s)}m+=c/2,n&&(v=Fs(d,g,n),"top"===y?m+=n[0]:"bottom"===y&&(m-=n[2]));for(var b=0,w=!1,S=(Bs("fill"in t?t.fill:(w=!0,p.fill))),M=(Vs("stroke"in t?t.stroke:o||p.autoStroke&&!w?null:(b=2,p.stroke))),I=t.textShadowBlur>0,T=null!=t.width&&("truncate"===t.overflow||"break"===t.overflow||"breakAll"===t.overflow),C=i.calculatedLineHeight,D=0;D<h.length;D++){var A=this._getOrCreateChild(vs),k=A.createStyle();A.useStyle(k),k.text=h[D],k.x=v,k.y=m,g&&(k.textAlign=g),k.textBaseline="middle",k.opacity=t.opacity,k.strokeFirst=!0,I&&(k.shadowBlur=t.textShadowBlur||0,k.shadowColor=t.textShadowColor||"transparent",k.shadowOffsetX=t.textShadowOffsetX||0,k.shadowOffsetY=t.textShadowOffsetY||0),k.stroke=M,k.fill=S,M&&(k.lineWidth=t.lineWidth||b,k.lineDash=t.lineDash,k.lineDashOffset=t.lineDashOffset||0),k.font=e,Ns(k,t),m+=c,T&&A.setBoundingRect(new sr(pr(k.x,t.width,k.textAlign),dr(k.y,C,k.textBaseline),u,C))}},e.prototype._updateRichTexts=function(){var t=this.style,e=function(t,e){var n=new ia;if(null!=t&&(t+=""),!t)return n;for(var i,r=e.width,o=e.height,a=e.overflow,s="break"!==a&&"breakAll"!==a||null==r?null:{width:r,accumWidth:0,breakAll:"breakAll"===a},l=Ko.lastIndex=0;null!=(i=Ko.exec(t));){var u=i.index;u>l&&ra(n,t.substring(l,u),e,s),ra(n,i[2],e,s,i[1]),l=Ko.lastIndex}l<t.length&&ra(n,t.substring(l,t.length),e,s);var h=[],c=0,p=0,d=e.padding,f="truncate"===a,g="truncate"===e.lineOverflow;function y(t,e,n){t.width=e,t.lineHeight=n,c+=n,p=Math.max(p,e)}t:for(var v=0;v<n.lines.length;v++){for(var m=n.lines[v],x=0,_=0,b=0;b<m.tokens.length;b++){var w=(P=m.tokens[b]).styleName&&e.rich[P.styleName]||{},S=P.textPadding=w.padding,M=S?S[1]+S[3]:0,I=P.font=w.font||e.font;P.contentHeight=fr(I);var T=rt(w.height,P.contentHeight);if(P.innerHeight=T,S&&(T+=S[0]+S[2]),P.height=T,P.lineHeight=ot(w.lineHeight,e.lineHeight,T),P.align=w&&w.align||e.align,P.verticalAlign=w&&w.verticalAlign||"middle",g&&null!=o&&c+P.lineHeight>o){b>0?(m.tokens=m.tokens.slice(0,b),y(m,_,x),n.lines=n.lines.slice(0,v+1)):n.lines=n.lines.slice(0,v);break t}var C=w.width,D=null==C||"auto"===C;if("string"==typeof C&&"%"===C.charAt(C.length-1))P.percentWidth=C,h.push(P),P.contentWidth=ur(P.text,I);else{if(D){var A=w.backgroundColor,k=A&&A.image;k&&qo(k=Xo(k))&&(P.width=Math.max(P.width,k.width*T/k.height))}var L=f&&null!=r?r-_:null;null!=L&&L<P.width?!D||L<M?(P.text="",P.width=P.contentWidth=0):(P.text=$o(P.text,L-M,I,e.ellipsis,{minChar:e.truncateMinChar}),P.width=P.contentWidth=ur(P.text,I)):P.contentWidth=ur(P.text,I)}P.width+=M,_+=P.width,w&&(x=Math.max(x,P.lineHeight))}y(m,_,x)}for(n.outerWidth=n.width=rt(r,p),n.outerHeight=n.height=rt(o,c),n.contentHeight=c,n.contentWidth=p,d&&(n.outerWidth+=d[1]+d[3],n.outerHeight+=d[0]+d[2]),v=0;v<h.length;v++){var P,O=(P=h[v]).percentWidth;P.width=parseInt(O,10)/100*n.width}return n}(Gs(t),t),n=e.width,i=e.outerWidth,r=e.outerHeight,o=t.padding,a=t.x||0,s=t.y||0,l=this._defaultStyle,u=t.align||l.align,h=t.verticalAlign||l.verticalAlign,c=pr(a,i,u),p=dr(s,r,h),d=c,f=p;o&&(d+=o[3],f+=o[0]);var g=d+n;Ws(t)&&this._renderBackground(t,t,c,p,i,r);for(var y=!!t.backgroundColor,v=0;v<e.lines.length;v++){for(var m=e.lines[v],x=m.tokens,_=x.length,b=m.lineHeight,w=m.width,S=0,M=d,I=g,T=_-1,C=void 0;S<_&&(!(C=x[S]).align||"left"===C.align);)this._placeToken(C,t,b,f,M,"left",y),w-=C.width,M+=C.width,S++;for(;T>=0&&"right"===(C=x[T]).align;)this._placeToken(C,t,b,f,I,"right",y),w-=C.width,I-=C.width,T--;for(M+=(n-(M-d)-(g-I)-w)/2;S<=T;)C=x[S],this._placeToken(C,t,b,f,M+C.width/2,"center",y),M+=C.width,S++;f+=b}},e.prototype._placeToken=function(t,e,n,i,r,o,s){var l=e.rich[t.styleName]||{};l.text=t.text;var u=t.verticalAlign,h=i+n/2;"top"===u?h=i+t.height/2:"bottom"===u&&(h=i+n-t.height/2),!t.isLineHolder&&Ws(l)&&this._renderBackground(l,e,"right"===o?r-t.width:"center"===o?r-t.width/2:r,h-t.height/2,t.width,t.height);var c=!!l.backgroundColor,p=t.textPadding;p&&(r=Fs(r,o,p),h-=t.height/2-p[0]-t.innerHeight/2);var d=this._getOrCreateChild(vs),f=d.createStyle();d.useStyle(f);var g=this._defaultStyle,y=!1,v=0,m=Bs("fill"in l?l.fill:"fill"in e?e.fill:(y=!0,g.fill)),x=Vs("stroke"in l?l.stroke:"stroke"in e?e.stroke:c||s||g.autoStroke&&!y?null:(v=2,g.stroke)),_=l.textShadowBlur>0||e.textShadowBlur>0;f.text=t.text,f.x=r,f.y=h,_&&(f.shadowBlur=l.textShadowBlur||e.textShadowBlur||0,f.shadowColor=l.textShadowColor||e.textShadowColor||"transparent",f.shadowOffsetX=l.textShadowOffsetX||e.textShadowOffsetX||0,f.shadowOffsetY=l.textShadowOffsetY||e.textShadowOffsetY||0),f.textAlign=o,f.textBaseline="middle",f.font=t.font||a,f.opacity=ot(l.opacity,e.opacity,1),Ns(f,l),x&&(f.lineWidth=ot(l.lineWidth,e.lineWidth,v),f.lineDash=rt(l.lineDash,e.lineDash),f.lineDashOffset=e.lineDashOffset||0,f.stroke=x),m&&(f.fill=m);var b=t.contentWidth,w=t.contentHeight;d.setBoundingRect(new sr(pr(f.x,b,f.textAlign),dr(f.y,w,f.textBaseline),b,w))},e.prototype._renderBackground=function(t,e,n,i,r,o){var a,s,l,u=t.backgroundColor,h=t.borderWidth,c=t.borderColor,p=u&&u.image,d=u&&!p,f=t.borderRadius,g=this;if(d||t.lineHeight||h&&c){(a=this._getOrCreateChild(Cs)).useStyle(a.createStyle()),a.style.fill=null;var y=a.shape;y.x=n,y.y=i,y.width=r,y.height=o,y.r=f,a.dirtyShape()}if(d)(l=a.style).fill=u||null,l.fillOpacity=rt(t.fillOpacity,1);else if(p){(s=this._getOrCreateChild(_s)).onload=function(){g.dirtyStyle()};var v=s.style;v.image=u.image,v.x=n,v.y=i,v.width=r,v.height=o}h&&c&&((l=a.style).lineWidth=h,l.stroke=c,l.strokeOpacity=rt(t.strokeOpacity,1),l.lineDash=t.borderDash,l.lineDashOffset=t.borderDashOffset||0,a.strokeContainThreshold=0,a.hasFill()&&a.hasStroke()&&(l.strokeFirst=!0,l.lineWidth*=2));var m=(a||s).style;m.shadowBlur=t.shadowBlur||0,m.shadowColor=t.shadowColor||"transparent",m.shadowOffsetX=t.shadowOffsetX||0,m.shadowOffsetY=t.shadowOffsetY||0,m.opacity=ot(t.opacity,e.opacity,1)},e.makeFont=function(t){var e="";return Es(t)&&(e=[t.fontStyle,t.fontWeight,Rs(t.fontSize),t.fontFamily||"sans-serif"].join(" ")),e&&ut(e)||t.textFont||t.font},e}(da),Ls={left:!0,right:1,center:1},Ps={top:1,bottom:1,middle:1},Os=["fontStyle","fontWeight","fontSize","fontFamily"];function Rs(t){return"string"!=typeof t||-1===t.indexOf("px")&&-1===t.indexOf("rem")&&-1===t.indexOf("em")?isNaN(+t)?"12px":t+"px":t}function Ns(t,e){for(var n=0;n<Os.length;n++){var i=Os[n],r=e[i];null!=r&&(t[i]=r)}}function Es(t){return null!=t.fontSize||t.fontFamily||t.fontWeight}function zs(t){if(t){t.font=ks.makeFont(t);var e=t.align;"middle"===e&&(e="center"),t.align=null==e||Ls[e]?e:"left";var n=t.verticalAlign;"center"===n&&(n="middle"),t.verticalAlign=null==n||Ps[n]?n:"top",t.padding&&(t.padding=st(t.padding))}}function Vs(t,e){return null==t||e<=0||"transparent"===t||"none"===t?null:t.image||t.colorStops?"#000":t}function Bs(t){return null==t||"none"===t?null:t.image||t.colorStops?"#000":t}function Fs(t,e,n){return"right"===e?t-n[1]:"center"===e?t+n[3]/2-n[1]/2:t+n[3]}function Gs(t){var e=t.text;return null!=e&&(e+=""),e}function Ws(t){return!!(t.backgroundColor||t.lineHeight||t.borderWidth&&t.borderColor)}var Hs=So(),Ys=function(t,e,n,i){if(i){var r=Hs(i);r.dataIndex=n,r.dataType=e,r.seriesIndex=t,"group"===i.type&&i.traverse((function(i){var r=Hs(i);r.seriesIndex=t,r.dataIndex=n,r.dataType=e}))}},Us=1,Xs={},Zs=So(),js=So(),qs=["emphasis","blur","select"],Ks=["normal","emphasis","blur","select"],$s=10,Js="highlight",Qs="downplay",tl="select",el="unselect",nl="toggleSelect";function il(t){return null!=t&&"none"!==t}var rl=new ln(100);function ol(t){if(X(t)){var e=rl.get(t);return e||(e=Sn(t,-.1),rl.put(t,e)),e}if(Q(t)){var n=A({},t);return n.colorStops=z(t.colorStops,(function(t){return{offset:t.offset,color:Sn(t.color,-.1)}})),n}return t}function al(t,e,n){t.onHoverStateChange&&(t.hoverState||0)!==n&&t.onHoverStateChange(e),t.hoverState=n}function sl(t){al(t,"emphasis",2)}function ll(t){2===t.hoverState&&al(t,"normal",0)}function ul(t){al(t,"blur",1)}function hl(t){1===t.hoverState&&al(t,"normal",0)}function cl(t){t.selected=!0}function pl(t){t.selected=!1}function dl(t,e,n){e(t,n)}function fl(t,e,n){dl(t,e,n),t.isGroup&&t.traverse((function(t){dl(t,e,n)}))}function gl(t,e){switch(e){case"emphasis":t.hoverState=2;break;case"normal":t.hoverState=0;break;case"blur":t.hoverState=1;break;case"select":t.selected=!0}}function yl(t,e){var n=this.states[t];if(this.style){if("emphasis"===t)return function(t,e,n,i){var r=n&&P(n,"select")>=0,o=!1;if(t instanceof gs){var a=Zs(t),s=r&&a.selectFill||a.normalFill,l=r&&a.selectStroke||a.normalStroke;if(il(s)||il(l)){var u=(i=i||{}).style||{};"inherit"===u.fill?(o=!0,i=A({},i),(u=A({},u)).fill=s):!il(u.fill)&&il(s)?(o=!0,i=A({},i),(u=A({},u)).fill=ol(s)):!il(u.stroke)&&il(l)&&(o||(i=A({},i),u=A({},u)),u.stroke=ol(l)),i.style=u}}if(i&&null==i.z2){o||(i=A({},i));var h=t.z2EmphasisLift;i.z2=t.z2+(null!=h?h:$s)}return i}(this,0,e,n);if("blur"===t)return function(t,e,n){var i=P(t.currentStates,e)>=0,r=t.style.opacity,o=i?null:function(t,e,n,i){for(var r=t.style,o={},a=0;a<e.length;a++){var s=e[a],l=r[s];o[s]=null==l?i&&i[s]:l}for(a=0;a<t.animators.length;a++){var u=t.animators[a];u.__fromStateTransition&&u.__fromStateTransition.indexOf(n)<0&&"style"===u.targetName&&u.saveTo(o,e)}return o}(t,["opacity"],e,{opacity:1}),a=(n=n||{}).style||{};return null==a.opacity&&(n=A({},n),a=A({opacity:i?r:.1*o.opacity},a),n.style=a),n}(this,t,n);if("select"===t)return function(t,e,n){if(n&&null==n.z2){n=A({},n);var i=t.z2SelectLift;n.z2=t.z2+(null!=i?i:9)}return n}(this,0,n)}return n}function vl(t){t.stateProxy=yl;var e=t.getTextContent(),n=t.getTextGuideLine();e&&(e.stateProxy=yl),n&&(n.stateProxy=yl)}function ml(t,e){!Tl(t,e)&&!t.__highByOuter&&fl(t,sl)}function xl(t,e){!Tl(t,e)&&!t.__highByOuter&&fl(t,ll)}function _l(t,e){t.__highByOuter|=1<<(e||0),fl(t,sl)}function bl(t,e){!(t.__highByOuter&=~(1<<(e||0)))&&fl(t,ll)}function wl(t){fl(t,ul)}function Sl(t){fl(t,hl)}function Ml(t){fl(t,cl)}function Il(t){fl(t,pl)}function Tl(t,e){return t.__highDownSilentOnTouch&&e.zrByTouch}function Cl(t){var e=t.getModel(),n=[],i=[];e.eachComponent((function(e,r){var o=js(r),a="series"===e,s=a?t.getViewOfSeriesModel(r):t.getViewOfComponentModel(r);!a&&i.push(s),o.isBlured&&(s.group.traverse((function(t){hl(t)})),a&&n.push(r)),o.isBlured=!1})),E(i,(function(t){t&&t.toggleBlurSeries&&t.toggleBlurSeries(n,!1,e)}))}function Dl(t,e,n,i){var r=i.getModel();function o(t,e){for(var n=0;n<e.length;n++){var i=t.getItemGraphicEl(e[n]);i&&Sl(i)}}if(n=n||"coordinateSystem",null!=t&&e&&"none"!==e){var a=r.getSeriesByIndex(t),s=a.coordinateSystem;s&&s.master&&(s=s.master);var l=[];r.eachSeries((function(t){var r=a===t,u=t.coordinateSystem;if(u&&u.master&&(u=u.master),!("series"===n&&!r||"coordinateSystem"===n&&!(u&&s?u===s:r)||"series"===e&&r)){if(i.getViewOfSeriesModel(t).group.traverse((function(t){ul(t)})),N(e))o(t.getData(),e);else if(q(e))for(var h=G(e),c=0;c<h.length;c++)o(t.getData(h[c]),e[h[c]]);l.push(t),js(t).isBlured=!0}})),r.eachComponent((function(t,e){if("series"!==t){var n=i.getViewOfComponentModel(e);n&&n.toggleBlurSeries&&n.toggleBlurSeries(l,!0,r)}}))}}function Al(t,e,n){if(null!=t&&null!=e){var i=n.getModel().getComponent(t,e);if(i){js(i).isBlured=!0;var r=n.getViewOfComponentModel(i);r&&r.focusBlurEnabled&&r.group.traverse((function(t){ul(t)}))}}}function kl(t,e,n,i){var r={focusSelf:!1,dispatchers:null};if(null==t||"series"===t||null==e||null==n)return r;var o=i.getModel().getComponent(t,e);if(!o)return r;var a=i.getViewOfComponentModel(o);if(!a||!a.findHighDownDispatchers)return r;for(var s,l=a.findHighDownDispatchers(n),u=0;u<l.length;u++)if("self"===Hs(l[u]).focus){s=!0;break}return{focusSelf:s,dispatchers:l}}function Ll(t){E(t.getAllData(),(function(e){var n=e.data,i=e.type;n.eachItemGraphicEl((function(e,n){t.isSelected(n,i)?Ml(e):Il(e)}))}))}function Pl(t){var e=[];return t.eachSeries((function(t){E(t.getAllData(),(function(n){n.data;var i=n.type,r=t.getSelectedDataIndices();if(r.length>0){var o={dataIndex:r,seriesIndex:t.seriesIndex};null!=i&&(o.dataType=i),e.push(o)}}))})),e}function Ol(t,e,n){Bl(t,!0),fl(t,vl),Nl(t,e,n)}function Rl(t,e,n,i){i?function(t){Bl(t,!1)}(t):Ol(t,e,n)}function Nl(t,e,n){var i=Hs(t);null!=e?(i.focus=e,i.blurScope=n):i.focus&&(i.focus=null)}var El=["emphasis","blur","select"],zl={itemStyle:"getItemStyle",lineStyle:"getLineStyle",areaStyle:"getAreaStyle"};function Vl(t,e,n,i){n=n||"itemStyle";for(var r=0;r<El.length;r++){var o=El[r],a=e.getModel([o,n]);t.ensureState(o).style=i?i(a):a[zl[n]]()}}function Bl(t,e){var n=!1===e,i=t;t.highDownSilentOnTouch&&(i.__highDownSilentOnTouch=t.highDownSilentOnTouch),n&&!i.__highDownDispatcher||(i.__highByOuter=i.__highByOuter||0,i.__highDownDispatcher=!n)}function Fl(t){return!(!t||!t.__highDownDispatcher)}function Gl(t){var e=t.type;return e===tl||e===el||e===nl}function Wl(t){var e=t.type;return e===Js||e===Qs}var Hl=qa.CMD,Yl=[[],[],[]],Ul=Math.sqrt,Xl=Math.atan2;function Zl(t,e){if(e){var n,i,r,o,a,s,l=t.data,u=t.len(),h=Hl.M,c=Hl.C,p=Hl.L,d=Hl.R,f=Hl.A,g=Hl.Q;for(r=0,o=0;r<u;){switch(n=l[r++],o=r,i=0,n){case h:case p:i=1;break;case c:i=3;break;case g:i=2;break;case f:var y=e[4],v=e[5],m=Ul(e[0]*e[0]+e[1]*e[1]),x=Ul(e[2]*e[2]+e[3]*e[3]),_=Xl(-e[1]/x,e[0]/m);l[r]*=m,l[r++]+=y,l[r]*=x,l[r++]+=v,l[r++]*=m,l[r++]*=x,l[r++]+=_,l[r++]+=_,o=r+=2;break;case d:s[0]=l[r++],s[1]=l[r++],Ft(s,s,e),l[o++]=s[0],l[o++]=s[1],s[0]+=l[r++],s[1]+=l[r++],Ft(s,s,e),l[o++]=s[0],l[o++]=s[1]}for(a=0;a<i;a++){var b=Yl[a];b[0]=l[r++],b[1]=l[r++],Ft(b,b,e),l[o++]=b[0],l[o++]=b[1]}}t.increaseVersion()}}var jl=Math.sqrt,ql=Math.sin,Kl=Math.cos,$l=Math.PI;function Jl(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function Ql(t,e){return(t[0]*e[0]+t[1]*e[1])/(Jl(t)*Jl(e))}function tu(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(Ql(t,e))}function eu(t,e,n,i,r,o,a,s,l,u,h){var c=l*($l/180),p=Kl(c)*(t-n)/2+ql(c)*(e-i)/2,d=-1*ql(c)*(t-n)/2+Kl(c)*(e-i)/2,f=p*p/(a*a)+d*d/(s*s);f>1&&(a*=jl(f),s*=jl(f));var g=(r===o?-1:1)*jl((a*a*(s*s)-a*a*(d*d)-s*s*(p*p))/(a*a*(d*d)+s*s*(p*p)))||0,y=g*a*d/s,v=g*-s*p/a,m=(t+n)/2+Kl(c)*y-ql(c)*v,x=(e+i)/2+ql(c)*y+Kl(c)*v,_=tu([1,0],[(p-y)/a,(d-v)/s]),b=[(p-y)/a,(d-v)/s],w=[(-1*p-y)/a,(-1*d-v)/s],S=tu(b,w);if(Ql(b,w)<=-1&&(S=$l),Ql(b,w)>=1&&(S=0),S<0){var M=Math.round(S/$l*1e6)/1e6;S=2*$l+M%2*$l}h.addData(u,m,x,a,s,_,S,c,o)}var nu=/([mlvhzcqtsa])([^mlvhzcqtsa]*)/gi,iu=/-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g;var ru=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.applyTransform=function(t){},e}(gs);function ou(t){return null!=t.setData}function au(t,e){var n=function(t){var e=new qa;if(!t)return e;var n,i=0,r=0,o=i,a=r,s=qa.CMD,l=t.match(nu);if(!l)return e;for(var u=0;u<l.length;u++){for(var h=l[u],c=h.charAt(0),p=void 0,d=h.match(iu)||[],f=d.length,g=0;g<f;g++)d[g]=parseFloat(d[g]);for(var y=0;y<f;){var v=void 0,m=void 0,x=void 0,_=void 0,b=void 0,w=void 0,S=void 0,M=i,I=r,T=void 0,C=void 0;switch(c){case"l":i+=d[y++],r+=d[y++],p=s.L,e.addData(p,i,r);break;case"L":i=d[y++],r=d[y++],p=s.L,e.addData(p,i,r);break;case"m":i+=d[y++],r+=d[y++],p=s.M,e.addData(p,i,r),o=i,a=r,c="l";break;case"M":i=d[y++],r=d[y++],p=s.M,e.addData(p,i,r),o=i,a=r,c="L";break;case"h":i+=d[y++],p=s.L,e.addData(p,i,r);break;case"H":i=d[y++],p=s.L,e.addData(p,i,r);break;case"v":r+=d[y++],p=s.L,e.addData(p,i,r);break;case"V":r=d[y++],p=s.L,e.addData(p,i,r);break;case"C":p=s.C,e.addData(p,d[y++],d[y++],d[y++],d[y++],d[y++],d[y++]),i=d[y-2],r=d[y-1];break;case"c":p=s.C,e.addData(p,d[y++]+i,d[y++]+r,d[y++]+i,d[y++]+r,d[y++]+i,d[y++]+r),i+=d[y-2],r+=d[y-1];break;case"S":v=i,m=r,T=e.len(),C=e.data,n===s.C&&(v+=i-C[T-4],m+=r-C[T-3]),p=s.C,M=d[y++],I=d[y++],i=d[y++],r=d[y++],e.addData(p,v,m,M,I,i,r);break;case"s":v=i,m=r,T=e.len(),C=e.data,n===s.C&&(v+=i-C[T-4],m+=r-C[T-3]),p=s.C,M=i+d[y++],I=r+d[y++],i+=d[y++],r+=d[y++],e.addData(p,v,m,M,I,i,r);break;case"Q":M=d[y++],I=d[y++],i=d[y++],r=d[y++],p=s.Q,e.addData(p,M,I,i,r);break;case"q":M=d[y++]+i,I=d[y++]+r,i+=d[y++],r+=d[y++],p=s.Q,e.addData(p,M,I,i,r);break;case"T":v=i,m=r,T=e.len(),C=e.data,n===s.Q&&(v+=i-C[T-4],m+=r-C[T-3]),i=d[y++],r=d[y++],p=s.Q,e.addData(p,v,m,i,r);break;case"t":v=i,m=r,T=e.len(),C=e.data,n===s.Q&&(v+=i-C[T-4],m+=r-C[T-3]),i+=d[y++],r+=d[y++],p=s.Q,e.addData(p,v,m,i,r);break;case"A":x=d[y++],_=d[y++],b=d[y++],w=d[y++],S=d[y++],eu(M=i,I=r,i=d[y++],r=d[y++],w,S,x,_,b,p=s.A,e);break;case"a":x=d[y++],_=d[y++],b=d[y++],w=d[y++],S=d[y++],eu(M=i,I=r,i+=d[y++],r+=d[y++],w,S,x,_,b,p=s.A,e)}}"z"!==c&&"Z"!==c||(p=s.Z,e.addData(p),i=o,r=a),n=p}return e.toStatic(),e}(t),i=A({},e);return i.buildPath=function(t){if(ou(t)){t.setData(n.data),(e=t.getContext())&&t.rebuildPath(e,1)}else{var e=t;n.rebuildPath(e,1)}},i.applyTransform=function(t){Zl(n,t),this.dirtyShape()},i}function su(t,e){return new ru(au(t,e))}function lu(t,e){e=e||{};var n=new gs;return t.shape&&n.setShape(t.shape),n.setStyle(t.style),e.bakeTransform?Zl(n.path,t.getComputedTransform()):e.toLocal?n.setLocalTransform(t.getComputedTransform()):n.copyTransform(t),n.buildPath=t.buildPath,n.applyTransform=n.applyTransform,n.z=t.z,n.z2=t.z2,n.zlevel=t.zlevel,n}var uu=function(){this.cx=0,this.cy=0,this.r=0},hu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new uu},e.prototype.buildPath=function(t,e){t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI)},e}(gs);hu.prototype.type="circle";var cu=function(){this.cx=0,this.cy=0,this.rx=0,this.ry=0},pu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new cu},e.prototype.buildPath=function(t,e){var n=.5522848,i=e.cx,r=e.cy,o=e.rx,a=e.ry,s=o*n,l=a*n;t.moveTo(i-o,r),t.bezierCurveTo(i-o,r-l,i-s,r-a,i,r-a),t.bezierCurveTo(i+s,r-a,i+o,r-l,i+o,r),t.bezierCurveTo(i+o,r+l,i+s,r+a,i,r+a),t.bezierCurveTo(i-s,r+a,i-o,r+l,i-o,r),t.closePath()},e}(gs);pu.prototype.type="ellipse";var du=Math.PI,fu=2*du,gu=Math.sin,yu=Math.cos,vu=Math.acos,mu=Math.atan2,xu=Math.abs,_u=Math.sqrt,bu=Math.max,wu=Math.min,Su=1e-4;function Mu(t,e,n,i,r,o,a){var s=t-n,l=e-i,u=(a?o:-o)/_u(s*s+l*l),h=u*l,c=-u*s,p=t+h,d=e+c,f=n+h,g=i+c,y=(p+f)/2,v=(d+g)/2,m=f-p,x=g-d,_=m*m+x*x,b=r-o,w=p*g-f*d,S=(x<0?-1:1)*_u(bu(0,b*b*_-w*w)),M=(w*x-m*S)/_,I=(-w*m-x*S)/_,T=(w*x+m*S)/_,C=(-w*m+x*S)/_,D=M-y,A=I-v,k=T-y,L=C-v;return D*D+A*A>k*k+L*L&&(M=T,I=C),{cx:M,cy:I,x0:-h,y0:-c,x1:M*(r/b-1),y1:I*(r/b-1)}}function Iu(t,e){var n,i=bu(e.r,0),r=bu(e.r0||0,0),o=i>0;if(o||r>0){if(o||(i=r,r=0),r>i){var a=i;i=r,r=a}var s=e.startAngle,l=e.endAngle;if(!isNaN(s)&&!isNaN(l)){var u=e.cx,h=e.cy,c=!!e.clockwise,p=xu(l-s),d=p>fu&&p%fu;if(d>Su&&(p=d),i>Su)if(p>fu-Su)t.moveTo(u+i*yu(s),h+i*gu(s)),t.arc(u,h,i,s,l,!c),r>Su&&(t.moveTo(u+r*yu(l),h+r*gu(l)),t.arc(u,h,r,l,s,c));else{var f=void 0,g=void 0,y=void 0,v=void 0,m=void 0,x=void 0,_=void 0,b=void 0,w=void 0,S=void 0,M=void 0,I=void 0,T=void 0,C=void 0,D=void 0,A=void 0,k=i*yu(s),L=i*gu(s),P=r*yu(l),O=r*gu(l),R=p>Su;if(R){var N=e.cornerRadius;N&&(f=(n=function(t){var e;if(Y(t)){var n=t.length;if(!n)return t;e=1===n?[t[0],t[0],0,0]:2===n?[t[0],t[0],t[1],t[1]]:3===n?t.concat(t[2]):t}else e=[t,t,t,t];return e}(N))[0],g=n[1],y=n[2],v=n[3]);var E=xu(i-r)/2;if(m=wu(E,y),x=wu(E,v),_=wu(E,f),b=wu(E,g),M=w=bu(m,x),I=S=bu(_,b),(w>Su||S>Su)&&(T=i*yu(l),C=i*gu(l),D=r*yu(s),A=r*gu(s),p<du)){var z=function(t,e,n,i,r,o,a,s){var l=n-t,u=i-e,h=a-r,c=s-o,p=c*l-h*u;if(!(p*p<Su))return[t+(p=(h*(e-o)-c*(t-r))/p)*l,e+p*u]}(k,L,D,A,T,C,P,O);if(z){var V=k-z[0],B=L-z[1],F=T-z[0],G=C-z[1],W=1/gu(vu((V*F+B*G)/(_u(V*V+B*B)*_u(F*F+G*G)))/2),H=_u(z[0]*z[0]+z[1]*z[1]);M=wu(w,(i-H)/(W+1)),I=wu(S,(r-H)/(W-1))}}}if(R)if(M>Su){var U=wu(y,M),X=wu(v,M),Z=Mu(D,A,k,L,i,U,c),j=Mu(T,C,P,O,i,X,c);t.moveTo(u+Z.cx+Z.x0,h+Z.cy+Z.y0),M<w&&U===X?t.arc(u+Z.cx,h+Z.cy,M,mu(Z.y0,Z.x0),mu(j.y0,j.x0),!c):(U>0&&t.arc(u+Z.cx,h+Z.cy,U,mu(Z.y0,Z.x0),mu(Z.y1,Z.x1),!c),t.arc(u,h,i,mu(Z.cy+Z.y1,Z.cx+Z.x1),mu(j.cy+j.y1,j.cx+j.x1),!c),X>0&&t.arc(u+j.cx,h+j.cy,X,mu(j.y1,j.x1),mu(j.y0,j.x0),!c))}else t.moveTo(u+k,h+L),t.arc(u,h,i,s,l,!c);else t.moveTo(u+k,h+L);if(r>Su&&R)if(I>Su){U=wu(f,I),Z=Mu(P,O,T,C,r,-(X=wu(g,I)),c),j=Mu(k,L,D,A,r,-U,c);t.lineTo(u+Z.cx+Z.x0,h+Z.cy+Z.y0),I<S&&U===X?t.arc(u+Z.cx,h+Z.cy,I,mu(Z.y0,Z.x0),mu(j.y0,j.x0),!c):(X>0&&t.arc(u+Z.cx,h+Z.cy,X,mu(Z.y0,Z.x0),mu(Z.y1,Z.x1),!c),t.arc(u,h,r,mu(Z.cy+Z.y1,Z.cx+Z.x1),mu(j.cy+j.y1,j.cx+j.x1),c),U>0&&t.arc(u+j.cx,h+j.cy,U,mu(j.y1,j.x1),mu(j.y0,j.x0),!c))}else t.lineTo(u+P,h+O),t.arc(u,h,r,l,s,c);else t.lineTo(u+P,h+O)}else t.moveTo(u,h);t.closePath()}}}var Tu=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0,this.cornerRadius=0},Cu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Tu},e.prototype.buildPath=function(t,e){Iu(t,e)},e.prototype.isZeroArea=function(){return this.shape.startAngle===this.shape.endAngle||this.shape.r===this.shape.r0},e}(gs);Cu.prototype.type="sector";var Du=function(){this.cx=0,this.cy=0,this.r=0,this.r0=0},Au=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Du},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)},e}(gs);function ku(t,e,n){var i=e.smooth,r=e.points;if(r&&r.length>=2){if(i){var o=function(t,e,n,i){var r,o,a,s,l=[],u=[],h=[],c=[];if(i){a=[1/0,1/0],s=[-1/0,-1/0];for(var p=0,d=t.length;p<d;p++)Gt(a,a,t[p]),Wt(s,s,t[p]);Gt(a,a,i[0]),Wt(s,s,i[1])}for(p=0,d=t.length;p<d;p++){var f=t[p];if(n)r=t[p?p-1:d-1],o=t[(p+1)%d];else{if(0===p||p===d-1){l.push(Mt(t[p]));continue}r=t[p-1],o=t[p+1]}Dt(u,o,r),Ot(u,u,e);var g=Nt(f,r),y=Nt(f,o),v=g+y;0!==v&&(g/=v,y/=v),Ot(h,u,-g),Ot(c,u,y);var m=Tt([],f,h),x=Tt([],f,c);i&&(Wt(m,m,a),Gt(m,m,s),Wt(x,x,a),Gt(x,x,s)),l.push(m),l.push(x)}return n&&l.push(l.shift()),l}(r,i,n,e.smoothConstraint);t.moveTo(r[0][0],r[0][1]);for(var a=r.length,s=0;s<(n?a:a-1);s++){var l=o[2*s],u=o[2*s+1],h=r[(s+1)%a];t.bezierCurveTo(l[0],l[1],u[0],u[1],h[0],h[1])}}else{t.moveTo(r[0][0],r[0][1]);s=1;for(var c=r.length;s<c;s++)t.lineTo(r[s][0],r[s][1])}n&&t.closePath()}}Au.prototype.type="ring";var Lu=function(){this.points=null,this.smooth=0,this.smoothConstraint=null},Pu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Lu},e.prototype.buildPath=function(t,e){ku(t,e,!0)},e}(gs);Pu.prototype.type="polygon";var Ou=function(){this.points=null,this.percent=1,this.smooth=0,this.smoothConstraint=null},Ru=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new Ou},e.prototype.buildPath=function(t,e){ku(t,e,!1)},e}(gs);Ru.prototype.type="polyline";var Nu={},Eu=function(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.percent=1},zu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new Eu},e.prototype.buildPath=function(t,e){var n,i,r,o;if(this.subPixelOptimize){var a=ws(Nu,e,this.style);n=a.x1,i=a.y1,r=a.x2,o=a.y2}else n=e.x1,i=e.y1,r=e.x2,o=e.y2;var s=e.percent;0!==s&&(t.moveTo(n,i),s<1&&(r=n*(1-s)+r*s,o=i*(1-s)+o*s),t.lineTo(r,o))},e.prototype.pointAt=function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]},e}(gs);zu.prototype.type="line";var Vu=[],Bu=function(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.cpx1=0,this.cpy1=0,this.percent=1};function Fu(t,e,n){var i=t.cpx2,r=t.cpy2;return null!=i||null!=r?[(n?Ye:He)(t.x1,t.cpx1,t.cpx2,t.x2,e),(n?Ye:He)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(n?$e:Ke)(t.x1,t.cpx1,t.x2,e),(n?$e:Ke)(t.y1,t.cpy1,t.y2,e)]}var Gu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new Bu},e.prototype.buildPath=function(t,e){var n=e.x1,i=e.y1,r=e.x2,o=e.y2,a=e.cpx1,s=e.cpy1,l=e.cpx2,u=e.cpy2,h=e.percent;0!==h&&(t.moveTo(n,i),null==l||null==u?(h<1&&(Qe(n,a,r,h,Vu),a=Vu[1],r=Vu[2],Qe(i,s,o,h,Vu),s=Vu[1],o=Vu[2]),t.quadraticCurveTo(a,s,r,o)):(h<1&&(Ze(n,a,l,r,h,Vu),a=Vu[1],l=Vu[2],r=Vu[3],Ze(i,s,u,o,h,Vu),s=Vu[1],u=Vu[2],o=Vu[3]),t.bezierCurveTo(a,s,l,u,r,o)))},e.prototype.pointAt=function(t){return Fu(this.shape,t,!1)},e.prototype.tangentAt=function(t){var e=Fu(this.shape,t,!0);return Rt(e,e)},e}(gs);Gu.prototype.type="bezier-curve";var Wu=function(){this.cx=0,this.cy=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0},Hu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new Wu},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r,0),o=e.startAngle,a=e.endAngle,s=e.clockwise,l=Math.cos(o),u=Math.sin(o);t.moveTo(l*r+n,u*r+i),t.arc(n,i,r,o,a,!s)},e}(gs);Hu.prototype.type="arc";var Yu=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="compound",e}return n(e,t),e.prototype._updatePathDirty=function(){for(var t=this.shape.paths,e=this.shapeChanged(),n=0;n<t.length;n++)e=e||t[n].shapeChanged();e&&this.dirtyShape()},e.prototype.beforeBrush=function(){this._updatePathDirty();for(var t=this.shape.paths||[],e=this.getGlobalScale(),n=0;n<t.length;n++)t[n].path||t[n].createPathProxy(),t[n].path.setScale(e[0],e[1],t[n].segmentIgnoreThreshold)},e.prototype.buildPath=function(t,e){for(var n=e.paths||[],i=0;i<n.length;i++)n[i].buildPath(t,n[i].shape,!0)},e.prototype.afterBrush=function(){for(var t=this.shape.paths||[],e=0;e<t.length;e++)t[e].pathUpdated()},e.prototype.getBoundingRect=function(){return this._updatePathDirty.call(this),gs.prototype.getBoundingRect.call(this)},e}(gs),Uu=function(){function t(t){this.colorStops=t||[]}return t.prototype.addColorStop=function(t,e){this.colorStops.push({offset:t,color:e})},t}(),Xu=function(t){function e(e,n,i,r,o,a){var s=t.call(this,o)||this;return s.x=null==e?0:e,s.y=null==n?0:n,s.x2=null==i?1:i,s.y2=null==r?0:r,s.type="linear",s.global=a||!1,s}return n(e,t),e}(Uu),Zu=function(t){function e(e,n,i,r,o){var a=t.call(this,r)||this;return a.x=null==e?.5:e,a.y=null==n?.5:n,a.r=null==i?.5:i,a.type="radial",a.global=o||!1,a}return n(e,t),e}(Uu),ju=[0,0],qu=[0,0],Ku=new Ji,$u=new Ji,Ju=function(){function t(t,e){this._corners=[],this._axes=[],this._origin=[0,0];for(var n=0;n<4;n++)this._corners[n]=new Ji;for(n=0;n<2;n++)this._axes[n]=new Ji;t&&this.fromBoundingRect(t,e)}return t.prototype.fromBoundingRect=function(t,e){var n=this._corners,i=this._axes,r=t.x,o=t.y,a=r+t.width,s=o+t.height;if(n[0].set(r,o),n[1].set(a,o),n[2].set(a,s),n[3].set(r,s),e)for(var l=0;l<4;l++)n[l].transform(e);Ji.sub(i[0],n[1],n[0]),Ji.sub(i[1],n[3],n[0]),i[0].normalize(),i[1].normalize();for(l=0;l<2;l++)this._origin[l]=i[l].dot(n[0])},t.prototype.intersect=function(t,e){var n=!0,i=!e;return Ku.set(1/0,1/0),$u.set(0,0),!this._intersectCheckOneSide(this,t,Ku,$u,i,1)&&(n=!1,i)||!this._intersectCheckOneSide(t,this,Ku,$u,i,-1)&&(n=!1,i)||i||Ji.copy(e,n?Ku:$u),n},t.prototype._intersectCheckOneSide=function(t,e,n,i,r,o){for(var a=!0,s=0;s<2;s++){var l=this._axes[s];if(this._getProjMinMaxOnAxis(s,t._corners,ju),this._getProjMinMaxOnAxis(s,e._corners,qu),ju[1]<qu[0]||ju[0]>qu[1]){if(a=!1,r)return a;var u=Math.abs(qu[0]-ju[1]),h=Math.abs(ju[0]-qu[1]);Math.min(u,h)>i.len()&&(u<h?Ji.scale(i,l,-u*o):Ji.scale(i,l,h*o))}else if(n){u=Math.abs(qu[0]-ju[1]),h=Math.abs(ju[0]-qu[1]);Math.min(u,h)<n.len()&&(u<h?Ji.scale(n,l,u*o):Ji.scale(n,l,-h*o))}}return a},t.prototype._getProjMinMaxOnAxis=function(t,e,n){for(var i=this._axes[t],r=this._origin,o=e[0].dot(i)+r[t],a=o,s=o,l=1;l<e.length;l++){var u=e[l].dot(i)+r[t];a=Math.min(u,a),s=Math.max(u,s)}n[0]=a,n[1]=s},t}(),Qu=[],th=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.notClear=!0,e.incremental=!0,e._displayables=[],e._temporaryDisplayables=[],e._cursor=0,e}return n(e,t),e.prototype.traverse=function(t,e){t.call(e,this)},e.prototype.useStyle=function(){this.style={}},e.prototype.getCursor=function(){return this._cursor},e.prototype.innerAfterBrush=function(){this._cursor=this._displayables.length},e.prototype.clearDisplaybles=function(){this._displayables=[],this._temporaryDisplayables=[],this._cursor=0,this.markRedraw(),this.notClear=!1},e.prototype.clearTemporalDisplayables=function(){this._temporaryDisplayables=[]},e.prototype.addDisplayable=function(t,e){e?this._temporaryDisplayables.push(t):this._displayables.push(t),this.markRedraw()},e.prototype.addDisplayables=function(t,e){e=e||!1;for(var n=0;n<t.length;n++)this.addDisplayable(t[n],e)},e.prototype.getDisplayables=function(){return this._displayables},e.prototype.getTemporalDisplayables=function(){return this._temporaryDisplayables},e.prototype.eachPendingDisplayable=function(t){for(var e=this._cursor;e<this._displayables.length;e++)t&&t(this._displayables[e]);for(e=0;e<this._temporaryDisplayables.length;e++)t&&t(this._temporaryDisplayables[e])},e.prototype.update=function(){this.updateTransform();for(var t=this._cursor;t<this._displayables.length;t++){(e=this._displayables[t]).parent=this,e.update(),e.parent=null}for(t=0;t<this._temporaryDisplayables.length;t++){var e;(e=this._temporaryDisplayables[t]).parent=this,e.update(),e.parent=null}},e.prototype.getBoundingRect=function(){if(!this._rect){for(var t=new sr(1/0,1/0,-1/0,-1/0),e=0;e<this._displayables.length;e++){var n=this._displayables[e],i=n.getBoundingRect().clone();n.needLocalTransform()&&i.applyTransform(n.getLocalTransform(Qu)),t.union(i)}this._rect=t}return this._rect},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e);if(this.getBoundingRect().contain(n[0],n[1]))for(var i=0;i<this._displayables.length;i++){if(this._displayables[i].contain(t,e))return!0}return!1},e}(da),eh=So();function nh(t,e,n,i,r){var o;if(e&&e.ecModel){var a=e.ecModel.getUpdatePayload();o=a&&a.animation}var s="update"===t;if(e&&e.isAnimationEnabled()){var l=void 0,u=void 0,h=void 0;return i?(l=rt(i.duration,200),u=rt(i.easing,"cubicOut"),h=0):(l=e.getShallow(s?"animationDurationUpdate":"animationDuration"),u=e.getShallow(s?"animationEasingUpdate":"animationEasing"),h=e.getShallow(s?"animationDelayUpdate":"animationDelay")),o&&(null!=o.duration&&(l=o.duration),null!=o.easing&&(u=o.easing),null!=o.delay&&(h=o.delay)),U(h)&&(h=h(n,r)),U(l)&&(l=l(n)),{duration:l||0,delay:h,easing:u}}return null}function ih(t,e,n,i,r,o,a){var s,l=!1;U(r)?(a=o,o=r,r=null):q(r)&&(o=r.cb,a=r.during,l=r.isFrom,s=r.removeOpt,r=r.dataIndex);var u="leave"===t;u||e.stopAnimation("leave");var h=nh(t,i,r,u?s||{}:null,i&&i.getAnimationDelayParams?i.getAnimationDelayParams(e,r):null);if(h&&h.duration>0){var c={duration:h.duration,delay:h.delay||0,easing:h.easing,done:o,force:!!o||!!a,setToFinal:!u,scope:t,during:a};l?e.animateFrom(n,c):e.animateTo(n,c)}else e.stopAnimation(),!l&&e.attr(n),a&&a(1),o&&o()}function rh(t,e,n,i,r,o){ih("update",t,e,n,i,r,o)}function oh(t,e,n,i,r,o){ih("enter",t,e,n,i,r,o)}function ah(t){if(!t.__zr)return!0;for(var e=0;e<t.animators.length;e++){if("leave"===t.animators[e].scope)return!0}return!1}function sh(t,e,n,i,r,o){ah(t)||ih("leave",t,e,n,i,r,o)}function lh(t,e,n,i){t.removeTextContent(),t.removeTextGuideLine(),sh(t,{style:{opacity:0}},e,n,i)}function uh(t,e,n){function i(){t.parent&&t.parent.remove(t)}t.isGroup?t.traverse((function(t){t.isGroup||lh(t,e,n,i)})):lh(t,e,n,i)}function hh(t){eh(t).oldStyle=t.style}var ch=Math.max,ph=Math.min,dh={};function fh(t){return gs.extend(t)}var gh=function(t,e){var i=au(t,e);return function(t){function e(e){var n=t.call(this,e)||this;return n.applyTransform=i.applyTransform,n.buildPath=i.buildPath,n}return n(e,t),e}(ru)};function yh(t,e){return gh(t,e)}function vh(t,e){dh[t]=e}function mh(t){if(dh.hasOwnProperty(t))return dh[t]}function xh(t,e,n,i){var r=su(t,e);return n&&("center"===i&&(n=bh(n,r.getBoundingRect())),Sh(r,n)),r}function _h(t,e,n){var i=new _s({style:{image:t,x:e.x,y:e.y,width:e.width,height:e.height},onload:function(t){if("center"===n){var r={width:t.width,height:t.height};i.setStyle(bh(e,r))}}});return i}function bh(t,e){var n,i=e.width/e.height,r=t.height*i;return n=r<=t.width?t.height:(r=t.width)/i,{x:t.x+t.width/2-r/2,y:t.y+t.height/2-n/2,width:r,height:n}}var wh=function(t,e){for(var n=[],i=t.length,r=0;r<i;r++){var o=t[r];n.push(o.getUpdatedPathProxy(!0))}var a=new gs(e);return a.createPathProxy(),a.buildPath=function(t){if(ou(t)){t.appendPath(n);var e=t.getContext();e&&t.rebuildPath(e,1)}},a};function Sh(t,e){if(t.applyTransform){var n=t.getBoundingRect().calculateTransform(e);t.applyTransform(n)}}var Mh=Ms;function Ih(t,e){for(var n=Oi([]);t&&t!==e;)Ni(n,t.getLocalTransform(),n),t=t.parent;return n}function Th(t,e,n){return e&&!N(e)&&(e=qi.getLocalTransform(e)),n&&(e=Bi([],e)),Ft([],t,e)}function Ch(t,e,n){var i=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),o=["left"===t?-i:"right"===t?i:0,"top"===t?-r:"bottom"===t?r:0];return o=Th(o,e,n),Math.abs(o[0])>Math.abs(o[1])?o[0]>0?"right":"left":o[1]>0?"bottom":"top"}function Dh(t){return!t.isGroup}function Ah(t,e,n){if(t&&e){var i,r=(i={},t.traverse((function(t){Dh(t)&&t.anid&&(i[t.anid]=t)})),i);e.traverse((function(t){if(Dh(t)&&t.anid){var e=r[t.anid];if(e){var i=o(t);t.attr(o(e)),rh(t,i,n,Hs(t).dataIndex)}}}))}function o(t){var e={x:t.x,y:t.y,rotation:t.rotation};return function(t){return null!=t.shape}(t)&&(e.shape=A({},t.shape)),e}}function kh(t,e){return z(t,(function(t){var n=t[0];n=ch(n,e.x),n=ph(n,e.x+e.width);var i=t[1];return i=ch(i,e.y),[n,i=ph(i,e.y+e.height)]}))}function Lh(t,e){var n=ch(t.x,e.x),i=ph(t.x+t.width,e.x+e.width),r=ch(t.y,e.y),o=ph(t.y+t.height,e.y+e.height);if(i>=n&&o>=r)return{x:n,y:r,width:i-n,height:o-r}}function Ph(t,e,n){var i=A({rectHover:!0},e),r=i.style={strokeNoScale:!0};if(n=n||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(r.image=t.slice(8),k(r,n),new _s(i)):xh(t.replace("path://",""),i,n,"center")}function Oh(t,e,n,i,r){for(var o=0,a=r[r.length-1];o<r.length;o++){var s=r[o];if(Rh(t,e,n,i,s[0],s[1],a[0],a[1]))return!0;a=s}}function Rh(t,e,n,i,r,o,a,s){var l,u=n-t,h=i-e,c=a-r,p=s-o,d=Nh(c,p,u,h);if((l=d)<=1e-6&&l>=-1e-6)return!1;var f=t-r,g=e-o,y=Nh(f,g,u,h)/d;if(y<0||y>1)return!1;var v=Nh(f,g,c,p)/d;return!(v<0||v>1)}function Nh(t,e,n,i){return t*i-n*e}function Eh(t){var e=t.itemTooltipOption,n=t.componentModel,i=t.itemName,r=X(e)?{formatter:e}:e,o=n.mainType,a=n.componentIndex,s={componentType:o,name:i,$vars:["name"]};s[o+"Index"]=a;var l=t.formatterParamsExtra;l&&E(G(l),(function(t){mt(s,t)||(s[t]=l[t],s.$vars.push(t))}));var u=Hs(t.el);u.componentMainType=o,u.componentIndex=a,u.tooltipConfig={name:i,option:k({content:i,formatterParams:s},r)}}function zh(t,e){var n;t.isGroup&&(n=e(t)),n||t.traverse(e)}function Vh(t,e){if(t)if(Y(t))for(var n=0;n<t.length;n++)zh(t[n],e);else zh(t,e)}vh("circle",hu),vh("ellipse",pu),vh("sector",Cu),vh("ring",Au),vh("polygon",Pu),vh("polyline",Ru),vh("rect",Cs),vh("line",zu),vh("bezierCurve",Gu),vh("arc",Hu);var Bh=Object.freeze({__proto__:null,updateProps:rh,initProps:oh,removeElement:sh,removeElementWithFadeOut:uh,isElementRemoved:ah,extendShape:fh,extendPath:yh,registerShape:vh,getShapeClass:mh,makePath:xh,makeImage:_h,mergePath:wh,resizePath:Sh,subPixelOptimizeLine:function(t){return ws(t.shape,t.shape,t.style),t},subPixelOptimizeRect:function(t){return Ss(t.shape,t.shape,t.style),t},subPixelOptimize:Mh,getTransform:Ih,applyTransform:Th,transformDirection:Ch,groupTransition:Ah,clipPointsByRect:kh,clipRectByRect:Lh,createIcon:Ph,linePolygonIntersect:Oh,lineLineIntersect:Rh,setTooltipConfig:Eh,traverseElements:Vh,Group:Cr,Image:_s,Text:ks,Circle:hu,Ellipse:pu,Sector:Cu,Ring:Au,Polygon:Pu,Polyline:Ru,Rect:Cs,Line:zu,BezierCurve:Gu,Arc:Hu,IncrementalDisplayable:th,CompoundPath:Yu,LinearGradient:Xu,RadialGradient:Zu,BoundingRect:sr,OrientedBoundingRect:Ju,Point:Ji,Path:gs}),Fh={};function Gh(t,e){for(var n=0;n<qs.length;n++){var i=qs[n],r=e[i],o=t.ensureState(i);o.style=o.style||{},o.style.text=r}var a=t.currentStates.slice();t.clearStates(!0),t.setStyle({text:e.normal}),t.useStates(a,!0)}function Wh(t,e,n){var i,r=t.labelFetcher,o=t.labelDataIndex,a=t.labelDimIndex,s=e.normal;r&&(i=r.getFormattedLabel(o,"normal",null,a,s&&s.get("formatter"),null!=n?{interpolatedValue:n}:null)),null==i&&(i=U(t.defaultText)?t.defaultText(o,t,n):t.defaultText);for(var l={normal:i},u=0;u<qs.length;u++){var h=qs[u],c=e[h];l[h]=rt(r?r.getFormattedLabel(o,h,null,a,c&&c.get("formatter")):null,i)}return l}function Hh(t,e,n,i){n=n||Fh;for(var r=t instanceof ks,o=!1,a=0;a<Ks.length;a++){if((p=e[Ks[a]])&&p.getShallow("show")){o=!0;break}}var s=r?t:t.getTextContent();if(o){r||(s||(s=new ks,t.setTextContent(s)),t.stateProxy&&(s.stateProxy=t.stateProxy));var l=Wh(n,e),u=e.normal,h=!!u.getShallow("show"),c=Uh(u,i&&i.normal,n,!1,!r);c.text=l.normal,r||t.setTextConfig(Xh(u,n,!1));for(a=0;a<qs.length;a++){var p,d=qs[a];if(p=e[d]){var f=s.ensureState(d),g=!!rt(p.getShallow("show"),h);if(g!==h&&(f.ignore=!g),f.style=Uh(p,i&&i[d],n,!0,!r),f.style.text=l[d],!r)t.ensureState(d).textConfig=Xh(p,n,!0)}}s.silent=!!u.getShallow("silent"),null!=s.style.x&&(c.x=s.style.x),null!=s.style.y&&(c.y=s.style.y),s.ignore=!h,s.useStyle(c),s.dirty(),n.enableTextSetter&&(Jh(s).setLabelText=function(t){var i=Wh(n,e,t);Gh(s,i)})}else s&&(s.ignore=!0);t.dirty()}function Yh(t,e){e=e||"label";for(var n={normal:t.getModel(e)},i=0;i<qs.length;i++){var r=qs[i];n[r]=t.getModel([r,e])}return n}function Uh(t,e,n,i,r){var o={};return function(t,e,n,i,r){n=n||Fh;var o,a=e.ecModel,s=a&&a.option.textStyle,l=function(t){var e;for(;t&&t!==t.ecModel;){var n=(t.option||Fh).rich;if(n){e=e||{};for(var i=G(n),r=0;r<i.length;r++){e[i[r]]=1}}t=t.parentModel}return e}(e);if(l)for(var u in o={},l)if(l.hasOwnProperty(u)){var h=e.getModel(["rich",u]);Kh(o[u]={},h,s,n,i,r,!1,!0)}o&&(t.rich=o);var c=e.get("overflow");c&&(t.overflow=c);var p=e.get("minMargin");null!=p&&(t.margin=p);Kh(t,e,s,n,i,r,!0,!1)}(o,t,n,i,r),e&&A(o,e),o}function Xh(t,e,n){e=e||{};var i,r={},o=t.getShallow("rotate"),a=rt(t.getShallow("distance"),n?null:5),s=t.getShallow("offset");return"outside"===(i=t.getShallow("position")||(n?null:"inside"))&&(i=e.defaultOutsidePosition||"top"),null!=i&&(r.position=i),null!=s&&(r.offset=s),null!=o&&(o*=Math.PI/180,r.rotation=o),null!=a&&(r.distance=a),r.outsideFill="inherit"===t.get("color")?e.inheritColor||null:"auto",r}var Zh=["fontStyle","fontWeight","fontSize","fontFamily","textShadowColor","textShadowBlur","textShadowOffsetX","textShadowOffsetY"],jh=["align","lineHeight","width","height","tag","verticalAlign"],qh=["padding","borderWidth","borderRadius","borderDashOffset","backgroundColor","borderColor","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"];function Kh(t,e,n,i,r,o,a,s){n=!r&&n||Fh;var l=i&&i.inheritColor,u=e.getShallow("color"),h=e.getShallow("textBorderColor"),c=rt(e.getShallow("opacity"),n.opacity);"inherit"!==u&&"auto"!==u||(u=l||null),"inherit"!==h&&"auto"!==h||(h=l||null),o||(u=u||n.color,h=h||n.textBorderColor),null!=u&&(t.fill=u),null!=h&&(t.stroke=h);var p=rt(e.getShallow("textBorderWidth"),n.textBorderWidth);null!=p&&(t.lineWidth=p);var d=rt(e.getShallow("textBorderType"),n.textBorderType);null!=d&&(t.lineDash=d);var f=rt(e.getShallow("textBorderDashOffset"),n.textBorderDashOffset);null!=f&&(t.lineDashOffset=f),r||null!=c||s||(c=i&&i.defaultOpacity),null!=c&&(t.opacity=c),r||o||null==t.fill&&i.inheritColor&&(t.fill=i.inheritColor);for(var g=0;g<Zh.length;g++){var y=Zh[g];null!=(m=rt(e.getShallow(y),n[y]))&&(t[y]=m)}for(g=0;g<jh.length;g++){y=jh[g];null!=(m=e.getShallow(y))&&(t[y]=m)}if(null==t.verticalAlign){var v=e.getShallow("baseline");null!=v&&(t.verticalAlign=v)}if(!a||!i.disableBox){for(g=0;g<qh.length;g++){var m;y=qh[g];null!=(m=e.getShallow(y))&&(t[y]=m)}var x=e.getShallow("borderType");null!=x&&(t.borderDash=x),"auto"!==t.backgroundColor&&"inherit"!==t.backgroundColor||!l||(t.backgroundColor=l),"auto"!==t.borderColor&&"inherit"!==t.borderColor||!l||(t.borderColor=l)}}function $h(t,e){var n=e&&e.getModel("textStyle");return ut([t.fontStyle||n&&n.getShallow("fontStyle")||"",t.fontWeight||n&&n.getShallow("fontWeight")||"",(t.fontSize||n&&n.getShallow("fontSize")||12)+"px",t.fontFamily||n&&n.getShallow("fontFamily")||"sans-serif"].join(" "))}var Jh=So();function Qh(t,e,n,i){if(t){var r=Jh(t);r.prevValue=r.value,r.value=n;var o=e.normal;r.valueAnimation=o.get("valueAnimation"),r.valueAnimation&&(r.precision=o.get("precision"),r.defaultInterpolatedText=i,r.statesModels=e)}}function tc(t,e,n,i,r){var o=Jh(t);if(o.valueAnimation&&o.prevValue!==o.value){var a=o.defaultInterpolatedText,s=rt(o.interpolatedValue,o.prevValue),l=o.value;t.percent=0,(null==o.prevValue?oh:rh)(t,{percent:1},i,e,null,(function(i){var u=Po(n,o.precision,s,l,i);o.interpolatedValue=1===i?null:u;var h=Wh({labelDataIndex:e,labelFetcher:r,defaultText:a?a(u):u+""},o.statesModels,u);Gh(t,h)}))}}var ec,nc,ic=["textStyle","color"],rc=["fontStyle","fontWeight","fontSize","fontFamily","padding","lineHeight","rich","width","height","overflow"],oc=new ks,ac=function(){function t(){}return t.prototype.getTextColor=function(t){var e=this.ecModel;return this.getShallow("color")||(!t&&e?e.get(ic):null)},t.prototype.getFont=function(){return $h({fontStyle:this.getShallow("fontStyle"),fontWeight:this.getShallow("fontWeight"),fontSize:this.getShallow("fontSize"),fontFamily:this.getShallow("fontFamily")},this.ecModel)},t.prototype.getTextRect=function(t){for(var e={text:t,verticalAlign:this.getShallow("verticalAlign")||this.getShallow("baseline")},n=0;n<rc.length;n++)e[rc[n]]=this.getShallow(rc[n]);return oc.useStyle(e),oc.update(),oc.getBoundingRect()},t}(),sc=[["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["lineDash","type"],["lineDashOffset","dashOffset"],["lineCap","cap"],["lineJoin","join"],["miterLimit"]],lc=Wo(sc),uc=function(){function t(){}return t.prototype.getLineStyle=function(t){return lc(this,t)},t}(),hc=[["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["lineDash","borderType"],["lineDashOffset","borderDashOffset"],["lineCap","borderCap"],["lineJoin","borderJoin"],["miterLimit","borderMiterLimit"]],cc=Wo(hc),pc=function(){function t(){}return t.prototype.getItemStyle=function(t,e){return cc(this,t,e)},t}(),dc=function(){function t(t,e,n){this.parentModel=e,this.ecModel=n,this.option=t}return t.prototype.init=function(t,e,n){for(var i=[],r=3;r<arguments.length;r++)i[r-3]=arguments[r]},t.prototype.mergeOption=function(t,e){C(this.option,t,!0)},t.prototype.get=function(t,e){return null==t?this.option:this._doGet(this.parsePath(t),!e&&this.parentModel)},t.prototype.getShallow=function(t,e){var n=this.option,i=null==n?n:n[t];if(null==i&&!e){var r=this.parentModel;r&&(i=r.getShallow(t))}return i},t.prototype.getModel=function(e,n){var i=null!=e,r=i?this.parsePath(e):null;return new t(i?this._doGet(r):this.option,n=n||this.parentModel&&this.parentModel.getModel(this.resolveParentPath(r)),this.ecModel)},t.prototype.isEmpty=function(){return null==this.option},t.prototype.restoreData=function(){},t.prototype.clone=function(){return new(0,this.constructor)(T(this.option))},t.prototype.parsePath=function(t){return"string"==typeof t?t.split("."):t},t.prototype.resolveParentPath=function(t){return t},t.prototype.isAnimationEnabled=function(){if(!r.node&&this.option){if(null!=this.option.animation)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}},t.prototype._doGet=function(t,e){var n=this.option;if(!t)return n;for(var i=0;i<t.length&&(!t[i]||null!=(n=n&&"object"==typeof n?n[t[i]]:null));i++);return null==n&&e&&(n=e._doGet(this.resolveParentPath(t),e.parentModel)),n},t}();Eo(dc),ec=dc,nc=["__\0is_clz",Vo++].join("_"),ec.prototype[nc]=!0,ec.isInstance=function(t){return!(!t||!t[nc])},R(dc,uc),R(dc,pc),R(dc,Yo),R(dc,ac);var fc=Math.round(10*Math.random());function gc(t){return[t||"",fc++].join("_")}function yc(t,e){return C(C({},t,!0),e,!0)}var vc="ZH",mc="EN",xc=mc,_c={},bc={},wc=r.domSupported&&(document.documentElement.lang||navigator.language||navigator.browserLanguage).toUpperCase().indexOf(vc)>-1?vc:xc;function Sc(t,e){t=t.toUpperCase(),bc[t]=new dc(e),_c[t]=e}function Mc(t){return bc[t]}Sc(mc,{time:{month:["January","February","March","April","May","June","July","August","September","October","November","December"],monthAbbr:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayOfWeek:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayOfWeekAbbr:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},legend:{selector:{all:"All",inverse:"Inv"}},toolbox:{brush:{title:{rect:"Box Select",polygon:"Lasso Select",lineX:"Horizontally Select",lineY:"Vertically Select",keep:"Keep Selections",clear:"Clear Selections"}},dataView:{title:"Data View",lang:["Data View","Close","Refresh"]},dataZoom:{title:{zoom:"Zoom",back:"Zoom Reset"}},magicType:{title:{line:"Switch to Line Chart",bar:"Switch to Bar Chart",stack:"Stack",tiled:"Tile"}},restore:{title:"Restore"},saveAsImage:{title:"Save as Image",lang:["Right Click to Save Image"]}},series:{typeNames:{pie:"Pie chart",bar:"Bar chart",line:"Line chart",scatter:"Scatter plot",effectScatter:"Ripple scatter plot",radar:"Radar chart",tree:"Tree",treemap:"Treemap",boxplot:"Boxplot",candlestick:"Candlestick",k:"K line chart",heatmap:"Heat map",map:"Map",parallel:"Parallel coordinate map",lines:"Line graph",graph:"Relationship graph",sankey:"Sankey diagram",funnel:"Funnel chart",gauge:"Gauge",pictorialBar:"Pictorial bar",themeRiver:"Theme River Map",sunburst:"Sunburst"}},aria:{general:{withTitle:'This is a chart about "{title}"',withoutTitle:"This is a chart"},series:{single:{prefix:"",withName:" with type {seriesType} named {seriesName}.",withoutName:" with type {seriesType}."},multiple:{prefix:". It consists of {seriesCount} series count.",withName:" The {seriesId} series is a {seriesType} representing {seriesName}.",withoutName:" The {seriesId} series is a {seriesType}.",separator:{middle:"",end:""}}},data:{allData:"The data is as follows: ",partialData:"The first {displayCnt} items are: ",withName:"the data for {name} is {value}",withoutName:"{value}",separator:{middle:", ",end:". "}}}}),Sc(vc,{time:{month:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthAbbr:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayOfWeek:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayOfWeekAbbr:["日","一","二","三","四","五","六"]},legend:{selector:{all:"全选",inverse:"反选"}},toolbox:{brush:{title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}},dataView:{title:"数据视图",lang:["数据视图","关闭","刷新"]},dataZoom:{title:{zoom:"区域缩放",back:"区域缩放还原"}},magicType:{title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"}},restore:{title:"还原"},saveAsImage:{title:"保存为图片",lang:["右键另存为图片"]}},series:{typeNames:{pie:"饼图",bar:"柱状图",line:"折线图",scatter:"散点图",effectScatter:"涟漪散点图",radar:"雷达图",tree:"树图",treemap:"矩形树图",boxplot:"箱型图",candlestick:"K线图",k:"K线图",heatmap:"热力图",map:"地图",parallel:"平行坐标图",lines:"线图",graph:"关系图",sankey:"桑基图",funnel:"漏斗图",gauge:"仪表盘图",pictorialBar:"象形柱图",themeRiver:"主题河流图",sunburst:"旭日图"}},aria:{general:{withTitle:"这是一个关于“{title}”的图表。",withoutTitle:"这是一个图表,"},series:{single:{prefix:"",withName:"图表类型是{seriesType},表示{seriesName}。",withoutName:"图表类型是{seriesType}。"},multiple:{prefix:"它由{seriesCount}个图表系列组成。",withName:"第{seriesId}个系列是一个表示{seriesName}的{seriesType},",withoutName:"第{seriesId}个系列是一个{seriesType},",separator:{middle:";",end:"。"}}},data:{allData:"其数据是——",partialData:"其中,前{displayCnt}项是——",withName:"{name}的数据是{value}",withoutName:"{value}",separator:{middle:",",end:""}}}});var Ic=1e3,Tc=6e4,Cc=36e5,Dc=864e5,Ac=31536e6,kc={year:"{yyyy}",month:"{MMM}",day:"{d}",hour:"{HH}:{mm}",minute:"{HH}:{mm}",second:"{HH}:{mm}:{ss}",millisecond:"{HH}:{mm}:{ss} {SSS}",none:"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}"},Lc="{yyyy}-{MM}-{dd}",Pc={year:"{yyyy}",month:"{yyyy}-{MM}",day:Lc,hour:"{yyyy}-{MM}-{dd} "+kc.hour,minute:"{yyyy}-{MM}-{dd} "+kc.minute,second:"{yyyy}-{MM}-{dd} "+kc.second,millisecond:kc.none},Oc=["year","month","day","hour","minute","second","millisecond"],Rc=["year","half-year","quarter","month","week","half-week","day","half-day","quarter-day","hour","minute","second","millisecond"];function Nc(t,e){return"0000".substr(0,e-(t+="").length)+t}function Ec(t){switch(t){case"half-year":case"quarter":return"month";case"week":case"half-week":return"day";case"half-day":case"quarter-day":return"hour";default:return t}}function zc(t){return t===Ec(t)}function Vc(t,e,n,i){var r=jr(t),o=r[Gc(n)](),a=r[Wc(n)]()+1,s=Math.floor((a-1)/3)+1,l=r[Hc(n)](),u=r["get"+(n?"UTC":"")+"Day"](),h=r[Yc(n)](),c=(h-1)%12+1,p=r[Uc(n)](),d=r[Xc(n)](),f=r[Zc(n)](),g=(i instanceof dc?i:Mc(i||wc)||bc.EN).getModel("time"),y=g.get("month"),v=g.get("monthAbbr"),m=g.get("dayOfWeek"),x=g.get("dayOfWeekAbbr");return(e||"").replace(/{yyyy}/g,o+"").replace(/{yy}/g,o%100+"").replace(/{Q}/g,s+"").replace(/{MMMM}/g,y[a-1]).replace(/{MMM}/g,v[a-1]).replace(/{MM}/g,Nc(a,2)).replace(/{M}/g,a+"").replace(/{dd}/g,Nc(l,2)).replace(/{d}/g,l+"").replace(/{eeee}/g,m[u]).replace(/{ee}/g,x[u]).replace(/{e}/g,u+"").replace(/{HH}/g,Nc(h,2)).replace(/{H}/g,h+"").replace(/{hh}/g,Nc(c+"",2)).replace(/{h}/g,c+"").replace(/{mm}/g,Nc(p,2)).replace(/{m}/g,p+"").replace(/{ss}/g,Nc(d,2)).replace(/{s}/g,d+"").replace(/{SSS}/g,Nc(f,3)).replace(/{S}/g,f+"")}function Bc(t,e){var n=jr(t),i=n[Wc(e)]()+1,r=n[Hc(e)](),o=n[Yc(e)](),a=n[Uc(e)](),s=n[Xc(e)](),l=0===n[Zc(e)](),u=l&&0===s,h=u&&0===a,c=h&&0===o,p=c&&1===r;return p&&1===i?"year":p?"month":c?"day":h?"hour":u?"minute":l?"second":"millisecond"}function Fc(t,e,n){var i=j(t)?jr(t):t;switch(e=e||Bc(t,n)){case"year":return i[Gc(n)]();case"half-year":return i[Wc(n)]()>=6?1:0;case"quarter":return Math.floor((i[Wc(n)]()+1)/4);case"month":return i[Wc(n)]();case"day":return i[Hc(n)]();case"half-day":return i[Yc(n)]()/24;case"hour":return i[Yc(n)]();case"minute":return i[Uc(n)]();case"second":return i[Xc(n)]();case"millisecond":return i[Zc(n)]()}}function Gc(t){return t?"getUTCFullYear":"getFullYear"}function Wc(t){return t?"getUTCMonth":"getMonth"}function Hc(t){return t?"getUTCDate":"getDate"}function Yc(t){return t?"getUTCHours":"getHours"}function Uc(t){return t?"getUTCMinutes":"getMinutes"}function Xc(t){return t?"getUTCSeconds":"getSeconds"}function Zc(t){return t?"getUTCMilliseconds":"getMilliseconds"}function jc(t){return t?"setUTCFullYear":"setFullYear"}function qc(t){return t?"setUTCMonth":"setMonth"}function Kc(t){return t?"setUTCDate":"setDate"}function $c(t){return t?"setUTCHours":"setHours"}function Jc(t){return t?"setUTCMinutes":"setMinutes"}function Qc(t){return t?"setUTCSeconds":"setSeconds"}function tp(t){return t?"setUTCMilliseconds":"setMilliseconds"}function ep(t){if(!eo(t))return X(t)?t:"-";var e=(t+"").split(".");return e[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(e.length>1?"."+e[1]:"")}function np(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,(function(t,e){return e.toUpperCase()})),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}var ip=st,rp=/([&<>"'])/g,op={"&":"&","<":"<",">":">",'"':""","'":"'"};function ap(t){return null==t?"":(t+"").replace(rp,(function(t,e){return op[e]}))}function sp(t,e,n){function i(t){return t&&ut(t)?t:"-"}function r(t){return!(null==t||isNaN(t)||!isFinite(t))}var o="time"===e,a=t instanceof Date;if(o||a){var s=o?jr(t):t;if(!isNaN(+s))return Vc(s,"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}",n);if(a)return"-"}if("ordinal"===e)return Z(t)?i(t):j(t)&&r(t)?t+"":"-";var l=to(t);return r(l)?ep(l):Z(t)?i(t):"boolean"==typeof t?t+"":"-"}var lp=["a","b","c","d","e","f","g"],up=function(t,e){return"{"+t+(null==e?"":e)+"}"};function hp(t,e,n){Y(e)||(e=[e]);var i=e.length;if(!i)return"";for(var r=e[0].$vars||[],o=0;o<r.length;o++){var a=lp[o];t=t.replace(up(a),up(a,0))}for(var s=0;s<i;s++)for(var l=0;l<r.length;l++){var u=e[s][r[l]];t=t.replace(up(lp[l],s),n?ap(u):u)}return t}function cp(t,e){var n=X(t)?{color:t,extraCssText:e}:t||{},i=n.color,r=n.type;e=n.extraCssText;var o=n.renderMode||"html";return i?"html"===o?"subItem"===r?'<span style="display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;border-radius:4px;width:4px;height:4px;background-color:'+ap(i)+";"+(e||"")+'"></span>':'<span style="display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:'+ap(i)+";"+(e||"")+'"></span>':{renderMode:o,content:"{"+(n.markerId||"markerX")+"|} ",style:"subItem"===r?{width:4,height:4,borderRadius:2,backgroundColor:i}:{width:10,height:10,borderRadius:5,backgroundColor:i}}:""}function pp(t,e){return e=e||"transparent",X(t)?t:q(t)&&t.colorStops&&(t.colorStops[0]||{}).color||e}function dp(t,e){if("_blank"===e||"blank"===e){var n=window.open();n.opener=null,n.location.href=t}else window.open(t,e)}var fp=E,gp=["left","right","top","bottom","width","height"],yp=[["width","left","right"],["height","top","bottom"]];function vp(t,e,n,i,r){var o=0,a=0;null==i&&(i=1/0),null==r&&(r=1/0);var s=0;e.eachChild((function(l,u){var h,c,p=l.getBoundingRect(),d=e.childAt(u+1),f=d&&d.getBoundingRect();if("horizontal"===t){var g=p.width+(f?-f.x+p.x:0);(h=o+g)>i||l.newline?(o=0,h=g,a+=s+n,s=p.height):s=Math.max(s,p.height)}else{var y=p.height+(f?-f.y+p.y:0);(c=a+y)>r||l.newline?(o+=s+n,a=0,c=y,s=p.width):s=Math.max(s,p.width)}l.newline||(l.x=o,l.y=a,l.markRedraw(),"horizontal"===t?o=h+n:a=c+n)}))}var mp=vp;H(vp,"vertical"),H(vp,"horizontal");function xp(t,e,n){n=ip(n||0);var i=e.width,r=e.height,o=Er(t.left,i),a=Er(t.top,r),s=Er(t.right,i),l=Er(t.bottom,r),u=Er(t.width,i),h=Er(t.height,r),c=n[2]+n[0],p=n[1]+n[3],d=t.aspect;switch(isNaN(u)&&(u=i-s-p-o),isNaN(h)&&(h=r-l-c-a),null!=d&&(isNaN(u)&&isNaN(h)&&(d>i/r?u=.8*i:h=.8*r),isNaN(u)&&(u=d*h),isNaN(h)&&(h=u/d)),isNaN(o)&&(o=i-s-u-p),isNaN(a)&&(a=r-l-h-c),t.left||t.right){case"center":o=i/2-u/2-n[3];break;case"right":o=i-u-p}switch(t.top||t.bottom){case"middle":case"center":a=r/2-h/2-n[0];break;case"bottom":a=r-h-c}o=o||0,a=a||0,isNaN(u)&&(u=i-p-o-(s||0)),isNaN(h)&&(h=r-c-a-(l||0));var f=new sr(o+n[3],a+n[0],u,h);return f.margin=n,f}function _p(t,e,n,i,r,o){var a,s=!r||!r.hv||r.hv[0],l=!r||!r.hv||r.hv[1],u=r&&r.boundingMode||"all";if((o=o||t).x=t.x,o.y=t.y,!s&&!l)return!1;if("raw"===u)a="group"===t.type?new sr(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(a=t.getBoundingRect(),t.needLocalTransform()){var h=t.getLocalTransform();(a=a.clone()).applyTransform(h)}var c=xp(k({width:a.width,height:a.height},e),n,i),p=s?c.x-a.x:0,d=l?c.y-a.y:0;return"raw"===u?(o.x=p,o.y=d):(o.x+=p,o.y+=d),o===t&&t.markRedraw(),!0}function bp(t){var e=t.layoutMode||t.constructor.layoutMode;return q(e)?e:e?{type:e}:null}function wp(t,e,n){var i=n&&n.ignoreSize;!Y(i)&&(i=[i,i]);var r=a(yp[0],0),o=a(yp[1],1);function a(n,r){var o={},a=0,u={},h=0;if(fp(n,(function(e){u[e]=t[e]})),fp(n,(function(t){s(e,t)&&(o[t]=u[t]=e[t]),l(o,t)&&a++,l(u,t)&&h++})),i[r])return l(e,n[1])?u[n[2]]=null:l(e,n[2])&&(u[n[1]]=null),u;if(2!==h&&a){if(a>=2)return o;for(var c=0;c<n.length;c++){var p=n[c];if(!s(o,p)&&s(t,p)){o[p]=t[p];break}}return o}return u}function s(t,e){return t.hasOwnProperty(e)}function l(t,e){return null!=t[e]&&"auto"!==t[e]}function u(t,e,n){fp(t,(function(t){e[t]=n[t]}))}u(yp[0],t,r),u(yp[1],t,o)}function Sp(t){return Mp({},t)}function Mp(t,e){return e&&t&&fp(gp,(function(n){e.hasOwnProperty(n)&&(t[n]=e[n])})),t}var Ip=So(),Tp=function(t){function e(e,n,i){var r=t.call(this,e,n,i)||this;return r.uid=gc("ec_cpt_model"),r}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n)},e.prototype.mergeDefaultAndTheme=function(t,e){var n=bp(this),i=n?Sp(t):{};C(t,e.getTheme().get(this.mainType)),C(t,this.getDefaultOption()),n&&wp(t,i,n)},e.prototype.mergeOption=function(t,e){C(this.option,t,!0);var n=bp(this);n&&wp(this.option,t,n)},e.prototype.optionUpdated=function(t,e){},e.prototype.getDefaultOption=function(){var t=this.constructor;if(!function(t){return!(!t||!t[Ro])}(t))return t.defaultOption;var e=Ip(this);if(!e.defaultOption){for(var n=[],i=t;i;){var r=i.prototype.defaultOption;r&&n.push(r),i=i.superClass}for(var o={},a=n.length-1;a>=0;a--)o=C(o,n[a],!0);e.defaultOption=o}return e.defaultOption},e.prototype.getReferringComponents=function(t,e){var n=t+"Index",i=t+"Id";return Ao(this.ecModel,t,{index:this.get(n,!0),id:this.get(i,!0)},e)},e.prototype.getBoxLayoutParams=function(){var t=this;return{left:t.get("left"),top:t.get("top"),right:t.get("right"),bottom:t.get("bottom"),width:t.get("width"),height:t.get("height")}},e.prototype.getZLevelKey=function(){return""},e.prototype.setZLevel=function(t){this.option.zlevel=t},e.protoInitialize=function(){var t=e.prototype;t.type="component",t.id="",t.name="",t.mainType="",t.subType="",t.componentIndex=0}(),e}(dc);zo(Tp,dc),Go(Tp),function(t){var e={};t.registerSubTypeDefaulter=function(t,n){var i=No(t);e[i.main]=n},t.determineSubType=function(n,i){var r=i.type;if(!r){var o=No(n).main;t.hasSubTypes(n)&&e[o]&&(r=e[o](i))}return r}}(Tp),function(t,e){function n(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}t.topologicalTravel=function(t,i,r,o){if(t.length){var a=function(t){var i={},r=[];return E(t,(function(o){var a=n(i,o),s=function(t,e){var n=[];return E(t,(function(t){P(e,t)>=0&&n.push(t)})),n}(a.originalDeps=e(o),t);a.entryCount=s.length,0===a.entryCount&&r.push(o),E(s,(function(t){P(a.predecessor,t)<0&&a.predecessor.push(t);var e=n(i,t);P(e.successor,t)<0&&e.successor.push(o)}))})),{graph:i,noEntryList:r}}(i),s=a.graph,l=a.noEntryList,u={};for(E(t,(function(t){u[t]=!0}));l.length;){var h=l.pop(),c=s[h],p=!!u[h];p&&(r.call(o,h,c.originalDeps.slice()),delete u[h]),E(c.successor,p?f:d)}E(u,(function(){var t="";throw new Error(t)}))}function d(t){s[t].entryCount--,0===s[t].entryCount&&l.push(t)}function f(t){u[t]=!0,d(t)}}}(Tp,(function(t){var e=[];E(Tp.getClassesByMainType(t),(function(t){e=e.concat(t.dependencies||t.prototype.dependencies||[])})),e=z(e,(function(t){return No(t).main})),"dataset"!==t&&P(e,"dataset")<=0&&e.unshift("dataset");return e}));var Cp="";"undefined"!=typeof navigator&&(Cp=navigator.platform||"");var Dp="rgba(0, 0, 0, 0.2)",Ap={darkMode:"auto",colorBy:"series",color:["#5470c6","#91cc75","#fac858","#ee6666","#73c0de","#3ba272","#fc8452","#9a60b4","#ea7ccc"],gradientColor:["#f6efa6","#d88273","#bf444c"],aria:{decal:{decals:[{color:Dp,dashArrayX:[1,0],dashArrayY:[2,5],symbolSize:1,rotation:Math.PI/6},{color:Dp,symbol:"circle",dashArrayX:[[8,8],[0,8,8,0]],dashArrayY:[6,0],symbolSize:.8},{color:Dp,dashArrayX:[1,0],dashArrayY:[4,3],rotation:-Math.PI/4},{color:Dp,dashArrayX:[[6,6],[0,6,6,0]],dashArrayY:[6,0]},{color:Dp,dashArrayX:[[1,0],[1,6]],dashArrayY:[1,0,6,0],rotation:Math.PI/4},{color:Dp,symbol:"triangle",dashArrayX:[[9,9],[0,9,9,0]],dashArrayY:[7,2],symbolSize:.75}]}},textStyle:{fontFamily:Cp.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,stateAnimation:{duration:300,easing:"cubicOut"},animation:"auto",animationDuration:1e3,animationDurationUpdate:500,animationEasing:"cubicInOut",animationEasingUpdate:"cubicInOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},kp=ft(["tooltip","label","itemName","itemId","itemGroupId","seriesName"]),Lp="original",Pp="arrayRows",Op="objectRows",Rp="keyedColumns",Np="typedArray",Ep="unknown",zp="column",Vp="row",Bp=1,Fp=2,Gp=3,Wp=So();function Hp(t,e,n){var i={},r=Up(e);if(!r||!t)return i;var o,a,s=[],l=[],u=e.ecModel,h=Wp(u).datasetMap,c=r.uid+"_"+n.seriesLayoutBy;E(t=t.slice(),(function(e,n){var r=q(e)?e:t[n]={name:e};"ordinal"===r.type&&null==o&&(o=n,a=f(r)),i[r.name]=[]}));var p=h.get(c)||h.set(c,{categoryWayDim:a,valueWayDim:0});function d(t,e,n){for(var i=0;i<n;i++)t.push(e+i)}function f(t){var e=t.dimsDef;return e?e.length:1}return E(t,(function(t,e){var n=t.name,r=f(t);if(null==o){var a=p.valueWayDim;d(i[n],a,r),d(l,a,r),p.valueWayDim+=r}else if(o===e)d(i[n],0,r),d(s,0,r);else{a=p.categoryWayDim;d(i[n],a,r),d(l,a,r),p.categoryWayDim+=r}})),s.length&&(i.itemName=s),l.length&&(i.seriesName=l),i}function Yp(t,e,n){var i={};if(!Up(t))return i;var r,o=e.sourceFormat,a=e.dimensionsDefine;o!==Op&&o!==Rp||E(a,(function(t,e){"name"===(q(t)?t.name:t)&&(r=e)}));var s=function(){for(var t={},i={},s=[],l=0,u=Math.min(5,n);l<u;l++){var h=Zp(e.data,o,e.seriesLayoutBy,a,e.startIndex,l);s.push(h);var c=h===Gp;if(c&&null==t.v&&l!==r&&(t.v=l),(null==t.n||t.n===t.v||!c&&s[t.n]===Gp)&&(t.n=l),p(t)&&s[t.n]!==Gp)return t;c||(h===Fp&&null==i.v&&l!==r&&(i.v=l),null!=i.n&&i.n!==i.v||(i.n=l))}function p(t){return null!=t.v&&null!=t.n}return p(t)?t:p(i)?i:null}();if(s){i.value=[s.v];var l=null!=r?r:s.n;i.itemName=[l],i.seriesName=[l]}return i}function Up(t){if(!t.get("data",!0))return Ao(t.ecModel,"dataset",{index:t.get("datasetIndex",!0),id:t.get("datasetId",!0)},Co).models[0]}function Xp(t,e){return Zp(t.data,t.sourceFormat,t.seriesLayoutBy,t.dimensionsDefine,t.startIndex,e)}function Zp(t,e,n,i,r,o){var a,s,l;if($(t))return Gp;if(i){var u=i[o];q(u)?(s=u.name,l=u.type):X(u)&&(s=u)}if(null!=l)return"ordinal"===l?Bp:Gp;if(e===Pp){var h=t;if(n===Vp){for(var c=h[o],p=0;p<(c||[]).length&&p<5;p++)if(null!=(a=m(c[r+p])))return a}else for(p=0;p<h.length&&p<5;p++){var d=h[r+p];if(d&&null!=(a=m(d[o])))return a}}else if(e===Op){var f=t;if(!s)return Gp;for(p=0;p<f.length&&p<5;p++){if((y=f[p])&&null!=(a=m(y[s])))return a}}else if(e===Rp){if(!s)return Gp;if(!(c=t[s])||$(c))return Gp;for(p=0;p<c.length&&p<5;p++)if(null!=(a=m(c[p])))return a}else if(e===Lp){var g=t;for(p=0;p<g.length&&p<5;p++){var y,v=fo(y=g[p]);if(!Y(v))return Gp;if(null!=(a=m(v[o])))return a}}function m(t){var e=X(t);return null!=t&&isFinite(t)&&""!==t?e?Fp:Gp:e&&"-"!==t?Bp:void 0}return Gp}var jp=ft();var qp,Kp,$p,Jp=So(),Qp=So(),td=function(){function t(){}return t.prototype.getColorFromPalette=function(t,e,n){var i=ho(this.get("color",!0)),r=this.get("colorLayer",!0);return nd(this,Jp,i,r,t,e,n)},t.prototype.clearColorPalette=function(){!function(t,e){e(t).paletteIdx=0,e(t).paletteNameMap={}}(this,Jp)},t}();function ed(t,e,n,i){var r=ho(t.get(["aria","decal","decals"]));return nd(t,Qp,r,null,e,n,i)}function nd(t,e,n,i,r,o,a){var s=e(o=o||t),l=s.paletteIdx||0,u=s.paletteNameMap=s.paletteNameMap||{};if(u.hasOwnProperty(r))return u[r];var h=null!=a&&i?function(t,e){for(var n=t.length,i=0;i<n;i++)if(t[i].length>e)return t[i];return t[n-1]}(i,a):n;if((h=h||n)&&h.length){var c=h[l];return r&&(u[r]=c),s.paletteIdx=(l+1)%h.length,c}}var id=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(t,e,n,i,r,o){i=i||{},this.option=null,this._theme=new dc(i),this._locale=new dc(r),this._optionManager=o},e.prototype.setOption=function(t,e,n){var i=ad(e);this._optionManager.setOption(t,n,i),this._resetOption(null,i)},e.prototype.resetOption=function(t,e){return this._resetOption(t,ad(e))},e.prototype._resetOption=function(t,e){var n=!1,i=this._optionManager;if(!t||"recreate"===t){var r=i.mountOption("recreate"===t);0,this.option&&"recreate"!==t?(this.restoreData(),this._mergeOption(r,e)):$p(this,r),n=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var o=i.getTimelineOption(this);o&&(n=!0,this._mergeOption(o,e))}if(!t||"recreate"===t||"media"===t){var a=i.getMediaOption(this);a.length&&E(a,(function(t){n=!0,this._mergeOption(t,e)}),this)}return n},e.prototype.mergeOption=function(t){this._mergeOption(t,null)},e.prototype._mergeOption=function(t,e){var n=this.option,i=this._componentsMap,r=this._componentsCount,o=[],a=ft(),s=e&&e.replaceMergeMainTypeMap;Wp(this).datasetMap=ft(),E(t,(function(t,e){null!=t&&(Tp.hasClass(e)?e&&(o.push(e),a.set(e,!0)):n[e]=null==n[e]?T(t):C(n[e],t,!0))})),s&&s.each((function(t,e){Tp.hasClass(e)&&!a.get(e)&&(o.push(e),a.set(e,!0))})),Tp.topologicalTravel(o,Tp.getAllClassMainTypes(),(function(e){var o=function(t,e,n){var i=jp.get(e);if(!i)return n;var r=i(t);return r?n.concat(r):n}(this,e,ho(t[e])),a=i.get(e),l=a?s&&s.get(e)?"replaceMerge":"normalMerge":"replaceAll",u=yo(a,o,l);(function(t,e,n){E(t,(function(t){var i=t.newOption;q(i)&&(t.keyInfo.mainType=e,t.keyInfo.subType=function(t,e,n,i){return e.type?e.type:n?n.subType:i.determineSubType(t,e)}(e,i,t.existing,n))}))})(u,e,Tp),n[e]=null,i.set(e,null),r.set(e,0);var h,c=[],p=[],d=0;E(u,(function(t,n){var i=t.existing,r=t.newOption;if(r){var o="series"===e,a=Tp.getClass(e,t.keyInfo.subType,!o);if(!a)return;if("tooltip"===e){if(h)return void 0;h=!0}if(i&&i.constructor===a)i.name=t.keyInfo.name,i.mergeOption(r,this),i.optionUpdated(r,!1);else{var s=A({componentIndex:n},t.keyInfo);A(i=new a(r,this,this,s),s),t.brandNew&&(i.__requireNewView=!0),i.init(r,this,this),i.optionUpdated(null,!0)}}else i&&(i.mergeOption({},this),i.optionUpdated({},!1));i?(c.push(i.option),p.push(i),d++):(c.push(void 0),p.push(void 0))}),this),n[e]=c,i.set(e,p),r.set(e,d),"series"===e&&qp(this)}),this),this._seriesIndices||qp(this)},e.prototype.getOption=function(){var t=T(this.option);return E(t,(function(e,n){if(Tp.hasClass(n)){for(var i=ho(e),r=i.length,o=!1,a=r-1;a>=0;a--)i[a]&&!bo(i[a])?o=!0:(i[a]=null,!o&&r--);i.length=r,t[n]=i}})),delete t["\0_ec_inner"],t},e.prototype.getTheme=function(){return this._theme},e.prototype.getLocaleModel=function(){return this._locale},e.prototype.setUpdatePayload=function(t){this._payload=t},e.prototype.getUpdatePayload=function(){return this._payload},e.prototype.getComponent=function(t,e){var n=this._componentsMap.get(t);if(n){var i=n[e||0];if(i)return i;if(null==e)for(var r=0;r<n.length;r++)if(n[r])return n[r]}},e.prototype.queryComponents=function(t){var e=t.mainType;if(!e)return[];var n,i=t.index,r=t.id,o=t.name,a=this._componentsMap.get(e);return a&&a.length?(null!=i?(n=[],E(ho(i),(function(t){a[t]&&n.push(a[t])}))):n=null!=r?rd("id",r,a):null!=o?rd("name",o,a):B(a,(function(t){return!!t})),od(n,t)):[]},e.prototype.findComponents=function(t){var e,n,i,r,o,a=t.query,s=t.mainType,l=(n=s+"Index",i=s+"Id",r=s+"Name",!(e=a)||null==e[n]&&null==e[i]&&null==e[r]?null:{mainType:s,index:e[n],id:e[i],name:e[r]}),u=l?this.queryComponents(l):B(this._componentsMap.get(s),(function(t){return!!t}));return o=od(u,t),t.filter?B(o,t.filter):o},e.prototype.eachComponent=function(t,e,n){var i=this._componentsMap;if(U(t)){var r=e,o=t;i.each((function(t,e){for(var n=0;t&&n<t.length;n++){var i=t[n];i&&o.call(r,e,i,i.componentIndex)}}))}else for(var a=X(t)?i.get(t):q(t)?this.findComponents(t):null,s=0;a&&s<a.length;s++){var l=a[s];l&&e.call(n,l,l.componentIndex)}},e.prototype.getSeriesByName=function(t){var e=xo(t,null);return B(this._componentsMap.get("series"),(function(t){return!!t&&null!=e&&t.name===e}))},e.prototype.getSeriesByIndex=function(t){return this._componentsMap.get("series")[t]},e.prototype.getSeriesByType=function(t){return B(this._componentsMap.get("series"),(function(e){return!!e&&e.subType===t}))},e.prototype.getSeries=function(){return B(this._componentsMap.get("series"),(function(t){return!!t}))},e.prototype.getSeriesCount=function(){return this._componentsCount.get("series")},e.prototype.eachSeries=function(t,e){Kp(this),E(this._seriesIndices,(function(n){var i=this._componentsMap.get("series")[n];t.call(e,i,n)}),this)},e.prototype.eachRawSeries=function(t,e){E(this._componentsMap.get("series"),(function(n){n&&t.call(e,n,n.componentIndex)}))},e.prototype.eachSeriesByType=function(t,e,n){Kp(this),E(this._seriesIndices,(function(i){var r=this._componentsMap.get("series")[i];r.subType===t&&e.call(n,r,i)}),this)},e.prototype.eachRawSeriesByType=function(t,e,n){return E(this.getSeriesByType(t),e,n)},e.prototype.isSeriesFiltered=function(t){return Kp(this),null==this._seriesIndicesMap.get(t.componentIndex)},e.prototype.getCurrentSeriesIndices=function(){return(this._seriesIndices||[]).slice()},e.prototype.filterSeries=function(t,e){Kp(this);var n=[];E(this._seriesIndices,(function(i){var r=this._componentsMap.get("series")[i];t.call(e,r,i)&&n.push(i)}),this),this._seriesIndices=n,this._seriesIndicesMap=ft(n)},e.prototype.restoreData=function(t){qp(this);var e=this._componentsMap,n=[];e.each((function(t,e){Tp.hasClass(e)&&n.push(e)})),Tp.topologicalTravel(n,Tp.getAllClassMainTypes(),(function(n){E(e.get(n),(function(e){!e||"series"===n&&function(t,e){if(e){var n=e.seriesIndex,i=e.seriesId,r=e.seriesName;return null!=n&&t.componentIndex!==n||null!=i&&t.id!==i||null!=r&&t.name!==r}}(e,t)||e.restoreData()}))}))},e.internalField=(qp=function(t){var e=t._seriesIndices=[];E(t._componentsMap.get("series"),(function(t){t&&e.push(t.componentIndex)})),t._seriesIndicesMap=ft(e)},Kp=function(t){},void($p=function(t,e){t.option={},t.option["\0_ec_inner"]=1,t._componentsMap=ft({series:[]}),t._componentsCount=ft();var n=e.aria;q(n)&&null==n.enabled&&(n.enabled=!0),function(t,e){var n=t.color&&!t.colorLayer;E(e,(function(e,i){"colorLayer"===i&&n||Tp.hasClass(i)||("object"==typeof e?t[i]=t[i]?C(t[i],e,!1):T(e):null==t[i]&&(t[i]=e))}))}(e,t._theme.option),C(e,Ap,!1),t._mergeOption(e,null)})),e}(dc);function rd(t,e,n){if(Y(e)){var i=ft();return E(e,(function(t){null!=t&&(null!=xo(t,null)&&i.set(t,!0))})),B(n,(function(e){return e&&i.get(e[t])}))}var r=xo(e,null);return B(n,(function(e){return e&&null!=r&&e[t]===r}))}function od(t,e){return e.hasOwnProperty("subType")?B(t,(function(t){return t&&t.subType===e.subType})):t}function ad(t){var e=ft();return t&&E(ho(t.replaceMerge),(function(t){e.set(t,!0)})),{replaceMergeMainTypeMap:e}}R(id,td);var sd=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isSSR","isDisposed","on","off","getDataURL","getConnectedDataURL","getOption","getId","updateLabelLayout"],ld=function(t){E(sd,(function(e){this[e]=W(t[e],t)}),this)},ud={},hd=function(){function t(){this._coordinateSystems=[]}return t.prototype.create=function(t,e){var n=[];E(ud,(function(i,r){var o=i.create(t,e);n=n.concat(o||[])})),this._coordinateSystems=n},t.prototype.update=function(t,e){E(this._coordinateSystems,(function(n){n.update&&n.update(t,e)}))},t.prototype.getCoordinateSystems=function(){return this._coordinateSystems.slice()},t.register=function(t,e){ud[t]=e},t.get=function(t){return ud[t]},t}(),cd=/^(min|max)?(.+)$/,pd=function(){function t(t){this._timelineOptions=[],this._mediaList=[],this._currentMediaIndices=[],this._api=t}return t.prototype.setOption=function(t,e,n){t&&(E(ho(t.series),(function(t){t&&t.data&&$(t.data)&&ct(t.data)})),E(ho(t.dataset),(function(t){t&&t.source&&$(t.source)&&ct(t.source)}))),t=T(t);var i=this._optionBackup,r=function(t,e,n){var i,r,o=[],a=t.baseOption,s=t.timeline,l=t.options,u=t.media,h=!!t.media,c=!!(l||s||a&&a.timeline);a?(r=a).timeline||(r.timeline=s):((c||h)&&(t.options=t.media=null),r=t);h&&Y(u)&&E(u,(function(t){t&&t.option&&(t.query?o.push(t):i||(i=t))}));function p(t){E(e,(function(e){e(t,n)}))}return p(r),E(l,(function(t){return p(t)})),E(o,(function(t){return p(t.option)})),{baseOption:r,timelineOptions:l||[],mediaDefault:i,mediaList:o}}(t,e,!i);this._newBaseOption=r.baseOption,i?(r.timelineOptions.length&&(i.timelineOptions=r.timelineOptions),r.mediaList.length&&(i.mediaList=r.mediaList),r.mediaDefault&&(i.mediaDefault=r.mediaDefault)):this._optionBackup=r},t.prototype.mountOption=function(t){var e=this._optionBackup;return this._timelineOptions=e.timelineOptions,this._mediaList=e.mediaList,this._mediaDefault=e.mediaDefault,this._currentMediaIndices=[],T(t?e.baseOption:this._newBaseOption)},t.prototype.getTimelineOption=function(t){var e,n=this._timelineOptions;if(n.length){var i=t.getComponent("timeline");i&&(e=T(n[i.getCurrentIndex()]))}return e},t.prototype.getMediaOption=function(t){var e,n,i=this._api.getWidth(),r=this._api.getHeight(),o=this._mediaList,a=this._mediaDefault,s=[],l=[];if(!o.length&&!a)return l;for(var u=0,h=o.length;u<h;u++)dd(o[u].query,i,r)&&s.push(u);return!s.length&&a&&(s=[-1]),s.length&&(e=s,n=this._currentMediaIndices,e.join(",")!==n.join(","))&&(l=z(s,(function(t){return T(-1===t?a.option:o[t].option)}))),this._currentMediaIndices=s,l},t}();function dd(t,e,n){var i={width:e,height:n,aspectratio:e/n},r=!0;return E(t,(function(t,e){var n=e.match(cd);if(n&&n[1]&&n[2]){var o=n[1],a=n[2].toLowerCase();(function(t,e,n){return"min"===n?t>=e:"max"===n?t<=e:t===e})(i[a],t,o)||(r=!1)}})),r}var fd=E,gd=q,yd=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];function vd(t){var e=t&&t.itemStyle;if(e)for(var n=0,i=yd.length;n<i;n++){var r=yd[n],o=e.normal,a=e.emphasis;o&&o[r]&&(t[r]=t[r]||{},t[r].normal?C(t[r].normal,o[r]):t[r].normal=o[r],o[r]=null),a&&a[r]&&(t[r]=t[r]||{},t[r].emphasis?C(t[r].emphasis,a[r]):t[r].emphasis=a[r],a[r]=null)}}function md(t,e,n){if(t&&t[e]&&(t[e].normal||t[e].emphasis)){var i=t[e].normal,r=t[e].emphasis;i&&(n?(t[e].normal=t[e].emphasis=null,k(t[e],i)):t[e]=i),r&&(t.emphasis=t.emphasis||{},t.emphasis[e]=r,r.focus&&(t.emphasis.focus=r.focus),r.blurScope&&(t.emphasis.blurScope=r.blurScope))}}function xd(t){md(t,"itemStyle"),md(t,"lineStyle"),md(t,"areaStyle"),md(t,"label"),md(t,"labelLine"),md(t,"upperLabel"),md(t,"edgeLabel")}function _d(t,e){var n=gd(t)&&t[e],i=gd(n)&&n.textStyle;if(i){0;for(var r=0,o=po.length;r<o;r++){var a=po[r];i.hasOwnProperty(a)&&(n[a]=i[a])}}}function bd(t){t&&(xd(t),_d(t,"label"),t.emphasis&&_d(t.emphasis,"label"))}function wd(t){return Y(t)?t:t?[t]:[]}function Sd(t){return(Y(t)?t[0]:t)||{}}function Md(t,e){fd(wd(t.series),(function(t){gd(t)&&function(t){if(gd(t)){vd(t),xd(t),_d(t,"label"),_d(t,"upperLabel"),_d(t,"edgeLabel"),t.emphasis&&(_d(t.emphasis,"label"),_d(t.emphasis,"upperLabel"),_d(t.emphasis,"edgeLabel"));var e=t.markPoint;e&&(vd(e),bd(e));var n=t.markLine;n&&(vd(n),bd(n));var i=t.markArea;i&&bd(i);var r=t.data;if("graph"===t.type){r=r||t.nodes;var o=t.links||t.edges;if(o&&!$(o))for(var a=0;a<o.length;a++)bd(o[a]);E(t.categories,(function(t){xd(t)}))}if(r&&!$(r))for(a=0;a<r.length;a++)bd(r[a]);if((e=t.markPoint)&&e.data){var s=e.data;for(a=0;a<s.length;a++)bd(s[a])}if((n=t.markLine)&&n.data){var l=n.data;for(a=0;a<l.length;a++)Y(l[a])?(bd(l[a][0]),bd(l[a][1])):bd(l[a])}"gauge"===t.type?(_d(t,"axisLabel"),_d(t,"title"),_d(t,"detail")):"treemap"===t.type?(md(t.breadcrumb,"itemStyle"),E(t.levels,(function(t){xd(t)}))):"tree"===t.type&&xd(t.leaves)}}(t)}));var n=["xAxis","yAxis","radiusAxis","angleAxis","singleAxis","parallelAxis","radar"];e&&n.push("valueAxis","categoryAxis","logAxis","timeAxis"),fd(n,(function(e){fd(wd(t[e]),(function(t){t&&(_d(t,"axisLabel"),_d(t.axisPointer,"label"))}))})),fd(wd(t.parallel),(function(t){var e=t&&t.parallelAxisDefault;_d(e,"axisLabel"),_d(e&&e.axisPointer,"label")})),fd(wd(t.calendar),(function(t){md(t,"itemStyle"),_d(t,"dayLabel"),_d(t,"monthLabel"),_d(t,"yearLabel")})),fd(wd(t.radar),(function(t){_d(t,"name"),t.name&&null==t.axisName&&(t.axisName=t.name,delete t.name),null!=t.nameGap&&null==t.axisNameGap&&(t.axisNameGap=t.nameGap,delete t.nameGap)})),fd(wd(t.geo),(function(t){gd(t)&&(bd(t),fd(wd(t.regions),(function(t){bd(t)})))})),fd(wd(t.timeline),(function(t){bd(t),md(t,"label"),md(t,"itemStyle"),md(t,"controlStyle",!0);var e=t.data;Y(e)&&E(e,(function(t){q(t)&&(md(t,"label"),md(t,"itemStyle"))}))})),fd(wd(t.toolbox),(function(t){md(t,"iconStyle"),fd(t.feature,(function(t){md(t,"iconStyle")}))})),_d(Sd(t.axisPointer),"label"),_d(Sd(t.tooltip).axisPointer,"label")}function Id(t){t&&E(Td,(function(e){e[0]in t&&!(e[1]in t)&&(t[e[1]]=t[e[0]])}))}var Td=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],Cd=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],Dd=[["borderRadius","barBorderRadius"],["borderColor","barBorderColor"],["borderWidth","barBorderWidth"]];function Ad(t){var e=t&&t.itemStyle;if(e)for(var n=0;n<Dd.length;n++){var i=Dd[n][1],r=Dd[n][0];null!=e[i]&&(e[r]=e[i])}}function kd(t){t&&"edge"===t.alignTo&&null!=t.margin&&null==t.edgeDistance&&(t.edgeDistance=t.margin)}function Ld(t){t&&t.downplay&&!t.blur&&(t.blur=t.downplay)}function Pd(t,e){if(t)for(var n=0;n<t.length;n++)e(t[n]),t[n]&&Pd(t[n].children,e)}function Od(t,e){Md(t,e),t.series=ho(t.series),E(t.series,(function(t){if(q(t)){var e=t.type;if("line"===e)null!=t.clipOverflow&&(t.clip=t.clipOverflow);else if("pie"===e||"gauge"===e){if(null!=t.clockWise&&(t.clockwise=t.clockWise),kd(t.label),(r=t.data)&&!$(r))for(var n=0;n<r.length;n++)kd(r[n]);null!=t.hoverOffset&&(t.emphasis=t.emphasis||{},(t.emphasis.scaleSize=null)&&(t.emphasis.scaleSize=t.hoverOffset))}else if("gauge"===e){var i=function(t,e){for(var n=e.split(","),i=t,r=0;r<n.length&&null!=(i=i&&i[n[r]]);r++);return i}(t,"pointer.color");null!=i&&function(t,e,n,i){for(var r,o=e.split(","),a=t,s=0;s<o.length-1;s++)null==a[r=o[s]]&&(a[r]={}),a=a[r];(i||null==a[o[s]])&&(a[o[s]]=n)}(t,"itemStyle.color",i)}else if("bar"===e){var r;if(Ad(t),Ad(t.backgroundStyle),Ad(t.emphasis),(r=t.data)&&!$(r))for(n=0;n<r.length;n++)"object"==typeof r[n]&&(Ad(r[n]),Ad(r[n]&&r[n].emphasis))}else if("sunburst"===e){var o=t.highlightPolicy;o&&(t.emphasis=t.emphasis||{},t.emphasis.focus||(t.emphasis.focus=o)),Ld(t),Pd(t.data,Ld)}else"graph"===e||"sankey"===e?function(t){t&&null!=t.focusNodeAdjacency&&(t.emphasis=t.emphasis||{},null==t.emphasis.focus&&(t.emphasis.focus="adjacency"))}(t):"map"===e&&(t.mapType&&!t.map&&(t.map=t.mapType),t.mapLocation&&k(t,t.mapLocation));null!=t.hoverAnimation&&(t.emphasis=t.emphasis||{},t.emphasis&&null==t.emphasis.scale&&(t.emphasis.scale=t.hoverAnimation)),Id(t)}})),t.dataRange&&(t.visualMap=t.dataRange),E(Cd,(function(e){var n=t[e];n&&(Y(n)||(n=[n]),E(n,(function(t){Id(t)})))}))}function Rd(t){E(t,(function(e,n){var i=[],r=[NaN,NaN],o=[e.stackResultDimension,e.stackedOverDimension],a=e.data,s=e.isStackedByIndex,l=e.seriesModel.get("stackStrategy")||"samesign";a.modify(o,(function(o,u,h){var c,p,d=a.get(e.stackedDimension,h);if(isNaN(d))return r;s?p=a.getRawIndex(h):c=a.get(e.stackedByDimension,h);for(var f=NaN,g=n-1;g>=0;g--){var y=t[g];if(s||(p=y.data.rawIndexOf(y.stackedByDimension,c)),p>=0){var v=y.data.getByRawIndex(y.stackResultDimension,p);if("all"===l||"positive"===l&&v>0||"negative"===l&&v<0||"samesign"===l&&d>=0&&v>0||"samesign"===l&&d<=0&&v<0){d=Hr(d,v),f=v;break}}}return i[0]=d,i[1]=f,i}))}))}var Nd,Ed,zd,Vd,Bd,Fd=function(t){this.data=t.data||(t.sourceFormat===Rp?{}:[]),this.sourceFormat=t.sourceFormat||Ep,this.seriesLayoutBy=t.seriesLayoutBy||zp,this.startIndex=t.startIndex||0,this.dimensionsDetectedCount=t.dimensionsDetectedCount,this.metaRawOption=t.metaRawOption;var e=this.dimensionsDefine=t.dimensionsDefine;if(e)for(var n=0;n<e.length;n++){var i=e[n];null==i.type&&Xp(this,n)===Bp&&(i.type="ordinal")}};function Gd(t){return t instanceof Fd}function Wd(t,e,n){n=n||Yd(t);var i=e.seriesLayoutBy,r=function(t,e,n,i,r){var o,a;if(!t)return{dimensionsDefine:Ud(r),startIndex:a,dimensionsDetectedCount:o};if(e===Pp){var s=t;"auto"===i||null==i?Xd((function(t){null!=t&&"-"!==t&&(X(t)?null==a&&(a=1):a=0)}),n,s,10):a=j(i)?i:i?1:0,r||1!==a||(r=[],Xd((function(t,e){r[e]=null!=t?t+"":""}),n,s,1/0)),o=r?r.length:n===Vp?s.length:s[0]?s[0].length:null}else if(e===Op)r||(r=function(t){var e,n=0;for(;n<t.length&&!(e=t[n++]););if(e){var i=[];return E(e,(function(t,e){i.push(e)})),i}}(t));else if(e===Rp)r||(r=[],E(t,(function(t,e){r.push(e)})));else if(e===Lp){var l=fo(t[0]);o=Y(l)&&l.length||1}return{startIndex:a,dimensionsDefine:Ud(r),dimensionsDetectedCount:o}}(t,n,i,e.sourceHeader,e.dimensions);return new Fd({data:t,sourceFormat:n,seriesLayoutBy:i,dimensionsDefine:r.dimensionsDefine,startIndex:r.startIndex,dimensionsDetectedCount:r.dimensionsDetectedCount,metaRawOption:T(e)})}function Hd(t){return new Fd({data:t,sourceFormat:$(t)?Np:Lp})}function Yd(t){var e=Ep;if($(t))e=Np;else if(Y(t)){0===t.length&&(e=Pp);for(var n=0,i=t.length;n<i;n++){var r=t[n];if(null!=r){if(Y(r)){e=Pp;break}if(q(r)){e=Op;break}}}}else if(q(t))for(var o in t)if(mt(t,o)&&N(t[o])){e=Rp;break}return e}function Ud(t){if(t){var e=ft();return z(t,(function(t,n){var i={name:(t=q(t)?t:{name:t}).name,displayName:t.displayName,type:t.type};if(null==i.name)return i;i.name+="",null==i.displayName&&(i.displayName=i.name);var r=e.get(i.name);return r?i.name+="-"+r.count++:e.set(i.name,{count:1}),i}))}}function Xd(t,e,n,i){if(e===Vp)for(var r=0;r<n.length&&r<i;r++)t(n[r]?n[r][0]:null,r);else{var o=n[0]||[];for(r=0;r<o.length&&r<i;r++)t(o[r],r)}}function Zd(t){var e=t.sourceFormat;return e===Op||e===Rp}var jd=function(){function t(t,e){var n=Gd(t)?t:Hd(t);this._source=n;var i=this._data=n.data;n.sourceFormat===Np&&(this._offset=0,this._dimSize=e,this._data=i),Bd(this,i,n)}return t.prototype.getSource=function(){return this._source},t.prototype.count=function(){return 0},t.prototype.getItem=function(t,e){},t.prototype.appendData=function(t){},t.prototype.clean=function(){},t.protoInitialize=function(){var e=t.prototype;e.pure=!1,e.persistent=!0}(),t.internalField=function(){var t;Bd=function(t,r,o){var a=o.sourceFormat,s=o.seriesLayoutBy,l=o.startIndex,u=o.dimensionsDefine,h=Vd[of(a,s)];if(A(t,h),a===Np)t.getItem=e,t.count=i,t.fillStorage=n;else{var c=$d(a,s);t.getItem=W(c,null,r,l,u);var p=tf(a,s);t.count=W(p,null,r,l,u)}};var e=function(t,e){t-=this._offset,e=e||[];for(var n=this._data,i=this._dimSize,r=i*t,o=0;o<i;o++)e[o]=n[r+o];return e},n=function(t,e,n,i){for(var r=this._data,o=this._dimSize,a=0;a<o;a++){for(var s=i[a],l=null==s[0]?1/0:s[0],u=null==s[1]?-1/0:s[1],h=e-t,c=n[a],p=0;p<h;p++){var d=r[p*o+a];c[t+p]=d,d<l&&(l=d),d>u&&(u=d)}s[0]=l,s[1]=u}},i=function(){return this._data?this._data.length/this._dimSize:0};function r(t){for(var e=0;e<t.length;e++)this._data.push(t[e])}(t={}).arrayRows_column={pure:!0,appendData:r},t.arrayRows_row={pure:!0,appendData:function(){throw new Error('Do not support appendData when set seriesLayoutBy: "row".')}},t.objectRows={pure:!0,appendData:r},t.keyedColumns={pure:!0,appendData:function(t){var e=this._data;E(t,(function(t,n){for(var i=e[n]||(e[n]=[]),r=0;r<(t||[]).length;r++)i.push(t[r])}))}},t.original={appendData:r},t.typedArray={persistent:!1,pure:!0,appendData:function(t){this._data=t},clean:function(){this._offset+=this.count(),this._data=null}},Vd=t}(),t}(),qd=function(t,e,n,i){return t[i]},Kd=((Nd={}).arrayRows_column=function(t,e,n,i){return t[i+e]},Nd.arrayRows_row=function(t,e,n,i,r){i+=e;for(var o=r||[],a=t,s=0;s<a.length;s++){var l=a[s];o[s]=l?l[i]:null}return o},Nd.objectRows=qd,Nd.keyedColumns=function(t,e,n,i,r){for(var o=r||[],a=0;a<n.length;a++){var s=n[a].name;0;var l=t[s];o[a]=l?l[i]:null}return o},Nd.original=qd,Nd);function $d(t,e){var n=Kd[of(t,e)];return n}var Jd=function(t,e,n){return t.length},Qd=((Ed={}).arrayRows_column=function(t,e,n){return Math.max(0,t.length-e)},Ed.arrayRows_row=function(t,e,n){var i=t[0];return i?Math.max(0,i.length-e):0},Ed.objectRows=Jd,Ed.keyedColumns=function(t,e,n){var i=n[0].name;var r=t[i];return r?r.length:0},Ed.original=Jd,Ed);function tf(t,e){var n=Qd[of(t,e)];return n}var ef=function(t,e,n){return t[e]},nf=((zd={}).arrayRows=ef,zd.objectRows=function(t,e,n){return t[n]},zd.keyedColumns=ef,zd.original=function(t,e,n){var i=fo(t);return i instanceof Array?i[e]:i},zd.typedArray=ef,zd);function rf(t){var e=nf[t];return e}function of(t,e){return t===Pp?t+"_"+e:t}function af(t,e,n){if(t){var i=t.getRawDataItem(e);if(null!=i){var r=t.getStore(),o=r.getSource().sourceFormat;if(null!=n){var a=t.getDimensionIndex(n),s=r.getDimensionProperty(a);return rf(o)(i,a,s)}var l=i;return o===Lp&&(l=fo(i)),l}}}var sf=/\{@(.+?)\}/g,lf=function(){function t(){}return t.prototype.getDataParams=function(t,e){var n=this.getData(e),i=this.getRawValue(t,e),r=n.getRawIndex(t),o=n.getName(t),a=n.getRawDataItem(t),s=n.getItemVisual(t,"style"),l=s&&s[n.getItemVisual(t,"drawType")||"fill"],u=s&&s.stroke,h=this.mainType,c="series"===h,p=n.userOutput&&n.userOutput.get();return{componentType:h,componentSubType:this.subType,componentIndex:this.componentIndex,seriesType:c?this.subType:null,seriesIndex:this.seriesIndex,seriesId:c?this.id:null,seriesName:c?this.name:null,name:o,dataIndex:r,data:a,dataType:e,value:i,color:l,borderColor:u,dimensionNames:p?p.fullDimensions:null,encode:p?p.encode:null,$vars:["seriesName","name","value"]}},t.prototype.getFormattedLabel=function(t,e,n,i,r,o){e=e||"normal";var a=this.getData(n),s=this.getDataParams(t,n);(o&&(s.value=o.interpolatedValue),null!=i&&Y(s.value)&&(s.value=s.value[i]),r)||(r=a.getItemModel(t).get("normal"===e?["label","formatter"]:[e,"label","formatter"]));return U(r)?(s.status=e,s.dimensionIndex=i,r(s)):X(r)?hp(r,s).replace(sf,(function(e,n){var i=n.length,r=n;"["===r.charAt(0)&&"]"===r.charAt(i-1)&&(r=+r.slice(1,i-1));var s=af(a,t,r);if(o&&Y(o.interpolatedValue)){var l=a.getDimensionIndex(r);l>=0&&(s=o.interpolatedValue[l])}return null!=s?s+"":""})):void 0},t.prototype.getRawValue=function(t,e){return af(this.getData(e),t)},t.prototype.formatTooltip=function(t,e,n){},t}();function uf(t){var e,n;return q(t)?t.type&&(n=t):e=t,{text:e,frag:n}}function hf(t){return new cf(t)}var cf=function(){function t(t){t=t||{},this._reset=t.reset,this._plan=t.plan,this._count=t.count,this._onDirty=t.onDirty,this._dirty=!0}return t.prototype.perform=function(t){var e,n=this._upstream,i=t&&t.skip;if(this._dirty&&n){var r=this.context;r.data=r.outputData=n.context.outputData}this.__pipeline&&(this.__pipeline.currentTask=this),this._plan&&!i&&(e=this._plan(this.context));var o,a=h(this._modBy),s=this._modDataCount||0,l=h(t&&t.modBy),u=t&&t.modDataCount||0;function h(t){return!(t>=1)&&(t=1),t}a===l&&s===u||(e="reset"),(this._dirty||"reset"===e)&&(this._dirty=!1,o=this._doReset(i)),this._modBy=l,this._modDataCount=u;var c=t&&t.step;if(this._dueEnd=n?n._outputDueEnd:this._count?this._count(this.context):1/0,this._progress){var p=this._dueIndex,d=Math.min(null!=c?this._dueIndex+c:1/0,this._dueEnd);if(!i&&(o||p<d)){var f=this._progress;if(Y(f))for(var g=0;g<f.length;g++)this._doProgress(f[g],p,d,l,u);else this._doProgress(f,p,d,l,u)}this._dueIndex=d;var y=null!=this._settedOutputEnd?this._settedOutputEnd:d;0,this._outputDueEnd=y}else this._dueIndex=this._outputDueEnd=null!=this._settedOutputEnd?this._settedOutputEnd:this._dueEnd;return this.unfinished()},t.prototype.dirty=function(){this._dirty=!0,this._onDirty&&this._onDirty(this.context)},t.prototype._doProgress=function(t,e,n,i,r){pf.reset(e,n,i,r),this._callingProgress=t,this._callingProgress({start:e,end:n,count:n-e,next:pf.next},this.context)},t.prototype._doReset=function(t){var e,n;this._dueIndex=this._outputDueEnd=this._dueEnd=0,this._settedOutputEnd=null,!t&&this._reset&&((e=this._reset(this.context))&&e.progress&&(n=e.forceFirstProgress,e=e.progress),Y(e)&&!e.length&&(e=null)),this._progress=e,this._modBy=this._modDataCount=null;var i=this._downstream;return i&&i.dirty(),n},t.prototype.unfinished=function(){return this._progress&&this._dueIndex<this._dueEnd},t.prototype.pipe=function(t){(this._downstream!==t||this._dirty)&&(this._downstream=t,t._upstream=this,t.dirty())},t.prototype.dispose=function(){this._disposed||(this._upstream&&(this._upstream._downstream=null),this._downstream&&(this._downstream._upstream=null),this._dirty=!1,this._disposed=!0)},t.prototype.getUpstream=function(){return this._upstream},t.prototype.getDownstream=function(){return this._downstream},t.prototype.setOutputEnd=function(t){this._outputDueEnd=this._settedOutputEnd=t},t}(),pf=function(){var t,e,n,i,r,o={reset:function(l,u,h,c){e=l,t=u,n=h,i=c,r=Math.ceil(i/n),o.next=n>1&&i>0?s:a}};return o;function a(){return e<t?e++:null}function s(){var o=e%r*n+Math.ceil(e/r),a=e>=t?null:o<i?o:e;return e++,a}}();function df(t,e){var n=e&&e.type;return"ordinal"===n?t:("time"!==n||j(t)||null==t||"-"===t||(t=+jr(t)),null==t||""===t?NaN:+t)}var ff=ft({number:function(t){return parseFloat(t)},time:function(t){return+jr(t)},trim:function(t){return X(t)?ut(t):t}});function gf(t){return ff.get(t)}var yf={lt:function(t,e){return t<e},lte:function(t,e){return t<=e},gt:function(t,e){return t>e},gte:function(t,e){return t>=e}},vf=function(){function t(t,e){if(!j(e)){var n="";0,ao(n)}this._opFn=yf[t],this._rvalFloat=to(e)}return t.prototype.evaluate=function(t){return j(t)?this._opFn(t,this._rvalFloat):this._opFn(to(t),this._rvalFloat)},t}(),mf=function(){function t(t,e){var n="desc"===t;this._resultLT=n?1:-1,null==e&&(e=n?"min":"max"),this._incomparable="min"===e?-1/0:1/0}return t.prototype.evaluate=function(t,e){var n=j(t)?t:to(t),i=j(e)?e:to(e),r=isNaN(n),o=isNaN(i);if(r&&(n=this._incomparable),o&&(i=this._incomparable),r&&o){var a=X(t),s=X(e);a&&(n=s?t:0),s&&(i=a?e:0)}return n<i?this._resultLT:n>i?-this._resultLT:0},t}(),xf=function(){function t(t,e){this._rval=e,this._isEQ=t,this._rvalTypeof=typeof e,this._rvalFloat=to(e)}return t.prototype.evaluate=function(t){var e=t===this._rval;if(!e){var n=typeof t;n===this._rvalTypeof||"number"!==n&&"number"!==this._rvalTypeof||(e=to(t)===this._rvalFloat)}return this._isEQ?e:!e},t}();function _f(t,e){return"eq"===t||"ne"===t?new xf("eq"===t,e):mt(yf,t)?new vf(t,e):null}var bf=function(){function t(){}return t.prototype.getRawData=function(){throw new Error("not supported")},t.prototype.getRawDataItem=function(t){throw new Error("not supported")},t.prototype.cloneRawData=function(){},t.prototype.getDimensionInfo=function(t){},t.prototype.cloneAllDimensionInfo=function(){},t.prototype.count=function(){},t.prototype.retrieveValue=function(t,e){},t.prototype.retrieveValueFromItem=function(t,e){},t.prototype.convertValue=function(t,e){return df(t,e)},t}();function wf(t){var e=t.sourceFormat;if(!Df(e)){var n="";0,ao(n)}return t.data}function Sf(t){var e=t.sourceFormat,n=t.data;if(!Df(e)){var i="";0,ao(i)}if(e===Pp){for(var r=[],o=0,a=n.length;o<a;o++)r.push(n[o].slice());return r}if(e===Op){for(r=[],o=0,a=n.length;o<a;o++)r.push(A({},n[o]));return r}}function Mf(t,e,n){if(null!=n)return j(n)||!isNaN(n)&&!mt(e,n)?t[n]:mt(e,n)?e[n]:void 0}function If(t){return T(t)}var Tf=ft();function Cf(t,e,n,i){var r="";e.length||ao(r),q(t)||ao(r);var o=t.type,a=Tf.get(o);a||ao(r);var s=z(e,(function(t){return function(t,e){var n=new bf,i=t.data,r=n.sourceFormat=t.sourceFormat,o=t.startIndex,a="";t.seriesLayoutBy!==zp&&ao(a);var s=[],l={},u=t.dimensionsDefine;if(u)E(u,(function(t,e){var n=t.name,i={index:e,name:n,displayName:t.displayName};if(s.push(i),null!=n){var r="";mt(l,n)&&ao(r),l[n]=i}}));else for(var h=0;h<t.dimensionsDetectedCount;h++)s.push({index:h});var c=$d(r,zp);e.__isBuiltIn&&(n.getRawDataItem=function(t){return c(i,o,s,t)},n.getRawData=W(wf,null,t)),n.cloneRawData=W(Sf,null,t);var p=tf(r,zp);n.count=W(p,null,i,o,s);var d=rf(r);n.retrieveValue=function(t,e){var n=c(i,o,s,t);return f(n,e)};var f=n.retrieveValueFromItem=function(t,e){if(null!=t){var n=s[e];return n?d(t,e,n.name):void 0}};return n.getDimensionInfo=W(Mf,null,s,l),n.cloneAllDimensionInfo=W(If,null,s),n}(t,a)})),l=ho(a.transform({upstream:s[0],upstreamList:s,config:T(t.config)}));return z(l,(function(t,n){var i,r="";q(t)||ao(r),t.data||ao(r),Df(Yd(t.data))||ao(r);var o=e[0];if(o&&0===n&&!t.dimensions){var a=o.startIndex;a&&(t.data=o.data.slice(0,a).concat(t.data)),i={seriesLayoutBy:zp,sourceHeader:a,dimensions:o.metaRawOption.dimensions}}else i={seriesLayoutBy:zp,sourceHeader:0,dimensions:t.dimensions};return Wd(t.data,i,null)}))}function Df(t){return t===Pp||t===Op}var Af,kf="undefined",Lf=typeof Uint32Array===kf?Array:Uint32Array,Pf=typeof Uint16Array===kf?Array:Uint16Array,Of=typeof Int32Array===kf?Array:Int32Array,Rf=typeof Float64Array===kf?Array:Float64Array,Nf={float:Rf,int:Of,ordinal:Array,number:Array,time:Rf};function Ef(t){return t>65535?Lf:Pf}function zf(t,e,n,i,r){var o=Nf[n||"float"];if(r){var a=t[e],s=a&&a.length;if(s!==i){for(var l=new o(i),u=0;u<s;u++)l[u]=a[u];t[e]=l}}else t[e]=new o(i)}var Vf=function(){function t(){this._chunks=[],this._rawExtent=[],this._extent=[],this._count=0,this._rawCount=0,this._calcDimNameToIdx=ft()}return t.prototype.initData=function(t,e,n){this._provider=t,this._chunks=[],this._indices=null,this.getRawIndex=this._getRawIdxIdentity;var i=t.getSource(),r=this.defaultDimValueGetter=Af[i.sourceFormat];this._dimValueGetter=n||r,this._rawExtent=[];Zd(i);this._dimensions=z(e,(function(t){return{type:t.type,property:t.property}})),this._initDataFromProvider(0,t.count())},t.prototype.getProvider=function(){return this._provider},t.prototype.getSource=function(){return this._provider.getSource()},t.prototype.ensureCalculationDimension=function(t,e){var n=this._calcDimNameToIdx,i=this._dimensions,r=n.get(t);if(null!=r){if(i[r].type===e)return r}else r=i.length;return i[r]={type:e},n.set(t,r),this._chunks[r]=new Nf[e||"float"](this._rawCount),this._rawExtent[r]=[1/0,-1/0],r},t.prototype.collectOrdinalMeta=function(t,e){var n=this._chunks[t],i=this._dimensions[t],r=this._rawExtent,o=i.ordinalOffset||0,a=n.length;0===o&&(r[t]=[1/0,-1/0]);for(var s=r[t],l=o;l<a;l++){var u=n[l]=e.parseAndCollect(n[l]);isNaN(u)||(s[0]=Math.min(u,s[0]),s[1]=Math.max(u,s[1]))}i.ordinalMeta=e,i.ordinalOffset=a,i.type="ordinal"},t.prototype.getOrdinalMeta=function(t){return this._dimensions[t].ordinalMeta},t.prototype.getDimensionProperty=function(t){var e=this._dimensions[t];return e&&e.property},t.prototype.appendData=function(t){var e=this._provider,n=this.count();e.appendData(t);var i=e.count();return e.persistent||(i+=n),n<i&&this._initDataFromProvider(n,i,!0),[n,i]},t.prototype.appendValues=function(t,e){for(var n=this._chunks,i=this._dimensions,r=i.length,o=this._rawExtent,a=this.count(),s=a+Math.max(t.length,e||0),l=0;l<r;l++){zf(n,l,(d=i[l]).type,s,!0)}for(var u=[],h=a;h<s;h++)for(var c=h-a,p=0;p<r;p++){var d=i[p],f=Af.arrayRows.call(this,t[c]||u,d.property,c,p);n[p][h]=f;var g=o[p];f<g[0]&&(g[0]=f),f>g[1]&&(g[1]=f)}return this._rawCount=this._count=s,{start:a,end:s}},t.prototype._initDataFromProvider=function(t,e,n){for(var i=this._provider,r=this._chunks,o=this._dimensions,a=o.length,s=this._rawExtent,l=z(o,(function(t){return t.property})),u=0;u<a;u++){var h=o[u];s[u]||(s[u]=[1/0,-1/0]),zf(r,u,h.type,e,n)}if(i.fillStorage)i.fillStorage(t,e,r,s);else for(var c=[],p=t;p<e;p++){c=i.getItem(p,c);for(var d=0;d<a;d++){var f=r[d],g=this._dimValueGetter(c,l[d],p,d);f[p]=g;var y=s[d];g<y[0]&&(y[0]=g),g>y[1]&&(y[1]=g)}}!i.persistent&&i.clean&&i.clean(),this._rawCount=this._count=e,this._extent=[]},t.prototype.count=function(){return this._count},t.prototype.get=function(t,e){if(!(e>=0&&e<this._count))return NaN;var n=this._chunks[t];return n?n[this.getRawIndex(e)]:NaN},t.prototype.getValues=function(t,e){var n=[],i=[];if(null==e){e=t,t=[];for(var r=0;r<this._dimensions.length;r++)i.push(r)}else i=t;r=0;for(var o=i.length;r<o;r++)n.push(this.get(i[r],e));return n},t.prototype.getByRawIndex=function(t,e){if(!(e>=0&&e<this._rawCount))return NaN;var n=this._chunks[t];return n?n[e]:NaN},t.prototype.getSum=function(t){var e=0;if(this._chunks[t])for(var n=0,i=this.count();n<i;n++){var r=this.get(t,n);isNaN(r)||(e+=r)}return e},t.prototype.getMedian=function(t){var e=[];this.each([t],(function(t){isNaN(t)||e.push(t)}));var n=e.sort((function(t,e){return t-e})),i=this.count();return 0===i?0:i%2==1?n[(i-1)/2]:(n[i/2]+n[i/2-1])/2},t.prototype.indexOfRawIndex=function(t){if(t>=this._rawCount||t<0)return-1;if(!this._indices)return t;var e=this._indices,n=e[t];if(null!=n&&n<this._count&&n===t)return t;for(var i=0,r=this._count-1;i<=r;){var o=(i+r)/2|0;if(e[o]<t)i=o+1;else{if(!(e[o]>t))return o;r=o-1}}return-1},t.prototype.indicesOfNearest=function(t,e,n){var i=this._chunks[t],r=[];if(!i)return r;null==n&&(n=1/0);for(var o=1/0,a=-1,s=0,l=0,u=this.count();l<u;l++){var h=e-i[this.getRawIndex(l)],c=Math.abs(h);c<=n&&((c<o||c===o&&h>=0&&a<0)&&(o=c,a=h,s=0),h===a&&(r[s++]=l))}return r.length=s,r},t.prototype.getIndices=function(){var t,e=this._indices;if(e){var n=e.constructor,i=this._count;if(n===Array){t=new n(i);for(var r=0;r<i;r++)t[r]=e[r]}else t=new n(e.buffer,0,i)}else{t=new(n=Ef(this._rawCount))(this.count());for(r=0;r<t.length;r++)t[r]=r}return t},t.prototype.filter=function(t,e){if(!this._count)return this;for(var n=this.clone(),i=n.count(),r=new(Ef(n._rawCount))(i),o=[],a=t.length,s=0,l=t[0],u=n._chunks,h=0;h<i;h++){var c=void 0,p=n.getRawIndex(h);if(0===a)c=e(h);else if(1===a){c=e(u[l][p],h)}else{for(var d=0;d<a;d++)o[d]=u[t[d]][p];o[d]=h,c=e.apply(null,o)}c&&(r[s++]=p)}return s<i&&(n._indices=r),n._count=s,n._extent=[],n._updateGetRawIdx(),n},t.prototype.selectRange=function(t){var e=this.clone(),n=e._count;if(!n)return this;var i=G(t),r=i.length;if(!r)return this;var o=e.count(),a=new(Ef(e._rawCount))(o),s=0,l=i[0],u=t[l][0],h=t[l][1],c=e._chunks,p=!1;if(!e._indices){var d=0;if(1===r){for(var f=c[i[0]],g=0;g<n;g++){((x=f[g])>=u&&x<=h||isNaN(x))&&(a[s++]=d),d++}p=!0}else if(2===r){f=c[i[0]];var y=c[i[1]],v=t[i[1]][0],m=t[i[1]][1];for(g=0;g<n;g++){var x=f[g],_=y[g];(x>=u&&x<=h||isNaN(x))&&(_>=v&&_<=m||isNaN(_))&&(a[s++]=d),d++}p=!0}}if(!p)if(1===r)for(g=0;g<o;g++){var b=e.getRawIndex(g);((x=c[i[0]][b])>=u&&x<=h||isNaN(x))&&(a[s++]=b)}else for(g=0;g<o;g++){for(var w=!0,S=(b=e.getRawIndex(g),0);S<r;S++){var M=i[S];((x=c[M][b])<t[M][0]||x>t[M][1])&&(w=!1)}w&&(a[s++]=e.getRawIndex(g))}return s<o&&(e._indices=a),e._count=s,e._extent=[],e._updateGetRawIdx(),e},t.prototype.map=function(t,e){var n=this.clone(t);return this._updateDims(n,t,e),n},t.prototype.modify=function(t,e){this._updateDims(this,t,e)},t.prototype._updateDims=function(t,e,n){for(var i=t._chunks,r=[],o=e.length,a=t.count(),s=[],l=t._rawExtent,u=0;u<e.length;u++)l[e[u]]=[1/0,-1/0];for(var h=0;h<a;h++){for(var c=t.getRawIndex(h),p=0;p<o;p++)s[p]=i[e[p]][c];s[o]=h;var d=n&&n.apply(null,s);if(null!=d){"object"!=typeof d&&(r[0]=d,d=r);for(u=0;u<d.length;u++){var f=e[u],g=d[u],y=l[f],v=i[f];v&&(v[c]=g),g<y[0]&&(y[0]=g),g>y[1]&&(y[1]=g)}}}},t.prototype.lttbDownSample=function(t,e){var n,i,r,o=this.clone([t],!0),a=o._chunks[t],s=this.count(),l=0,u=Math.floor(1/e),h=this.getRawIndex(0),c=new(Ef(this._rawCount))(Math.min(2*(Math.ceil(s/u)+2),s));c[l++]=h;for(var p=1;p<s-1;p+=u){for(var d=Math.min(p+u,s-1),f=Math.min(p+2*u,s),g=(f+d)/2,y=0,v=d;v<f;v++){var m=a[I=this.getRawIndex(v)];isNaN(m)||(y+=m)}y/=f-d;var x=p,_=Math.min(p+u,s),b=p-1,w=a[h];n=-1,r=x;var S=-1,M=0;for(v=x;v<_;v++){var I;m=a[I=this.getRawIndex(v)];isNaN(m)?(M++,S<0&&(S=I)):(i=Math.abs((b-g)*(m-w)-(b-v)*(y-w)))>n&&(n=i,r=I)}M>0&&M<_-x&&(c[l++]=Math.min(S,r),r=Math.max(S,r)),c[l++]=r,h=r}return c[l++]=this.getRawIndex(s-1),o._count=l,o._indices=c,o.getRawIndex=this._getRawIdx,o},t.prototype.downSample=function(t,e,n,i){for(var r=this.clone([t],!0),o=r._chunks,a=[],s=Math.floor(1/e),l=o[t],u=this.count(),h=r._rawExtent[t]=[1/0,-1/0],c=new(Ef(this._rawCount))(Math.ceil(u/s)),p=0,d=0;d<u;d+=s){s>u-d&&(s=u-d,a.length=s);for(var f=0;f<s;f++){var g=this.getRawIndex(d+f);a[f]=l[g]}var y=n(a),v=this.getRawIndex(Math.min(d+i(a,y)||0,u-1));l[v]=y,y<h[0]&&(h[0]=y),y>h[1]&&(h[1]=y),c[p++]=v}return r._count=p,r._indices=c,r._updateGetRawIdx(),r},t.prototype.each=function(t,e){if(this._count)for(var n=t.length,i=this._chunks,r=0,o=this.count();r<o;r++){var a=this.getRawIndex(r);switch(n){case 0:e(r);break;case 1:e(i[t[0]][a],r);break;case 2:e(i[t[0]][a],i[t[1]][a],r);break;default:for(var s=0,l=[];s<n;s++)l[s]=i[t[s]][a];l[s]=r,e.apply(null,l)}}},t.prototype.getDataExtent=function(t){var e=this._chunks[t],n=[1/0,-1/0];if(!e)return n;var i,r=this.count();if(!this._indices)return this._rawExtent[t].slice();if(i=this._extent[t])return i.slice();for(var o=(i=n)[0],a=i[1],s=0;s<r;s++){var l=e[this.getRawIndex(s)];l<o&&(o=l),l>a&&(a=l)}return i=[o,a],this._extent[t]=i,i},t.prototype.getRawDataItem=function(t){var e=this.getRawIndex(t);if(this._provider.persistent)return this._provider.getItem(e);for(var n=[],i=this._chunks,r=0;r<i.length;r++)n.push(i[r][e]);return n},t.prototype.clone=function(e,n){var i,r,o=new t,a=this._chunks,s=e&&V(e,(function(t,e){return t[e]=!0,t}),{});if(s)for(var l=0;l<a.length;l++)o._chunks[l]=s[l]?(i=a[l],r=void 0,(r=i.constructor)===Array?i.slice():new r(i)):a[l];else o._chunks=a;return this._copyCommonProps(o),n||(o._indices=this._cloneIndices()),o._updateGetRawIdx(),o},t.prototype._copyCommonProps=function(t){t._count=this._count,t._rawCount=this._rawCount,t._provider=this._provider,t._dimensions=this._dimensions,t._extent=T(this._extent),t._rawExtent=T(this._rawExtent)},t.prototype._cloneIndices=function(){if(this._indices){var t=this._indices.constructor,e=void 0;if(t===Array){var n=this._indices.length;e=new t(n);for(var i=0;i<n;i++)e[i]=this._indices[i]}else e=new t(this._indices);return e}return null},t.prototype._getRawIdxIdentity=function(t){return t},t.prototype._getRawIdx=function(t){return t<this._count&&t>=0?this._indices[t]:-1},t.prototype._updateGetRawIdx=function(){this.getRawIndex=this._indices?this._getRawIdx:this._getRawIdxIdentity},t.internalField=function(){function t(t,e,n,i){return df(t[i],this._dimensions[i])}Af={arrayRows:t,objectRows:function(t,e,n,i){return df(t[e],this._dimensions[i])},keyedColumns:t,original:function(t,e,n,i){var r=t&&(null==t.value?t:t.value);return df(r instanceof Array?r[i]:r,this._dimensions[i])},typedArray:function(t,e,n,i){return t[i]}}}(),t}(),Bf=function(){function t(t){this._sourceList=[],this._storeList=[],this._upstreamSignList=[],this._versionSignBase=0,this._dirty=!0,this._sourceHost=t}return t.prototype.dirty=function(){this._setLocalSource([],[]),this._storeList=[],this._dirty=!0},t.prototype._setLocalSource=function(t,e){this._sourceList=t,this._upstreamSignList=e,this._versionSignBase++,this._versionSignBase>9e10&&(this._versionSignBase=0)},t.prototype._getVersionSign=function(){return this._sourceHost.uid+"_"+this._versionSignBase},t.prototype.prepareSource=function(){this._isDirty()&&(this._createSource(),this._dirty=!1)},t.prototype._createSource=function(){this._setLocalSource([],[]);var t,e,n=this._sourceHost,i=this._getUpstreamSourceManagers(),r=!!i.length;if(Gf(n)){var o=n,a=void 0,s=void 0,l=void 0;if(r){var u=i[0];u.prepareSource(),a=(l=u.getSource()).data,s=l.sourceFormat,e=[u._getVersionSign()]}else s=$(a=o.get("data",!0))?Np:Lp,e=[];var h=this._getSourceMetaRawOption()||{},c=l&&l.metaRawOption||{},p=rt(h.seriesLayoutBy,c.seriesLayoutBy)||null,d=rt(h.sourceHeader,c.sourceHeader),f=rt(h.dimensions,c.dimensions);t=p!==c.seriesLayoutBy||!!d!=!!c.sourceHeader||f?[Wd(a,{seriesLayoutBy:p,sourceHeader:d,dimensions:f},s)]:[]}else{var g=n;if(r){var y=this._applyTransform(i);t=y.sourceList,e=y.upstreamSignList}else{t=[Wd(g.get("source",!0),this._getSourceMetaRawOption(),null)],e=[]}}this._setLocalSource(t,e)},t.prototype._applyTransform=function(t){var e,n=this._sourceHost,i=n.get("transform",!0),r=n.get("fromTransformResult",!0);if(null!=r){var o="";1!==t.length&&Wf(o)}var a,s=[],l=[];return E(t,(function(t){t.prepareSource();var e=t.getSource(r||0),n="";null==r||e||Wf(n),s.push(e),l.push(t._getVersionSign())})),i?e=function(t,e,n){var i=ho(t),r=i.length,o="";r||ao(o);for(var a=0,s=r;a<s;a++)e=Cf(i[a],e),a!==s-1&&(e.length=Math.max(e.length,1));return e}(i,s,n.componentIndex):null!=r&&(e=[(a=s[0],new Fd({data:a.data,sourceFormat:a.sourceFormat,seriesLayoutBy:a.seriesLayoutBy,dimensionsDefine:T(a.dimensionsDefine),startIndex:a.startIndex,dimensionsDetectedCount:a.dimensionsDetectedCount}))]),{sourceList:e,upstreamSignList:l}},t.prototype._isDirty=function(){if(this._dirty)return!0;for(var t=this._getUpstreamSourceManagers(),e=0;e<t.length;e++){var n=t[e];if(n._isDirty()||this._upstreamSignList[e]!==n._getVersionSign())return!0}},t.prototype.getSource=function(t){t=t||0;var e=this._sourceList[t];if(!e){var n=this._getUpstreamSourceManagers();return n[0]&&n[0].getSource(t)}return e},t.prototype.getSharedDataStore=function(t){var e=t.makeStoreSchema();return this._innerGetDataStore(e.dimensions,t.source,e.hash)},t.prototype._innerGetDataStore=function(t,e,n){var i=this._storeList,r=i[0];r||(r=i[0]={});var o=r[n];if(!o){var a=this._getUpstreamSourceManagers()[0];Gf(this._sourceHost)&&a?o=a._innerGetDataStore(t,e,n):(o=new Vf).initData(new jd(e,t.length),t),r[n]=o}return o},t.prototype._getUpstreamSourceManagers=function(){var t=this._sourceHost;if(Gf(t)){var e=Up(t);return e?[e.getSourceManager()]:[]}return z(function(t){return t.get("transform",!0)||t.get("fromTransformResult",!0)?Ao(t.ecModel,"dataset",{index:t.get("fromDatasetIndex",!0),id:t.get("fromDatasetId",!0)},Co).models:[]}(t),(function(t){return t.getSourceManager()}))},t.prototype._getSourceMetaRawOption=function(){var t,e,n,i=this._sourceHost;if(Gf(i))t=i.get("seriesLayoutBy",!0),e=i.get("sourceHeader",!0),n=i.get("dimensions",!0);else if(!this._getUpstreamSourceManagers().length){var r=i;t=r.get("seriesLayoutBy",!0),e=r.get("sourceHeader",!0),n=r.get("dimensions",!0)}return{seriesLayoutBy:t,sourceHeader:e,dimensions:n}},t}();function Ff(t){t.option.transform&&ct(t.option.transform)}function Gf(t){return"series"===t.mainType}function Wf(t){throw new Error(t)}function Hf(t,e){var n=t.color||"#6e7079",i=t.fontSize||12,r=t.fontWeight||"400",o=t.color||"#464646",a=t.fontSize||14,s=t.fontWeight||"900";return"html"===e?{nameStyle:"font-size:"+ap(i+"")+"px;color:"+ap(n)+";font-weight:"+ap(r+""),valueStyle:"font-size:"+ap(a+"")+"px;color:"+ap(o)+";font-weight:"+ap(s+"")}:{nameStyle:{fontSize:i,fill:n,fontWeight:r},valueStyle:{fontSize:a,fill:o,fontWeight:s}}}var Yf=[0,10,20,30],Uf=["","\n","\n\n","\n\n\n"];function Xf(t,e){return e.type=t,e}function Zf(t){return"section"===t.type}function jf(t){return Zf(t)?Kf:$f}function qf(t){if(Zf(t)){var e=0,n=t.blocks.length,i=n>1||n>0&&!t.noHeader;return E(t.blocks,(function(t){var n=qf(t);n>=e&&(e=n+ +(i&&(!n||Zf(t)&&!t.noHeader)))})),e}return 0}function Kf(t,e,n,i){var r,o=e.noHeader,a=(r=qf(e),{html:Yf[r],richText:Uf[r]}),s=[],l=e.blocks||[];lt(!l||Y(l)),l=l||[];var u=t.orderMode;if(e.sortBlocks&&u){l=l.slice();var h={valueAsc:"asc",valueDesc:"desc"};if(mt(h,u)){var c=new mf(h[u],null);l.sort((function(t,e){return c.evaluate(t.sortParam,e.sortParam)}))}else"seriesDesc"===u&&l.reverse()}E(l,(function(n,r){var o=e.valueFormatter,l=jf(n)(o?A(A({},t),{valueFormatter:o}):t,n,r>0?a.html:0,i);null!=l&&s.push(l)}));var p="richText"===t.renderMode?s.join(a.richText):Qf(s.join(""),o?n:a.html);if(o)return p;var d=sp(e.header,"ordinal",t.useUTC),f=Hf(i,t.renderMode).nameStyle;return"richText"===t.renderMode?tg(t,d,f)+a.richText+p:Qf('<div style="'+f+";"+'line-height:1;">'+ap(d)+"</div>"+p,n)}function $f(t,e,n,i){var r=t.renderMode,o=e.noName,a=e.noValue,s=!e.markerType,l=e.name,u=t.useUTC,h=e.valueFormatter||t.valueFormatter||function(t){return z(t=Y(t)?t:[t],(function(t,e){return sp(t,Y(d)?d[e]:d,u)}))};if(!o||!a){var c=s?"":t.markupStyleCreator.makeTooltipMarker(e.markerType,e.markerColor||"#333",r),p=o?"":sp(l,"ordinal",u),d=e.valueType,f=a?[]:h(e.value),g=!s||!o,y=!s&&o,v=Hf(i,r),m=v.nameStyle,x=v.valueStyle;return"richText"===r?(s?"":c)+(o?"":tg(t,p,m))+(a?"":function(t,e,n,i,r){var o=[r],a=i?10:20;return n&&o.push({padding:[0,0,0,a],align:"right"}),t.markupStyleCreator.wrapRichTextStyle(Y(e)?e.join(" "):e,o)}(t,f,g,y,x)):Qf((s?"":c)+(o?"":function(t,e,n){return'<span style="'+n+";"+(e?"margin-left:2px":"")+'">'+ap(t)+"</span>"}(p,!s,m))+(a?"":function(t,e,n,i){var r=n?"10px":"20px",o=e?"float:right;margin-left:"+r:"";return t=Y(t)?t:[t],'<span style="'+o+";"+i+'">'+z(t,(function(t){return ap(t)})).join(" ")+"</span>"}(f,g,y,x)),n)}}function Jf(t,e,n,i,r,o){if(t)return jf(t)({useUTC:r,renderMode:n,orderMode:i,markupStyleCreator:e,valueFormatter:t.valueFormatter},t,0,o)}function Qf(t,e){return'<div style="'+("margin: "+e+"px 0 0")+";"+'line-height:1;">'+t+'<div style="clear:both"></div></div>'}function tg(t,e,n){return t.markupStyleCreator.wrapRichTextStyle(e,n)}function eg(t,e){return pp(t.getData().getItemVisual(e,"style")[t.visualDrawType])}function ng(t,e){var n=t.get("padding");return null!=n?n:"richText"===e?[8,10]:10}var ig=function(){function t(){this.richTextStyles={},this._nextStyleNameId=no()}return t.prototype._generateStyleName=function(){return"__EC_aUTo_"+this._nextStyleNameId++},t.prototype.makeTooltipMarker=function(t,e,n){var i="richText"===n?this._generateStyleName():null,r=cp({color:e,type:t,renderMode:n,markerId:i});return X(r)?r:(this.richTextStyles[i]=r.style,r.content)},t.prototype.wrapRichTextStyle=function(t,e){var n={};Y(e)?E(e,(function(t){return A(n,t)})):A(n,e);var i=this._generateStyleName();return this.richTextStyles[i]=n,"{"+i+"|"+t+"}"},t}();function rg(t){var e,n,i,r,o=t.series,a=t.dataIndex,s=t.multipleSeries,l=o.getData(),u=l.mapDimensionsAll("defaultedTooltip"),h=u.length,c=o.getRawValue(a),p=Y(c),d=eg(o,a);if(h>1||p&&!h){var f=function(t,e,n,i,r){var o=e.getData(),a=V(t,(function(t,e,n){var i=o.getDimensionInfo(n);return t||i&&!1!==i.tooltip&&null!=i.displayName}),!1),s=[],l=[],u=[];function h(t,e){var n=o.getDimensionInfo(e);n&&!1!==n.otherDims.tooltip&&(a?u.push(Xf("nameValue",{markerType:"subItem",markerColor:r,name:n.displayName,value:t,valueType:n.type})):(s.push(t),l.push(n.type)))}return i.length?E(i,(function(t){h(af(o,n,t),t)})):E(t,h),{inlineValues:s,inlineValueTypes:l,blocks:u}}(c,o,a,u,d);e=f.inlineValues,n=f.inlineValueTypes,i=f.blocks,r=f.inlineValues[0]}else if(h){var g=l.getDimensionInfo(u[0]);r=e=af(l,a,u[0]),n=g.type}else r=e=p?c[0]:c;var y=_o(o),v=y&&o.name||"",m=l.getName(a),x=s?v:m;return Xf("section",{header:v,noHeader:s||!y,sortParam:r,blocks:[Xf("nameValue",{markerType:"item",markerColor:d,name:x,noName:!ut(x),value:e,valueType:n})].concat(i||[])})}var og=So();function ag(t,e){return t.getName(e)||t.getId(e)}var sg=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._selectedDataIndicesMap={},e}return n(e,t),e.prototype.init=function(t,e,n){this.seriesIndex=this.componentIndex,this.dataTask=hf({count:ug,reset:hg}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(t,n),(og(this).sourceManager=new Bf(this)).prepareSource();var i=this.getInitialData(t,n);pg(i,this),this.dataTask.context.data=i,og(this).dataBeforeProcessed=i,lg(this),this._initSelectedMapFromData(i)},e.prototype.mergeDefaultAndTheme=function(t,e){var n=bp(this),i=n?Sp(t):{},r=this.subType;Tp.hasClass(r)&&(r+="Series"),C(t,e.getTheme().get(this.subType)),C(t,this.getDefaultOption()),co(t,"label",["show"]),this.fillDataTextStyle(t.data),n&&wp(t,i,n)},e.prototype.mergeOption=function(t,e){t=C(this.option,t,!0),this.fillDataTextStyle(t.data);var n=bp(this);n&&wp(this.option,t,n);var i=og(this).sourceManager;i.dirty(),i.prepareSource();var r=this.getInitialData(t,e);pg(r,this),this.dataTask.dirty(),this.dataTask.context.data=r,og(this).dataBeforeProcessed=r,lg(this),this._initSelectedMapFromData(r)},e.prototype.fillDataTextStyle=function(t){if(t&&!$(t))for(var e=["show"],n=0;n<t.length;n++)t[n]&&t[n].label&&co(t[n],"label",e)},e.prototype.getInitialData=function(t,e){},e.prototype.appendData=function(t){this.getRawData().appendData(t.data)},e.prototype.getData=function(t){var e=fg(this);if(e){var n=e.context.data;return null==t?n:n.getLinkedData(t)}return og(this).data},e.prototype.getAllData=function(){var t=this.getData();return t&&t.getLinkedDataAll?t.getLinkedDataAll():[{data:t}]},e.prototype.setData=function(t){var e=fg(this);if(e){var n=e.context;n.outputData=t,e!==this.dataTask&&(n.data=t)}og(this).data=t},e.prototype.getEncode=function(){var t=this.get("encode",!0);if(t)return ft(t)},e.prototype.getSourceManager=function(){return og(this).sourceManager},e.prototype.getSource=function(){return this.getSourceManager().getSource()},e.prototype.getRawData=function(){return og(this).dataBeforeProcessed},e.prototype.getColorBy=function(){return this.get("colorBy")||"series"},e.prototype.isColorBySeries=function(){return"series"===this.getColorBy()},e.prototype.getBaseAxis=function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},e.prototype.formatTooltip=function(t,e,n){return rg({series:this,dataIndex:t,multipleSeries:e})},e.prototype.isAnimationEnabled=function(){var t=this.ecModel;if(r.node&&(!t||!t.ssr))return!1;var e=this.getShallow("animation");return e&&this.getData().count()>this.getShallow("animationThreshold")&&(e=!1),!!e},e.prototype.restoreData=function(){this.dataTask.dirty()},e.prototype.getColorFromPalette=function(t,e,n){var i=this.ecModel,r=td.prototype.getColorFromPalette.call(this,t,e,n);return r||(r=i.getColorFromPalette(t,e,n)),r},e.prototype.coordDimToDataDim=function(t){return this.getRawData().mapDimensionsAll(t)},e.prototype.getProgressive=function(){return this.get("progressive")},e.prototype.getProgressiveThreshold=function(){return this.get("progressiveThreshold")},e.prototype.select=function(t,e){this._innerSelect(this.getData(e),t)},e.prototype.unselect=function(t,e){var n=this.option.selectedMap;if(n){var i=this.option.selectedMode,r=this.getData(e);if("series"===i||"all"===n)return this.option.selectedMap={},void(this._selectedDataIndicesMap={});for(var o=0;o<t.length;o++){var a=ag(r,t[o]);n[a]=!1,this._selectedDataIndicesMap[a]=-1}}},e.prototype.toggleSelect=function(t,e){for(var n=[],i=0;i<t.length;i++)n[0]=t[i],this.isSelected(t[i],e)?this.unselect(n,e):this.select(n,e)},e.prototype.getSelectedDataIndices=function(){if("all"===this.option.selectedMap)return[].slice.call(this.getData().getIndices());for(var t=this._selectedDataIndicesMap,e=G(t),n=[],i=0;i<e.length;i++){var r=t[e[i]];r>=0&&n.push(r)}return n},e.prototype.isSelected=function(t,e){var n=this.option.selectedMap;if(!n)return!1;var i=this.getData(e);return("all"===n||n[ag(i,t)])&&!i.getItemModel(t).get(["select","disabled"])},e.prototype.isUniversalTransitionEnabled=function(){if(this.__universalTransitionEnabled)return!0;var t=this.option.universalTransition;return!!t&&(!0===t||t&&t.enabled)},e.prototype._innerSelect=function(t,e){var n,i,r=this.option,o=r.selectedMode,a=e.length;if(o&&a)if("series"===o)r.selectedMap="all";else if("multiple"===o){q(r.selectedMap)||(r.selectedMap={});for(var s=r.selectedMap,l=0;l<a;l++){var u=e[l];s[c=ag(t,u)]=!0,this._selectedDataIndicesMap[c]=t.getRawIndex(u)}}else if("single"===o||!0===o){var h=e[a-1],c=ag(t,h);r.selectedMap=((n={})[c]=!0,n),this._selectedDataIndicesMap=((i={})[c]=t.getRawIndex(h),i)}},e.prototype._initSelectedMapFromData=function(t){if(!this.option.selectedMap){var e=[];t.hasItemOption&&t.each((function(n){var i=t.getRawDataItem(n);i&&i.selected&&e.push(n)})),e.length>0&&this._innerSelect(t,e)}},e.registerClass=function(t){return Tp.registerClass(t)},e.protoInitialize=function(){var t=e.prototype;t.type="series.__base__",t.seriesIndex=0,t.ignoreStyleOnData=!1,t.hasSymbolVisual=!1,t.defaultSymbol="circle",t.visualStyleAccessPath="itemStyle",t.visualDrawType="fill"}(),e}(Tp);function lg(t){var e=t.name;_o(t)||(t.name=function(t){var e=t.getRawData(),n=e.mapDimensionsAll("seriesName"),i=[];return E(n,(function(t){var n=e.getDimensionInfo(t);n.displayName&&i.push(n.displayName)})),i.join(" ")}(t)||e)}function ug(t){return t.model.getRawData().count()}function hg(t){var e=t.model;return e.setData(e.getRawData().cloneShallow()),cg}function cg(t,e){e.outputData&&t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function pg(t,e){E(gt(t.CHANGABLE_METHODS,t.DOWNSAMPLE_METHODS),(function(n){t.wrapMethod(n,H(dg,e))}))}function dg(t,e){var n=fg(t);return n&&n.setOutputEnd((e||this).count()),e}function fg(t){var e=(t.ecModel||{}).scheduler,n=e&&e.getPipeline(t.uid);if(n){var i=n.currentTask;if(i){var r=i.agentStubMap;r&&(i=r.get(t.uid))}return i}}R(sg,lf),R(sg,td),zo(sg,Tp);var gg=function(){function t(){this.group=new Cr,this.uid=gc("viewComponent")}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){},t.prototype.updateLayout=function(t,e,n,i){},t.prototype.updateVisual=function(t,e,n,i){},t.prototype.toggleBlurSeries=function(t,e,n){},t.prototype.eachRendered=function(t){var e=this.group;e&&e.traverse(t)},t}();function yg(){var t=So();return function(e){var n=t(e),i=e.pipelineContext,r=!!n.large,o=!!n.progressiveRender,a=n.large=!(!i||!i.large),s=n.progressiveRender=!(!i||!i.progressiveRender);return!(r===a&&o===s)&&"reset"}}Eo(gg),Go(gg);var vg=So(),mg=yg(),xg=function(){function t(){this.group=new Cr,this.uid=gc("viewChart"),this.renderTask=hf({plan:wg,reset:Sg}),this.renderTask.context={view:this}}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){0},t.prototype.highlight=function(t,e,n,i){var r=t.getData(i&&i.dataType);r&&bg(r,i,"emphasis")},t.prototype.downplay=function(t,e,n,i){var r=t.getData(i&&i.dataType);r&&bg(r,i,"normal")},t.prototype.remove=function(t,e){this.group.removeAll()},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateLayout=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.eachRendered=function(t){Vh(this.group,t)},t.markUpdateMethod=function(t,e){vg(t).updateMethod=e},t.protoInitialize=void(t.prototype.type="chart"),t}();function _g(t,e,n){t&&Fl(t)&&("emphasis"===e?_l:bl)(t,n)}function bg(t,e,n){var i=wo(t,e),r=e&&null!=e.highlightKey?function(t){var e=Xs[t];return null==e&&Us<=32&&(e=Xs[t]=Us++),e}(e.highlightKey):null;null!=i?E(ho(i),(function(e){_g(t.getItemGraphicEl(e),n,r)})):t.eachItemGraphicEl((function(t){_g(t,n,r)}))}function wg(t){return mg(t.model)}function Sg(t){var e=t.model,n=t.ecModel,i=t.api,r=t.payload,o=e.pipelineContext.progressiveRender,a=t.view,s=r&&vg(r).updateMethod,l=o?"incrementalPrepareRender":s&&a[s]?s:"render";return"render"!==l&&a[l](e,n,i,r),Mg[l]}Eo(xg),Go(xg);var Mg={incrementalPrepareRender:{progress:function(t,e){e.view.incrementalRender(t,e.model,e.ecModel,e.api,e.payload)}},render:{forceFirstProgress:!0,progress:function(t,e){e.view.render(e.model,e.ecModel,e.api,e.payload)}}},Ig="\0__throttleOriginMethod",Tg="\0__throttleRate",Cg="\0__throttleType";function Dg(t,e,n){var i,r,o,a,s,l=0,u=0,h=null;function c(){u=(new Date).getTime(),h=null,t.apply(o,a||[])}e=e||0;var p=function(){for(var t=[],p=0;p<arguments.length;p++)t[p]=arguments[p];i=(new Date).getTime(),o=this,a=t;var d=s||e,f=s||n;s=null,r=i-(f?l:u)-d,clearTimeout(h),f?h=setTimeout(c,d):r>=0?c():h=setTimeout(c,-r),l=i};return p.clear=function(){h&&(clearTimeout(h),h=null)},p.debounceNextCall=function(t){s=t},p}function Ag(t,e,n,i){var r=t[e];if(r){var o=r[Ig]||r,a=r[Cg];if(r[Tg]!==n||a!==i){if(null==n||!i)return t[e]=o;(r=t[e]=Dg(o,n,"debounce"===i))[Ig]=o,r[Cg]=i,r[Tg]=n}return r}}function kg(t,e){var n=t[e];n&&n[Ig]&&(n.clear&&n.clear(),t[e]=n[Ig])}var Lg=So(),Pg={itemStyle:Wo(hc,!0),lineStyle:Wo(sc,!0)},Og={lineStyle:"stroke",itemStyle:"fill"};function Rg(t,e){var n=t.visualStyleMapper||Pg[e];return n||(console.warn("Unkown style type '"+e+"'."),Pg.itemStyle)}function Ng(t,e){var n=t.visualDrawType||Og[e];return n||(console.warn("Unkown style type '"+e+"'."),"fill")}var Eg={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=t.getModel(i),o=Rg(t,i)(r),a=r.getShallow("decal");a&&(n.setVisual("decal",a),a.dirty=!0);var s=Ng(t,i),l=o[s],u=U(l)?l:null,h="auto"===o.fill||"auto"===o.stroke;if(!o[s]||u||h){var c=t.getColorFromPalette(t.name,null,e.getSeriesCount());o[s]||(o[s]=c,n.setVisual("colorFromPalette",!0)),o.fill="auto"===o.fill||U(o.fill)?c:o.fill,o.stroke="auto"===o.stroke||U(o.stroke)?c:o.stroke}if(n.setVisual("style",o),n.setVisual("drawType",s),!e.isSeriesFiltered(t)&&u)return n.setVisual("colorFromPalette",!1),{dataEach:function(e,n){var i=t.getDataParams(n),r=A({},o);r[s]=u(i),e.setItemVisual(n,"style",r)}}}},zg=new dc,Vg={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){if(!t.ignoreStyleOnData&&!e.isSeriesFiltered(t)){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=Rg(t,i),o=n.getVisual("drawType");return{dataEach:n.hasItemOption?function(t,e){var n=t.getRawDataItem(e);if(n&&n[i]){zg.option=n[i];var a=r(zg);A(t.ensureUniqueItemVisual(e,"style"),a),zg.option.decal&&(t.setItemVisual(e,"decal",zg.option.decal),zg.option.decal.dirty=!0),o in a&&t.setItemVisual(e,"colorFromPalette",!1)}}:null}}}},Bg={performRawSeries:!0,overallReset:function(t){var e=ft();t.eachSeries((function(t){var n=t.getColorBy();if(!t.isColorBySeries()){var i=t.type+"-"+n,r=e.get(i);r||(r={},e.set(i,r)),Lg(t).scope=r}})),t.eachSeries((function(e){if(!e.isColorBySeries()&&!t.isSeriesFiltered(e)){var n=e.getRawData(),i={},r=e.getData(),o=Lg(e).scope,a=e.visualStyleAccessPath||"itemStyle",s=Ng(e,a);r.each((function(t){var e=r.getRawIndex(t);i[e]=t})),n.each((function(t){var a=i[t];if(r.getItemVisual(a,"colorFromPalette")){var l=r.ensureUniqueItemVisual(a,"style"),u=n.getName(t)||t+"",h=n.count();l[s]=e.getColorFromPalette(u,o,h)}}))}}))}},Fg=Math.PI;var Gg=function(){function t(t,e,n,i){this._stageTaskMap=ft(),this.ecInstance=t,this.api=e,n=this._dataProcessorHandlers=n.slice(),i=this._visualHandlers=i.slice(),this._allHandlers=n.concat(i)}return t.prototype.restoreData=function(t,e){t.restoreData(e),this._stageTaskMap.each((function(t){var e=t.overallTask;e&&e.dirty()}))},t.prototype.getPerformArgs=function(t,e){if(t.__pipeline){var n=this._pipelineMap.get(t.__pipeline.id),i=n.context,r=!e&&n.progressiveEnabled&&(!i||i.progressiveRender)&&t.__idxInPipeline>n.blockIndex?n.step:null,o=i&&i.modDataCount;return{step:r,modBy:null!=o?Math.ceil(o/r):null,modDataCount:o}}},t.prototype.getPipeline=function(t){return this._pipelineMap.get(t)},t.prototype.updateStreamModes=function(t,e){var n=this._pipelineMap.get(t.uid),i=t.getData().count(),r=n.progressiveEnabled&&e.incrementalPrepareRender&&i>=n.threshold,o=t.get("large")&&i>=t.get("largeThreshold"),a="mod"===t.get("progressiveChunkMode")?i:null;t.pipelineContext=n.context={progressiveRender:r,modDataCount:a,large:o}},t.prototype.restorePipelines=function(t){var e=this,n=e._pipelineMap=ft();t.eachSeries((function(t){var i=t.getProgressive(),r=t.uid;n.set(r,{id:r,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:i&&!(t.preventIncremental&&t.preventIncremental()),blockIndex:-1,step:Math.round(i||700),count:0}),e._pipe(t,t.dataTask)}))},t.prototype.prepareStageTasks=function(){var t=this._stageTaskMap,e=this.api.getModel(),n=this.api;E(this._allHandlers,(function(i){var r=t.get(i.uid)||t.set(i.uid,{}),o="";lt(!(i.reset&&i.overallReset),o),i.reset&&this._createSeriesStageTask(i,r,e,n),i.overallReset&&this._createOverallStageTask(i,r,e,n)}),this)},t.prototype.prepareView=function(t,e,n,i){var r=t.renderTask,o=r.context;o.model=e,o.ecModel=n,o.api=i,r.__block=!t.incrementalPrepareRender,this._pipe(e,r)},t.prototype.performDataProcessorTasks=function(t,e){this._performStageTasks(this._dataProcessorHandlers,t,e,{block:!0})},t.prototype.performVisualTasks=function(t,e,n){this._performStageTasks(this._visualHandlers,t,e,n)},t.prototype._performStageTasks=function(t,e,n,i){i=i||{};var r=!1,o=this;function a(t,e){return t.setDirty&&(!t.dirtyMap||t.dirtyMap.get(e.__pipeline.id))}E(t,(function(t,s){if(!i.visualType||i.visualType===t.visualType){var l=o._stageTaskMap.get(t.uid),u=l.seriesTaskMap,h=l.overallTask;if(h){var c,p=h.agentStubMap;p.each((function(t){a(i,t)&&(t.dirty(),c=!0)})),c&&h.dirty(),o.updatePayload(h,n);var d=o.getPerformArgs(h,i.block);p.each((function(t){t.perform(d)})),h.perform(d)&&(r=!0)}else u&&u.each((function(s,l){a(i,s)&&s.dirty();var u=o.getPerformArgs(s,i.block);u.skip=!t.performRawSeries&&e.isSeriesFiltered(s.context.model),o.updatePayload(s,n),s.perform(u)&&(r=!0)}))}})),this.unfinished=r||this.unfinished},t.prototype.performSeriesTasks=function(t){var e;t.eachSeries((function(t){e=t.dataTask.perform()||e})),this.unfinished=e||this.unfinished},t.prototype.plan=function(){this._pipelineMap.each((function(t){var e=t.tail;do{if(e.__block){t.blockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)}))},t.prototype.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)},t.prototype._createSeriesStageTask=function(t,e,n,i){var r=this,o=e.seriesTaskMap,a=e.seriesTaskMap=ft(),s=t.seriesType,l=t.getTargetSeries;function u(e){var s=e.uid,l=a.set(s,o&&o.get(s)||hf({plan:Xg,reset:Zg,count:Kg}));l.context={model:e,ecModel:n,api:i,useClearVisual:t.isVisual&&!t.isLayout,plan:t.plan,reset:t.reset,scheduler:r},r._pipe(e,l)}t.createOnAllSeries?n.eachRawSeries(u):s?n.eachRawSeriesByType(s,u):l&&l(n,i).each(u)},t.prototype._createOverallStageTask=function(t,e,n,i){var r=this,o=e.overallTask=e.overallTask||hf({reset:Wg});o.context={ecModel:n,api:i,overallReset:t.overallReset,scheduler:r};var a=o.agentStubMap,s=o.agentStubMap=ft(),l=t.seriesType,u=t.getTargetSeries,h=!0,c=!1,p="";function d(t){var e=t.uid,n=s.set(e,a&&a.get(e)||(c=!0,hf({reset:Hg,onDirty:Ug})));n.context={model:t,overallProgress:h},n.agent=o,n.__block=h,r._pipe(t,n)}lt(!t.createOnAllSeries,p),l?n.eachRawSeriesByType(l,d):u?u(n,i).each(d):(h=!1,E(n.getSeries(),d)),c&&o.dirty()},t.prototype._pipe=function(t,e){var n=t.uid,i=this._pipelineMap.get(n);!i.head&&(i.head=e),i.tail&&i.tail.pipe(e),i.tail=e,e.__idxInPipeline=i.count++,e.__pipeline=i},t.wrapStageHandler=function(t,e){return U(t)&&(t={overallReset:t,seriesType:$g(t)}),t.uid=gc("stageHandler"),e&&(t.visualType=e),t},t}();function Wg(t){t.overallReset(t.ecModel,t.api,t.payload)}function Hg(t){return t.overallProgress&&Yg}function Yg(){this.agent.dirty(),this.getDownstream().dirty()}function Ug(){this.agent&&this.agent.dirty()}function Xg(t){return t.plan?t.plan(t.model,t.ecModel,t.api,t.payload):null}function Zg(t){t.useClearVisual&&t.data.clearAllVisual();var e=t.resetDefines=ho(t.reset(t.model,t.ecModel,t.api,t.payload));return e.length>1?z(e,(function(t,e){return qg(e)})):jg}var jg=qg(0);function qg(t){return function(e,n){var i=n.data,r=n.resetDefines[t];if(r&&r.dataEach)for(var o=e.start;o<e.end;o++)r.dataEach(i,o);else r&&r.progress&&r.progress(e,i)}}function Kg(t){return t.data.count()}function $g(t){Jg=null;try{t(Qg,ty)}catch(t){}return Jg}var Jg,Qg={},ty={};function ey(t,e){for(var n in e.prototype)t[n]=xt}ey(Qg,id),ey(ty,ld),Qg.eachSeriesByType=Qg.eachRawSeriesByType=function(t){Jg=t},Qg.eachComponent=function(t){"series"===t.mainType&&t.subType&&(Jg=t.subType)};var ny=["#37A2DA","#32C5E9","#67E0E3","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#E062AE","#E690D1","#e7bcf3","#9d96f5","#8378EA","#96BFFF"],iy={color:ny,colorLayer:[["#37A2DA","#ffd85c","#fd7b5f"],["#37A2DA","#67E0E3","#FFDB5C","#ff9f7f","#E062AE","#9d96f5"],["#37A2DA","#32C5E9","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#e7bcf3","#8378EA","#96BFFF"],ny]},ry="#B9B8CE",oy="#100C2A",ay=function(){return{axisLine:{lineStyle:{color:ry}},splitLine:{lineStyle:{color:"#484753"}},splitArea:{areaStyle:{color:["rgba(255,255,255,0.02)","rgba(255,255,255,0.05)"]}},minorSplitLine:{lineStyle:{color:"#20203B"}}}},sy=["#4992ff","#7cffb2","#fddd60","#ff6e76","#58d9f9","#05c091","#ff8a45","#8d48e3","#dd79ff"],ly={darkMode:!0,color:sy,backgroundColor:oy,axisPointer:{lineStyle:{color:"#817f91"},crossStyle:{color:"#817f91"},label:{color:"#fff"}},legend:{textStyle:{color:ry}},textStyle:{color:ry},title:{textStyle:{color:"#EEF1FA"},subtextStyle:{color:"#B9B8CE"}},toolbox:{iconStyle:{borderColor:ry}},dataZoom:{borderColor:"#71708A",textStyle:{color:ry},brushStyle:{color:"rgba(135,163,206,0.3)"},handleStyle:{color:"#353450",borderColor:"#C5CBE3"},moveHandleStyle:{color:"#B0B6C3",opacity:.3},fillerColor:"rgba(135,163,206,0.2)",emphasis:{handleStyle:{borderColor:"#91B7F2",color:"#4D587D"},moveHandleStyle:{color:"#636D9A",opacity:.7}},dataBackground:{lineStyle:{color:"#71708A",width:1},areaStyle:{color:"#71708A"}},selectedDataBackground:{lineStyle:{color:"#87A3CE"},areaStyle:{color:"#87A3CE"}}},visualMap:{textStyle:{color:ry}},timeline:{lineStyle:{color:ry},label:{color:ry},controlStyle:{color:ry,borderColor:ry}},calendar:{itemStyle:{color:oy},dayLabel:{color:ry},monthLabel:{color:ry},yearLabel:{color:ry}},timeAxis:ay(),logAxis:ay(),valueAxis:ay(),categoryAxis:ay(),line:{symbol:"circle"},graph:{color:sy},gauge:{title:{color:ry},axisLine:{lineStyle:{color:[[1,"rgba(207,212,219,0.2)"]]}},axisLabel:{color:ry},detail:{color:"#EEF1FA"}},candlestick:{itemStyle:{color:"#f64e56",color0:"#54ea92",borderColor:"#f64e56",borderColor0:"#54ea92"}}};ly.categoryAxis.splitLine.show=!1;var uy=function(){function t(){}return t.prototype.normalizeQuery=function(t){var e={},n={},i={};if(X(t)){var r=No(t);e.mainType=r.main||null,e.subType=r.sub||null}else{var o=["Index","Name","Id"],a={name:1,dataIndex:1,dataType:1};E(t,(function(t,r){for(var s=!1,l=0;l<o.length;l++){var u=o[l],h=r.lastIndexOf(u);if(h>0&&h===r.length-u.length){var c=r.slice(0,h);"data"!==c&&(e.mainType=c,e[u.toLowerCase()]=t,s=!0)}}a.hasOwnProperty(r)&&(n[r]=t,s=!0),s||(i[r]=t)}))}return{cptQuery:e,dataQuery:n,otherQuery:i}},t.prototype.filter=function(t,e){var n=this.eventInfo;if(!n)return!0;var i=n.targetEl,r=n.packedEvent,o=n.model,a=n.view;if(!o||!a)return!0;var s=e.cptQuery,l=e.dataQuery;return u(s,o,"mainType")&&u(s,o,"subType")&&u(s,o,"index","componentIndex")&&u(s,o,"name")&&u(s,o,"id")&&u(l,r,"name")&&u(l,r,"dataIndex")&&u(l,r,"dataType")&&(!a.filterForExposedEvent||a.filterForExposedEvent(t,e.otherQuery,i,r));function u(t,e,n,i){return null==t[n]||e[i||n]===t[n]}},t.prototype.afterTrigger=function(){this.eventInfo=null},t}(),hy=["symbol","symbolSize","symbolRotate","symbolOffset"],cy=hy.concat(["symbolKeepAspect"]),py={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData();if(t.legendIcon&&n.setVisual("legendIcon",t.legendIcon),t.hasSymbolVisual){for(var i={},r={},o=!1,a=0;a<hy.length;a++){var s=hy[a],l=t.get(s);U(l)?(o=!0,r[s]=l):i[s]=l}if(i.symbol=i.symbol||t.defaultSymbol,n.setVisual(A({legendIcon:t.legendIcon||i.symbol,symbolKeepAspect:t.get("symbolKeepAspect")},i)),!e.isSeriesFiltered(t)){var u=G(r);return{dataEach:o?function(e,n){for(var i=t.getRawValue(n),o=t.getDataParams(n),a=0;a<u.length;a++){var s=u[a];e.setItemVisual(n,s,r[s](i,o))}}:null}}}}},dy={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){if(t.hasSymbolVisual&&!e.isSeriesFiltered(t))return{dataEach:t.getData().hasItemOption?function(t,e){for(var n=t.getItemModel(e),i=0;i<cy.length;i++){var r=cy[i],o=n.getShallow(r,!0);null!=o&&t.setItemVisual(e,r,o)}}:null}}};function fy(t,e,n){switch(n){case"color":return t.getItemVisual(e,"style")[t.getVisual("drawType")];case"opacity":return t.getItemVisual(e,"style").opacity;case"symbol":case"symbolSize":case"liftZ":return t.getItemVisual(e,n);default:0}}function gy(t,e){switch(e){case"color":return t.getVisual("style")[t.getVisual("drawType")];case"opacity":return t.getVisual("style").opacity;case"symbol":case"symbolSize":case"liftZ":return t.getVisual(e);default:0}}function yy(t,e,n,i){switch(n){case"color":t.ensureUniqueItemVisual(e,"style")[t.getVisual("drawType")]=i,t.setItemVisual(e,"colorFromPalette",!1);break;case"opacity":t.ensureUniqueItemVisual(e,"style").opacity=i;break;case"symbol":case"symbolSize":case"liftZ":t.setItemVisual(e,n,i);break;default:0}}function vy(t,e){function n(e,n){var i=[];return e.eachComponent({mainType:"series",subType:t,query:n},(function(t){i.push(t.seriesIndex)})),i}E([[t+"ToggleSelect","toggleSelect"],[t+"Select","select"],[t+"UnSelect","unselect"]],(function(t){e(t[0],(function(e,i,r){e=A({},e),r.dispatchAction(A(e,{type:t[1],seriesIndex:n(i,e)}))}))}))}function my(t,e,n,i,r){var o=t+e;n.isSilent(o)||i.eachComponent({mainType:"series",subType:"pie"},(function(t){for(var e=t.seriesIndex,i=t.option.selectedMap,a=r.selected,s=0;s<a.length;s++)if(a[s].seriesIndex===e){var l=t.getData(),u=wo(l,r.fromActionPayload);n.trigger(o,{type:o,seriesId:t.id,name:Y(u)?l.getName(u[0]):l.getName(u),selected:X(i)?i:A({},i)})}}))}function xy(t,e,n){for(var i;t&&(!e(t)||(i=t,!n));)t=t.__hostTarget||t.parent;return i}var _y=Math.round(9*Math.random()),by="function"==typeof Object.defineProperty,wy=function(){function t(){this._id="__ec_inner_"+_y++}return t.prototype.get=function(t){return this._guard(t)[this._id]},t.prototype.set=function(t,e){var n=this._guard(t);return by?Object.defineProperty(n,this._id,{value:e,enumerable:!1,configurable:!0}):n[this._id]=e,this},t.prototype.delete=function(t){return!!this.has(t)&&(delete this._guard(t)[this._id],!0)},t.prototype.has=function(t){return!!this._guard(t)[this._id]},t.prototype._guard=function(t){if(t!==Object(t))throw TypeError("Value of WeakMap is not a non-null object.");return t},t}(),Sy=gs.extend({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,o=e.height/2;t.moveTo(n,i-o),t.lineTo(n+r,i+o),t.lineTo(n-r,i+o),t.closePath()}}),My=gs.extend({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,o=e.height/2;t.moveTo(n,i-o),t.lineTo(n+r,i),t.lineTo(n,i+o),t.lineTo(n-r,i),t.closePath()}}),Iy=gs.extend({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,i=e.y,r=e.width/5*3,o=Math.max(r,e.height),a=r/2,s=a*a/(o-a),l=i-o+a+s,u=Math.asin(s/a),h=Math.cos(u)*a,c=Math.sin(u),p=Math.cos(u),d=.6*a,f=.7*a;t.moveTo(n-h,l+s),t.arc(n,l,a,Math.PI-u,2*Math.PI+u),t.bezierCurveTo(n+h-c*d,l+s+p*d,n,i-f,n,i),t.bezierCurveTo(n,i-f,n-h+c*d,l+s+p*d,n-h,l+s),t.closePath()}}),Ty=gs.extend({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.height,i=e.width,r=e.x,o=e.y,a=i/3*2;t.moveTo(r,o),t.lineTo(r+a,o+n),t.lineTo(r,o+n/4*3),t.lineTo(r-a,o+n),t.lineTo(r,o),t.closePath()}}),Cy={line:function(t,e,n,i,r){r.x1=t,r.y1=e+i/2,r.x2=t+n,r.y2=e+i/2},rect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i},roundRect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i,r.r=Math.min(n,i)/4},square:function(t,e,n,i,r){var o=Math.min(n,i);r.x=t,r.y=e,r.width=o,r.height=o},circle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.r=Math.min(n,i)/2},diamond:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i},pin:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},arrow:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},triangle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i}},Dy={};E({line:zu,rect:Cs,roundRect:Cs,square:Cs,circle:hu,diamond:My,pin:Iy,arrow:Ty,triangle:Sy},(function(t,e){Dy[e]=new t}));var Ay=gs.extend({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},calculateTextPosition:function(t,e,n){var i=yr(t,e,n),r=this.shape;return r&&"pin"===r.symbolType&&"inside"===e.position&&(i.y=n.y+.4*n.height),i},buildPath:function(t,e,n){var i=e.symbolType;if("none"!==i){var r=Dy[i];r||(r=Dy[i="rect"]),Cy[i](e.x,e.y,e.width,e.height,r.shape),r.buildPath(t,r.shape,n)}}});function ky(t,e){if("image"!==this.type){var n=this.style;this.__isEmptyBrush?(n.stroke=t,n.fill=e||"#fff",n.lineWidth=2):"line"===this.shape.symbolType?n.stroke=t:n.fill=t,this.markRedraw()}}function Ly(t,e,n,i,r,o,a){var s,l=0===t.indexOf("empty");return l&&(t=t.substr(5,1).toLowerCase()+t.substr(6)),(s=0===t.indexOf("image://")?_h(t.slice(8),new sr(e,n,i,r),a?"center":"cover"):0===t.indexOf("path://")?xh(t.slice(7),{},new sr(e,n,i,r),a?"center":"cover"):new Ay({shape:{symbolType:t,x:e,y:n,width:i,height:r}})).__isEmptyBrush=l,s.setColor=ky,o&&s.setColor(o),s}function Py(t){return Y(t)||(t=[+t,+t]),[t[0]||0,t[1]||0]}function Oy(t,e){if(null!=t)return Y(t)||(t=[t,t]),[Er(t[0],e[0])||0,Er(rt(t[1],t[0]),e[1])||0]}function Ry(t){return isFinite(t)}function Ny(t,e,n){for(var i="radial"===e.type?function(t,e,n){var i=n.width,r=n.height,o=Math.min(i,r),a=null==e.x?.5:e.x,s=null==e.y?.5:e.y,l=null==e.r?.5:e.r;return e.global||(a=a*i+n.x,s=s*r+n.y,l*=o),a=Ry(a)?a:.5,s=Ry(s)?s:.5,l=l>=0&&Ry(l)?l:.5,t.createRadialGradient(a,s,0,a,s,l)}(t,e,n):function(t,e,n){var i=null==e.x?0:e.x,r=null==e.x2?1:e.x2,o=null==e.y?0:e.y,a=null==e.y2?0:e.y2;return e.global||(i=i*n.width+n.x,r=r*n.width+n.x,o=o*n.height+n.y,a=a*n.height+n.y),i=Ry(i)?i:0,r=Ry(r)?r:1,o=Ry(o)?o:0,a=Ry(a)?a:0,t.createLinearGradient(i,o,r,a)}(t,e,n),r=e.colorStops,o=0;o<r.length;o++)i.addColorStop(r[o].offset,r[o].color);return i}function Ey(t){return parseInt(t,10)}function zy(t,e,n){var i=["width","height"][e],r=["clientWidth","clientHeight"][e],o=["paddingLeft","paddingTop"][e],a=["paddingRight","paddingBottom"][e];if(null!=n[i]&&"auto"!==n[i])return parseFloat(n[i]);var s=document.defaultView.getComputedStyle(t);return(t[r]||Ey(s[i])||Ey(t.style[i]))-(Ey(s[o])||0)-(Ey(s[a])||0)|0}function Vy(t){var e,n,i=t.style,r=i.lineDash&&i.lineWidth>0&&(e=i.lineDash,n=i.lineWidth,e&&"solid"!==e&&n>0?"dashed"===e?[4*n,2*n]:"dotted"===e?[n]:j(e)?[e]:Y(e)?e:null:null),o=i.lineDashOffset;if(r){var a=i.strokeNoScale&&t.getLineScale?t.getLineScale():1;a&&1!==a&&(r=z(r,(function(t){return t/a})),o/=a)}return[r,o]}var By=new qa(!0);function Fy(t){var e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))}function Gy(t){return"string"==typeof t&&"none"!==t}function Wy(t){var e=t.fill;return null!=e&&"none"!==e}function Hy(t,e){if(null!=e.fillOpacity&&1!==e.fillOpacity){var n=t.globalAlpha;t.globalAlpha=e.fillOpacity*e.opacity,t.fill(),t.globalAlpha=n}else t.fill()}function Yy(t,e){if(null!=e.strokeOpacity&&1!==e.strokeOpacity){var n=t.globalAlpha;t.globalAlpha=e.strokeOpacity*e.opacity,t.stroke(),t.globalAlpha=n}else t.stroke()}function Uy(t,e,n){var i=Zo(e.image,e.__image,n);if(qo(i)){var r=t.createPattern(i,e.repeat||"repeat");if("function"==typeof DOMMatrix&&r&&r.setTransform){var o=new DOMMatrix;o.translateSelf(e.x||0,e.y||0),o.rotateSelf(0,0,(e.rotation||0)*_t),o.scaleSelf(e.scaleX||1,e.scaleY||1),r.setTransform(o)}return r}}var Xy=["shadowBlur","shadowOffsetX","shadowOffsetY"],Zy=[["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]];function jy(t,e,n,i,r){var o=!1;if(!i&&e===(n=n||{}))return!1;if(i||e.opacity!==n.opacity){$y(t,r),o=!0;var a=Math.max(Math.min(e.opacity,1),0);t.globalAlpha=isNaN(a)?ua.opacity:a}(i||e.blend!==n.blend)&&(o||($y(t,r),o=!0),t.globalCompositeOperation=e.blend||ua.blend);for(var s=0;s<Xy.length;s++){var l=Xy[s];(i||e[l]!==n[l])&&(o||($y(t,r),o=!0),t[l]=t.dpr*(e[l]||0))}return(i||e.shadowColor!==n.shadowColor)&&(o||($y(t,r),o=!0),t.shadowColor=e.shadowColor||ua.shadowColor),o}function qy(t,e,n,i,r){var o=Jy(e,r.inHover),a=i?null:n&&Jy(n,r.inHover)||{};if(o===a)return!1;var s=jy(t,o,a,i,r);if((i||o.fill!==a.fill)&&(s||($y(t,r),s=!0),Gy(o.fill)&&(t.fillStyle=o.fill)),(i||o.stroke!==a.stroke)&&(s||($y(t,r),s=!0),Gy(o.stroke)&&(t.strokeStyle=o.stroke)),(i||o.opacity!==a.opacity)&&(s||($y(t,r),s=!0),t.globalAlpha=null==o.opacity?1:o.opacity),e.hasStroke()){var l=o.lineWidth/(o.strokeNoScale&&e.getLineScale?e.getLineScale():1);t.lineWidth!==l&&(s||($y(t,r),s=!0),t.lineWidth=l)}for(var u=0;u<Zy.length;u++){var h=Zy[u],c=h[0];(i||o[c]!==a[c])&&(s||($y(t,r),s=!0),t[c]=o[c]||h[1])}return s}function Ky(t,e){var n=e.transform,i=t.dpr||1;n?t.setTransform(i*n[0],i*n[1],i*n[2],i*n[3],i*n[4],i*n[5]):t.setTransform(i,0,0,i,0,0)}function $y(t,e){e.batchFill&&t.fill(),e.batchStroke&&t.stroke(),e.batchFill="",e.batchStroke=""}function Jy(t,e){return e&&t.__hoverStyle||t.style}function Qy(t,e){tv(t,e,{inHover:!1,viewWidth:0,viewHeight:0},!0)}function tv(t,e,n,i){var r=e.transform;if(!e.shouldBePainted(n.viewWidth,n.viewHeight,!1,!1))return e.__dirty&=-2,void(e.__isRendered=!1);var o=e.__clipPaths,s=n.prevElClipPaths,l=!1,u=!1;if(s&&!function(t,e){if(t===e||!t&&!e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var n=0;n<t.length;n++)if(t[n]!==e[n])return!0;return!1}(o,s)||(s&&s.length&&($y(t,n),t.restore(),u=l=!0,n.prevElClipPaths=null,n.allClipped=!1,n.prevEl=null),o&&o.length&&($y(t,n),t.save(),function(t,e,n){for(var i=!1,r=0;r<t.length;r++){var o=t[r];i=i||o.isZeroArea(),Ky(e,o),e.beginPath(),o.buildPath(e,o.shape),e.clip()}n.allClipped=i}(o,t,n),l=!0),n.prevElClipPaths=o),n.allClipped)e.__isRendered=!1;else{e.beforeBrush&&e.beforeBrush(),e.innerBeforeBrush();var h=n.prevEl;h||(u=l=!0);var c,p,d=e instanceof gs&&e.autoBatch&&function(t){var e=Wy(t),n=Fy(t);return!(t.lineDash||!(+e^+n)||e&&"string"!=typeof t.fill||n&&"string"!=typeof t.stroke||t.strokePercent<1||t.strokeOpacity<1||t.fillOpacity<1)}(e.style);l||(c=r,p=h.transform,c&&p?c[0]!==p[0]||c[1]!==p[1]||c[2]!==p[2]||c[3]!==p[3]||c[4]!==p[4]||c[5]!==p[5]:c||p)?($y(t,n),Ky(t,e)):d||$y(t,n);var f=Jy(e,n.inHover);e instanceof gs?(1!==n.lastDrawType&&(u=!0,n.lastDrawType=1),qy(t,e,h,u,n),d&&(n.batchFill||n.batchStroke)||t.beginPath(),function(t,e,n,i){var r,o=Fy(n),a=Wy(n),s=n.strokePercent,l=s<1,u=!e.path;e.silent&&!l||!u||e.createPathProxy();var h=e.path||By,c=e.__dirty;if(!i){var p=n.fill,d=n.stroke,f=a&&!!p.colorStops,g=o&&!!d.colorStops,y=a&&!!p.image,v=o&&!!d.image,m=void 0,x=void 0,_=void 0,b=void 0,w=void 0;(f||g)&&(w=e.getBoundingRect()),f&&(m=c?Ny(t,p,w):e.__canvasFillGradient,e.__canvasFillGradient=m),g&&(x=c?Ny(t,d,w):e.__canvasStrokeGradient,e.__canvasStrokeGradient=x),y&&(_=c||!e.__canvasFillPattern?Uy(t,p,e):e.__canvasFillPattern,e.__canvasFillPattern=_),v&&(b=c||!e.__canvasStrokePattern?Uy(t,d,e):e.__canvasStrokePattern,e.__canvasStrokePattern=_),f?t.fillStyle=m:y&&(_?t.fillStyle=_:a=!1),g?t.strokeStyle=x:v&&(b?t.strokeStyle=b:o=!1)}var S,M,I=e.getGlobalScale();h.setScale(I[0],I[1],e.segmentIgnoreThreshold),t.setLineDash&&n.lineDash&&(S=(r=Vy(e))[0],M=r[1]);var T=!0;(u||4&c)&&(h.setDPR(t.dpr),l?h.setContext(null):(h.setContext(t),T=!1),h.reset(),e.buildPath(h,e.shape,i),h.toStatic(),e.pathUpdated()),T&&h.rebuildPath(t,l?s:1),S&&(t.setLineDash(S),t.lineDashOffset=M),i||(n.strokeFirst?(o&&Yy(t,n),a&&Hy(t,n)):(a&&Hy(t,n),o&&Yy(t,n))),S&&t.setLineDash([])}(t,e,f,d),d&&(n.batchFill=f.fill||"",n.batchStroke=f.stroke||"")):e instanceof vs?(3!==n.lastDrawType&&(u=!0,n.lastDrawType=3),qy(t,e,h,u,n),function(t,e,n){var i,r=n.text;if(null!=r&&(r+=""),r){t.font=n.font||a,t.textAlign=n.textAlign,t.textBaseline=n.textBaseline;var o=void 0,s=void 0;t.setLineDash&&n.lineDash&&(o=(i=Vy(e))[0],s=i[1]),o&&(t.setLineDash(o),t.lineDashOffset=s),n.strokeFirst?(Fy(n)&&t.strokeText(r,n.x,n.y),Wy(n)&&t.fillText(r,n.x,n.y)):(Wy(n)&&t.fillText(r,n.x,n.y),Fy(n)&&t.strokeText(r,n.x,n.y)),o&&t.setLineDash([])}}(t,e,f)):e instanceof _s?(2!==n.lastDrawType&&(u=!0,n.lastDrawType=2),function(t,e,n,i,r){jy(t,Jy(e,r.inHover),n&&Jy(n,r.inHover),i,r)}(t,e,h,u,n),function(t,e,n){var i=e.__image=Zo(n.image,e.__image,e,e.onload);if(i&&qo(i)){var r=n.x||0,o=n.y||0,a=e.getWidth(),s=e.getHeight(),l=i.width/i.height;if(null==a&&null!=s?a=s*l:null==s&&null!=a?s=a/l:null==a&&null==s&&(a=i.width,s=i.height),n.sWidth&&n.sHeight){var u=n.sx||0,h=n.sy||0;t.drawImage(i,u,h,n.sWidth,n.sHeight,r,o,a,s)}else if(n.sx&&n.sy){var c=a-(u=n.sx),p=s-(h=n.sy);t.drawImage(i,u,h,c,p,r,o,a,s)}else t.drawImage(i,r,o,a,s)}}(t,e,f)):e.getTemporalDisplayables&&(4!==n.lastDrawType&&(u=!0,n.lastDrawType=4),function(t,e,n){var i=e.getDisplayables(),r=e.getTemporalDisplayables();t.save();var o,a,s={prevElClipPaths:null,prevEl:null,allClipped:!1,viewWidth:n.viewWidth,viewHeight:n.viewHeight,inHover:n.inHover};for(o=e.getCursor(),a=i.length;o<a;o++){(h=i[o]).beforeBrush&&h.beforeBrush(),h.innerBeforeBrush(),tv(t,h,s,o===a-1),h.innerAfterBrush(),h.afterBrush&&h.afterBrush(),s.prevEl=h}for(var l=0,u=r.length;l<u;l++){var h;(h=r[l]).beforeBrush&&h.beforeBrush(),h.innerBeforeBrush(),tv(t,h,s,l===u-1),h.innerAfterBrush(),h.afterBrush&&h.afterBrush(),s.prevEl=h}e.clearTemporalDisplayables(),e.notClear=!0,t.restore()}(t,e,n)),d&&i&&$y(t,n),e.innerAfterBrush(),e.afterBrush&&e.afterBrush(),n.prevEl=e,e.__dirty=0,e.__isRendered=!0}}var ev=new wy,nv=new ln(100),iv=["symbol","symbolSize","symbolKeepAspect","color","backgroundColor","dashArrayX","dashArrayY","maxTileWidth","maxTileHeight"];function rv(t,e){if("none"===t)return null;var n=e.getDevicePixelRatio(),i=e.getZr(),r="svg"===i.painter.type;t.dirty&&ev.delete(t);var o=ev.get(t);if(o)return o;var a=k(t,{symbol:"rect",symbolSize:1,symbolKeepAspect:!0,color:"rgba(0, 0, 0, 0.2)",backgroundColor:null,dashArrayX:5,dashArrayY:5,rotation:0,maxTileWidth:512,maxTileHeight:512});"none"===a.backgroundColor&&(a.backgroundColor=null);var s={repeat:"repeat"};return function(t){for(var e,o=[n],s=!0,l=0;l<iv.length;++l){var u=a[iv[l]];if(null!=u&&!Y(u)&&!X(u)&&!j(u)&&"boolean"!=typeof u){s=!1;break}o.push(u)}if(s){e=o.join(",")+(r?"-svg":"");var c=nv.get(e);c&&(r?t.svgElement=c:t.image=c)}var p,d=av(a.dashArrayX),f=function(t){if(!t||"object"==typeof t&&0===t.length)return[0,0];if(j(t)){var e=Math.ceil(t);return[e,e]}var n=z(t,(function(t){return Math.ceil(t)}));return t.length%2?n.concat(n):n}(a.dashArrayY),g=ov(a.symbol),y=(b=d,z(b,(function(t){return sv(t)}))),v=sv(f),m=!r&&h.createCanvas(),x=r&&{tag:"g",attrs:{},key:"dcl",children:[]},_=function(){for(var t=1,e=0,n=y.length;e<n;++e)t=ro(t,y[e]);var i=1;for(e=0,n=g.length;e<n;++e)i=ro(i,g[e].length);t*=i;var r=v*y.length*g.length;return{width:Math.max(1,Math.min(t,a.maxTileWidth)),height:Math.max(1,Math.min(r,a.maxTileHeight))}}();var b;m&&(m.width=_.width*n,m.height=_.height*n,p=m.getContext("2d"));(function(){p&&(p.clearRect(0,0,m.width,m.height),a.backgroundColor&&(p.fillStyle=a.backgroundColor,p.fillRect(0,0,m.width,m.height)));for(var t=0,e=0;e<f.length;++e)t+=f[e];if(t<=0)return;var o=-v,s=0,l=0,u=0;for(;o<_.height;){if(s%2==0){for(var h=l/2%g.length,c=0,y=0,b=0;c<2*_.width;){var w=0;for(e=0;e<d[u].length;++e)w+=d[u][e];if(w<=0)break;if(y%2==0){var S=.5*(1-a.symbolSize),M=c+d[u][y]*S,I=o+f[s]*S,T=d[u][y]*a.symbolSize,C=f[s]*a.symbolSize,D=b/2%g[h].length;A(M,I,T,C,g[h][D])}c+=d[u][y],++b,++y===d[u].length&&(y=0)}++u===d.length&&(u=0)}o+=f[s],++l,++s===f.length&&(s=0)}function A(t,e,o,s,l){var u=r?1:n,h=Ly(l,t*u,e*u,o*u,s*u,a.color,a.symbolKeepAspect);if(r){var c=i.painter.renderOneToVNode(h);c&&x.children.push(c)}else Qy(p,h)}})(),s&&nv.put(e,m||x);t.image=m,t.svgElement=x,t.svgWidth=_.width,t.svgHeight=_.height}(s),s.rotation=a.rotation,s.scaleX=s.scaleY=r?1:1/n,ev.set(t,s),t.dirty=!1,s}function ov(t){if(!t||0===t.length)return[["rect"]];if(X(t))return[[t]];for(var e=!0,n=0;n<t.length;++n)if(!X(t[n])){e=!1;break}if(e)return ov([t]);var i=[];for(n=0;n<t.length;++n)X(t[n])?i.push([t[n]]):i.push(t[n]);return i}function av(t){if(!t||0===t.length)return[[0,0]];if(j(t))return[[r=Math.ceil(t),r]];for(var e=!0,n=0;n<t.length;++n)if(!j(t[n])){e=!1;break}if(e)return av([t]);var i=[];for(n=0;n<t.length;++n)if(j(t[n])){var r=Math.ceil(t[n]);i.push([r,r])}else{(r=z(t[n],(function(t){return Math.ceil(t)}))).length%2==1?i.push(r.concat(r)):i.push(r)}return i}function sv(t){for(var e=0,n=0;n<t.length;++n)e+=t[n];return t.length%2==1?2*e:e}var lv=new Xt,uv={};function hv(t){return uv[t]}var cv="undefined"!=typeof window,pv=2e3,dv=4500,fv={PROCESSOR:{FILTER:1e3,SERIES_FILTER:800,STATISTIC:5e3},VISUAL:{LAYOUT:1e3,PROGRESSIVE_LAYOUT:1100,GLOBAL:pv,CHART:3e3,POST_CHART_LAYOUT:4600,COMPONENT:4e3,BRUSH:5e3,CHART_ITEM:dv,ARIA:6e3,DECAL:7e3}},gv=/^[a-zA-Z0-9_]+$/,yv="__connectUpdateStatus";function vv(t){return function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];if(!this.isDisposed())return xv(this,t,e);Hv(this.id)}}function mv(t){return function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];return xv(this,t,e)}}function xv(t,e,n){return n[0]=n[0]&&n[0].toLowerCase(),Xt.prototype[e].apply(t,n)}var _v,bv,wv,Sv,Mv,Iv,Tv,Cv,Dv,Av,kv,Lv,Pv,Ov,Rv,Nv,Ev,zv,Vv=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e}(Xt),Bv=Vv.prototype;Bv.on=mv("on"),Bv.off=mv("off");var Fv=function(t){function e(e,n,i){var r=t.call(this,new uy)||this;r._chartsViews=[],r._chartsMap={},r._componentsViews=[],r._componentsMap={},r._pendingActions=[],i=i||{},X(n)&&(n=qv[n]),r._dom=e;var o="canvas",a=!1,s=r._zr=Lr(e,{renderer:i.renderer||o,devicePixelRatio:i.devicePixelRatio,width:i.width,height:i.height,ssr:i.ssr,useDirtyRect:null==i.useDirtyRect?a:i.useDirtyRect});r._ssr=i.ssr,r._throttledZrFlush=Dg(W(s.flush,s),17),(n=T(n))&&Od(n,!0),r._theme=n,r._locale=function(t){if(X(t)){var e=_c[t.toUpperCase()]||{};return t===vc||t===mc?T(e):C(T(e),T(_c.EN),!1)}return C(T(t),T(_c.EN),!1)}(i.locale||wc),r._coordSysMgr=new hd;var l=r._api=Rv(r);function u(t,e){return t.__prio-e.__prio}return Ie(jv,u),Ie(Xv,u),r._scheduler=new Gg(r,l,Xv,jv),r._messageCenter=new Vv,r._initEvents(),r.resize=W(r.resize,r),s.animation.on("frame",r._onframe,r),Av(s,r),kv(s,r),ct(r),r}return n(e,t),e.prototype._onframe=function(){if(!this._disposed){zv(this);var t=this._scheduler;if(this.__pendingUpdate){var e=this.__pendingUpdate.silent;this.__flagInMainProcess=!0;try{_v(this),Sv.update.call(this,null,this.__pendingUpdate.updateParams)}catch(t){throw this.__flagInMainProcess=!1,this.__pendingUpdate=null,t}this._zr.flush(),this.__flagInMainProcess=!1,this.__pendingUpdate=null,Cv.call(this,e),Dv.call(this,e)}else if(t.unfinished){var n=1,i=this._model,r=this._api;t.unfinished=!1;do{var o=+new Date;t.performSeriesTasks(i),t.performDataProcessorTasks(i),Iv(this,i),t.performVisualTasks(i),Ov(this,this._model,r,"remain",{}),n-=+new Date-o}while(n>0&&t.unfinished);t.unfinished||this._zr.flush()}}},e.prototype.getDom=function(){return this._dom},e.prototype.getId=function(){return this.id},e.prototype.getZr=function(){return this._zr},e.prototype.isSSR=function(){return this._ssr},e.prototype.setOption=function(t,e,n){if(!this.__flagInMainProcess)if(this._disposed)Hv(this.id);else{var i,r,o;if(q(e)&&(n=e.lazyUpdate,i=e.silent,r=e.replaceMerge,o=e.transition,e=e.notMerge),this.__flagInMainProcess=!0,!this._model||e){var a=new pd(this._api),s=this._theme,l=this._model=new id;l.scheduler=this._scheduler,l.ssr=this._ssr,l.init(null,null,null,s,this._locale,a)}this._model.setOption(t,{replaceMerge:r},Zv);var u={seriesTransition:o,optionChanged:!0};if(n)this.__pendingUpdate={silent:i,updateParams:u},this.__flagInMainProcess=!1,this.getZr().wakeUp();else{try{_v(this),Sv.update.call(this,null,u)}catch(t){throw this.__pendingUpdate=null,this.__flagInMainProcess=!1,t}this._ssr||this._zr.flush(),this.__pendingUpdate=null,this.__flagInMainProcess=!1,Cv.call(this,i),Dv.call(this,i)}}},e.prototype.setTheme=function(){oo()},e.prototype.getModel=function(){return this._model},e.prototype.getOption=function(){return this._model&&this._model.getOption()},e.prototype.getWidth=function(){return this._zr.getWidth()},e.prototype.getHeight=function(){return this._zr.getHeight()},e.prototype.getDevicePixelRatio=function(){return this._zr.painter.dpr||cv&&window.devicePixelRatio||1},e.prototype.getRenderedCanvas=function(t){return this.renderToCanvas(t)},e.prototype.renderToCanvas=function(t){t=t||{};var e=this._zr.painter;return e.getRenderedCanvas({backgroundColor:t.backgroundColor||this._model.get("backgroundColor"),pixelRatio:t.pixelRatio||this.getDevicePixelRatio()})},e.prototype.renderToSVGString=function(t){t=t||{};var e=this._zr.painter;return e.renderToString({useViewBox:t.useViewBox})},e.prototype.getSvgDataURL=function(){if(r.svgSupported){var t=this._zr;return E(t.storage.getDisplayList(),(function(t){t.stopAnimation(null,!0)})),t.painter.toDataURL()}},e.prototype.getDataURL=function(t){if(!this._disposed){var e=(t=t||{}).excludeComponents,n=this._model,i=[],r=this;E(e,(function(t){n.eachComponent({mainType:t},(function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)}))}));var o="svg"===this._zr.painter.getType()?this.getSvgDataURL():this.renderToCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return E(i,(function(t){t.group.ignore=!1})),o}Hv(this.id)},e.prototype.getConnectedDataURL=function(t){if(!this._disposed){var e="svg"===t.type,n=this.group,i=Math.min,r=Math.max,o=1/0;if(Jv[n]){var a=o,s=o,l=-1/0,u=-1/0,c=[],p=t&&t.pixelRatio||this.getDevicePixelRatio();E($v,(function(o,h){if(o.group===n){var p=e?o.getZr().painter.getSvgDom().innerHTML:o.renderToCanvas(T(t)),d=o.getDom().getBoundingClientRect();a=i(d.left,a),s=i(d.top,s),l=r(d.right,l),u=r(d.bottom,u),c.push({dom:p,left:d.left,top:d.top})}}));var d=(l*=p)-(a*=p),f=(u*=p)-(s*=p),g=h.createCanvas(),y=Lr(g,{renderer:e?"svg":"canvas"});if(y.resize({width:d,height:f}),e){var v="";return E(c,(function(t){var e=t.left-a,n=t.top-s;v+='<g transform="translate('+e+","+n+')">'+t.dom+"</g>"})),y.painter.getSvgRoot().innerHTML=v,t.connectedBackgroundColor&&y.painter.setBackgroundColor(t.connectedBackgroundColor),y.refreshImmediately(),y.painter.toDataURL()}return t.connectedBackgroundColor&&y.add(new Cs({shape:{x:0,y:0,width:d,height:f},style:{fill:t.connectedBackgroundColor}})),E(c,(function(t){var e=new _s({style:{x:t.left*p-a,y:t.top*p-s,image:t.dom}});y.add(e)})),y.refreshImmediately(),g.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}Hv(this.id)},e.prototype.convertToPixel=function(t,e){return Mv(this,"convertToPixel",t,e)},e.prototype.convertFromPixel=function(t,e){return Mv(this,"convertFromPixel",t,e)},e.prototype.containPixel=function(t,e){var n;if(!this._disposed)return E(Io(this._model,t),(function(t,i){i.indexOf("Models")>=0&&E(t,(function(t){var r=t.coordinateSystem;if(r&&r.containPoint)n=n||!!r.containPoint(e);else if("seriesModels"===i){var o=this._chartsMap[t.__viewId];o&&o.containPoint&&(n=n||o.containPoint(e,t))}else 0}),this)}),this),!!n;Hv(this.id)},e.prototype.getVisual=function(t,e){var n=Io(this._model,t,{defaultMainType:"series"}),i=n.seriesModel;var r=i.getData(),o=n.hasOwnProperty("dataIndexInside")?n.dataIndexInside:n.hasOwnProperty("dataIndex")?r.indexOfRawIndex(n.dataIndex):null;return null!=o?fy(r,o,e):gy(r,e)},e.prototype.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},e.prototype.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]},e.prototype._initEvents=function(){var t,e,n,i=this;E(Wv,(function(t){var e=function(e){var n,r=i.getModel(),o=e.target,a="globalout"===t;if(a?n={}:o&&xy(o,(function(t){var e=Hs(t);if(e&&null!=e.dataIndex){var i=e.dataModel||r.getSeriesByIndex(e.seriesIndex);return n=i&&i.getDataParams(e.dataIndex,e.dataType)||{},!0}if(e.eventData)return n=A({},e.eventData),!0}),!0),n){var s=n.componentType,l=n.componentIndex;"markLine"!==s&&"markPoint"!==s&&"markArea"!==s||(s="series",l=n.seriesIndex);var u=s&&null!=l&&r.getComponent(s,l),h=u&&i["series"===u.mainType?"_chartsMap":"_componentsMap"][u.__viewId];0,n.event=e,n.type=t,i._$eventProcessor.eventInfo={targetEl:o,packedEvent:n,model:u,view:h},i.trigger(t,n)}};e.zrEventfulCallAtLast=!0,i._zr.on(t,e,i)})),E(Uv,(function(t,e){i._messageCenter.on(e,(function(t){this.trigger(e,t)}),i)})),E(["selectchanged"],(function(t){i._messageCenter.on(t,(function(e){this.trigger(t,e)}),i)})),t=this._messageCenter,e=this,n=this._api,t.on("selectchanged",(function(t){var i=n.getModel();t.isFromClick?(my("map","selectchanged",e,i,t),my("pie","selectchanged",e,i,t)):"select"===t.fromAction?(my("map","selected",e,i,t),my("pie","selected",e,i,t)):"unselect"===t.fromAction&&(my("map","unselected",e,i,t),my("pie","unselected",e,i,t))}))},e.prototype.isDisposed=function(){return this._disposed},e.prototype.clear=function(){this._disposed?Hv(this.id):this.setOption({series:[]},!0)},e.prototype.dispose=function(){if(this._disposed)Hv(this.id);else{this._disposed=!0,this.getDom()&&ko(this.getDom(),em,"");var t=this,e=t._api,n=t._model;E(t._componentsViews,(function(t){t.dispose(n,e)})),E(t._chartsViews,(function(t){t.dispose(n,e)})),t._zr.dispose(),t._dom=t._model=t._chartsMap=t._componentsMap=t._chartsViews=t._componentsViews=t._scheduler=t._api=t._zr=t._throttledZrFlush=t._theme=t._coordSysMgr=t._messageCenter=null,delete $v[t.id]}},e.prototype.resize=function(t){if(!this.__flagInMainProcess)if(this._disposed)Hv(this.id);else{this._zr.resize(t);var e=this._model;if(this._loadingFX&&this._loadingFX.resize(),e){var n=e.resetOption("media"),i=t&&t.silent;this.__pendingUpdate&&(null==i&&(i=this.__pendingUpdate.silent),n=!0,this.__pendingUpdate=null),this.__flagInMainProcess=!0;try{n&&_v(this),Sv.update.call(this,{type:"resize",animation:A({duration:0},t&&t.animation)})}catch(t){throw this.__flagInMainProcess=!1,t}this.__flagInMainProcess=!1,Cv.call(this,i),Dv.call(this,i)}}},e.prototype.showLoading=function(t,e){if(this._disposed)Hv(this.id);else if(q(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),Kv[t]){var n=Kv[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},e.prototype.hideLoading=function(){this._disposed?Hv(this.id):(this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null)},e.prototype.makeActionFromEvent=function(t){var e=A({},t);return e.type=Uv[t.type],e},e.prototype.dispatchAction=function(t,e){if(this._disposed)Hv(this.id);else if(q(e)||(e={silent:!!e}),Yv[t.type]&&this._model)if(this.__flagInMainProcess)this._pendingActions.push(t);else{var n=e.silent;Tv.call(this,t,n);var i=e.flush;i?this._zr.flush():!1!==i&&r.browser.weChat&&this._throttledZrFlush(),Cv.call(this,n),Dv.call(this,n)}},e.prototype.updateLabelLayout=function(){lv.trigger("series:layoutlabels",this._model,this._api,{updatedSeries:[]})},e.prototype.appendData=function(t){if(this._disposed)Hv(this.id);else{var e=t.seriesIndex,n=this.getModel().getSeriesByIndex(e);0,n.appendData(t),this._scheduler.unfinished=!0,this.getZr().wakeUp()}},e.internalField=function(){function t(t){t.clearColorPalette(),t.eachSeries((function(t){t.clearColorPalette()}))}function e(t){for(var e=[],n=t.currentStates,i=0;i<n.length;i++){var r=n[i];"emphasis"!==r&&"blur"!==r&&"select"!==r&&e.push(r)}t.selected&&t.states.select&&e.push("select"),2===t.hoverState&&t.states.emphasis?e.push("emphasis"):1===t.hoverState&&t.states.blur&&e.push("blur"),t.useStates(e)}function i(t,e){if(!t.preventAutoZ){var n=t.get("z")||0,i=t.get("zlevel")||0;e.eachRendered((function(t){return o(t,n,i,-1/0),!0}))}}function o(t,e,n,i){var r=t.getTextContent(),a=t.getTextGuideLine();if(t.isGroup)for(var s=t.childrenRef(),l=0;l<s.length;l++)i=Math.max(o(s[l],e,n,i),i);else t.z=e,t.zlevel=n,i=Math.max(t.z2,i);if(r&&(r.z=e,r.zlevel=n,isFinite(i)&&(r.z2=i+2)),a){var u=t.textGuideLineConfig;a.z=e,a.zlevel=n,isFinite(i)&&(a.z2=i+(u&&u.showAbove?1:-1))}return i}function a(t,e){e.eachRendered((function(t){if(!ah(t)){var e=t.getTextContent(),n=t.getTextGuideLine();t.stateTransition&&(t.stateTransition=null),e&&e.stateTransition&&(e.stateTransition=null),n&&n.stateTransition&&(n.stateTransition=null),t.hasState()?(t.prevStates=t.currentStates,t.clearStates()):t.prevStates&&(t.prevStates=null)}}))}function s(t,n){var i=t.getModel("stateAnimation"),r=t.isAnimationEnabled(),o=i.get("duration"),a=o>0?{duration:o,delay:i.get("delay"),easing:i.get("easing")}:null;n.eachRendered((function(t){if(t.states&&t.states.emphasis){if(ah(t))return;if(t instanceof gs&&function(t){var e=Zs(t);e.normalFill=t.style.fill,e.normalStroke=t.style.stroke;var n=t.states.select||{};e.selectFill=n.style&&n.style.fill||null,e.selectStroke=n.style&&n.style.stroke||null}(t),t.__dirty){var n=t.prevStates;n&&t.useStates(n)}if(r){t.stateTransition=a;var i=t.getTextContent(),o=t.getTextGuideLine();i&&(i.stateTransition=a),o&&(o.stateTransition=a)}t.__dirty&&e(t)}}))}_v=function(t){var e=t._scheduler;e.restorePipelines(t._model),e.prepareStageTasks(),bv(t,!0),bv(t,!1),e.plan()},bv=function(t,e){for(var n=t._model,i=t._scheduler,r=e?t._componentsViews:t._chartsViews,o=e?t._componentsMap:t._chartsMap,a=t._zr,s=t._api,l=0;l<r.length;l++)r[l].__alive=!1;function u(t){var l=t.__requireNewView;t.__requireNewView=!1;var u="_ec_"+t.id+"_"+t.type,h=!l&&o[u];if(!h){var c=No(t.type),p=e?gg.getClass(c.main,c.sub):xg.getClass(c.sub);0,(h=new p).init(n,s),o[u]=h,r.push(h),a.add(h.group)}t.__viewId=h.__id=u,h.__alive=!0,h.__model=t,h.group.__ecComponentInfo={mainType:t.mainType,index:t.componentIndex},!e&&i.prepareView(h,t,n,s)}e?n.eachComponent((function(t,e){"series"!==t&&u(e)})):n.eachSeries(u);for(l=0;l<r.length;){var h=r[l];h.__alive?l++:(!e&&h.renderTask.dispose(),a.remove(h.group),h.dispose(n,s),r.splice(l,1),o[h.__id]===h&&delete o[h.__id],h.__id=h.group.__ecComponentInfo=null)}},wv=function(t,e,n,i,r){var o=t._model;if(o.setUpdatePayload(n),i){var a={};a[i+"Id"]=n[i+"Id"],a[i+"Index"]=n[i+"Index"],a[i+"Name"]=n[i+"Name"];var s={mainType:i,query:a};r&&(s.subType=r);var l,u=n.excludeSeriesId;null!=u&&(l=ft(),E(ho(u),(function(t){var e=xo(t,null);null!=e&&l.set(e,!0)}))),o&&o.eachComponent(s,(function(e){if(!(l&&null!==l.get(e.id)))if(Wl(n))if(e instanceof sg)n.type!==Js||n.notBlur||e.get(["emphasis","disabled"])||function(t,e,n){var i=t.seriesIndex,r=t.getData(e.dataType);if(r){var o=wo(r,e);o=(Y(o)?o[0]:o)||0;var a=r.getItemGraphicEl(o);if(!a)for(var s=r.count(),l=0;!a&&l<s;)a=r.getItemGraphicEl(l++);if(a){var u=Hs(a);Dl(i,u.focus,u.blurScope,n)}else{var h=t.get(["emphasis","focus"]),c=t.get(["emphasis","blurScope"]);null!=h&&Dl(i,h,c,n)}}}(e,n,t._api);else{var i=kl(e.mainType,e.componentIndex,n.name,t._api),r=i.focusSelf,o=i.dispatchers;n.type===Js&&r&&!n.notBlur&&Al(e.mainType,e.componentIndex,t._api),o&&E(o,(function(t){n.type===Js?_l(t):bl(t)}))}else Gl(n)&&e instanceof sg&&(!function(t,e,n){if(Gl(e)){var i=e.dataType,r=wo(t.getData(i),e);Y(r)||(r=[r]),t[e.type===nl?"toggleSelect":e.type===tl?"select":"unselect"](r,i)}}(e,n,t._api),Ll(e),Ev(t))}),t),o&&o.eachComponent(s,(function(e){l&&null!==l.get(e.id)||h(t["series"===i?"_chartsMap":"_componentsMap"][e.__viewId])}),t)}else E([].concat(t._componentsViews).concat(t._chartsViews),h);function h(i){i&&i.__alive&&i[e]&&i[e](i.__model,o,t._api,n)}},Sv={prepareAndUpdate:function(t){_v(this),Sv.update.call(this,t,{optionChanged:null!=t.newOption})},update:function(e,n){var i=this._model,r=this._api,o=this._zr,a=this._coordSysMgr,s=this._scheduler;if(i){i.setUpdatePayload(e),s.restoreData(i,e),s.performSeriesTasks(i),a.create(i,r),s.performDataProcessorTasks(i,e),Iv(this,i),a.update(i,r),t(i),s.performVisualTasks(i,e),Lv(this,i,r,e,n);var l=i.get("backgroundColor")||"transparent",u=i.get("darkMode");o.setBackgroundColor(l),null!=u&&"auto"!==u&&o.setDarkMode(u),lv.trigger("afterupdate",i,r)}},updateTransform:function(e){var n=this,i=this._model,r=this._api;if(i){i.setUpdatePayload(e);var o=[];i.eachComponent((function(t,a){if("series"!==t){var s=n.getViewOfComponentModel(a);if(s&&s.__alive)if(s.updateTransform){var l=s.updateTransform(a,i,r,e);l&&l.update&&o.push(s)}else o.push(s)}}));var a=ft();i.eachSeries((function(t){var o=n._chartsMap[t.__viewId];if(o.updateTransform){var s=o.updateTransform(t,i,r,e);s&&s.update&&a.set(t.uid,1)}else a.set(t.uid,1)})),t(i),this._scheduler.performVisualTasks(i,e,{setDirty:!0,dirtyMap:a}),Ov(this,i,r,e,{},a),lv.trigger("afterupdate",i,r)}},updateView:function(e){var n=this._model;n&&(n.setUpdatePayload(e),xg.markUpdateMethod(e,"updateView"),t(n),this._scheduler.performVisualTasks(n,e,{setDirty:!0}),Lv(this,n,this._api,e,{}),lv.trigger("afterupdate",n,this._api))},updateVisual:function(e){var n=this,i=this._model;i&&(i.setUpdatePayload(e),i.eachSeries((function(t){t.getData().clearAllVisual()})),xg.markUpdateMethod(e,"updateVisual"),t(i),this._scheduler.performVisualTasks(i,e,{visualType:"visual",setDirty:!0}),i.eachComponent((function(t,r){if("series"!==t){var o=n.getViewOfComponentModel(r);o&&o.__alive&&o.updateVisual(r,i,n._api,e)}})),i.eachSeries((function(t){n._chartsMap[t.__viewId].updateVisual(t,i,n._api,e)})),lv.trigger("afterupdate",i,this._api))},updateLayout:function(t){Sv.update.call(this,t)}},Mv=function(t,e,n,i){if(t._disposed)Hv(t.id);else{for(var r,o=t._model,a=t._coordSysMgr.getCoordinateSystems(),s=Io(o,n),l=0;l<a.length;l++){var u=a[l];if(u[e]&&null!=(r=u[e](o,s,i)))return r}0}},Iv=function(t,e){var n=t._chartsMap,i=t._scheduler;e.eachSeries((function(t){i.updateStreamModes(t,n[t.__viewId])}))},Tv=function(t,e){var n=this,i=this.getModel(),r=t.type,o=t.escapeConnect,a=Yv[r],s=a.actionInfo,l=(s.update||"update").split(":"),u=l.pop(),h=null!=l[0]&&No(l[0]);this.__flagInMainProcess=!0;var c=[t],p=!1;t.batch&&(p=!0,c=z(t.batch,(function(e){return(e=k(A({},e),t)).batch=null,e})));var d,f=[],g=Gl(t),y=Wl(t);if(y&&Cl(this._api),E(c,(function(e){if((d=(d=a.action(e,n._model,n._api))||A({},e)).type=s.event||d.type,f.push(d),y){var i=To(t),r=i.queryOptionMap,o=i.mainTypeSpecified?r.keys()[0]:"series";wv(n,u,e,o),Ev(n)}else g?(wv(n,u,e,"series"),Ev(n)):h&&wv(n,u,e,h.main,h.sub)})),"none"!==u&&!y&&!g&&!h)try{this.__pendingUpdate?(_v(this),Sv.update.call(this,t),this.__pendingUpdate=null):Sv[u].call(this,t)}catch(t){throw this.__flagInMainProcess=!1,t}if(d=p?{type:s.event||r,escapeConnect:o,batch:f}:f[0],this.__flagInMainProcess=!1,!e){var v=this._messageCenter;if(v.trigger(d.type,d),g){var m={type:"selectchanged",escapeConnect:o,selected:Pl(i),isFromClick:t.isFromClick||!1,fromAction:t.type,fromActionPayload:t};v.trigger(m.type,m)}}},Cv=function(t){for(var e=this._pendingActions;e.length;){var n=e.shift();Tv.call(this,n,t)}},Dv=function(t){!t&&this.trigger("updated")},Av=function(t,e){t.on("rendered",(function(n){e.trigger("rendered",n),!t.animation.isFinished()||e.__pendingUpdate||e._scheduler.unfinished||e._pendingActions.length||e.trigger("finished")}))},kv=function(t,e){t.on("mouseover",(function(t){var n=xy(t.target,Fl);n&&(!function(t,e,n){var i=Hs(t),r=kl(i.componentMainType,i.componentIndex,i.componentHighDownName,n),o=r.dispatchers,a=r.focusSelf;o?(a&&Al(i.componentMainType,i.componentIndex,n),E(o,(function(t){return ml(t,e)}))):(Dl(i.seriesIndex,i.focus,i.blurScope,n),"self"===i.focus&&Al(i.componentMainType,i.componentIndex,n),ml(t,e))}(n,t,e._api),Ev(e))})).on("mouseout",(function(t){var n=xy(t.target,Fl);n&&(!function(t,e,n){Cl(n);var i=Hs(t),r=kl(i.componentMainType,i.componentIndex,i.componentHighDownName,n).dispatchers;r?E(r,(function(t){return xl(t,e)})):xl(t,e)}(n,t,e._api),Ev(e))})).on("click",(function(t){var n=xy(t.target,(function(t){return null!=Hs(t).dataIndex}),!0);if(n){var i=n.selected?"unselect":"select",r=Hs(n);e._api.dispatchAction({type:i,dataType:r.dataType,dataIndexInside:r.dataIndex,seriesIndex:r.seriesIndex,isFromClick:!0})}}))},Lv=function(t,e,n,i,r){!function(t){var e=[],n=[],i=!1;if(t.eachComponent((function(t,r){var o=r.get("zlevel")||0,a=r.get("z")||0,s=r.getZLevelKey();i=i||!!s,("series"===t?n:e).push({zlevel:o,z:a,idx:r.componentIndex,type:t,key:s})})),i){var r,o,a=e.concat(n);Ie(a,(function(t,e){return t.zlevel===e.zlevel?t.z-e.z:t.zlevel-e.zlevel})),E(a,(function(e){var n=t.getComponent(e.type,e.idx),i=e.zlevel,a=e.key;null!=r&&(i=Math.max(r,i)),a?(i===r&&a!==o&&i++,o=a):o&&(i===r&&i++,o=""),r=i,n.setZLevel(i)}))}}(e),Pv(t,e,n,i,r),E(t._chartsViews,(function(t){t.__alive=!1})),Ov(t,e,n,i,r),E(t._chartsViews,(function(t){t.__alive||t.remove(e,n)}))},Pv=function(t,e,n,r,o,l){E(l||t._componentsViews,(function(t){var o=t.__model;a(o,t),t.render(o,e,n,r),i(o,t),s(o,t)}))},Ov=function(t,e,n,o,l,u){var h=t._scheduler;l=A(l||{},{updatedSeries:e.getSeries()}),lv.trigger("series:beforeupdate",e,n,l);var c=!1;e.eachSeries((function(e){var n=t._chartsMap[e.__viewId];n.__alive=!0;var i=n.renderTask;h.updatePayload(i,o),a(e,n),u&&u.get(e.uid)&&i.dirty(),i.perform(h.getPerformArgs(i))&&(c=!0),n.group.silent=!!e.get("silent"),function(t,e){var n=t.get("blendMode")||null;e.eachRendered((function(t){t.isGroup||(t.style.blend=n)}))}(e,n),Ll(e)})),h.unfinished=c||h.unfinished,lv.trigger("series:layoutlabels",e,n,l),lv.trigger("series:transition",e,n,l),e.eachSeries((function(e){var n=t._chartsMap[e.__viewId];i(e,n),s(e,n)})),function(t,e){var n=t._zr.storage,i=0;n.traverse((function(t){t.isGroup||i++})),i>e.get("hoverLayerThreshold")&&!r.node&&!r.worker&&e.eachSeries((function(e){if(!e.preventUsingHoverLayer){var n=t._chartsMap[e.__viewId];n.__alive&&n.eachRendered((function(t){t.states.emphasis&&(t.states.emphasis.hoverLayer=!0)}))}}))}(t,e),lv.trigger("series:afterupdate",e,n,l)},Ev=function(t){t.__needsUpdateStatus=!0,t.getZr().wakeUp()},zv=function(t){t.__needsUpdateStatus&&(t.getZr().storage.traverse((function(t){ah(t)||e(t)})),t.__needsUpdateStatus=!1)},Rv=function(t){return new(function(e){function i(){return null!==e&&e.apply(this,arguments)||this}return n(i,e),i.prototype.getCoordinateSystems=function(){return t._coordSysMgr.getCoordinateSystems()},i.prototype.getComponentByElement=function(e){for(;e;){var n=e.__ecComponentInfo;if(null!=n)return t._model.getComponent(n.mainType,n.index);e=e.parent}},i.prototype.enterEmphasis=function(e,n){_l(e,n),Ev(t)},i.prototype.leaveEmphasis=function(e,n){bl(e,n),Ev(t)},i.prototype.enterBlur=function(e){wl(e),Ev(t)},i.prototype.leaveBlur=function(e){Sl(e),Ev(t)},i.prototype.enterSelect=function(e){Ml(e),Ev(t)},i.prototype.leaveSelect=function(e){Il(e),Ev(t)},i.prototype.getModel=function(){return t.getModel()},i.prototype.getViewOfComponentModel=function(e){return t.getViewOfComponentModel(e)},i.prototype.getViewOfSeriesModel=function(e){return t.getViewOfSeriesModel(e)},i}(ld))(t)},Nv=function(t){function e(t,e){for(var n=0;n<t.length;n++){t[n][yv]=e}}E(Uv,(function(n,i){t._messageCenter.on(i,(function(n){if(Jv[t.group]&&0!==t[yv]){if(n&&n.escapeConnect)return;var i=t.makeActionFromEvent(n),r=[];E($v,(function(e){e!==t&&e.group===t.group&&r.push(e)})),e(r,0),E(r,(function(t){1!==t[yv]&&t.dispatchAction(i)})),e(r,2)}}))}))}}(),e}(Xt),Gv=Fv.prototype;Gv.on=vv("on"),Gv.off=vv("off"),Gv.one=function(t,e,n){var i=this;oo(),this.on.call(this,t,(function n(){for(var r=[],o=0;o<arguments.length;o++)r[o]=arguments[o];e&&e.apply&&e.apply(this,r),i.off(t,n)}),n)};var Wv=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];function Hv(t){0}var Yv={},Uv={},Xv=[],Zv=[],jv=[],qv={},Kv={},$v={},Jv={},Qv=+new Date-0,tm=+new Date-0,em="_echarts_instance_";function nm(t){Jv[t]=!1}var im=nm;function rm(t){return $v[function(t,e){return t.getAttribute?t.getAttribute(e):t[e]}(t,em)]}function om(t,e){qv[t]=e}function am(t){P(Zv,t)<0&&Zv.push(t)}function sm(t,e){ym(Xv,t,e,2e3)}function lm(t){hm("afterinit",t)}function um(t){hm("afterupdate",t)}function hm(t,e){lv.on(t,e)}function cm(t,e,n){U(e)&&(n=e,e="");var i=q(t)?t.type:[t,t={event:e}][0];t.event=(t.event||i).toLowerCase(),e=t.event,Uv[e]||(lt(gv.test(i)&&gv.test(e)),Yv[i]||(Yv[i]={action:n,actionInfo:t}),Uv[e]=i)}function pm(t,e){hd.register(t,e)}function dm(t,e){ym(jv,t,e,1e3,"layout")}function fm(t,e){ym(jv,t,e,3e3,"visual")}var gm=[];function ym(t,e,n,i,r){if((U(e)||q(e))&&(n=e,e=i),!(P(gm,n)>=0)){gm.push(n);var o=Gg.wrapStageHandler(n,r);o.__prio=e,o.__raw=n,t.push(o)}}function vm(t,e){Kv[t]=e}function mm(t,e,n){var i=hv("registerMap");i&&i(t,e,n)}var xm=function(t){var e=(t=T(t)).type,n="";e||ao(n);var i=e.split(":");2!==i.length&&ao(n);var r=!1;"echarts"===i[0]&&(e=i[1],r=!0),t.__isBuiltIn=r,Tf.set(e,t)};fm(pv,Eg),fm(dv,Vg),fm(dv,Bg),fm(pv,py),fm(dv,dy),fm(7e3,(function(t,e){t.eachRawSeries((function(n){if(!t.isSeriesFiltered(n)){var i=n.getData();i.hasItemVisual()&&i.each((function(t){var n=i.getItemVisual(t,"decal");n&&(i.ensureUniqueItemVisual(t,"style").decal=rv(n,e))}));var r=i.getVisual("decal");if(r)i.getVisual("style").decal=rv(r,e)}}))})),am(Od),sm(900,(function(t){var e=ft();t.eachSeries((function(t){var n=t.get("stack");if(n){var i=e.get(n)||e.set(n,[]),r=t.getData(),o={stackResultDimension:r.getCalculationInfo("stackResultDimension"),stackedOverDimension:r.getCalculationInfo("stackedOverDimension"),stackedDimension:r.getCalculationInfo("stackedDimension"),stackedByDimension:r.getCalculationInfo("stackedByDimension"),isStackedByIndex:r.getCalculationInfo("isStackedByIndex"),data:r,seriesModel:t};if(!o.stackedDimension||!o.isStackedByIndex&&!o.stackedByDimension)return;i.length&&r.setCalculationInfo("stackedOnSeries",i[i.length-1].seriesModel),i.push(o)}})),e.each(Rd)})),vm("default",(function(t,e){k(e=e||{},{text:"loading",textColor:"#000",fontSize:12,fontWeight:"normal",fontStyle:"normal",fontFamily:"sans-serif",maskColor:"rgba(255, 255, 255, 0.8)",showSpinner:!0,color:"#5470c6",spinnerRadius:10,lineWidth:5,zlevel:0});var n=new Cr,i=new Cs({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4});n.add(i);var r,o=new ks({style:{text:e.text,fill:e.textColor,fontSize:e.fontSize,fontWeight:e.fontWeight,fontStyle:e.fontStyle,fontFamily:e.fontFamily},zlevel:e.zlevel,z:10001}),a=new Cs({style:{fill:"none"},textContent:o,textConfig:{position:"right",distance:10},zlevel:e.zlevel,z:10001});return n.add(a),e.showSpinner&&((r=new Hu({shape:{startAngle:-Fg/2,endAngle:-Fg/2+.1,r:e.spinnerRadius},style:{stroke:e.color,lineCap:"round",lineWidth:e.lineWidth},zlevel:e.zlevel,z:10001})).animateShape(!0).when(1e3,{endAngle:3*Fg/2}).start("circularInOut"),r.animateShape(!0).when(1e3,{startAngle:3*Fg/2}).delay(300).start("circularInOut"),n.add(r)),n.resize=function(){var n=o.getBoundingRect().width,s=e.showSpinner?e.spinnerRadius:0,l=(t.getWidth()-2*s-(e.showSpinner&&n?10:0)-n)/2-(e.showSpinner&&n?0:5+n/2)+(e.showSpinner?0:n/2)+(n?0:s),u=t.getHeight()/2;e.showSpinner&&r.setShape({cx:l,cy:u}),a.setShape({x:l-s,y:u-s,width:2*s,height:2*s}),i.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},n.resize(),n})),cm({type:Js,event:Js,update:Js},xt),cm({type:Qs,event:Qs,update:Qs},xt),cm({type:tl,event:tl,update:tl},xt),cm({type:el,event:el,update:el},xt),cm({type:nl,event:nl,update:nl},xt),om("light",iy),om("dark",ly);var _m=[],bm={registerPreprocessor:am,registerProcessor:sm,registerPostInit:lm,registerPostUpdate:um,registerUpdateLifecycle:hm,registerAction:cm,registerCoordinateSystem:pm,registerLayout:dm,registerVisual:fm,registerTransform:xm,registerLoading:vm,registerMap:mm,registerImpl:function(t,e){uv[t]=e},PRIORITY:fv,ComponentModel:Tp,ComponentView:gg,SeriesModel:sg,ChartView:xg,registerComponentModel:function(t){Tp.registerClass(t)},registerComponentView:function(t){gg.registerClass(t)},registerSeriesModel:function(t){sg.registerClass(t)},registerChartView:function(t){xg.registerClass(t)},registerSubTypeDefaulter:function(t,e){Tp.registerSubTypeDefaulter(t,e)},registerPainter:function(t,e){Pr(t,e)}};function wm(t){Y(t)?E(t,(function(t){wm(t)})):P(_m,t)>=0||(_m.push(t),U(t)&&(t={install:t}),t.install(bm))}function Sm(t){return null==t?0:t.length||1}function Mm(t){return t}var Im=function(){function t(t,e,n,i,r,o){this._old=t,this._new=e,this._oldKeyGetter=n||Mm,this._newKeyGetter=i||Mm,this.context=r,this._diffModeMultiple="multiple"===o}return t.prototype.add=function(t){return this._add=t,this},t.prototype.update=function(t){return this._update=t,this},t.prototype.updateManyToOne=function(t){return this._updateManyToOne=t,this},t.prototype.updateOneToMany=function(t){return this._updateOneToMany=t,this},t.prototype.updateManyToMany=function(t){return this._updateManyToMany=t,this},t.prototype.remove=function(t){return this._remove=t,this},t.prototype.execute=function(){this[this._diffModeMultiple?"_executeMultiple":"_executeOneToOne"]()},t.prototype._executeOneToOne=function(){var t=this._old,e=this._new,n={},i=new Array(t.length),r=new Array(e.length);this._initIndexMap(t,null,i,"_oldKeyGetter"),this._initIndexMap(e,n,r,"_newKeyGetter");for(var o=0;o<t.length;o++){var a=i[o],s=n[a],l=Sm(s);if(l>1){var u=s.shift();1===s.length&&(n[a]=s[0]),this._update&&this._update(u,o)}else 1===l?(n[a]=null,this._update&&this._update(s,o)):this._remove&&this._remove(o)}this._performRestAdd(r,n)},t.prototype._executeMultiple=function(){var t=this._old,e=this._new,n={},i={},r=[],o=[];this._initIndexMap(t,n,r,"_oldKeyGetter"),this._initIndexMap(e,i,o,"_newKeyGetter");for(var a=0;a<r.length;a++){var s=r[a],l=n[s],u=i[s],h=Sm(l),c=Sm(u);if(h>1&&1===c)this._updateManyToOne&&this._updateManyToOne(u,l),i[s]=null;else if(1===h&&c>1)this._updateOneToMany&&this._updateOneToMany(u,l),i[s]=null;else if(1===h&&1===c)this._update&&this._update(u,l),i[s]=null;else if(h>1&&c>1)this._updateManyToMany&&this._updateManyToMany(u,l),i[s]=null;else if(h>1)for(var p=0;p<h;p++)this._remove&&this._remove(l[p]);else this._remove&&this._remove(l)}this._performRestAdd(o,i)},t.prototype._performRestAdd=function(t,e){for(var n=0;n<t.length;n++){var i=t[n],r=e[i],o=Sm(r);if(o>1)for(var a=0;a<o;a++)this._add&&this._add(r[a]);else 1===o&&this._add&&this._add(r);e[i]=null}},t.prototype._initIndexMap=function(t,e,n,i){for(var r=this._diffModeMultiple,o=0;o<t.length;o++){var a="_ec_"+this[i](t[o],o);if(r||(n[o]=a),e){var s=e[a],l=Sm(s);0===l?(e[a]=o,r&&n.push(a)):1===l?e[a]=[s,o]:s.push(o)}}},t}(),Tm=function(){function t(t,e){this._encode=t,this._schema=e}return t.prototype.get=function(){return{fullDimensions:this._getFullDimensionNames(),encode:this._encode}},t.prototype._getFullDimensionNames=function(){return this._cachedDimNames||(this._cachedDimNames=this._schema?this._schema.makeOutputDimensionNames():[]),this._cachedDimNames},t}();function Cm(t,e){return t.hasOwnProperty(e)||(t[e]=[]),t[e]}function Dm(t){return"category"===t?"ordinal":"time"===t?"time":"float"}var Am=function(t){this.otherDims={},null!=t&&A(this,t)},km=So(),Lm={float:"f",int:"i",ordinal:"o",number:"n",time:"t"},Pm=function(){function t(t){this.dimensions=t.dimensions,this._dimOmitted=t.dimensionOmitted,this.source=t.source,this._fullDimCount=t.fullDimensionCount,this._updateDimOmitted(t.dimensionOmitted)}return t.prototype.isDimensionOmitted=function(){return this._dimOmitted},t.prototype._updateDimOmitted=function(t){this._dimOmitted=t,t&&(this._dimNameMap||(this._dimNameMap=Nm(this.source)))},t.prototype.getSourceDimensionIndex=function(t){return rt(this._dimNameMap.get(t),-1)},t.prototype.getSourceDimension=function(t){var e=this.source.dimensionsDefine;if(e)return e[t]},t.prototype.makeStoreSchema=function(){for(var t=this._fullDimCount,e=Zd(this.source),n=!Em(t),i="",r=[],o=0,a=0;o<t;o++){var s=void 0,l=void 0,u=void 0,h=this.dimensions[a];if(h&&h.storeDimIndex===o)s=e?h.name:null,l=h.type,u=h.ordinalMeta,a++;else{var c=this.getSourceDimension(o);c&&(s=e?c.name:null,l=c.type)}r.push({property:s,type:l,ordinalMeta:u}),!e||null==s||h&&h.isCalculationCoord||(i+=n?s.replace(/\`/g,"`1").replace(/\$/g,"`2"):s),i+="$",i+=Lm[l]||"f",u&&(i+=u.uid),i+="$"}var p=this.source;return{dimensions:r,hash:[p.seriesLayoutBy,p.startIndex,i].join("$$")}},t.prototype.makeOutputDimensionNames=function(){for(var t=[],e=0,n=0;e<this._fullDimCount;e++){var i=void 0,r=this.dimensions[n];if(r&&r.storeDimIndex===e)r.isCalculationCoord||(i=r.name),n++;else{var o=this.getSourceDimension(e);o&&(i=o.name)}t.push(i)}return t},t.prototype.appendCalculationDimension=function(t){this.dimensions.push(t),t.isCalculationCoord=!0,this._fullDimCount++,this._updateDimOmitted(!0)},t}();function Om(t){return t instanceof Pm}function Rm(t){for(var e=ft(),n=0;n<(t||[]).length;n++){var i=t[n],r=q(i)?i.name:i;null!=r&&null==e.get(r)&&e.set(r,n)}return e}function Nm(t){var e=km(t);return e.dimNameMap||(e.dimNameMap=Rm(t.dimensionsDefine))}function Em(t){return t>30}var zm,Vm,Bm,Fm,Gm,Wm,Hm,Ym=q,Um=z,Xm="undefined"==typeof Int32Array?Array:Int32Array,Zm=["hasItemOption","_nameList","_idList","_invertedIndicesMap","_dimSummary","userOutput","_rawData","_dimValueGetter","_nameDimIdx","_idDimIdx","_nameRepeatCount"],jm=["_approximateExtent"],qm=function(){function t(t,e){var n;this.type="list",this._dimOmitted=!1,this._nameList=[],this._idList=[],this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._approximateExtent={},this._calculationInfo={},this.hasItemOption=!1,this.TRANSFERABLE_METHODS=["cloneShallow","downSample","lttbDownSample","map"],this.CHANGABLE_METHODS=["filterSelf","selectRange"],this.DOWNSAMPLE_METHODS=["downSample","lttbDownSample"];var i=!1;Om(t)?(n=t.dimensions,this._dimOmitted=t.isDimensionOmitted(),this._schema=t):(i=!0,n=t),n=n||["x","y"];for(var r={},o=[],a={},s=!1,l={},u=0;u<n.length;u++){var h=n[u],c=X(h)?new Am({name:h}):h instanceof Am?h:new Am(h),p=c.name;c.type=c.type||"float",c.coordDim||(c.coordDim=p,c.coordDimIndex=0);var d=c.otherDims=c.otherDims||{};o.push(p),r[p]=c,null!=l[p]&&(s=!0),c.createInvertedIndices&&(a[p]=[]),0===d.itemName&&(this._nameDimIdx=u),0===d.itemId&&(this._idDimIdx=u),i&&(c.storeDimIndex=u)}if(this.dimensions=o,this._dimInfos=r,this._initGetDimensionInfo(s),this.hostModel=e,this._invertedIndicesMap=a,this._dimOmitted){var f=this._dimIdxToName=ft();E(o,(function(t){f.set(r[t].storeDimIndex,t)}))}}return t.prototype.getDimension=function(t){var e=this._recognizeDimIndex(t);if(null==e)return t;if(e=t,!this._dimOmitted)return this.dimensions[e];var n=this._dimIdxToName.get(e);if(null!=n)return n;var i=this._schema.getSourceDimension(e);return i?i.name:void 0},t.prototype.getDimensionIndex=function(t){var e=this._recognizeDimIndex(t);if(null!=e)return e;if(null==t)return-1;var n=this._getDimInfo(t);return n?n.storeDimIndex:this._dimOmitted?this._schema.getSourceDimensionIndex(t):-1},t.prototype._recognizeDimIndex=function(t){if(j(t)||null!=t&&!isNaN(t)&&!this._getDimInfo(t)&&(!this._dimOmitted||this._schema.getSourceDimensionIndex(t)<0))return+t},t.prototype._getStoreDimIndex=function(t){var e=this.getDimensionIndex(t);return e},t.prototype.getDimensionInfo=function(t){return this._getDimInfo(this.getDimension(t))},t.prototype._initGetDimensionInfo=function(t){var e=this._dimInfos;this._getDimInfo=t?function(t){return e.hasOwnProperty(t)?e[t]:void 0}:function(t){return e[t]}},t.prototype.getDimensionsOnCoord=function(){return this._dimSummary.dataDimsOnCoord.slice()},t.prototype.mapDimension=function(t,e){var n=this._dimSummary;if(null==e)return n.encodeFirstDimNotExtra[t];var i=n.encode[t];return i?i[e]:null},t.prototype.mapDimensionsAll=function(t){return(this._dimSummary.encode[t]||[]).slice()},t.prototype.getStore=function(){return this._store},t.prototype.initData=function(t,e,n){var i,r=this;if(t instanceof Vf&&(i=t),!i){var o=this.dimensions,a=Gd(t)||N(t)?new jd(t,o.length):t;i=new Vf;var s=Um(o,(function(t){return{type:r._dimInfos[t].type,property:t}}));i.initData(a,s,n)}this._store=i,this._nameList=(e||[]).slice(),this._idList=[],this._nameRepeatCount={},this._doInit(0,i.count()),this._dimSummary=function(t,e){var n={},i=n.encode={},r=ft(),o=[],a=[],s={};E(t.dimensions,(function(e){var n,l=t.getDimensionInfo(e),u=l.coordDim;if(u){var h=l.coordDimIndex;Cm(i,u)[h]=e,l.isExtraCoord||(r.set(u,1),"ordinal"!==(n=l.type)&&"time"!==n&&(o[0]=e),Cm(s,u)[h]=t.getDimensionIndex(l.name)),l.defaultTooltip&&a.push(e)}kp.each((function(t,e){var n=Cm(i,e),r=l.otherDims[e];null!=r&&!1!==r&&(n[r]=l.name)}))}));var l=[],u={};r.each((function(t,e){var n=i[e];u[e]=n[0],l=l.concat(n)})),n.dataDimsOnCoord=l,n.dataDimIndicesOnCoord=z(l,(function(e){return t.getDimensionInfo(e).storeDimIndex})),n.encodeFirstDimNotExtra=u;var h=i.label;h&&h.length&&(o=h.slice());var c=i.tooltip;return c&&c.length?a=c.slice():a.length||(a=o.slice()),i.defaultedLabel=o,i.defaultedTooltip=a,n.userOutput=new Tm(s,e),n}(this,this._schema),this.userOutput=this._dimSummary.userOutput},t.prototype.appendData=function(t){var e=this._store.appendData(t);this._doInit(e[0],e[1])},t.prototype.appendValues=function(t,e){var n=this._store.appendValues(t,e.length),i=n.start,r=n.end,o=this._shouldMakeIdFromName();if(this._updateOrdinalMeta(),e)for(var a=i;a<r;a++){var s=a-i;this._nameList[a]=e[s],o&&Hm(this,a)}},t.prototype._updateOrdinalMeta=function(){for(var t=this._store,e=this.dimensions,n=0;n<e.length;n++){var i=this._dimInfos[e[n]];i.ordinalMeta&&t.collectOrdinalMeta(i.storeDimIndex,i.ordinalMeta)}},t.prototype._shouldMakeIdFromName=function(){var t=this._store.getProvider();return null==this._idDimIdx&&t.getSource().sourceFormat!==Np&&!t.fillStorage},t.prototype._doInit=function(t,e){if(!(t>=e)){var n=this._store.getProvider();this._updateOrdinalMeta();var i=this._nameList,r=this._idList;if(n.getSource().sourceFormat===Lp&&!n.pure)for(var o=[],a=t;a<e;a++){var s=n.getItem(a,o);if(!this.hasItemOption&&go(s)&&(this.hasItemOption=!0),s){var l=s.name;null==i[a]&&null!=l&&(i[a]=xo(l,null));var u=s.id;null==r[a]&&null!=u&&(r[a]=xo(u,null))}}if(this._shouldMakeIdFromName())for(a=t;a<e;a++)Hm(this,a);zm(this)}},t.prototype.getApproximateExtent=function(t){return this._approximateExtent[t]||this._store.getDataExtent(this._getStoreDimIndex(t))},t.prototype.setApproximateExtent=function(t,e){e=this.getDimension(e),this._approximateExtent[e]=t.slice()},t.prototype.getCalculationInfo=function(t){return this._calculationInfo[t]},t.prototype.setCalculationInfo=function(t,e){Ym(t)?A(this._calculationInfo,t):this._calculationInfo[t]=e},t.prototype.getName=function(t){var e=this.getRawIndex(t),n=this._nameList[e];return null==n&&null!=this._nameDimIdx&&(n=Bm(this,this._nameDimIdx,e)),null==n&&(n=""),n},t.prototype._getCategory=function(t,e){var n=this._store.get(t,e),i=this._store.getOrdinalMeta(t);return i?i.categories[n]:n},t.prototype.getId=function(t){return Vm(this,this.getRawIndex(t))},t.prototype.count=function(){return this._store.count()},t.prototype.get=function(t,e){var n=this._store,i=this._dimInfos[t];if(i)return n.get(i.storeDimIndex,e)},t.prototype.getByRawIndex=function(t,e){var n=this._store,i=this._dimInfos[t];if(i)return n.getByRawIndex(i.storeDimIndex,e)},t.prototype.getIndices=function(){return this._store.getIndices()},t.prototype.getDataExtent=function(t){return this._store.getDataExtent(this._getStoreDimIndex(t))},t.prototype.getSum=function(t){return this._store.getSum(this._getStoreDimIndex(t))},t.prototype.getMedian=function(t){return this._store.getMedian(this._getStoreDimIndex(t))},t.prototype.getValues=function(t,e){var n=this,i=this._store;return Y(t)?i.getValues(Um(t,(function(t){return n._getStoreDimIndex(t)})),e):i.getValues(t)},t.prototype.hasValue=function(t){for(var e=this._dimSummary.dataDimIndicesOnCoord,n=0,i=e.length;n<i;n++)if(isNaN(this._store.get(e[n],t)))return!1;return!0},t.prototype.indexOfName=function(t){for(var e=0,n=this._store.count();e<n;e++)if(this.getName(e)===t)return e;return-1},t.prototype.getRawIndex=function(t){return this._store.getRawIndex(t)},t.prototype.indexOfRawIndex=function(t){return this._store.indexOfRawIndex(t)},t.prototype.rawIndexOf=function(t,e){var n=t&&this._invertedIndicesMap[t];var i=n[e];return null==i||isNaN(i)?-1:i},t.prototype.indicesOfNearest=function(t,e,n){return this._store.indicesOfNearest(this._getStoreDimIndex(t),e,n)},t.prototype.each=function(t,e,n){U(t)&&(n=e,e=t,t=[]);var i=n||this,r=Um(Fm(t),this._getStoreDimIndex,this);this._store.each(r,i?W(e,i):e)},t.prototype.filterSelf=function(t,e,n){U(t)&&(n=e,e=t,t=[]);var i=n||this,r=Um(Fm(t),this._getStoreDimIndex,this);return this._store=this._store.filter(r,i?W(e,i):e),this},t.prototype.selectRange=function(t){var e=this,n={};return E(G(t),(function(i){var r=e._getStoreDimIndex(i);n[r]=t[i]})),this._store=this._store.selectRange(n),this},t.prototype.mapArray=function(t,e,n){U(t)&&(n=e,e=t,t=[]),n=n||this;var i=[];return this.each(t,(function(){i.push(e&&e.apply(this,arguments))}),n),i},t.prototype.map=function(t,e,n,i){var r=n||i||this,o=Um(Fm(t),this._getStoreDimIndex,this),a=Wm(this);return a._store=this._store.map(o,r?W(e,r):e),a},t.prototype.modify=function(t,e,n,i){var r=n||i||this;var o=Um(Fm(t),this._getStoreDimIndex,this);this._store.modify(o,r?W(e,r):e)},t.prototype.downSample=function(t,e,n,i){var r=Wm(this);return r._store=this._store.downSample(this._getStoreDimIndex(t),e,n,i),r},t.prototype.lttbDownSample=function(t,e){var n=Wm(this);return n._store=this._store.lttbDownSample(this._getStoreDimIndex(t),e),n},t.prototype.getRawDataItem=function(t){return this._store.getRawDataItem(t)},t.prototype.getItemModel=function(t){var e=this.hostModel,n=this.getRawDataItem(t);return new dc(n,e,e&&e.ecModel)},t.prototype.diff=function(t){var e=this;return new Im(t?t.getStore().getIndices():[],this.getStore().getIndices(),(function(e){return Vm(t,e)}),(function(t){return Vm(e,t)}))},t.prototype.getVisual=function(t){var e=this._visual;return e&&e[t]},t.prototype.setVisual=function(t,e){this._visual=this._visual||{},Ym(t)?A(this._visual,t):this._visual[t]=e},t.prototype.getItemVisual=function(t,e){var n=this._itemVisuals[t],i=n&&n[e];return null==i?this.getVisual(e):i},t.prototype.hasItemVisual=function(){return this._itemVisuals.length>0},t.prototype.ensureUniqueItemVisual=function(t,e){var n=this._itemVisuals,i=n[t];i||(i=n[t]={});var r=i[e];return null==r&&(Y(r=this.getVisual(e))?r=r.slice():Ym(r)&&(r=A({},r)),i[e]=r),r},t.prototype.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{};this._itemVisuals[t]=i,Ym(e)?A(i,e):i[e]=n},t.prototype.clearAllVisual=function(){this._visual={},this._itemVisuals=[]},t.prototype.setLayout=function(t,e){Ym(t)?A(this._layout,t):this._layout[t]=e},t.prototype.getLayout=function(t){return this._layout[t]},t.prototype.getItemLayout=function(t){return this._itemLayouts[t]},t.prototype.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?A(this._itemLayouts[t]||{},e):e},t.prototype.clearItemLayouts=function(){this._itemLayouts.length=0},t.prototype.setItemGraphicEl=function(t,e){var n=this.hostModel&&this.hostModel.seriesIndex;Ys(n,this.dataType,t,e),this._graphicEls[t]=e},t.prototype.getItemGraphicEl=function(t){return this._graphicEls[t]},t.prototype.eachItemGraphicEl=function(t,e){E(this._graphicEls,(function(n,i){n&&t&&t.call(e,n,i)}))},t.prototype.cloneShallow=function(e){return e||(e=new t(this._schema?this._schema:Um(this.dimensions,this._getDimInfo,this),this.hostModel)),Gm(e,this),e._store=this._store,e},t.prototype.wrapMethod=function(t,e){var n=this[t];U(n)&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(at(arguments)))})},t.internalField=(zm=function(t){var e=t._invertedIndicesMap;E(e,(function(n,i){var r=t._dimInfos[i],o=r.ordinalMeta,a=t._store;if(o){n=e[i]=new Xm(o.categories.length);for(var s=0;s<n.length;s++)n[s]=-1;for(s=0;s<a.count();s++)n[a.get(r.storeDimIndex,s)]=s}}))},Bm=function(t,e,n){return xo(t._getCategory(e,n),null)},Vm=function(t,e){var n=t._idList[e];return null==n&&null!=t._idDimIdx&&(n=Bm(t,t._idDimIdx,e)),null==n&&(n="e\0\0"+e),n},Fm=function(t){return Y(t)||(t=null!=t?[t]:[]),t},Wm=function(e){var n=new t(e._schema?e._schema:Um(e.dimensions,e._getDimInfo,e),e.hostModel);return Gm(n,e),n},Gm=function(t,e){E(Zm.concat(e.__wrappedMethods||[]),(function(n){e.hasOwnProperty(n)&&(t[n]=e[n])})),t.__wrappedMethods=e.__wrappedMethods,E(jm,(function(n){t[n]=T(e[n])})),t._calculationInfo=A({},e._calculationInfo)},void(Hm=function(t,e){var n=t._nameList,i=t._idList,r=t._nameDimIdx,o=t._idDimIdx,a=n[e],s=i[e];if(null==a&&null!=r&&(n[e]=a=Bm(t,r,e)),null==s&&null!=o&&(i[e]=s=Bm(t,o,e)),null==s&&null!=a){var l=t._nameRepeatCount,u=l[a]=(l[a]||0)+1;s=a,u>1&&(s+="__ec__"+u),i[e]=s}})),t}();function Km(t,e){Gd(t)||(t=Hd(t));var n=(e=e||{}).coordDimensions||[],i=e.dimensionsDefine||t.dimensionsDefine||[],r=ft(),o=[],a=function(t,e,n,i){var r=Math.max(t.dimensionsDetectedCount||1,e.length,n.length,i||0);return E(e,(function(t){var e;q(t)&&(e=t.dimsDef)&&(r=Math.max(r,e.length))})),r}(t,n,i,e.dimensionsCount),s=e.canOmitUnusedDimensions&&Em(a),l=i===t.dimensionsDefine,u=l?Nm(t):Rm(i),h=e.encodeDefine;!h&&e.encodeDefaulter&&(h=e.encodeDefaulter(t,a));for(var c=ft(h),p=new Of(a),d=0;d<p.length;d++)p[d]=-1;function f(t){var e=p[t];if(e<0){var n=i[t],r=q(n)?n:{name:n},a=new Am,s=r.name;null!=s&&null!=u.get(s)&&(a.name=a.displayName=s),null!=r.type&&(a.type=r.type),null!=r.displayName&&(a.displayName=r.displayName);var l=o.length;return p[t]=l,a.storeDimIndex=t,o.push(a),a}return o[e]}if(!s)for(d=0;d<a;d++)f(d);c.each((function(t,e){var n=ho(t).slice();if(1===n.length&&!X(n[0])&&n[0]<0)c.set(e,!1);else{var i=c.set(e,[]);E(n,(function(t,n){var r=X(t)?u.get(t):t;null!=r&&r<a&&(i[n]=r,y(f(r),e,n))}))}}));var g=0;function y(t,e,n){null!=kp.get(e)?t.otherDims[e]=n:(t.coordDim=e,t.coordDimIndex=n,r.set(e,!0))}E(n,(function(t){var e,n,i,r;if(X(t))e=t,r={};else{e=(r=t).name;var o=r.ordinalMeta;r.ordinalMeta=null,(r=A({},r)).ordinalMeta=o,n=r.dimsDef,i=r.otherDims,r.name=r.coordDim=r.coordDimIndex=r.dimsDef=r.otherDims=null}var s=c.get(e);if(!1!==s){if(!(s=ho(s)).length)for(var u=0;u<(n&&n.length||1);u++){for(;g<a&&null!=f(g).coordDim;)g++;g<a&&s.push(g++)}E(s,(function(t,o){var a=f(t);if(l&&null!=r.type&&(a.type=r.type),y(k(a,r),e,o),null==a.name&&n){var s=n[o];!q(s)&&(s={name:s}),a.name=a.displayName=s.name,a.defaultTooltip=s.defaultTooltip}i&&k(a.otherDims,i)}))}}));var v=e.generateCoord,m=e.generateCoordCount,x=null!=m;m=v?m||1:0;var _=v||"value";function b(t){null==t.name&&(t.name=t.coordDim)}if(s)E(o,(function(t){b(t)})),o.sort((function(t,e){return t.storeDimIndex-e.storeDimIndex}));else for(var w=0;w<a;w++){var S=f(w);null==S.coordDim&&(S.coordDim=$m(_,r,x),S.coordDimIndex=0,(!v||m<=0)&&(S.isExtraCoord=!0),m--),b(S),null!=S.type||Xp(t,w)!==Bp&&(!S.isExtraCoord||null==S.otherDims.itemName&&null==S.otherDims.seriesName)||(S.type="ordinal")}return function(t){for(var e=ft(),n=0;n<t.length;n++){var i=t[n],r=i.name,o=e.get(r)||0;o>0&&(i.name=r+(o-1)),o++,e.set(r,o)}}(o),new Pm({source:t,dimensions:o,fullDimensionCount:a,dimensionOmitted:s})}function $m(t,e,n){var i=e.data;if(n||i.hasOwnProperty(t)){for(var r=0;i.hasOwnProperty(t+r);)r++;t+=r}return e.set(t,!0),t}var Jm=function(t){this.coordSysDims=[],this.axisMap=ft(),this.categoryAxisMap=ft(),this.coordSysName=t};var Qm={cartesian2d:function(t,e,n,i){var r=t.getReferringComponents("xAxis",Co).models[0],o=t.getReferringComponents("yAxis",Co).models[0];e.coordSysDims=["x","y"],n.set("x",r),n.set("y",o),tx(r)&&(i.set("x",r),e.firstCategoryDimIndex=0),tx(o)&&(i.set("y",o),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},singleAxis:function(t,e,n,i){var r=t.getReferringComponents("singleAxis",Co).models[0];e.coordSysDims=["single"],n.set("single",r),tx(r)&&(i.set("single",r),e.firstCategoryDimIndex=0)},polar:function(t,e,n,i){var r=t.getReferringComponents("polar",Co).models[0],o=r.findAxisModel("radiusAxis"),a=r.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],n.set("radius",o),n.set("angle",a),tx(o)&&(i.set("radius",o),e.firstCategoryDimIndex=0),tx(a)&&(i.set("angle",a),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},geo:function(t,e,n,i){e.coordSysDims=["lng","lat"]},parallel:function(t,e,n,i){var r=t.ecModel,o=r.getComponent("parallel",t.get("parallelIndex")),a=e.coordSysDims=o.dimensions.slice();E(o.parallelAxisIndex,(function(t,o){var s=r.getComponent("parallelAxis",t),l=a[o];n.set(l,s),tx(s)&&(i.set(l,s),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=o))}))}};function tx(t){return"category"===t.get("type")}function ex(t,e,n){var i,r,o,a=(n=n||{}).byIndex,s=n.stackedCoordDimension;!function(t){return!Om(t.schema)}(e)?(r=e.schema,i=r.dimensions,o=e.store):i=e;var l,u,h,c,p=!(!t||!t.get("stack"));if(E(i,(function(t,e){X(t)&&(i[e]=t={name:t}),p&&!t.isExtraCoord&&(a||l||!t.ordinalMeta||(l=t),u||"ordinal"===t.type||"time"===t.type||s&&s!==t.coordDim||(u=t))})),!u||a||l||(a=!0),u){h="__\0ecstackresult_"+t.id,c="__\0ecstackedover_"+t.id,l&&(l.createInvertedIndices=!0);var d=u.coordDim,f=u.type,g=0;E(i,(function(t){t.coordDim===d&&g++}));var y={name:h,coordDim:d,coordDimIndex:g,type:f,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length},v={name:c,coordDim:c,coordDimIndex:g+1,type:f,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length+1};r?(o&&(y.storeDimIndex=o.ensureCalculationDimension(c,f),v.storeDimIndex=o.ensureCalculationDimension(h,f)),r.appendCalculationDimension(y),r.appendCalculationDimension(v)):(i.push(y),i.push(v))}return{stackedDimension:u&&u.name,stackedByDimension:l&&l.name,isStackedByIndex:a,stackedOverDimension:c,stackResultDimension:h}}function nx(t,e){return!!e&&e===t.getCalculationInfo("stackedDimension")}function ix(t,e){return nx(t,e)?t.getCalculationInfo("stackResultDimension"):e}function rx(t,e,n){n=n||{};var i,r=e.getSourceManager(),o=!1;t?(o=!0,i=Hd(t)):o=(i=r.getSource()).sourceFormat===Lp;var a=function(t){var e=t.get("coordinateSystem"),n=new Jm(e),i=Qm[e];if(i)return i(t,n,n.axisMap,n.categoryAxisMap),n}(e),s=function(t,e){var n,i=t.get("coordinateSystem"),r=hd.get(i);return e&&e.coordSysDims&&(n=z(e.coordSysDims,(function(t){var n={name:t},i=e.axisMap.get(t);if(i){var r=i.get("type");n.type=Dm(r)}return n}))),n||(n=r&&(r.getDimensionsInfo?r.getDimensionsInfo():r.dimensions.slice())||["x","y"]),n}(e,a),l=n.useEncodeDefaulter,u=U(l)?l:l?H(Hp,s,e):null,h=Km(i,{coordDimensions:s,generateCoord:n.generateCoord,encodeDefine:e.getEncode(),encodeDefaulter:u,canOmitUnusedDimensions:!o}),c=function(t,e,n){var i,r;return n&&E(t,(function(t,o){var a=t.coordDim,s=n.categoryAxisMap.get(a);s&&(null==i&&(i=o),t.ordinalMeta=s.getOrdinalMeta(),e&&(t.createInvertedIndices=!0)),null!=t.otherDims.itemName&&(r=!0)})),r||null==i||(t[i].otherDims.itemName=0),i}(h.dimensions,n.createInvertedIndices,a),p=o?null:r.getSharedDataStore(h),d=ex(e,{schema:h,store:p}),f=new qm(h,e);f.setCalculationInfo(d);var g=null!=c&&function(t){if(t.sourceFormat===Lp){return!Y(fo(function(t){var e=0;for(;e<t.length&&null==t[e];)e++;return t[e]}(t.data||[])))}}(i)?function(t,e,n,i){return i===c?n:this.defaultDimValueGetter(t,e,n,i)}:null;return f.hasItemOption=!1,f.initData(o?i:p,null,g),f}var ox=function(){function t(t){this._setting=t||{},this._extent=[1/0,-1/0]}return t.prototype.getSetting=function(t){return this._setting[t]},t.prototype.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},t.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},t.prototype.isInExtentRange=function(t){return this._extent[0]<=t&&this._extent[1]>=t},t.prototype.isBlank=function(){return this._isBlank},t.prototype.setBlank=function(t){this._isBlank=t},t}();Go(ox);var ax=0,sx=function(){function t(t){this.categories=t.categories||[],this._needCollect=t.needCollect,this._deduplication=t.deduplication,this.uid=++ax}return t.createByAxisModel=function(e){var n=e.option,i=n.data,r=i&&z(i,lx);return new t({categories:r,needCollect:!r,deduplication:!1!==n.dedplication})},t.prototype.getOrdinal=function(t){return this._getOrCreateMap().get(t)},t.prototype.parseAndCollect=function(t){var e,n=this._needCollect;if(!X(t)&&!n)return t;if(n&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var i=this._getOrCreateMap();return null==(e=i.get(t))&&(n?(e=this.categories.length,this.categories[e]=t,i.set(t,e)):e=NaN),e},t.prototype._getOrCreateMap=function(){return this._map||(this._map=ft(this.categories))},t}();function lx(t){return q(t)&&null!=t.value?t.value:t+""}function ux(t){return"interval"===t.type||"log"===t.type}function hx(t,e,n,i){var r={},o=t[1]-t[0],a=r.interval=$r(o/e,!0);null!=n&&a<n&&(a=r.interval=n),null!=i&&a>i&&(a=r.interval=i);var s=r.intervalPrecision=px(a);return function(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),dx(t,0,e),dx(t,1,e),t[0]>t[1]&&(t[0]=t[1])}(r.niceTickExtent=[zr(Math.ceil(t[0]/a)*a,s),zr(Math.floor(t[1]/a)*a,s)],t),r}function cx(t){var e=Math.pow(10,Kr(t)),n=t/e;return n?2===n?n=3:3===n?n=5:n*=2:n=1,zr(n*e)}function px(t){return Br(t)+2}function dx(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}function fx(t,e){return t>=e[0]&&t<=e[1]}function gx(t,e){return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])}function yx(t,e){return t*(e[1]-e[0])+e[0]}var vx=function(t){function e(e){var n=t.call(this,e)||this;n.type="ordinal";var i=n.getSetting("ordinalMeta");return i||(i=new sx({})),Y(i)&&(i=new sx({categories:z(i,(function(t){return q(t)?t.value:t}))})),n._ordinalMeta=i,n._extent=n.getSetting("extent")||[0,i.categories.length-1],n}return n(e,t),e.prototype.parse=function(t){return null==t?NaN:X(t)?this._ordinalMeta.getOrdinal(t):Math.round(t)},e.prototype.contain=function(t){return fx(t=this.parse(t),this._extent)&&null!=this._ordinalMeta.categories[t]},e.prototype.normalize=function(t){return gx(t=this._getTickNumber(this.parse(t)),this._extent)},e.prototype.scale=function(t){return t=Math.round(yx(t,this._extent)),this.getRawOrdinalNumber(t)},e.prototype.getTicks=function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push({value:n}),n++;return t},e.prototype.getMinorTicks=function(t){},e.prototype.setSortInfo=function(t){if(null!=t){for(var e=t.ordinalNumbers,n=this._ordinalNumbersByTick=[],i=this._ticksByOrdinalNumber=[],r=0,o=this._ordinalMeta.categories.length,a=Math.min(o,e.length);r<a;++r){var s=e[r];n[r]=s,i[s]=r}for(var l=0;r<o;++r){for(;null!=i[l];)l++;n.push(l),i[l]=r}}else this._ordinalNumbersByTick=this._ticksByOrdinalNumber=null},e.prototype._getTickNumber=function(t){var e=this._ticksByOrdinalNumber;return e&&t>=0&&t<e.length?e[t]:t},e.prototype.getRawOrdinalNumber=function(t){var e=this._ordinalNumbersByTick;return e&&t>=0&&t<e.length?e[t]:t},e.prototype.getLabel=function(t){if(!this.isBlank()){var e=this.getRawOrdinalNumber(t.value),n=this._ordinalMeta.categories[e];return null==n?"":n+""}},e.prototype.count=function(){return this._extent[1]-this._extent[0]+1},e.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},e.prototype.isInExtentRange=function(t){return t=this._getTickNumber(t),this._extent[0]<=t&&this._extent[1]>=t},e.prototype.getOrdinalMeta=function(){return this._ordinalMeta},e.prototype.calcNiceTicks=function(){},e.prototype.calcNiceExtent=function(){},e.type="ordinal",e}(ox);ox.registerClass(vx);var mx=zr,xx=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="interval",e._interval=0,e._intervalPrecision=2,e}return n(e,t),e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return fx(t,this._extent)},e.prototype.normalize=function(t){return gx(t,this._extent)},e.prototype.scale=function(t){return yx(t,this._extent)},e.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},e.prototype.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),this.setExtent(e[0],e[1])},e.prototype.getInterval=function(){return this._interval},e.prototype.setInterval=function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=px(t)},e.prototype.getTicks=function(t){var e=this._interval,n=this._extent,i=this._niceExtent,r=this._intervalPrecision,o=[];if(!e)return o;n[0]<i[0]&&(t?o.push({value:mx(i[0]-e,r)}):o.push({value:n[0]}));for(var a=i[0];a<=i[1]&&(o.push({value:a}),(a=mx(a+e,r))!==o[o.length-1].value);)if(o.length>1e4)return[];var s=o.length?o[o.length-1].value:i[1];return n[1]>s&&(t?o.push({value:mx(s+e,r)}):o.push({value:n[1]})),o},e.prototype.getMinorTicks=function(t){for(var e=this.getTicks(!0),n=[],i=this.getExtent(),r=1;r<e.length;r++){for(var o=e[r],a=e[r-1],s=0,l=[],u=(o.value-a.value)/t;s<t-1;){var h=mx(a.value+(s+1)*u);h>i[0]&&h<i[1]&&l.push(h),s++}n.push(l)}return n},e.prototype.getLabel=function(t,e){if(null==t)return"";var n=e&&e.precision;return null==n?n=Br(t.value)||0:"auto"===n&&(n=this._intervalPrecision),ep(mx(t.value,n,!0))},e.prototype.calcNiceTicks=function(t,e,n){t=t||5;var i=this._extent,r=i[1]-i[0];if(isFinite(r)){r<0&&(r=-r,i.reverse());var o=hx(i,t,e,n);this._intervalPrecision=o.intervalPrecision,this._interval=o.interval,this._niceExtent=o.niceTickExtent}},e.prototype.calcNiceExtent=function(t){var e=this._extent;if(e[0]===e[1])if(0!==e[0]){var n=e[0];t.fixMax||(e[1]+=n/2),e[0]-=n/2}else e[1]=1;var i=e[1]-e[0];isFinite(i)||(e[0]=0,e[1]=1),this.calcNiceTicks(t.splitNumber,t.minInterval,t.maxInterval);var r=this._interval;t.fixMin||(e[0]=mx(Math.floor(e[0]/r)*r)),t.fixMax||(e[1]=mx(Math.ceil(e[1]/r)*r))},e.prototype.setNiceExtent=function(t,e){this._niceExtent=[t,e]},e.type="interval",e}(ox);ox.registerClass(xx);var _x="undefined"!=typeof Float32Array,bx=_x?Float32Array:Array;function Sx(t){return Y(t)?_x?new Float32Array(t):t:new bx(t)}var Mx="__ec_stack_";function Ix(t){return t.get("stack")||Mx+t.seriesIndex}function Tx(t){return t.dim+t.index}function Cx(t,e){var n=[];return e.eachSeriesByType(t,(function(t){Px(t)&&n.push(t)})),n}function Dx(t){var e=function(t){var e={};E(t,(function(t){var n=t.coordinateSystem.getBaseAxis();if("time"===n.type||"value"===n.type)for(var i=t.getData(),r=n.dim+"_"+n.index,o=i.getDimensionIndex(i.mapDimension(n.dim)),a=i.getStore(),s=0,l=a.count();s<l;++s){var u=a.get(o,s);e[r]?e[r].push(u):e[r]=[u]}}));var n={};for(var i in e)if(e.hasOwnProperty(i)){var r=e[i];if(r){r.sort((function(t,e){return t-e}));for(var o=null,a=1;a<r.length;++a){var s=r[a]-r[a-1];s>0&&(o=null===o?s:Math.min(o,s))}n[i]=o}}return n}(t),n=[];return E(t,(function(t){var i,r=t.coordinateSystem.getBaseAxis(),o=r.getExtent();if("category"===r.type)i=r.getBandWidth();else if("value"===r.type||"time"===r.type){var a=r.dim+"_"+r.index,s=e[a],l=Math.abs(o[1]-o[0]),u=r.scale.getExtent(),h=Math.abs(u[1]-u[0]);i=s?l/h*s:l}else{var c=t.getData();i=Math.abs(o[1]-o[0])/c.count()}var p=Er(t.get("barWidth"),i),d=Er(t.get("barMaxWidth"),i),f=Er(t.get("barMinWidth")||(Ox(t)?.5:1),i),g=t.get("barGap"),y=t.get("barCategoryGap");n.push({bandWidth:i,barWidth:p,barMaxWidth:d,barMinWidth:f,barGap:g,barCategoryGap:y,axisKey:Tx(r),stackId:Ix(t)})})),Ax(n)}function Ax(t){var e={};E(t,(function(t,n){var i=t.axisKey,r=t.bandWidth,o=e[i]||{bandWidth:r,remainedWidth:r,autoWidthCount:0,categoryGap:null,gap:"20%",stacks:{}},a=o.stacks;e[i]=o;var s=t.stackId;a[s]||o.autoWidthCount++,a[s]=a[s]||{width:0,maxWidth:0};var l=t.barWidth;l&&!a[s].width&&(a[s].width=l,l=Math.min(o.remainedWidth,l),o.remainedWidth-=l);var u=t.barMaxWidth;u&&(a[s].maxWidth=u);var h=t.barMinWidth;h&&(a[s].minWidth=h);var c=t.barGap;null!=c&&(o.gap=c);var p=t.barCategoryGap;null!=p&&(o.categoryGap=p)}));var n={};return E(e,(function(t,e){n[e]={};var i=t.stacks,r=t.bandWidth,o=t.categoryGap;if(null==o){var a=G(i).length;o=Math.max(35-4*a,15)+"%"}var s=Er(o,r),l=Er(t.gap,1),u=t.remainedWidth,h=t.autoWidthCount,c=(u-s)/(h+(h-1)*l);c=Math.max(c,0),E(i,(function(t){var e=t.maxWidth,n=t.minWidth;if(t.width){i=t.width;e&&(i=Math.min(i,e)),n&&(i=Math.max(i,n)),t.width=i,u-=i+l*i,h--}else{var i=c;e&&e<i&&(i=Math.min(e,u)),n&&n>i&&(i=n),i!==c&&(t.width=i,u-=i+l*i,h--)}})),c=(u-s)/(h+(h-1)*l),c=Math.max(c,0);var p,d=0;E(i,(function(t,e){t.width||(t.width=c),p=t,d+=t.width*(1+l)})),p&&(d-=p.width*l);var f=-d/2;E(i,(function(t,i){n[e][i]=n[e][i]||{bandWidth:r,offset:f,width:t.width},f+=t.width*(1+l)}))})),n}function kx(t,e){var n=Cx(t,e),i=Dx(n);E(n,(function(t){var e=t.getData(),n=t.coordinateSystem.getBaseAxis(),r=Ix(t),o=i[Tx(n)][r],a=o.offset,s=o.width;e.setLayout({bandWidth:o.bandWidth,offset:a,size:s})}))}function Lx(t){return{seriesType:t,plan:yg(),reset:function(t){if(Px(t)){var e=t.getData(),n=t.coordinateSystem,i=n.getBaseAxis(),r=n.getOtherAxis(i),o=e.getDimensionIndex(e.mapDimension(r.dim)),a=e.getDimensionIndex(e.mapDimension(i.dim)),s=t.get("showBackground",!0),l=e.mapDimension(r.dim),u=e.getCalculationInfo("stackResultDimension"),h=nx(e,l)&&!!e.getCalculationInfo("stackedOnSeries"),c=r.isHorizontal(),p=function(t,e){return e.toGlobalCoord(e.dataToCoord("log"===e.type?1:0))}(0,r),d=Ox(t),f=t.get("barMinHeight")||0,g=u&&e.getDimensionIndex(u),y=e.getLayout("size"),v=e.getLayout("offset");return{progress:function(t,e){for(var i,r=t.count,l=d&&Sx(3*r),u=d&&s&&Sx(3*r),m=d&&Sx(r),x=n.master.getRect(),_=c?x.width:x.height,b=e.getStore(),w=0;null!=(i=t.next());){var S=b.get(h?g:o,i),M=b.get(a,i),I=p,T=void 0;h&&(T=+S-b.get(o,i));var C=void 0,D=void 0,A=void 0,k=void 0;if(c){var L=n.dataToPoint([S,M]);if(h)I=n.dataToPoint([T,M])[0];C=I,D=L[1]+v,A=L[0]-I,k=y,Math.abs(A)<f&&(A=(A<0?-1:1)*f)}else{L=n.dataToPoint([M,S]);if(h)I=n.dataToPoint([M,T])[1];C=L[0]+v,D=I,A=y,k=L[1]-I,Math.abs(k)<f&&(k=(k<=0?-1:1)*f)}d?(l[w]=C,l[w+1]=D,l[w+2]=c?A:k,u&&(u[w]=c?x.x:C,u[w+1]=c?D:x.y,u[w+2]=_),m[i]=i):e.setItemLayout(i,{x:C,y:D,width:A,height:k}),w+=3}d&&e.setLayout({largePoints:l,largeDataIndices:m,largeBackgroundPoints:u,valueAxisHorizontal:c})}}}}}}function Px(t){return t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type}function Ox(t){return t.pipelineContext&&t.pipelineContext.large}var Rx=function(t){function e(e){var n=t.call(this,e)||this;return n.type="time",n}return n(e,t),e.prototype.getLabel=function(t){var e=this.getSetting("useUTC");return Vc(t.value,Pc[function(t){switch(t){case"year":case"month":return"day";case"millisecond":return"millisecond";default:return"second"}}(Ec(this._minLevelUnit))]||Pc.second,e,this.getSetting("locale"))},e.prototype.getFormattedLabel=function(t,e,n){var i=this.getSetting("useUTC");return function(t,e,n,i,r){var o=null;if(X(n))o=n;else if(U(n))o=n(t.value,e,{level:t.level});else{var a=A({},kc);if(t.level>0)for(var s=0;s<Oc.length;++s)a[Oc[s]]="{primary|"+a[Oc[s]]+"}";var l=n?!1===n.inherit?n:k(n,a):a,u=Bc(t.value,r);if(l[u])o=l[u];else if(l.inherit){for(s=Rc.indexOf(u)-1;s>=0;--s)if(l[u]){o=l[u];break}o=o||a.none}if(Y(o)){var h=null==t.level?0:t.level>=0?t.level:o.length+t.level;o=o[h=Math.min(h,o.length-1)]}}return Vc(new Date(t.value),o,r,i)}(t,e,n,this.getSetting("locale"),i)},e.prototype.getTicks=function(){var t=this._interval,e=this._extent,n=[];if(!t)return n;n.push({value:e[0],level:0});var i=this.getSetting("useUTC"),r=function(t,e,n,i){var r=1e4,o=Rc,a=0;function s(t,e,n,r,o,a,s){for(var l=new Date(e),u=e,h=l[r]();u<n&&u<=i[1];)s.push({value:u}),h+=t,l[o](h),u=l.getTime();s.push({value:u,notAdd:!0})}function l(t,r,o){var a=[],l=!r.length;if(!function(t,e,n,i){var r=jr(e),o=jr(n),a=function(t){return Fc(r,t,i)===Fc(o,t,i)},s=function(){return a("year")},l=function(){return s()&&a("month")},u=function(){return l()&&a("day")},h=function(){return u()&&a("hour")},c=function(){return h()&&a("minute")},p=function(){return c()&&a("second")},d=function(){return p()&&a("millisecond")};switch(t){case"year":return s();case"month":return l();case"day":return u();case"hour":return h();case"minute":return c();case"second":return p();case"millisecond":return d()}}(Ec(t),i[0],i[1],n)){l&&(r=[{value:Gx(new Date(i[0]),t,n)},{value:i[1]}]);for(var u=0;u<r.length-1;u++){var h=r[u].value,c=r[u+1].value;if(h!==c){var p=void 0,d=void 0,f=void 0,g=!1;switch(t){case"year":p=Math.max(1,Math.round(e/Dc/365)),d=Gc(n),f=jc(n);break;case"half-year":case"quarter":case"month":p=zx(e),d=Wc(n),f=qc(n);break;case"week":case"half-week":case"day":p=Ex(e),d=Hc(n),f=Kc(n),g=!0;break;case"half-day":case"quarter-day":case"hour":p=Vx(e),d=Yc(n),f=$c(n);break;case"minute":p=Bx(e,!0),d=Uc(n),f=Jc(n);break;case"second":p=Bx(e,!1),d=Xc(n),f=Qc(n);break;case"millisecond":p=Fx(e),d=Zc(n),f=tp(n)}s(p,h,c,d,f,g,a),"year"===t&&o.length>1&&0===u&&o.unshift({value:o[0].value-p})}}for(u=0;u<a.length;u++)o.push(a[u]);return a}}for(var u=[],h=[],c=0,p=0,d=0;d<o.length&&a++<r;++d){var f=Ec(o[d]);if(zc(o[d]))if(l(o[d],u[u.length-1]||[],h),f!==(o[d+1]?Ec(o[d+1]):null)){if(h.length){p=c,h.sort((function(t,e){return t.value-e.value}));for(var g=[],y=0;y<h.length;++y){var v=h[y].value;0!==y&&h[y-1].value===v||(g.push(h[y]),v>=i[0]&&v<=i[1]&&c++)}var m=(i[1]-i[0])/e;if(c>1.5*m&&p>m/1.5)break;if(u.push(g),c>m||t===o[d])break}h=[]}}0;var x=B(z(u,(function(t){return B(t,(function(t){return t.value>=i[0]&&t.value<=i[1]&&!t.notAdd}))})),(function(t){return t.length>0})),_=[],b=x.length-1;for(d=0;d<x.length;++d)for(var w=x[d],S=0;S<w.length;++S)_.push({value:w[S].value,level:b-d});_.sort((function(t,e){return t.value-e.value}));var M=[];for(d=0;d<_.length;++d)0!==d&&_[d].value===_[d-1].value||M.push(_[d]);return M}(this._minLevelUnit,this._approxInterval,i,e);return(n=n.concat(r)).push({value:e[1],level:0}),n},e.prototype.calcNiceExtent=function(t){var e=this._extent;if(e[0]===e[1]&&(e[0]-=Dc,e[1]+=Dc),e[1]===-1/0&&e[0]===1/0){var n=new Date;e[1]=+new Date(n.getFullYear(),n.getMonth(),n.getDate()),e[0]=e[1]-Dc}this.calcNiceTicks(t.splitNumber,t.minInterval,t.maxInterval)},e.prototype.calcNiceTicks=function(t,e,n){t=t||10;var i=this._extent,r=i[1]-i[0];this._approxInterval=r/t,null!=e&&this._approxInterval<e&&(this._approxInterval=e),null!=n&&this._approxInterval>n&&(this._approxInterval=n);var o=Nx.length,a=Math.min(function(t,e,n,i){for(;n<i;){var r=n+i>>>1;t[r][1]<e?n=r+1:i=r}return n}(Nx,this._approxInterval,0,o),o-1);this._interval=Nx[a][1],this._minLevelUnit=Nx[Math.max(a-1,0)][0]},e.prototype.parse=function(t){return j(t)?t:+jr(t)},e.prototype.contain=function(t){return fx(this.parse(t),this._extent)},e.prototype.normalize=function(t){return gx(this.parse(t),this._extent)},e.prototype.scale=function(t){return yx(t,this._extent)},e.type="time",e}(xx),Nx=[["second",Ic],["minute",Tc],["hour",Cc],["quarter-day",216e5],["half-day",432e5],["day",10368e4],["half-week",3024e5],["week",6048e5],["month",26784e5],["quarter",8208e6],["half-year",Ac/2],["year",Ac]];function Ex(t,e){return(t/=Dc)>16?16:t>7.5?7:t>3.5?4:t>1.5?2:1}function zx(t){return(t/=2592e6)>6?6:t>3?3:t>2?2:1}function Vx(t){return(t/=Cc)>12?12:t>6?6:t>3.5?4:t>2?2:1}function Bx(t,e){return(t/=e?Tc:Ic)>30?30:t>20?20:t>15?15:t>10?10:t>5?5:t>2?2:1}function Fx(t){return $r(t,!0)}function Gx(t,e,n){var i=new Date(t);switch(Ec(e)){case"year":case"month":i[qc(n)](0);case"day":i[Kc(n)](1);case"hour":i[$c(n)](0);case"minute":i[Jc(n)](0);case"second":i[Qc(n)](0),i[tp(n)](0)}return i.getTime()}ox.registerClass(Rx);var Wx=ox.prototype,Hx=xx.prototype,Yx=zr,Ux=Math.floor,Xx=Math.ceil,Zx=Math.pow,jx=Math.log,qx=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="log",e.base=10,e._originalScale=new xx,e._interval=0,e}return n(e,t),e.prototype.getTicks=function(t){var e=this._originalScale,n=this._extent,i=e.getExtent();return z(Hx.getTicks.call(this,t),(function(t){var e=t.value,r=zr(Zx(this.base,e));return r=e===n[0]&&this._fixMin?$x(r,i[0]):r,{value:r=e===n[1]&&this._fixMax?$x(r,i[1]):r}}),this)},e.prototype.setExtent=function(t,e){var n=this.base;t=jx(t)/jx(n),e=jx(e)/jx(n),Hx.setExtent.call(this,t,e)},e.prototype.getExtent=function(){var t=this.base,e=Wx.getExtent.call(this);e[0]=Zx(t,e[0]),e[1]=Zx(t,e[1]);var n=this._originalScale.getExtent();return this._fixMin&&(e[0]=$x(e[0],n[0])),this._fixMax&&(e[1]=$x(e[1],n[1])),e},e.prototype.unionExtent=function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=jx(t[0])/jx(e),t[1]=jx(t[1])/jx(e),Wx.unionExtent.call(this,t)},e.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},e.prototype.calcNiceTicks=function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n===1/0||n<=0)){var i=qr(n);for(t/n*i<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&Math.abs(i)>0;)i*=10;var r=[zr(Xx(e[0]/i)*i),zr(Ux(e[1]/i)*i)];this._interval=i,this._niceExtent=r}},e.prototype.calcNiceExtent=function(t){Hx.calcNiceExtent.call(this,t),this._fixMin=t.fixMin,this._fixMax=t.fixMax},e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return fx(t=jx(t)/jx(this.base),this._extent)},e.prototype.normalize=function(t){return gx(t=jx(t)/jx(this.base),this._extent)},e.prototype.scale=function(t){return t=yx(t,this._extent),Zx(this.base,t)},e.type="log",e}(ox),Kx=qx.prototype;function $x(t,e){return Yx(t,Br(e))}Kx.getMinorTicks=Hx.getMinorTicks,Kx.getLabel=Hx.getLabel,ox.registerClass(qx);var Jx=function(){function t(t,e,n){this._prepareParams(t,e,n)}return t.prototype._prepareParams=function(t,e,n){n[1]<n[0]&&(n=[NaN,NaN]),this._dataMin=n[0],this._dataMax=n[1];var i=this._isOrdinal="ordinal"===t.type;this._needCrossZero="interval"===t.type&&e.getNeedCrossZero&&e.getNeedCrossZero();var r=this._modelMinRaw=e.get("min",!0);U(r)?this._modelMinNum=n_(t,r({min:n[0],max:n[1]})):"dataMin"!==r&&(this._modelMinNum=n_(t,r));var o=this._modelMaxRaw=e.get("max",!0);if(U(o)?this._modelMaxNum=n_(t,o({min:n[0],max:n[1]})):"dataMax"!==o&&(this._modelMaxNum=n_(t,o)),i)this._axisDataLen=e.getCategories().length;else{var a=e.get("boundaryGap"),s=Y(a)?a:[a||0,a||0];"boolean"==typeof s[0]||"boolean"==typeof s[1]?this._boundaryGapInner=[0,0]:this._boundaryGapInner=[gr(s[0],1),gr(s[1],1)]}},t.prototype.calculate=function(){var t=this._isOrdinal,e=this._dataMin,n=this._dataMax,i=this._axisDataLen,r=this._boundaryGapInner,o=t?null:n-e||Math.abs(e),a="dataMin"===this._modelMinRaw?e:this._modelMinNum,s="dataMax"===this._modelMaxRaw?n:this._modelMaxNum,l=null!=a,u=null!=s;null==a&&(a=t?i?0:NaN:e-r[0]*o),null==s&&(s=t?i?i-1:NaN:n+r[1]*o),(null==a||!isFinite(a))&&(a=NaN),(null==s||!isFinite(s))&&(s=NaN);var h=nt(a)||nt(s)||t&&!i;this._needCrossZero&&(a>0&&s>0&&!l&&(a=0),a<0&&s<0&&!u&&(s=0));var c=this._determinedMin,p=this._determinedMax;return null!=c&&(a=c,l=!0),null!=p&&(s=p,u=!0),{min:a,max:s,minFixed:l,maxFixed:u,isBlank:h}},t.prototype.modifyDataMinMax=function(t,e){this[t_[t]]=e},t.prototype.setDeterminedMinMax=function(t,e){var n=Qx[t];this[n]=e},t.prototype.freeze=function(){this.frozen=!0},t}(),Qx={min:"_determinedMin",max:"_determinedMax"},t_={min:"_dataMin",max:"_dataMax"};function e_(t,e,n){var i=t.rawExtentInfo;return i||(i=new Jx(t,e,n),t.rawExtentInfo=i,i)}function n_(t,e){return null==e?null:nt(e)?NaN:t.parse(e)}function i_(t,e){var n=t.type,i=e_(t,e,t.getExtent()).calculate();t.setBlank(i.isBlank);var r=i.min,o=i.max,a=e.ecModel;if(a&&"time"===n){var s=Cx("bar",a),l=!1;if(E(s,(function(t){l=l||t.getBaseAxis()===e.axis})),l){var u=Dx(s),h=function(t,e,n,i){var r=n.axis.getExtent(),o=r[1]-r[0],a=function(t,e,n){if(t&&e){var i=t[Tx(e)];return null!=i&&null!=n?i[Ix(n)]:i}}(i,n.axis);if(void 0===a)return{min:t,max:e};var s=1/0;E(a,(function(t){s=Math.min(t.offset,s)}));var l=-1/0;E(a,(function(t){l=Math.max(t.offset+t.width,l)})),s=Math.abs(s),l=Math.abs(l);var u=s+l,h=e-t,c=h/(1-(s+l)/o)-h;return{min:t-=c*(s/u),max:e+=c*(l/u)}}(r,o,e,u);r=h.min,o=h.max}}return{extent:[r,o],fixMin:i.minFixed,fixMax:i.maxFixed}}function r_(t,e){var n=e,i=i_(t,n),r=i.extent,o=n.get("splitNumber");t instanceof qx&&(t.base=n.get("logBase"));var a=t.type,s=n.get("interval"),l="interval"===a||"time"===a;t.setExtent(r[0],r[1]),t.calcNiceExtent({splitNumber:o,fixMin:i.fixMin,fixMax:i.fixMax,minInterval:l?n.get("minInterval"):null,maxInterval:l?n.get("maxInterval"):null}),null!=s&&t.setInterval&&t.setInterval(s)}function o_(t,e){if(e=e||t.get("type"))switch(e){case"category":return new vx({ordinalMeta:t.getOrdinalMeta?t.getOrdinalMeta():t.getCategories(),extent:[1/0,-1/0]});case"time":return new Rx({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new(ox.getClass(e)||xx)}}function a_(t){var e,n,i=t.getLabelModel().get("formatter"),r="category"===t.type?t.scale.getExtent()[0]:null;return"time"===t.scale.type?(n=i,function(e,i){return t.scale.getFormattedLabel(e,i,n)}):X(i)?function(e){return function(n){var i=t.scale.getLabel(n);return e.replace("{value}",null!=i?i:"")}}(i):U(i)?(e=i,function(n,i){return null!=r&&(i=n.value-r),e(s_(t,n),i,null!=n.level?{level:n.level}:null)}):function(e){return t.scale.getLabel(e)}}function s_(t,e){return"category"===t.type?t.scale.getLabel(e):e.value}function l_(t,e){var n=e*Math.PI/180,i=t.width,r=t.height,o=i*Math.abs(Math.cos(n))+Math.abs(r*Math.sin(n)),a=i*Math.abs(Math.sin(n))+Math.abs(r*Math.cos(n));return new sr(t.x,t.y,o,a)}function u_(t){var e=t.get("interval");return null==e?"auto":e}function h_(t){return"category"===t.type&&0===u_(t.getLabelModel())}function c_(t,e){var n={};return E(t.mapDimensionsAll(e),(function(e){n[ix(t,e)]=!0})),G(n)}var p_=function(){function t(){}return t.prototype.getNeedCrossZero=function(){return!this.option.scale},t.prototype.getCoordSysModel=function(){},t}();var d_={isDimensionStacked:nx,enableDataStack:ex,getStackedDimension:ix};var f_=Object.freeze({__proto__:null,createList:function(t){return rx(null,t)},getLayoutRect:xp,dataStack:d_,createScale:function(t,e){var n=e;e instanceof dc||(n=new dc(e));var i=o_(n);return i.setExtent(t[0],t[1]),r_(i,n),i},mixinAxisModelCommonMethods:function(t){R(t,p_)},getECData:Hs,createTextStyle:function(t,e){return Uh(t,null,null,"normal"!==(e=e||{}).state)},createDimensions:function(t,e){return Km(t,e).dimensions},createSymbol:Ly,enableHoverEmphasis:Ol});function g_(t,e){return Math.abs(t-e)<1e-8}function y_(t,e,n){var i=0,r=t[0];if(!r)return!1;for(var o=1;o<t.length;o++){var a=t[o];i+=is(r[0],r[1],a[0],a[1],e,n),r=a}var s=t[0];return g_(r[0],s[0])&&g_(r[1],s[1])||(i+=is(r[0],r[1],s[0],s[1],e,n)),0!==i}var v_=[];function m_(t,e){for(var n=0;n<t.length;n++)Ft(t[n],t[n],e)}function x_(t,e,n,i){for(var r=0;r<t.length;r++){var o=t[r];i&&(o=i.project(o)),o&&isFinite(o[0])&&isFinite(o[1])&&(Gt(e,e,o),Wt(n,n,o))}}var __=function(){function t(t){this.name=t}return t.prototype.setCenter=function(t){this._center=t},t.prototype.getCenter=function(){var t=this._center;return t||(t=this._center=this.calcCenter()),t},t}(),b_=function(t,e){this.type="polygon",this.exterior=t,this.interiors=e},w_=function(t){this.type="linestring",this.points=t},S_=function(t){function e(e,n,i){var r=t.call(this,e)||this;return r.type="geoJSON",r.geometries=n,r._center=i&&[i[0],i[1]],r}return n(e,t),e.prototype.calcCenter=function(){for(var t,e=this.geometries,n=0,i=0;i<e.length;i++){var r=e[i],o=r.exterior,a=o&&o.length;a>n&&(t=r,n=a)}if(t)return function(t){for(var e=0,n=0,i=0,r=t.length,o=t[r-1][0],a=t[r-1][1],s=0;s<r;s++){var l=t[s][0],u=t[s][1],h=o*u-l*a;e+=h,n+=(o+l)*h,i+=(a+u)*h,o=l,a=u}return e?[n/e/3,i/e/3,e]:[t[0][0]||0,t[0][1]||0]}(t.exterior);var s=this.getBoundingRect();return[s.x+s.width/2,s.y+s.height/2]},e.prototype.getBoundingRect=function(t){var e=this._rect;if(e&&!t)return e;var n=[1/0,1/0],i=[-1/0,-1/0];return E(this.geometries,(function(e){"polygon"===e.type?x_(e.exterior,n,i,t):E(e.points,(function(e){x_(e,n,i,t)}))})),isFinite(n[0])&&isFinite(n[1])&&isFinite(i[0])&&isFinite(i[1])||(n[0]=n[1]=i[0]=i[1]=0),e=new sr(n[0],n[1],i[0]-n[0],i[1]-n[1]),t||(this._rect=e),e},e.prototype.contain=function(t){var e=this.getBoundingRect(),n=this.geometries;if(!e.contain(t[0],t[1]))return!1;t:for(var i=0,r=n.length;i<r;i++){var o=n[i];if("polygon"===o.type){var a=o.exterior,s=o.interiors;if(y_(a,t[0],t[1])){for(var l=0;l<(s?s.length:0);l++)if(y_(s[l],t[0],t[1]))continue t;return!0}}}return!1},e.prototype.transformTo=function(t,e,n,i){var r=this.getBoundingRect(),o=r.width/r.height;n?i||(i=n/o):n=o*i;for(var a=new sr(t,e,n,i),s=r.calculateTransform(a),l=this.geometries,u=0;u<l.length;u++){var h=l[u];"polygon"===h.type?(m_(h.exterior,s),E(h.interiors,(function(t){m_(t,s)}))):E(h.points,(function(t){m_(t,s)}))}(r=this._rect).copy(a),this._center=[r.x+r.width/2,r.y+r.height/2]},e.prototype.cloneShallow=function(t){null==t&&(t=this.name);var n=new e(t,this.geometries,this._center);return n._rect=this._rect,n.transformTo=null,n},e}(__),M_=function(t){function e(e,n){var i=t.call(this,e)||this;return i.type="geoSVG",i._elOnlyForCalculate=n,i}return n(e,t),e.prototype.calcCenter=function(){for(var t=this._elOnlyForCalculate,e=t.getBoundingRect(),n=[e.x+e.width/2,e.y+e.height/2],i=Oi(v_),r=t;r&&!r.isGeoSVGGraphicRoot;)Ni(i,r.getLocalTransform(),i),r=r.parent;return Bi(i,i),Ft(n,n,i),n},e}(__);function I_(t,e,n){for(var i=0;i<t.length;i++)t[i]=T_(t[i],e[i],n)}function T_(t,e,n){for(var i=[],r=e[0],o=e[1],a=0;a<t.length;a+=2){var s=t.charCodeAt(a)-64,l=t.charCodeAt(a+1)-64;s=s>>1^-(1&s),l=l>>1^-(1&l),r=s+=r,o=l+=o,i.push([s/n,l/n])}return i}function C_(t,e){return z(B((t=function(t){if(!t.UTF8Encoding)return t;var e=t,n=e.UTF8Scale;return null==n&&(n=1024),E(e.features,(function(t){var e=t.geometry,i=e.encodeOffsets,r=e.coordinates;if(i)switch(e.type){case"LineString":e.coordinates=T_(r,i,n);break;case"Polygon":case"MultiLineString":I_(r,i,n);break;case"MultiPolygon":E(r,(function(t,e){return I_(t,i[e],n)}))}})),e.UTF8Encoding=!1,e}(t)).features,(function(t){return t.geometry&&t.properties&&t.geometry.coordinates.length>0})),(function(t){var n=t.properties,i=t.geometry,r=[];switch(i.type){case"Polygon":var o=i.coordinates;r.push(new b_(o[0],o.slice(1)));break;case"MultiPolygon":E(i.coordinates,(function(t){t[0]&&r.push(new b_(t[0],t.slice(1)))}));break;case"LineString":r.push(new w_([i.coordinates]));break;case"MultiLineString":r.push(new w_(i.coordinates))}var a=new S_(n[e||"name"],r,n.cp);return a.properties=n,a}))}var D_=Object.freeze({__proto__:null,linearMap:Nr,round:zr,asc:Vr,getPrecision:Br,getPrecisionSafe:Fr,getPixelPrecision:Gr,getPercentWithPrecision:Wr,MAX_SAFE_INTEGER:Yr,remRadian:Ur,isRadianAroundZero:Xr,parseDate:jr,quantity:qr,quantityExponent:Kr,nice:$r,quantile:Jr,reformIntervals:Qr,isNumeric:eo,numericToNumber:to}),A_=Object.freeze({__proto__:null,parse:jr,format:Vc}),k_=Object.freeze({__proto__:null,extendShape:fh,extendPath:yh,makePath:xh,makeImage:_h,mergePath:wh,resizePath:Sh,createIcon:Ph,updateProps:rh,initProps:oh,getTransform:Ih,clipPointsByRect:kh,clipRectByRect:Lh,registerShape:vh,getShapeClass:mh,Group:Cr,Image:_s,Text:ks,Circle:hu,Ellipse:pu,Sector:Cu,Ring:Au,Polygon:Pu,Polyline:Ru,Rect:Cs,Line:zu,BezierCurve:Gu,Arc:Hu,IncrementalDisplayable:th,CompoundPath:Yu,LinearGradient:Xu,RadialGradient:Zu,BoundingRect:sr}),L_=Object.freeze({__proto__:null,addCommas:ep,toCamelCase:np,normalizeCssArray:ip,encodeHTML:ap,formatTpl:hp,getTooltipMarker:cp,formatTime:function(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=jr(e),r=n?"getUTC":"get",o=i[r+"FullYear"](),a=i[r+"Month"]()+1,s=i[r+"Date"](),l=i[r+"Hours"](),u=i[r+"Minutes"](),h=i[r+"Seconds"](),c=i[r+"Milliseconds"]();return t=t.replace("MM",Nc(a,2)).replace("M",a).replace("yyyy",o).replace("yy",Nc(o%100+"",2)).replace("dd",Nc(s,2)).replace("d",s).replace("hh",Nc(l,2)).replace("h",l).replace("mm",Nc(u,2)).replace("m",u).replace("ss",Nc(h,2)).replace("s",h).replace("SSS",Nc(c,3))},capitalFirst:function(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t},truncateText:$o,getTextRect:function(t,e,n,i,r,o,a,s){return new ks({style:{text:t,font:e,align:n,verticalAlign:i,padding:r,rich:o,overflow:a?"truncate":null,lineHeight:s}}).getBoundingRect()}}),P_=Object.freeze({__proto__:null,map:z,each:E,indexOf:P,inherits:O,reduce:V,filter:B,bind:W,curry:H,isArray:Y,isString:X,isObject:q,isFunction:U,extend:A,defaults:k,clone:T,merge:C}),O_=So();function R_(t){return"category"===t.type?function(t){var e=t.getLabelModel(),n=E_(t,e);return!e.get("show")||t.scale.isBlank()?{labels:[],labelCategoryInterval:n.labelCategoryInterval}:n}(t):function(t){var e=t.scale.getTicks(),n=a_(t);return{labels:z(e,(function(e,i){return{level:e.level,formattedLabel:n(e,i),rawLabel:t.scale.getLabel(e),tickValue:e.value}}))}}(t)}function N_(t,e){return"category"===t.type?function(t,e){var n,i,r=z_(t,"ticks"),o=u_(e),a=V_(r,o);if(a)return a;e.get("show")&&!t.scale.isBlank()||(n=[]);if(U(o))n=G_(t,o,!0);else if("auto"===o){var s=E_(t,t.getLabelModel());i=s.labelCategoryInterval,n=z(s.labels,(function(t){return t.tickValue}))}else n=F_(t,i=o,!0);return B_(r,o,{ticks:n,tickCategoryInterval:i})}(t,e):{ticks:z(t.scale.getTicks(),(function(t){return t.value}))}}function E_(t,e){var n,i,r=z_(t,"labels"),o=u_(e),a=V_(r,o);return a||(U(o)?n=G_(t,o):(i="auto"===o?function(t){var e=O_(t).autoInterval;return null!=e?e:O_(t).autoInterval=t.calculateCategoryInterval()}(t):o,n=F_(t,i)),B_(r,o,{labels:n,labelCategoryInterval:i}))}function z_(t,e){return O_(t)[e]||(O_(t)[e]=[])}function V_(t,e){for(var n=0;n<t.length;n++)if(t[n].key===e)return t[n].value}function B_(t,e,n){return t.push({key:e,value:n}),n}function F_(t,e,n){var i=a_(t),r=t.scale,o=r.getExtent(),a=t.getLabelModel(),s=[],l=Math.max((e||0)+1,1),u=o[0],h=r.count();0!==u&&l>1&&h/l>2&&(u=Math.round(Math.ceil(u/l)*l));var c=h_(t),p=a.get("showMinLabel")||c,d=a.get("showMaxLabel")||c;p&&u!==o[0]&&g(o[0]);for(var f=u;f<=o[1];f+=l)g(f);function g(t){var e={value:t};s.push(n?t:{formattedLabel:i(e),rawLabel:r.getLabel(e),tickValue:t})}return d&&f-l!==o[1]&&g(o[1]),s}function G_(t,e,n){var i=t.scale,r=a_(t),o=[];return E(i.getTicks(),(function(t){var a=i.getLabel(t),s=t.value;e(t.value,a)&&o.push(n?s:{formattedLabel:r(t),rawLabel:a,tickValue:s})})),o}var W_=[0,1],H_=function(){function t(t,e,n){this.onBand=!1,this.inverse=!1,this.dim=t,this.scale=e,this._extent=n||[0,0]}return t.prototype.contain=function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return t>=n&&t<=i},t.prototype.containData=function(t){return this.scale.contain(t)},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.getPixelPrecision=function(t){return Gr(t||this.scale.getExtent(),this._extent)},t.prototype.setExtent=function(t,e){var n=this._extent;n[0]=t,n[1]=e},t.prototype.dataToCoord=function(t,e){var n=this._extent,i=this.scale;return t=i.normalize(t),this.onBand&&"ordinal"===i.type&&Y_(n=n.slice(),i.count()),Nr(t,W_,n,e)},t.prototype.coordToData=function(t,e){var n=this._extent,i=this.scale;this.onBand&&"ordinal"===i.type&&Y_(n=n.slice(),i.count());var r=Nr(t,n,W_,e);return this.scale.scale(r)},t.prototype.pointToData=function(t,e){},t.prototype.getTicksCoords=function(t){var e=(t=t||{}).tickModel||this.getTickModel(),n=z(N_(this,e).ticks,(function(t){return{coord:this.dataToCoord("ordinal"===this.scale.type?this.scale.getRawOrdinalNumber(t):t),tickValue:t}}),this);return function(t,e,n,i){var r=e.length;if(!t.onBand||n||!r)return;var o,a,s=t.getExtent();if(1===r)e[0].coord=s[0],o=e[1]={coord:s[0]};else{var l=e[r-1].tickValue-e[0].tickValue,u=(e[r-1].coord-e[0].coord)/l;E(e,(function(t){t.coord-=u/2})),a=1+t.scale.getExtent()[1]-e[r-1].tickValue,o={coord:e[r-1].coord+u*a},e.push(o)}var h=s[0]>s[1];c(e[0].coord,s[0])&&(i?e[0].coord=s[0]:e.shift());i&&c(s[0],e[0].coord)&&e.unshift({coord:s[0]});c(s[1],o.coord)&&(i?o.coord=s[1]:e.pop());i&&c(o.coord,s[1])&&e.push({coord:s[1]});function c(t,e){return t=zr(t),e=zr(e),h?t>e:t<e}}(this,n,e.get("alignWithLabel"),t.clamp),n},t.prototype.getMinorTicksCoords=function(){if("ordinal"===this.scale.type)return[];var t=this.model.getModel("minorTick").get("splitNumber");return t>0&&t<100||(t=5),z(this.scale.getMinorTicks(t),(function(t){return z(t,(function(t){return{coord:this.dataToCoord(t),tickValue:t}}),this)}),this)},t.prototype.getViewLabels=function(){return R_(this).labels},t.prototype.getLabelModel=function(){return this.model.getModel("axisLabel")},t.prototype.getTickModel=function(){return this.model.getModel("axisTick")},t.prototype.getBandWidth=function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n},t.prototype.calculateCategoryInterval=function(){return function(t){var e=function(t){var e=t.getLabelModel();return{axisRotate:t.getRotate?t.getRotate():t.isHorizontal&&!t.isHorizontal()?90:0,labelRotate:e.get("rotate")||0,font:e.getFont()}}(t),n=a_(t),i=(e.axisRotate-e.labelRotate)/180*Math.PI,r=t.scale,o=r.getExtent(),a=r.count();if(o[1]-o[0]<1)return 0;var s=1;a>40&&(s=Math.max(1,Math.floor(a/40)));for(var l=o[0],u=t.dataToCoord(l+1)-t.dataToCoord(l),h=Math.abs(u*Math.cos(i)),c=Math.abs(u*Math.sin(i)),p=0,d=0;l<=o[1];l+=s){var f,g,y=cr(n({value:l}),e.font,"center","top");f=1.3*y.width,g=1.3*y.height,p=Math.max(p,f,7),d=Math.max(d,g,7)}var v=p/h,m=d/c;isNaN(v)&&(v=1/0),isNaN(m)&&(m=1/0);var x=Math.max(0,Math.floor(Math.min(v,m))),_=O_(t.model),b=t.getExtent(),w=_.lastAutoInterval,S=_.lastTickCount;return null!=w&&null!=S&&Math.abs(w-x)<=1&&Math.abs(S-a)<=1&&w>x&&_.axisExtent0===b[0]&&_.axisExtent1===b[1]?x=w:(_.lastTickCount=a,_.lastAutoInterval=x,_.axisExtent0=b[0],_.axisExtent1=b[1]),x}(this)},t}();function Y_(t,e){var n=(t[1]-t[0])/e/2;t[0]+=n,t[1]-=n}var U_=2*Math.PI,X_=qa.CMD,Z_=["top","right","bottom","left"];function j_(t,e,n,i,r){var o=n.width,a=n.height;switch(t){case"top":i.set(n.x+o/2,n.y-e),r.set(0,-1);break;case"bottom":i.set(n.x+o/2,n.y+a+e),r.set(0,1);break;case"left":i.set(n.x-e,n.y+a/2),r.set(-1,0);break;case"right":i.set(n.x+o+e,n.y+a/2),r.set(1,0)}}function q_(t,e,n,i,r,o,a,s,l){a-=t,s-=e;var u=Math.sqrt(a*a+s*s),h=(a/=u)*n+t,c=(s/=u)*n+e;if(Math.abs(i-r)%U_<1e-4)return l[0]=h,l[1]=c,u-n;if(o){var p=i;i=ts(r),r=ts(p)}else i=ts(i),r=ts(r);i>r&&(r+=U_);var d=Math.atan2(s,a);if(d<0&&(d+=U_),d>=i&&d<=r||d+U_>=i&&d+U_<=r)return l[0]=h,l[1]=c,u-n;var f=n*Math.cos(i)+t,g=n*Math.sin(i)+e,y=n*Math.cos(r)+t,v=n*Math.sin(r)+e,m=(f-a)*(f-a)+(g-s)*(g-s),x=(y-a)*(y-a)+(v-s)*(v-s);return m<x?(l[0]=f,l[1]=g,Math.sqrt(m)):(l[0]=y,l[1]=v,Math.sqrt(x))}function K_(t,e,n,i,r,o,a,s){var l=r-t,u=o-e,h=n-t,c=i-e,p=Math.sqrt(h*h+c*c),d=(l*(h/=p)+u*(c/=p))/p;s&&(d=Math.min(Math.max(d,0),1)),d*=p;var f=a[0]=t+d*h,g=a[1]=e+d*c;return Math.sqrt((f-r)*(f-r)+(g-o)*(g-o))}function $_(t,e,n,i,r,o,a){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i);var s=t+n,l=e+i,u=a[0]=Math.min(Math.max(r,t),s),h=a[1]=Math.min(Math.max(o,e),l);return Math.sqrt((u-r)*(u-r)+(h-o)*(h-o))}var J_=[];function Q_(t,e,n){var i=$_(e.x,e.y,e.width,e.height,t.x,t.y,J_);return n.set(J_[0],J_[1]),i}function tb(t,e,n){for(var i,r,o=0,a=0,s=0,l=0,u=1/0,h=e.data,c=t.x,p=t.y,d=0;d<h.length;){var f=h[d++];1===d&&(s=o=h[d],l=a=h[d+1]);var g=u;switch(f){case X_.M:o=s=h[d++],a=l=h[d++];break;case X_.L:g=K_(o,a,h[d],h[d+1],c,p,J_,!0),o=h[d++],a=h[d++];break;case X_.C:g=je(o,a,h[d++],h[d++],h[d++],h[d++],h[d],h[d+1],c,p,J_),o=h[d++],a=h[d++];break;case X_.Q:g=tn(o,a,h[d++],h[d++],h[d],h[d+1],c,p,J_),o=h[d++],a=h[d++];break;case X_.A:var y=h[d++],v=h[d++],m=h[d++],x=h[d++],_=h[d++],b=h[d++];d+=1;var w=!!(1-h[d++]);i=Math.cos(_)*m+y,r=Math.sin(_)*x+v,d<=1&&(s=i,l=r),g=q_(y,v,x,_,_+b,w,(c-y)*x/m+y,p,J_),o=Math.cos(_+b)*m+y,a=Math.sin(_+b)*x+v;break;case X_.R:g=$_(s=o=h[d++],l=a=h[d++],h[d++],h[d++],c,p,J_);break;case X_.Z:g=K_(o,a,s,l,c,p,J_,!0),o=s,a=l}g<u&&(u=g,n.set(J_[0],J_[1]))}return u}var eb=new Ji,nb=new Ji,ib=new Ji,rb=new Ji,ob=new Ji;function ab(t,e){if(t){var n=t.getTextGuideLine(),i=t.getTextContent();if(i&&n){var r=t.textGuideLineConfig||{},o=[[0,0],[0,0],[0,0]],a=r.candidates||Z_,s=i.getBoundingRect().clone();s.applyTransform(i.getComputedTransform());var l=1/0,u=r.anchor,h=t.getComputedTransform(),c=h&&Bi([],h),p=e.get("length2")||0;u&&ib.copy(u);for(var d=0;d<a.length;d++){j_(a[d],0,s,eb,rb),Ji.scaleAndAdd(nb,eb,rb,p),nb.transform(c);var f=t.getBoundingRect(),g=u?u.distance(nb):t instanceof gs?tb(nb,t.path,ib):Q_(nb,f,ib);g<l&&(l=g,nb.transform(h),ib.transform(h),ib.toArray(o[0]),nb.toArray(o[1]),eb.toArray(o[2]))}ub(o,e.get("minTurnAngle")),n.setShape({points:o})}}}var sb=[],lb=new Ji;function ub(t,e){if(e<=180&&e>0){e=e/180*Math.PI,eb.fromArray(t[0]),nb.fromArray(t[1]),ib.fromArray(t[2]),Ji.sub(rb,eb,nb),Ji.sub(ob,ib,nb);var n=rb.len(),i=ob.len();if(!(n<.001||i<.001)){rb.scale(1/n),ob.scale(1/i);var r=rb.dot(ob);if(Math.cos(e)<r){var o=K_(nb.x,nb.y,ib.x,ib.y,eb.x,eb.y,sb,!1);lb.fromArray(sb),lb.scaleAndAdd(ob,o/Math.tan(Math.PI-e));var a=ib.x!==nb.x?(lb.x-nb.x)/(ib.x-nb.x):(lb.y-nb.y)/(ib.y-nb.y);if(isNaN(a))return;a<0?Ji.copy(lb,nb):a>1&&Ji.copy(lb,ib),lb.toArray(t[1])}}}}function hb(t,e,n){if(n<=180&&n>0){n=n/180*Math.PI,eb.fromArray(t[0]),nb.fromArray(t[1]),ib.fromArray(t[2]),Ji.sub(rb,nb,eb),Ji.sub(ob,ib,nb);var i=rb.len(),r=ob.len();if(!(i<.001||r<.001))if(rb.scale(1/i),ob.scale(1/r),rb.dot(e)<Math.cos(n)){var o=K_(nb.x,nb.y,ib.x,ib.y,eb.x,eb.y,sb,!1);lb.fromArray(sb);var a=Math.PI/2,s=a+Math.acos(ob.dot(e))-n;if(s>=a)Ji.copy(lb,ib);else{lb.scaleAndAdd(ob,o/Math.tan(Math.PI/2-s));var l=ib.x!==nb.x?(lb.x-nb.x)/(ib.x-nb.x):(lb.y-nb.y)/(ib.y-nb.y);if(isNaN(l))return;l<0?Ji.copy(lb,nb):l>1&&Ji.copy(lb,ib)}lb.toArray(t[1])}}}function cb(t,e,n,i){var r="normal"===n,o=r?t:t.ensureState(n);o.ignore=e;var a=i.get("smooth");a&&!0===a&&(a=.3),o.shape=o.shape||{},a>0&&(o.shape.smooth=a);var s=i.getModel("lineStyle").getLineStyle();r?t.useStyle(s):o.style=s}function pb(t,e){var n=e.smooth,i=e.points;if(i)if(t.moveTo(i[0][0],i[0][1]),n>0&&i.length>=3){var r=Et(i[0],i[1]),o=Et(i[1],i[2]);if(!r||!o)return t.lineTo(i[1][0],i[1][1]),void t.lineTo(i[2][0],i[2][1]);var a=Math.min(r,o)*n,s=Bt([],i[1],i[0],a/r),l=Bt([],i[1],i[2],a/o),u=Bt([],s,l,.5);t.bezierCurveTo(s[0],s[1],s[0],s[1],u[0],u[1]),t.bezierCurveTo(l[0],l[1],l[0],l[1],i[2][0],i[2][1])}else for(var h=1;h<i.length;h++)t.lineTo(i[h][0],i[h][1])}function db(t,e,n){var i=t.getTextGuideLine(),r=t.getTextContent();if(r){for(var o=e.normal,a=o.get("show"),s=r.ignore,l=0;l<Ks.length;l++){var u=Ks[l],h=e[u],c="normal"===u;if(h){var p=h.get("show");if((c?s:rt(r.states[u]&&r.states[u].ignore,s))||!rt(p,a)){var d=c?i:i&&i.states[u];d&&(d.ignore=!0);continue}i||(i=new Ru,t.setTextGuideLine(i),c||!s&&a||cb(i,!0,"normal",e.normal),t.stateProxy&&(i.stateProxy=t.stateProxy)),cb(i,!1,u,h)}}if(i){k(i.style,n),i.style.fill=null;var f=o.get("showAbove");(t.textGuideLineConfig=t.textGuideLineConfig||{}).showAbove=f||!1,i.buildPath=pb}}else i&&t.removeTextGuideLine()}function fb(t,e){e=e||"labelLine";for(var n={normal:t.getModel(e)},i=0;i<qs.length;i++){var r=qs[i];n[r]=t.getModel([r,e])}return n}function gb(t){for(var e=[],n=0;n<t.length;n++){var i=t[n];if(!i.defaultAttr.ignore){var r=i.label,o=r.getComputedTransform(),a=r.getBoundingRect(),s=!o||o[1]<1e-5&&o[2]<1e-5,l=r.style.margin||0,u=a.clone();u.applyTransform(o),u.x-=l/2,u.y-=l/2,u.width+=l,u.height+=l;var h=s?new Ju(a,o):null;e.push({label:r,labelLine:i.labelLine,rect:u,localRect:a,obb:h,priority:i.priority,defaultAttr:i.defaultAttr,layoutOption:i.computedLayoutOption,axisAligned:s,transform:o})}}return e}function yb(t,e,n,i,r,o){var a=t.length;if(!(a<2)){t.sort((function(t,n){return t.rect[e]-n.rect[e]}));for(var s,l=0,u=!1,h=0,c=0;c<a;c++){var p=t[c],d=p.rect;(s=d[e]-l)<0&&(d[e]-=s,p.label[e]-=s,u=!0),h+=Math.max(-s,0),l=d[e]+d[n]}h>0&&o&&_(-h/a,0,a);var f,g,y=t[0],v=t[a-1];return m(),f<0&&b(-f,.8),g<0&&b(g,.8),m(),x(f,g,1),x(g,f,-1),m(),f<0&&w(-f),g<0&&w(g),u}function m(){f=y.rect[e]-i,g=r-v.rect[e]-v.rect[n]}function x(t,e,n){if(t<0){var i=Math.min(e,-t);if(i>0){_(i*n,0,a);var r=i+t;r<0&&b(-r*n,1)}else b(-t*n,1)}}function _(n,i,r){0!==n&&(u=!0);for(var o=i;o<r;o++){var a=t[o];a.rect[e]+=n,a.label[e]+=n}}function b(i,r){for(var o=[],s=0,l=1;l<a;l++){var u=t[l-1].rect,h=Math.max(t[l].rect[e]-u[e]-u[n],0);o.push(h),s+=h}if(s){var c=Math.min(Math.abs(i)/s,r);if(i>0)for(l=0;l<a-1;l++){_(o[l]*c,0,l+1)}else for(l=a-1;l>0;l--){_(-(o[l-1]*c),l,a)}}}function w(t){var e=t<0?-1:1;t=Math.abs(t);for(var n=Math.ceil(t/(a-1)),i=0;i<a-1;i++)if(e>0?_(n,0,i+1):_(-n,a-i-1,a),(t-=n)<=0)return}}function vb(t,e,n,i){return yb(t,"y","height",e,n,i)}function mb(t){var e=[];t.sort((function(t,e){return e.priority-t.priority}));var n=new sr(0,0,0,0);function i(t){if(!t.ignore){var e=t.ensureState("emphasis");null==e.ignore&&(e.ignore=!1)}t.ignore=!0}for(var r=0;r<t.length;r++){var o=t[r],a=o.axisAligned,s=o.localRect,l=o.transform,u=o.label,h=o.labelLine;n.copy(o.rect),n.width-=.1,n.height-=.1,n.x+=.05,n.y+=.05;for(var c=o.obb,p=!1,d=0;d<e.length;d++){var f=e[d];if(n.intersect(f.rect)){if(a&&f.axisAligned){p=!0;break}if(f.obb||(f.obb=new Ju(f.localRect,f.transform)),c||(c=new Ju(s,l)),c.intersect(f.obb)){p=!0;break}}}p?(i(u),h&&i(h)):(u.attr("ignore",o.defaultAttr.ignore),h&&h.attr("ignore",o.defaultAttr.labelGuideIgnore),e.push(o))}}function xb(t){if(t){for(var e=[],n=0;n<t.length;n++)e.push(t[n].slice());return e}}function _b(t,e){var n=t.label,i=e&&e.getTextGuideLine();return{dataIndex:t.dataIndex,dataType:t.dataType,seriesIndex:t.seriesModel.seriesIndex,text:t.label.style.text,rect:t.hostRect,labelRect:t.rect,align:n.style.align,verticalAlign:n.style.verticalAlign,labelLinePoints:xb(i&&i.shape.points)}}var bb=["align","verticalAlign","width","height","fontSize"],wb=new qi,Sb=So(),Mb=So();function Ib(t,e,n){for(var i=0;i<n.length;i++){var r=n[i];null!=e[r]&&(t[r]=e[r])}}var Tb=["x","y","rotation"],Cb=function(){function t(){this._labelList=[],this._chartViewList=[]}return t.prototype.clearLabels=function(){this._labelList=[],this._chartViewList=[]},t.prototype._addLabel=function(t,e,n,i,r){var o=i.style,a=i.__hostTarget.textConfig||{},s=i.getComputedTransform(),l=i.getBoundingRect().plain();sr.applyTransform(l,l,s),s?wb.setLocalTransform(s):(wb.x=wb.y=wb.rotation=wb.originX=wb.originY=0,wb.scaleX=wb.scaleY=1);var u,h=i.__hostTarget;if(h){u=h.getBoundingRect().plain();var c=h.getComputedTransform();sr.applyTransform(u,u,c)}var p=u&&h.getTextGuideLine();this._labelList.push({label:i,labelLine:p,seriesModel:n,dataIndex:t,dataType:e,layoutOption:r,computedLayoutOption:null,rect:l,hostRect:u,priority:u?u.width*u.height:0,defaultAttr:{ignore:i.ignore,labelGuideIgnore:p&&p.ignore,x:wb.x,y:wb.y,scaleX:wb.scaleX,scaleY:wb.scaleY,rotation:wb.rotation,style:{x:o.x,y:o.y,align:o.align,verticalAlign:o.verticalAlign,width:o.width,height:o.height,fontSize:o.fontSize},cursor:i.cursor,attachedPos:a.position,attachedRot:a.rotation}})},t.prototype.addLabelsOfSeries=function(t){var e=this;this._chartViewList.push(t);var n=t.__model,i=n.get("labelLayout");(U(i)||G(i).length)&&t.group.traverse((function(t){if(t.ignore)return!0;var r=t.getTextContent(),o=Hs(t);r&&!r.disableLabelLayout&&e._addLabel(o.dataIndex,o.dataType,n,r,i)}))},t.prototype.updateLayoutConfig=function(t){var e=t.getWidth(),n=t.getHeight();function i(t,e){return function(){ab(t,e)}}for(var r=0;r<this._labelList.length;r++){var o=this._labelList[r],a=o.label,s=a.__hostTarget,l=o.defaultAttr,u=void 0;u=(u=U(o.layoutOption)?o.layoutOption(_b(o,s)):o.layoutOption)||{},o.computedLayoutOption=u;var h=Math.PI/180;s&&s.setTextConfig({local:!1,position:null!=u.x||null!=u.y?null:l.attachedPos,rotation:null!=u.rotate?u.rotate*h:l.attachedRot,offset:[u.dx||0,u.dy||0]});var c=!1;if(null!=u.x?(a.x=Er(u.x,e),a.setStyle("x",0),c=!0):(a.x=l.x,a.setStyle("x",l.style.x)),null!=u.y?(a.y=Er(u.y,n),a.setStyle("y",0),c=!0):(a.y=l.y,a.setStyle("y",l.style.y)),u.labelLinePoints){var p=s.getTextGuideLine();p&&(p.setShape({points:u.labelLinePoints}),c=!1)}Sb(a).needsUpdateLabelLine=c,a.rotation=null!=u.rotate?u.rotate*h:l.rotation,a.scaleX=l.scaleX,a.scaleY=l.scaleY;for(var d=0;d<bb.length;d++){var f=bb[d];a.setStyle(f,null!=u[f]?u[f]:l.style[f])}if(u.draggable){if(a.draggable=!0,a.cursor="move",s){var g=o.seriesModel;if(null!=o.dataIndex)g=o.seriesModel.getData(o.dataType).getItemModel(o.dataIndex);a.on("drag",i(s,g.getModel("labelLine")))}}else a.off("drag"),a.cursor=l.cursor}},t.prototype.layout=function(t){var e,n=t.getWidth(),i=t.getHeight(),r=gb(this._labelList),o=B(r,(function(t){return"shiftX"===t.layoutOption.moveOverlap})),a=B(r,(function(t){return"shiftY"===t.layoutOption.moveOverlap}));yb(o,"x","width",0,n,e),vb(a,0,i),mb(B(r,(function(t){return t.layoutOption.hideOverlap})))},t.prototype.processLabelsOverall=function(){var t=this;E(this._chartViewList,(function(e){var n=e.__model,i=e.ignoreLabelLineUpdate,r=n.isAnimationEnabled();e.group.traverse((function(e){if(e.ignore&&!e.forceLabelAnimation)return!0;var o=!i,a=e.getTextContent();!o&&a&&(o=Sb(a).needsUpdateLabelLine),o&&t._updateLabelLine(e,n),r&&t._animateLabels(e,n)}))}))},t.prototype._updateLabelLine=function(t,e){var n=t.getTextContent(),i=Hs(t),r=i.dataIndex;if(n&&null!=r){var o=e.getData(i.dataType),a=o.getItemModel(r),s={},l=o.getItemVisual(r,"style"),u=o.getVisual("drawType");s.stroke=l[u];var h=a.getModel("labelLine");db(t,fb(a),s),ab(t,h)}},t.prototype._animateLabels=function(t,e){var n=t.getTextContent(),i=t.getTextGuideLine();if(n&&(t.forceLabelAnimation||!n.ignore&&!n.invisible&&!t.disableLabelAnimation&&!ah(t))){var r=(d=Sb(n)).oldLayout,o=Hs(t),a=o.dataIndex,s={x:n.x,y:n.y,rotation:n.rotation},l=e.getData(o.dataType);if(r){n.attr(r);var u=t.prevStates;u&&(P(u,"select")>=0&&n.attr(d.oldLayoutSelect),P(u,"emphasis")>=0&&n.attr(d.oldLayoutEmphasis)),rh(n,s,e,a)}else if(n.attr(s),!Jh(n).valueAnimation){var h=rt(n.style.opacity,1);n.style.opacity=0,oh(n,{style:{opacity:h}},e,a)}if(d.oldLayout=s,n.states.select){var c=d.oldLayoutSelect={};Ib(c,s,Tb),Ib(c,n.states.select,Tb)}if(n.states.emphasis){var p=d.oldLayoutEmphasis={};Ib(p,s,Tb),Ib(p,n.states.emphasis,Tb)}tc(n,a,l,e,e)}if(i&&!i.ignore&&!i.invisible){r=(d=Mb(i)).oldLayout;var d,f={points:i.shape.points};r?(i.attr({shape:r}),rh(i,{shape:f},e)):(i.setShape(f),i.style.strokePercent=0,oh(i,{style:{strokePercent:1}},e)),d.oldLayout=f}},t}(),Db=So();var Ab=Math.sin,kb=Math.cos,Lb=Math.PI,Pb=2*Math.PI,Ob=180/Lb,Rb=function(){function t(){}return t.prototype.reset=function(t){this._start=!0,this._d=[],this._str="",this._p=Math.pow(10,t||4)},t.prototype.moveTo=function(t,e){this._add("M",t,e)},t.prototype.lineTo=function(t,e){this._add("L",t,e)},t.prototype.bezierCurveTo=function(t,e,n,i,r,o){this._add("C",t,e,n,i,r,o)},t.prototype.quadraticCurveTo=function(t,e,n,i){this._add("Q",t,e,n,i)},t.prototype.arc=function(t,e,n,i,r,o){this.ellipse(t,e,n,n,0,i,r,o)},t.prototype.ellipse=function(t,e,n,i,r,o,a,s){var l=a-o,u=!s,h=Math.abs(l),c=En(h-Pb)||(u?l>=Pb:-l>=Pb),p=l>0?l%Pb:l%Pb+Pb,d=!1;d=!!c||!En(h)&&p>=Lb==!!u;var f=t+n*kb(o),g=e+i*Ab(o);this._start&&this._add("M",f,g);var y=Math.round(r*Ob);if(c){var v=1/this._p,m=(u?1:-1)*(Pb-v);this._add("A",n,i,y,1,+u,t+n*kb(o+m),e+i*Ab(o+m)),v>.01&&this._add("A",n,i,y,0,+u,f,g)}else{var x=t+n*kb(a),_=e+i*Ab(a);this._add("A",n,i,y,+d,+u,x,_)}},t.prototype.rect=function(t,e,n,i){this._add("M",t,e),this._add("l",n,0),this._add("l",0,i),this._add("l",-n,0),this._add("Z")},t.prototype.closePath=function(){this._d.length>0&&this._add("Z")},t.prototype._add=function(t,e,n,i,r,o,a,s,l){for(var u=[],h=this._p,c=1;c<arguments.length;c++){var p=arguments[c];if(isNaN(p))return void(this._invalid=!0);u.push(Math.round(p*h)/h)}this._d.push(t+u.join(" ")),this._start="Z"===t},t.prototype.generateStr=function(){this._str=this._invalid?"":this._d.join(""),this._d=[]},t.prototype.getStr=function(){return this._str},t}(),Nb="none",Eb=Math.round;var zb=["lineCap","miterLimit","lineJoin"],Vb=z(zb,(function(t){return"stroke-"+t.toLowerCase()}));function Bb(t,e,n,i){var r=null==e.opacity?1:e.opacity;if(n instanceof _s)t("opacity",r);else{if(function(t){var e=t.fill;return null!=e&&e!==Nb}(e)){var o=Rn(e.fill);t("fill",o.color);var a=null!=e.fillOpacity?e.fillOpacity*o.opacity*r:o.opacity*r;(i||a<1)&&t("fill-opacity",a)}else t("fill",Nb);if(function(t){var e=t.stroke;return null!=e&&e!==Nb}(e)){var s=Rn(e.stroke);t("stroke",s.color);var l=e.strokeNoScale?n.getLineScale():1,u=l?(e.lineWidth||0)/l:0,h=null!=e.strokeOpacity?e.strokeOpacity*s.opacity*r:s.opacity*r,c=e.strokeFirst;if((i||1!==u)&&t("stroke-width",u),(i||c)&&t("paint-order",c?"stroke":"fill"),(i||h<1)&&t("stroke-opacity",h),e.lineDash){var p=Vy(n),d=p[0],f=p[1];d&&(f=Eb(f||0),t("stroke-dasharray",d.join(",")),(f||i)&&t("stroke-dashoffset",f))}else i&&t("stroke-dasharray",Nb);for(var g=0;g<zb.length;g++){var y=zb[g];if(i||e[y]!==ps[y]){var v=e[y]||ps[y];v&&t(Vb[g],v)}}}else i&&t("stroke",Nb)}}var Fb="http://www.w3.org/2000/svg",Gb="http://www.w3.org/1999/xlink";function Wb(t){return document.createElementNS(Fb,t)}function Hb(t,e,n,i,r){return{tag:t,attrs:n||{},children:i,text:r,key:e}}function Yb(t,e){var n=(e=e||{}).newline?"\n":"";return function t(e){var i=e.children,r=e.tag;return function(t,e){var n=[];if(e)for(var i in e){var r=e[i],o=i;!1!==r&&(!0!==r&&null!=r&&(o+='="'+r+'"'),n.push(o))}return"<"+t+" "+n.join(" ")+">"}(r,e.attrs)+(e.text||"")+(i?""+n+z(i,(function(e){return t(e)})).join(n)+n:"")+("</"+r+">")}(t)}function Ub(t){return{zrId:t,shadowCache:{},patternCache:{},gradientCache:{},clipPathCache:{},defs:{},cssNodes:{},cssAnims:{},cssClassIdx:0,cssAnimIdx:0,shadowIdx:0,gradientIdx:0,patternIdx:0,clipPathIdx:0}}function Xb(t,e,n,i){return Hb("svg","root",{width:t,height:e,xmlns:Fb,"xmlns:xlink":Gb,version:"1.1",baseProfile:"full",viewBox:!!i&&"0 0 "+t+" "+e},n)}var Zb={cubicIn:"0.32,0,0.67,0",cubicOut:"0.33,1,0.68,1",cubicInOut:"0.65,0,0.35,1",quadraticIn:"0.11,0,0.5,0",quadraticOut:"0.5,1,0.89,1",quadraticInOut:"0.45,0,0.55,1",quarticIn:"0.5,0,0.75,0",quarticOut:"0.25,1,0.5,1",quarticInOut:"0.76,0,0.24,1",quinticIn:"0.64,0,0.78,0",quinticOut:"0.22,1,0.36,1",quinticInOut:"0.83,0,0.17,1",sinusoidalIn:"0.12,0,0.39,0",sinusoidalOut:"0.61,1,0.88,1",sinusoidalInOut:"0.37,0,0.63,1",exponentialIn:"0.7,0,0.84,0",exponentialOut:"0.16,1,0.3,1",exponentialInOut:"0.87,0,0.13,1",circularIn:"0.55,0,1,0.45",circularOut:"0,0.55,0.45,1",circularInOut:"0.85,0,0.15,1"},jb="transform-origin";function qb(t,e,n){var i=A({},t.shape);A(i,e),t.buildPath(n,i);var r=new Rb;return r.reset(Yn(t)),n.rebuildPath(r,1),r.generateStr(),r.getStr()}function Kb(t,e){var n=e.originX,i=e.originY;(n||i)&&(t[jb]=n+"px "+i+"px")}var $b={fill:"fill",opacity:"opacity",lineWidth:"stroke-width",lineDashOffset:"stroke-dashoffset"};function Jb(t,e){var n=e.zrId+"-ani-"+e.cssAnimIdx++;return e.cssAnims[n]=t,n}function Qb(t){return X(t)?Zb[t]?"cubic-bezier("+Zb[t]+")":rn(t)?t:"":""}function tw(t,e,n,i){var r=t.animators,o=r.length,a=[];if(t instanceof Yu){if(y=function(t,e,n){var i,r,o=t.shape.paths,a={};if(E(o,(function(t){var e=Ub(n.zrId);e.animation=!0,tw(t,{},e,!0);var o=e.cssAnims,s=e.cssNodes,l=G(o),u=l.length;if(u){var h=o[r=l[u-1]];for(var c in h){var p=h[c];a[c]=a[c]||{d:""},a[c].d+=p.d||""}for(var d in s){var f=s[d].animation;f.indexOf(r)>=0&&(i=f)}}})),i){e.d=!1;var s=Jb(a,n);return i.replace(r,s)}}(t,e,n))a.push(y);else if(!o)return}else if(!o)return;for(var s={},l=0;l<o;l++){var u=r[l],h=[u.getMaxTime()/1e3+"s"],c=Qb(u.getClip().easing),p=u.getDelay();c?h.push(c):h.push("linear"),p&&h.push(p/1e3+"s"),u.getLoop()&&h.push("infinite");var d=h.join(" ");s[d]=s[d]||[d,[]],s[d][1].push(u)}function f(r){var o,a=r[1],s=a.length,l={},u={},h={};function c(t,e,n){for(var i=t.getTracks(),r=t.getMaxTime(),o=0;o<i.length;o++){var a=i[o];if(a.needsAnimate()){var s=a.keyframes,l=a.propName;if(n&&(l=n(l)),l)for(var u=0;u<s.length;u++){var h=s[u],c=Math.round(h.time/r*100)+"%",p=Qb(h.easing),d=h.rawValue;(X(d)||j(d))&&(e[c]=e[c]||{},e[c][l]=h.rawValue,p&&(e[c]["animation-timing-function"]=p))}}}}for(var p=0;p<s;p++){(w=(b=a[p]).targetName)?"shape"===w&&c(b,u):!i&&c(b,l)}for(var d in l){var f={};$i(f,t),A(f,l[d]);var g=Un(f),y=l[d]["animation-timing-function"];h[d]=g?{transform:g}:{},Kb(h[d],f),y&&(h[d]["animation-timing-function"]=y)}var v=!0;for(var d in u){h[d]=h[d]||{};var m=!o;y=u[d]["animation-timing-function"];m&&(o=new qa);var x=o.len();o.reset(),h[d].d=qb(t,u[d],o);var _=o.len();if(!m&&x!==_){v=!1;break}y&&(h[d]["animation-timing-function"]=y)}if(!v)for(var d in h)delete h[d].d;if(!i)for(p=0;p<s;p++){var b,w;"style"===(w=(b=a[p]).targetName)&&c(b,h,(function(t){return $b[t]}))}var S,M=G(h),I=!0;for(p=1;p<M.length;p++){var T=M[p-1],C=M[p];if(h[T][jb]!==h[C][jb]){I=!1;break}S=h[T][jb]}if(I&&S){for(var d in h)h[d][jb]&&delete h[d][jb];e[jb]=S}if(B(M,(function(t){return G(h[t]).length>0})).length)return Jb(h,n)+" "+r[0]+" both"}for(var g in s){var y;(y=f(s[g]))&&a.push(y)}if(a.length){var v=n.zrId+"-cls-"+n.cssClassIdx++;n.cssNodes["."+v]={animation:a.join(",")},e.class=v}}var ew=Math.round;function nw(t){return t&&X(t.src)}function iw(t){return t&&U(t.toDataURL)}function rw(t,e,n,i){Bb((function(r,o){var a="fill"===r||"stroke"===r;a&&function(t){return t&&("linear"===t.type||"radial"===t.type)}(o)?function(t,e,n,i){var r,o=t[n],a={gradientUnits:o.global?"userSpaceOnUse":"objectBoundingBox"};if(Gn(o))r="linearGradient",a.x1=o.x,a.y1=o.y,a.x2=o.x2,a.y2=o.y2;else{if(!Wn(o))return void 0;r="radialGradient",a.cx=rt(o.x,.5),a.cy=rt(o.y,.5),a.r=rt(o.r,.5)}for(var s=o.colorStops,l=[],u=0,h=s.length;u<h;++u){var c=100*Vn(s[u].offset)+"%",p=Rn(s[u].color),d=p.color,f=p.opacity,g={offset:c};g["stop-color"]=d,f<1&&(g["stop-opacity"]=f),l.push(Hb("stop",u+"",g))}var y=Yb(Hb(r,"",a,l)),v=i.gradientCache,m=v[y];m||(m=i.zrId+"-g"+i.gradientIdx++,v[y]=m,a.id=m,i.defs[m]=Hb(r,m,a,l));e[n]=Hn(m)}(e,t,r,i):a&&function(t){return Fn(t)||function(t){return t&&!!t.svgElement}(t)}(o)?function(t,e,n,i){var r,o=t.style[n],a={patternUnits:"userSpaceOnUse"};if(Fn(o)){var s=o.imageWidth,l=o.imageHeight,u=void 0,h=o.image;if(X(h)?u=h:nw(h)?u=h.src:iw(h)&&(u=h.toDataURL()),"undefined"==typeof Image){var c="Image width/height must been given explictly in svg-ssr renderer.";lt(s,c),lt(l,c)}else if(null==s||null==l){var p=function(t,e){if(t){var n=t.elm,i=t.attrs.width=s||e.width,r=t.attrs.height=l||e.height;n&&(n.setAttribute("width",i),n.setAttribute("height",r))}},d=Zo(u,null,t,(function(t){p(f,t),p(r,t)}));d&&d.width&&d.height&&(s=s||d.width,l=l||d.height)}r=Hb("image","img",{href:u,width:s,height:l}),a.width=s,a.height=l}else o.svgElement&&(r=T(o.svgElement),a.width=o.svgWidth,a.height=o.svgHeight);if(!r)return;a.patternTransform=Un(o);var f=Hb("pattern","",a,[r]),g=Yb(f),y=i.patternCache,v=y[g];v||(v=i.zrId+"-p"+i.patternIdx++,y[g]=v,a.id=v,f=i.defs[v]=Hb("pattern",v,a,[r]));e[n]=Hn(v)}(n,t,r,i):t[r]=o}),e,n,!1),function(t,e,n){var i=t.style;if(function(t){return t&&(t.shadowBlur||t.shadowOffsetX||t.shadowOffsetY)}(i)){var r=function(t){var e=t.style,n=t.getGlobalScale();return[e.shadowColor,(e.shadowBlur||0).toFixed(2),(e.shadowOffsetX||0).toFixed(2),(e.shadowOffsetY||0).toFixed(2),n[0],n[1]].join(",")}(t),o=n.shadowCache,a=o[r];if(!a){var s=t.getGlobalScale(),l=s[0],u=s[1];if(!l||!u)return;var h=i.shadowOffsetX||0,c=i.shadowOffsetY||0,p=i.shadowBlur,d=Rn(i.shadowColor),f=d.opacity,g=d.color,y=p/2/l+" "+p/2/u;a=n.zrId+"-s"+n.shadowIdx++,n.defs[a]=Hb("filter",a,{id:a,x:"-100%",y:"-100%",width:"300%",height:"300%"},[Hb("feDropShadow","",{dx:h/l,dy:c/u,stdDeviation:y,"flood-color":g,"flood-opacity":f})]),o[r]=a}e.filter=Hn(a)}}(n,t,i)}function ow(t){return En(t[0]-1)&&En(t[1])&&En(t[2])&&En(t[3]-1)}function aw(t,e,n){if(e&&(!function(t){return En(t[4])&&En(t[5])}(e)||!ow(e))){var i=n?10:1e4;t.transform=ow(e)?"translate("+ew(e[4]*i)/i+" "+ew(e[5]*i)/i+")":function(t){return"matrix("+zn(t[0])+","+zn(t[1])+","+zn(t[2])+","+zn(t[3])+","+Vn(t[4])+","+Vn(t[5])+")"}(e)}}function sw(t,e,n){for(var i=t.points,r=[],o=0;o<i.length;o++)r.push(ew(i[o][0]*n)/n),r.push(ew(i[o][1]*n)/n);e.points=r.join(" ")}function lw(t){return!t.smooth}var uw,hw,cw={circle:[(uw=["cx","cy","r"],hw=z(uw,(function(t){return"string"==typeof t?[t,t]:t})),function(t,e,n){for(var i=0;i<hw.length;i++){var r=hw[i],o=t[r[0]];null!=o&&(e[r[1]]=ew(o*n)/n)}})],polyline:[sw,lw],polygon:[sw,lw]};function pw(t,e){var n=t.style,i=t.shape,r=cw[t.type],o={},a=e.animation,s="path",l=t.style.strokePercent,u=e.compress&&Yn(t)||4;if(!r||e.willUpdate||r[1]&&!r[1](i)||a&&function(t){for(var e=t.animators,n=0;n<e.length;n++)if("shape"===e[n].targetName)return!0;return!1}(t)||l<1){t.path||t.createPathProxy();var h=t.path;t.shapeChanged()&&(h.beginPath(),t.buildPath(h,t.shape),t.pathUpdated());var c=h.getVersion(),p=t,d=p.__svgPathBuilder;p.__svgPathVersion===c&&d&&l===p.__svgPathStrokePercent||(d||(d=p.__svgPathBuilder=new Rb),d.reset(u),h.rebuildPath(d,l),d.generateStr(),p.__svgPathVersion=c,p.__svgPathStrokePercent=l),o.d=d.getStr()}else{s=t.type;var f=Math.pow(10,u);r[0](i,o,f)}return aw(o,t.transform),rw(o,n,t,e),e.animation&&tw(t,o,e),Hb(s,t.id+"",o)}function dw(t,e){return t instanceof gs?pw(t,e):t instanceof _s?function(t,e){var n=t.style,i=n.image;if(i&&!X(i)&&(nw(i)?i=i.src:iw(i)&&(i=i.toDataURL())),i){var r=n.x||0,o=n.y||0,a={href:i,width:n.width,height:n.height};return r&&(a.x=r),o&&(a.y=o),aw(a,t.transform),rw(a,n,t,e),e.animation&&tw(t,a,e),Hb("image",t.id+"",a)}}(t,e):t instanceof vs?function(t,e){var n=t.style,i=n.text;if(null!=i&&(i+=""),i&&!isNaN(n.x)&&!isNaN(n.y)){var r=n.font||a,s=n.x||0,l=function(t,e,n){return"top"===n?t+=e/2:"bottom"===n&&(t-=e/2),t}(n.y||0,fr(r),n.textBaseline),u={"dominant-baseline":"central","text-anchor":Bn[n.textAlign]||n.textAlign};if(Es(n)){var h="",c=n.fontStyle,p=Rs(n.fontSize);if(!parseFloat(p))return;var d=n.fontFamily||o,f=n.fontWeight;h+="font-size:"+p+";font-family:"+d+";",c&&"normal"!==c&&(h+="font-style:"+c+";"),f&&"normal"!==f&&(h+="font-weight:"+f+";"),u.style=h}else u.style="font: "+r;return i.match(/\s/)&&(u["xml:space"]="preserve"),s&&(u.x=s),l&&(u.y=l),aw(u,t.transform),rw(u,n,t,e),e.animation&&tw(t,u,e),Hb("text",t.id+"",u,void 0,i)}}(t,e):void 0}function fw(t,e,n){var i=n.clipPathCache,r=n.defs,o=i[t.id];if(!o){var a={id:o=n.zrId+"-c"+n.clipPathIdx++};i[t.id]=o,r[o]=Hb("clipPath",o,a,[pw(t,n)])}e["clip-path"]=Hn(o)}function gw(t){return document.createTextNode(t)}function yw(t,e,n){t.insertBefore(e,n)}function vw(t,e){t.removeChild(e)}function mw(t,e){t.appendChild(e)}function xw(t){return t.parentNode}function _w(t){return t.nextSibling}function bw(t,e){t.textContent=e}var ww=Hb("","");function Sw(t){return void 0===t}function Mw(t){return void 0!==t}function Iw(t,e,n){for(var i={},r=e;r<=n;++r){var o=t[r].key;void 0!==o&&(i[o]=r)}return i}function Tw(t,e){var n=t.key===e.key;return t.tag===e.tag&&n}function Cw(t){var e,n=t.children,i=t.tag;if(Mw(i)){var r=t.elm=Wb(i);if(kw(ww,t),Y(n))for(e=0;e<n.length;++e){var o=n[e];null!=o&&mw(r,Cw(o))}else Mw(t.text)&&!q(t.text)&&mw(r,gw(t.text))}else t.elm=gw(t.text);return t.elm}function Dw(t,e,n,i,r){for(;i<=r;++i){var o=n[i];null!=o&&yw(t,Cw(o),e)}}function Aw(t,e,n,i){for(;n<=i;++n){var r=e[n];if(null!=r)if(Mw(r.tag))vw(xw(r.elm),r.elm);else vw(t,r.elm)}}function kw(t,e){var n,i=e.elm,r=t&&t.attrs||{},o=e.attrs||{};if(r!==o){for(n in o){var a=o[n];r[n]!==a&&(!0===a?i.setAttribute(n,""):!1===a?i.removeAttribute(n):120!==n.charCodeAt(0)?i.setAttribute(n,a):"xmlns:xlink"===n||"xmlns"===n?i.setAttributeNS("http://www.w3.org/2000/xmlns/",n,a):58===n.charCodeAt(3)?i.setAttributeNS("http://www.w3.org/XML/1998/namespace",n,a):58===n.charCodeAt(5)?i.setAttributeNS(Gb,n,a):i.setAttribute(n,a))}for(n in r)n in o||i.removeAttribute(n)}}function Lw(t,e){var n=e.elm=t.elm,i=t.children,r=e.children;t!==e&&(kw(t,e),Sw(e.text)?Mw(i)&&Mw(r)?i!==r&&function(t,e,n){for(var i,r,o,a=0,s=0,l=e.length-1,u=e[0],h=e[l],c=n.length-1,p=n[0],d=n[c];a<=l&&s<=c;)null==u?u=e[++a]:null==h?h=e[--l]:null==p?p=n[++s]:null==d?d=n[--c]:Tw(u,p)?(Lw(u,p),u=e[++a],p=n[++s]):Tw(h,d)?(Lw(h,d),h=e[--l],d=n[--c]):Tw(u,d)?(Lw(u,d),yw(t,u.elm,_w(h.elm)),u=e[++a],d=n[--c]):Tw(h,p)?(Lw(h,p),yw(t,h.elm,u.elm),h=e[--l],p=n[++s]):(Sw(i)&&(i=Iw(e,a,l)),Sw(r=i[p.key])||(o=e[r]).tag!==p.tag?yw(t,Cw(p),u.elm):(Lw(o,p),e[r]=void 0,yw(t,o.elm,u.elm)),p=n[++s]);(a<=l||s<=c)&&(a>l?Dw(t,null==n[c+1]?null:n[c+1].elm,n,s,c):Aw(t,e,a,l))}(n,i,r):Mw(r)?(Mw(t.text)&&bw(n,""),Dw(n,null,r,0,r.length-1)):Mw(i)?Aw(n,i,0,i.length-1):Mw(t.text)&&bw(n,""):t.text!==e.text&&(Mw(i)&&Aw(n,i,0,i.length-1),bw(n,e.text)))}var Pw=0,Ow=function(){function t(t,e,n){if(this.type="svg",this.refreshHover=Rw("refreshHover"),this.configLayer=Rw("configLayer"),this.storage=e,this._opts=n=A({},n),this.root=t,this._id="zr"+Pw++,this._oldVNode=Xb(n.width,n.height),t&&!n.ssr){var i=this._viewport=document.createElement("div");i.style.cssText="position:relative;overflow:hidden";var r=this._svgDom=this._oldVNode.elm=Wb("svg");kw(null,this._oldVNode),i.appendChild(r),t.appendChild(i)}this.resize(n.width,n.height)}return t.prototype.getType=function(){return this.type},t.prototype.getViewportRoot=function(){return this._viewport},t.prototype.getViewportRootOffset=function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},t.prototype.getSvgDom=function(){return this._svgDom},t.prototype.refresh=function(){if(this.root){var t=this.renderToVNode({willUpdate:!0});t.attrs.style="position:absolute;left:0;top:0;user-select:none",function(t,e){if(Tw(t,e))Lw(t,e);else{var n=t.elm,i=xw(n);Cw(e),null!==i&&(yw(i,e.elm,_w(n)),Aw(i,[t],0,0))}}(this._oldVNode,t),this._oldVNode=t}},t.prototype.renderOneToVNode=function(t){return dw(t,Ub(this._id))},t.prototype.renderToVNode=function(t){t=t||{};var e=this.storage.getDisplayList(!0),n=this._backgroundColor,i=this._width,r=this._height,o=Ub(this._id);o.animation=t.animation,o.willUpdate=t.willUpdate,o.compress=t.compress;var a=[];if(n&&"none"!==n){var s=Rn(n),l=s.color,u=s.opacity;this._bgVNode=Hb("rect","bg",{width:i,height:r,x:"0",y:"0",id:"0",fill:l,"fill-opacity":u}),a.push(this._bgVNode)}else this._bgVNode=null;var h=t.compress?null:this._mainVNode=Hb("g","main",{},[]);this._paintList(e,o,h?h.children:a),h&&a.push(h);var c=z(G(o.defs),(function(t){return o.defs[t]}));if(c.length&&a.push(Hb("defs","defs",{},c)),t.animation){var p=function(t,e,n){var i=(n=n||{}).newline?"\n":"",r=" {"+i,o=i+"}",a=z(G(t),(function(e){return e+r+z(G(t[e]),(function(n){return n+":"+t[e][n]+";"})).join(i)+o})).join(i),s=z(G(e),(function(t){return"@keyframes "+t+r+z(G(e[t]),(function(n){return n+r+z(G(e[t][n]),(function(i){var r=e[t][n][i];return"d"===i&&(r='path("'+r+'")'),i+":"+r+";"})).join(i)+o})).join(i)+o})).join(i);return a||s?["<![CDATA[",a,s,"]]>"].join(i):""}(o.cssNodes,o.cssAnims,{newline:!0});if(p){var d=Hb("style","stl",{},[],p);a.push(d)}}return Xb(i,r,a,t.useViewBox)},t.prototype.renderToString=function(t){return t=t||{},Yb(this.renderToVNode({animation:rt(t.cssAnimation,!0),willUpdate:!1,compress:!0,useViewBox:rt(t.useViewBox,!0)}),{newline:!0})},t.prototype.setBackgroundColor=function(t){this._backgroundColor=t;var e=this._bgVNode;if(e&&e.elm){var n=Rn(t),i=n.color,r=n.opacity;e.elm.setAttribute("fill",i),r<1&&e.elm.setAttribute("fill-opacity",r)}},t.prototype.getSvgRoot=function(){return this._mainVNode&&this._mainVNode.elm},t.prototype._paintList=function(t,e,n){for(var i,r,o=t.length,a=[],s=0,l=0,u=0;u<o;u++){var h=t[u];if(!h.invisible){var c=h.__clipPaths,p=c&&c.length||0,d=r&&r.length||0,f=void 0;for(f=Math.max(p-1,d-1);f>=0&&(!c||!r||c[f]!==r[f]);f--);for(var g=d-1;g>f;g--)i=a[--s-1];for(var y=f+1;y<p;y++){var v={};fw(c[y],v,e);var m=Hb("g","clip-g-"+l++,v,[]);(i?i.children:n).push(m),a[s++]=m,i=m}r=c;var x=dw(h,e);x&&(i?i.children:n).push(x)}}},t.prototype.resize=function(t,e){var n=this._opts,i=this.root,r=this._viewport;if(null!=t&&(n.width=t),null!=e&&(n.height=e),i&&r&&(r.style.display="none",t=zy(i,0,n),e=zy(i,1,n),r.style.display=""),this._width!==t||this._height!==e){if(this._width=t,this._height=e,r){var o=r.style;o.width=t+"px",o.height=e+"px"}var a=this._svgDom;a&&(a.setAttribute("width",t),a.setAttribute("height",e))}},t.prototype.getWidth=function(){return this._width},t.prototype.getHeight=function(){return this._height},t.prototype.dispose=function(){this.root&&(this.root.innerHTML=""),this._svgDom=this._viewport=this.storage=this._oldVNode=this._bgVNode=this._mainVNode=null},t.prototype.clear=function(){this._svgDom&&(this._svgDom.innerHTML=null),this._oldVNode=null},t.prototype.toDataURL=function(t){var e=encodeURIComponent(this.renderToString()),n="data:image/svg+xml;";return t?(e=Xn(e))&&n+"base64,"+e:n+"charset=UTF-8,"+e},t}();function Rw(t){return function(){0}}function Nw(t,e,n){var i=h.createCanvas(),r=e.getWidth(),o=e.getHeight(),a=i.style;return a&&(a.position="absolute",a.left="0",a.top="0",a.width=r+"px",a.height=o+"px",i.setAttribute("data-zr-dom-id",t)),i.width=r*n,i.height=o*n,i}var Ew=function(t){function e(e,n,i){var r,o=t.call(this)||this;o.motionBlur=!1,o.lastFrameAlpha=.7,o.dpr=1,o.virtual=!1,o.config={},o.incremental=!1,o.zlevel=0,o.maxRepaintRectCount=5,o.__dirty=!0,o.__firstTimePaint=!0,o.__used=!1,o.__drawIndex=0,o.__startIndex=0,o.__endIndex=0,o.__prevStartIndex=null,o.__prevEndIndex=null,i=i||Ai,"string"==typeof e?r=Nw(e,n,i):q(e)&&(e=(r=e).id),o.id=e,o.dom=r;var a=r.style;return a&&(vt(r),r.onselectstart=function(){return!1},a.padding="0",a.margin="0",a.borderWidth="0"),o.painter=n,o.dpr=i,o}return n(e,t),e.prototype.getElementCount=function(){return this.__endIndex-this.__startIndex},e.prototype.afterBrush=function(){this.__prevStartIndex=this.__startIndex,this.__prevEndIndex=this.__endIndex},e.prototype.initContext=function(){this.ctx=this.dom.getContext("2d"),this.ctx.dpr=this.dpr},e.prototype.setUnpainted=function(){this.__firstTimePaint=!0},e.prototype.createBackBuffer=function(){var t=this.dpr;this.domBack=Nw("back-"+this.id,this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!==t&&this.ctxBack.scale(t,t)},e.prototype.createRepaintRects=function(t,e,n,i){if(this.__firstTimePaint)return this.__firstTimePaint=!1,null;var r,o=[],a=this.maxRepaintRectCount,s=!1,l=new sr(0,0,0,0);function u(t){if(t.isFinite()&&!t.isZero())if(0===o.length){(e=new sr(0,0,0,0)).copy(t),o.push(e)}else{for(var e,n=!1,i=1/0,r=0,u=0;u<o.length;++u){var h=o[u];if(h.intersect(t)){var c=new sr(0,0,0,0);c.copy(h),c.union(t),o[u]=c,n=!0;break}if(s){l.copy(t),l.union(h);var p=t.width*t.height,d=h.width*h.height,f=l.width*l.height-p-d;f<i&&(i=f,r=u)}}if(s&&(o[r].union(t),n=!0),!n)(e=new sr(0,0,0,0)).copy(t),o.push(e);s||(s=o.length>=a)}}for(var h=this.__startIndex;h<this.__endIndex;++h){if(d=t[h]){var c=d.shouldBePainted(n,i,!0,!0);(f=d.__isRendered&&(1&d.__dirty||!c)?d.getPrevPaintRect():null)&&u(f);var p=c&&(1&d.__dirty||!d.__isRendered)?d.getPaintRect():null;p&&u(p)}}for(h=this.__prevStartIndex;h<this.__prevEndIndex;++h){var d,f;c=(d=e[h]).shouldBePainted(n,i,!0,!0);if(d&&(!c||!d.__zr)&&d.__isRendered)(f=d.getPrevPaintRect())&&u(f)}do{r=!1;for(h=0;h<o.length;)if(o[h].isZero())o.splice(h,1);else{for(var g=h+1;g<o.length;)o[h].intersect(o[g])?(r=!0,o[h].union(o[g]),o.splice(g,1)):g++;h++}}while(r);return this._paintRects=o,o},e.prototype.debugGetPaintRects=function(){return(this._paintRects||[]).slice()},e.prototype.resize=function(t,e){var n=this.dpr,i=this.dom,r=i.style,o=this.domBack;r&&(r.width=t+"px",r.height=e+"px"),i.width=t*n,i.height=e*n,o&&(o.width=t*n,o.height=e*n,1!==n&&this.ctxBack.scale(n,n))},e.prototype.clear=function(t,e,n){var i=this.dom,r=this.ctx,o=i.width,a=i.height;e=e||this.clearColor;var s=this.motionBlur&&!t,l=this.lastFrameAlpha,u=this.dpr,h=this;s&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(i,0,0,o/u,a/u));var c=this.domBack;function p(t,n,i,o){if(r.clearRect(t,n,i,o),e&&"transparent"!==e){var a=void 0;Q(e)?(a=e.__canvasGradient||Ny(r,e,{x:0,y:0,width:i,height:o}),e.__canvasGradient=a):tt(e)&&(a=Uy(r,e,{dirty:function(){h.setUnpainted(),h.__painter.refresh()}})),r.save(),r.fillStyle=a||e,r.fillRect(t,n,i,o),r.restore()}s&&(r.save(),r.globalAlpha=l,r.drawImage(c,t,n,i,o),r.restore())}!n||s?p(0,0,o,a):n.length&&E(n,(function(t){p(t.x*u,t.y*u,t.width*u,t.height*u)}))},e}(Xt),zw=1e5,Vw=314159,Bw=.01;var Fw=function(){function t(t,e,n,i){this.type="canvas",this._zlevelList=[],this._prevDisplayList=[],this._layers={},this._layerConfig={},this._needsManuallyCompositing=!1,this.type="canvas";var r=!t.nodeName||"CANVAS"===t.nodeName.toUpperCase();this._opts=n=A({},n||{}),this.dpr=n.devicePixelRatio||Ai,this._singleCanvas=r,this.root=t,t.style&&(vt(t),t.innerHTML=""),this.storage=e;var o=this._zlevelList;this._prevDisplayList=[];var a=this._layers;if(r){var s=t,l=s.width,u=s.height;null!=n.width&&(l=n.width),null!=n.height&&(u=n.height),this.dpr=n.devicePixelRatio||1,s.width=l*this.dpr,s.height=u*this.dpr,this._width=l,this._height=u;var h=new Ew(s,this,this.dpr);h.__builtin__=!0,h.initContext(),a[314159]=h,h.zlevel=Vw,o.push(Vw),this._domRoot=t}else{this._width=zy(t,0,n),this._height=zy(t,1,n);var c=this._domRoot=function(t,e){var n=document.createElement("div");return n.style.cssText=["position:relative","width:"+t+"px","height:"+e+"px","padding:0","margin:0","border-width:0"].join(";")+";",n}(this._width,this._height);t.appendChild(c)}}return t.prototype.getType=function(){return"canvas"},t.prototype.isSingleCanvas=function(){return this._singleCanvas},t.prototype.getViewportRoot=function(){return this._domRoot},t.prototype.getViewportRootOffset=function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},t.prototype.refresh=function(t){var e=this.storage.getDisplayList(!0),n=this._prevDisplayList,i=this._zlevelList;this._redrawId=Math.random(),this._paintList(e,n,t,this._redrawId);for(var r=0;r<i.length;r++){var o=i[r],a=this._layers[o];if(!a.__builtin__&&a.refresh){var s=0===r?this._backgroundColor:null;a.refresh(s)}}return this._opts.useDirtyRect&&(this._prevDisplayList=e.slice()),this},t.prototype.refreshHover=function(){this._paintHoverList(this.storage.getDisplayList(!1))},t.prototype._paintHoverList=function(t){var e=t.length,n=this._hoverlayer;if(n&&n.clear(),e){for(var i,r={inHover:!0,viewWidth:this._width,viewHeight:this._height},o=0;o<e;o++){var a=t[o];a.__inHover&&(n||(n=this._hoverlayer=this.getLayer(zw)),i||(i=n.ctx).save(),tv(i,a,r,o===e-1))}i&&i.restore()}},t.prototype.getHoverLayer=function(){return this.getLayer(zw)},t.prototype.paintOne=function(t,e){Qy(t,e)},t.prototype._paintList=function(t,e,n,i){if(this._redrawId===i){n=n||!1,this._updateLayerStatus(t);var r=this._doPaintList(t,e,n),o=r.finished,a=r.needsRefreshHover;if(this._needsManuallyCompositing&&this._compositeManually(),a&&this._paintHoverList(t),o)this.eachLayer((function(t){t.afterBrush&&t.afterBrush()}));else{var s=this;ke((function(){s._paintList(t,e,n,i)}))}}},t.prototype._compositeManually=function(){var t=this.getLayer(Vw).ctx,e=this._domRoot.width,n=this._domRoot.height;t.clearRect(0,0,e,n),this.eachBuiltinLayer((function(i){i.virtual&&t.drawImage(i.dom,0,0,e,n)}))},t.prototype._doPaintList=function(t,e,n){for(var i=this,o=[],a=this._opts.useDirtyRect,s=0;s<this._zlevelList.length;s++){var l=this._zlevelList[s],u=this._layers[l];u.__builtin__&&u!==this._hoverlayer&&(u.__dirty||n)&&o.push(u)}for(var h=!0,c=!1,p=function(r){var s,l=o[r],u=l.ctx,p=a&&l.createRepaintRects(t,e,d._width,d._height),f=n?l.__startIndex:l.__drawIndex,g=!n&&l.incremental&&Date.now,y=g&&Date.now(),v=l.zlevel===d._zlevelList[0]?d._backgroundColor:null;if(l.__startIndex===l.__endIndex)l.clear(!1,v,p);else if(f===l.__startIndex){var m=t[f];m.incremental&&m.notClear&&!n||l.clear(!1,v,p)}-1===f&&(console.error("For some unknown reason. drawIndex is -1"),f=l.__startIndex);var x=function(e){var n={inHover:!1,allClipped:!1,prevEl:null,viewWidth:i._width,viewHeight:i._height};for(s=f;s<l.__endIndex;s++){var r=t[s];if(r.__inHover&&(c=!0),i._doPaintEl(r,l,a,e,n,s===l.__endIndex-1),g)if(Date.now()-y>15)break}n.prevElClipPaths&&u.restore()};if(p)if(0===p.length)s=l.__endIndex;else for(var _=d.dpr,b=0;b<p.length;++b){var w=p[b];u.save(),u.beginPath(),u.rect(w.x*_,w.y*_,w.width*_,w.height*_),u.clip(),x(w),u.restore()}else u.save(),x(),u.restore();l.__drawIndex=s,l.__drawIndex<l.__endIndex&&(h=!1)},d=this,f=0;f<o.length;f++)p(f);return r.wxa&&E(this._layers,(function(t){t&&t.ctx&&t.ctx.draw&&t.ctx.draw()})),{finished:h,needsRefreshHover:c}},t.prototype._doPaintEl=function(t,e,n,i,r,o){var a=e.ctx;if(n){var s=t.getPaintRect();(!i||s&&s.intersect(i))&&(tv(a,t,r,o),t.setPrevPaintRect(s))}else tv(a,t,r,o)},t.prototype.getLayer=function(t,e){this._singleCanvas&&!this._needsManuallyCompositing&&(t=Vw);var n=this._layers[t];return n||((n=new Ew("zr_"+t,this,this.dpr)).zlevel=t,n.__builtin__=!0,this._layerConfig[t]?C(n,this._layerConfig[t],!0):this._layerConfig[t-Bw]&&C(n,this._layerConfig[t-Bw],!0),e&&(n.virtual=e),this.insertLayer(t,n),n.initContext()),n},t.prototype.insertLayer=function(t,e){var n=this._layers,i=this._zlevelList,r=i.length,o=this._domRoot,a=null,s=-1;if(!n[t]&&function(t){return!!t&&(!!t.__builtin__||"function"==typeof t.resize&&"function"==typeof t.refresh)}(e)){if(r>0&&t>i[0]){for(s=0;s<r-1&&!(i[s]<t&&i[s+1]>t);s++);a=n[i[s]]}if(i.splice(s+1,0,t),n[t]=e,!e.virtual)if(a){var l=a.dom;l.nextSibling?o.insertBefore(e.dom,l.nextSibling):o.appendChild(e.dom)}else o.firstChild?o.insertBefore(e.dom,o.firstChild):o.appendChild(e.dom);e.__painter=this}},t.prototype.eachLayer=function(t,e){for(var n=this._zlevelList,i=0;i<n.length;i++){var r=n[i];t.call(e,this._layers[r],r)}},t.prototype.eachBuiltinLayer=function(t,e){for(var n=this._zlevelList,i=0;i<n.length;i++){var r=n[i],o=this._layers[r];o.__builtin__&&t.call(e,o,r)}},t.prototype.eachOtherLayer=function(t,e){for(var n=this._zlevelList,i=0;i<n.length;i++){var r=n[i],o=this._layers[r];o.__builtin__||t.call(e,o,r)}},t.prototype.getLayers=function(){return this._layers},t.prototype._updateLayerStatus=function(t){function e(t){o&&(o.__endIndex!==t&&(o.__dirty=!0),o.__endIndex=t)}if(this.eachBuiltinLayer((function(t,e){t.__dirty=t.__used=!1})),this._singleCanvas)for(var n=1;n<t.length;n++){if((s=t[n]).zlevel!==t[n-1].zlevel||s.incremental){this._needsManuallyCompositing=!0;break}}var i,r,o=null,a=0;for(r=0;r<t.length;r++){var s,l=(s=t[r]).zlevel,u=void 0;i!==l&&(i=l,a=0),s.incremental?((u=this.getLayer(l+.001,this._needsManuallyCompositing)).incremental=!0,a=1):u=this.getLayer(l+(a>0?Bw:0),this._needsManuallyCompositing),u.__builtin__||I("ZLevel "+l+" has been used by unkown layer "+u.id),u!==o&&(u.__used=!0,u.__startIndex!==r&&(u.__dirty=!0),u.__startIndex=r,u.incremental?u.__drawIndex=-1:u.__drawIndex=r,e(r),o=u),1&s.__dirty&&!s.__inHover&&(u.__dirty=!0,u.incremental&&u.__drawIndex<0&&(u.__drawIndex=r))}e(r),this.eachBuiltinLayer((function(t,e){!t.__used&&t.getElementCount()>0&&(t.__dirty=!0,t.__startIndex=t.__endIndex=t.__drawIndex=0),t.__dirty&&t.__drawIndex<0&&(t.__drawIndex=t.__startIndex)}))},t.prototype.clear=function(){return this.eachBuiltinLayer(this._clearLayer),this},t.prototype._clearLayer=function(t){t.clear()},t.prototype.setBackgroundColor=function(t){this._backgroundColor=t,E(this._layers,(function(t){t.setUnpainted()}))},t.prototype.configLayer=function(t,e){if(e){var n=this._layerConfig;n[t]?C(n[t],e,!0):n[t]=e;for(var i=0;i<this._zlevelList.length;i++){var r=this._zlevelList[i];if(r===t||r===t+Bw)C(this._layers[r],n[t],!0)}}},t.prototype.delLayer=function(t){var e=this._layers,n=this._zlevelList,i=e[t];i&&(i.dom.parentNode.removeChild(i.dom),delete e[t],n.splice(P(n,t),1))},t.prototype.resize=function(t,e){if(this._domRoot.style){var n=this._domRoot;n.style.display="none";var i=this._opts,r=this.root;if(null!=t&&(i.width=t),null!=e&&(i.height=e),t=zy(r,0,i),e=zy(r,1,i),n.style.display="",this._width!==t||e!==this._height){for(var o in n.style.width=t+"px",n.style.height=e+"px",this._layers)this._layers.hasOwnProperty(o)&&this._layers[o].resize(t,e);this.refresh(!0)}this._width=t,this._height=e}else{if(null==t||null==e)return;this._width=t,this._height=e,this.getLayer(Vw).resize(t,e)}return this},t.prototype.clearLayer=function(t){var e=this._layers[t];e&&e.clear()},t.prototype.dispose=function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},t.prototype.getRenderedCanvas=function(t){if(t=t||{},this._singleCanvas&&!this._compositeManually)return this._layers[314159].dom;var e=new Ew("image",this,t.pixelRatio||this.dpr);e.initContext(),e.clear(!1,t.backgroundColor||this._backgroundColor);var n=e.ctx;if(t.pixelRatio<=this.dpr){this.refresh();var i=e.dom.width,r=e.dom.height;this.eachLayer((function(t){t.__builtin__?n.drawImage(t.dom,0,0,i,r):t.renderToCanvas&&(n.save(),t.renderToCanvas(n),n.restore())}))}else for(var o={inHover:!1,viewWidth:this._width,viewHeight:this._height},a=this.storage.getDisplayList(!0),s=0,l=a.length;s<l;s++){var u=a[s];tv(n,u,o,s===l-1)}return e.dom},t.prototype.getWidth=function(){return this._width},t.prototype.getHeight=function(){return this._height},t}();var Gw=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.getInitialData=function(t){return rx(null,this,{useEncodeDefaulter:!0})},e.prototype.getLegendIcon=function(t){var e=new Cr,n=Ly("line",0,t.itemHeight/2,t.itemWidth,0,t.lineStyle.stroke,!1);e.add(n),n.setStyle(t.lineStyle);var i=this.getData().getVisual("symbol"),r=this.getData().getVisual("symbolRotate"),o="none"===i?"circle":i,a=.8*t.itemHeight,s=Ly(o,(t.itemWidth-a)/2,(t.itemHeight-a)/2,a,a,t.itemStyle.fill);e.add(s),s.setStyle(t.itemStyle);var l="inherit"===t.iconRotate?r:t.iconRotate||0;return s.rotation=l*Math.PI/180,s.setOrigin([t.itemWidth/2,t.itemHeight/2]),o.indexOf("empty")>-1&&(s.style.stroke=s.style.fill,s.style.fill="#fff",s.style.lineWidth=2),e},e.type="series.line",e.dependencies=["grid","polar"],e.defaultOption={z:3,coordinateSystem:"cartesian2d",legendHoverLink:!0,clip:!0,label:{position:"top"},endLabel:{show:!1,valueAnimation:!0,distance:8},lineStyle:{width:2,type:"solid"},emphasis:{scale:!0},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:"auto",connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0,universalTransition:{divideShape:"clone"},triggerLineEvent:!1},e}(sg);function Ww(t,e){var n=t.mapDimensionsAll("defaultedLabel"),i=n.length;if(1===i){var r=af(t,e,n[0]);return null!=r?r+"":null}if(i){for(var o=[],a=0;a<n.length;a++)o.push(af(t,e,n[a]));return o.join(" ")}}function Hw(t,e){var n=t.mapDimensionsAll("defaultedLabel");if(!Y(e))return e+"";for(var i=[],r=0;r<n.length;r++){var o=t.getDimensionIndex(n[r]);o>=0&&i.push(e[o])}return i.join(" ")}var Yw=function(t){function e(e,n,i,r){var o=t.call(this)||this;return o.updateData(e,n,i,r),o}return n(e,t),e.prototype._createSymbol=function(t,e,n,i,r){this.removeAll();var o=Ly(t,-1,-1,2,2,null,r);o.attr({z2:100,culling:!0,scaleX:i[0]/2,scaleY:i[1]/2}),o.drift=Uw,this._symbolType=t,this.add(o)},e.prototype.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(null,t)},e.prototype.getSymbolType=function(){return this._symbolType},e.prototype.getSymbolPath=function(){return this.childAt(0)},e.prototype.highlight=function(){_l(this.childAt(0))},e.prototype.downplay=function(){bl(this.childAt(0))},e.prototype.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},e.prototype.setDraggable=function(t,e){var n=this.childAt(0);n.draggable=t,n.cursor=!e&&t?"move":n.cursor},e.prototype.updateData=function(t,n,i,r){this.silent=!1;var o=t.getItemVisual(n,"symbol")||"circle",a=t.hostModel,s=e.getSymbolSize(t,n),l=o!==this._symbolType,u=r&&r.disableAnimation;if(l){var h=t.getItemVisual(n,"symbolKeepAspect");this._createSymbol(o,t,n,s,h)}else{(p=this.childAt(0)).silent=!1;var c={scaleX:s[0]/2,scaleY:s[1]/2};u?p.attr(c):rh(p,c,a,n),hh(p)}if(this._updateCommon(t,n,s,i,r),l){var p=this.childAt(0);if(!u){c={scaleX:this._sizeX,scaleY:this._sizeY,style:{opacity:p.style.opacity}};p.scaleX=p.scaleY=0,p.style.opacity=0,oh(p,c,a,n)}}u&&this.childAt(0).stopAnimation("leave")},e.prototype._updateCommon=function(t,e,n,i,r){var o,a,s,l,u,h,c,p,d,f=this.childAt(0),g=t.hostModel;if(i&&(o=i.emphasisItemStyle,a=i.blurItemStyle,s=i.selectItemStyle,l=i.focus,u=i.blurScope,c=i.labelStatesModels,p=i.hoverScale,d=i.cursorStyle,h=i.emphasisDisabled),!i||t.hasItemOption){var y=i&&i.itemModel?i.itemModel:t.getItemModel(e),v=y.getModel("emphasis");o=v.getModel("itemStyle").getItemStyle(),s=y.getModel(["select","itemStyle"]).getItemStyle(),a=y.getModel(["blur","itemStyle"]).getItemStyle(),l=v.get("focus"),u=v.get("blurScope"),h=v.get("disabled"),c=Yh(y),p=v.getShallow("scale"),d=y.getShallow("cursor")}var m=t.getItemVisual(e,"symbolRotate");f.attr("rotation",(m||0)*Math.PI/180||0);var x=Oy(t.getItemVisual(e,"symbolOffset"),n);x&&(f.x=x[0],f.y=x[1]),d&&f.attr("cursor",d);var _=t.getItemVisual(e,"style"),b=_.fill;if(f instanceof _s){var w=f.style;f.useStyle(A({image:w.image,x:w.x,y:w.y,width:w.width,height:w.height},_))}else f.__isEmptyBrush?f.useStyle(A({},_)):f.useStyle(_),f.style.decal=null,f.setColor(b,r&&r.symbolInnerColor),f.style.strokeNoScale=!0;var S=t.getItemVisual(e,"liftZ"),M=this._z2;null!=S?null==M&&(this._z2=f.z2,f.z2+=S):null!=M&&(f.z2=M,this._z2=null);var I=r&&r.useNameLabel;Hh(f,c,{labelFetcher:g,labelDataIndex:e,defaultText:function(e){return I?t.getName(e):Ww(t,e)},inheritColor:b,defaultOpacity:_.opacity}),this._sizeX=n[0]/2,this._sizeY=n[1]/2;var T=f.ensureState("emphasis");if(T.style=o,f.ensureState("select").style=s,f.ensureState("blur").style=a,p){var C=Math.max(j(p)?p:1.1,3/this._sizeY);T.scaleX=this._sizeX*C,T.scaleY=this._sizeY*C}this.setSymbolScale(1),Rl(this,l,u,h)},e.prototype.setSymbolScale=function(t){this.scaleX=this.scaleY=t},e.prototype.fadeOut=function(t,e,n){var i=this.childAt(0),r=Hs(this).dataIndex,o=n&&n.animation;if(this.silent=i.silent=!0,n&&n.fadeLabel){var a=i.getTextContent();a&&sh(a,{style:{opacity:0}},e,{dataIndex:r,removeOpt:o,cb:function(){i.removeTextContent()}})}else i.removeTextContent();sh(i,{style:{opacity:0},scaleX:0,scaleY:0},e,{dataIndex:r,cb:t,removeOpt:o})},e.getSymbolSize=function(t,e){return Py(t.getItemVisual(e,"symbolSize"))},e}(Cr);function Uw(t,e){this.parent.drift(t,e)}function Xw(t,e,n,i){return e&&!isNaN(e[0])&&!isNaN(e[1])&&!(i.isIgnore&&i.isIgnore(n))&&!(i.clipShape&&!i.clipShape.contain(e[0],e[1]))&&"none"!==t.getItemVisual(n,"symbol")}function Zw(t){return null==t||q(t)||(t={isIgnore:t}),t||{}}function jw(t){var e=t.hostModel,n=e.getModel("emphasis");return{emphasisItemStyle:n.getModel("itemStyle").getItemStyle(),blurItemStyle:e.getModel(["blur","itemStyle"]).getItemStyle(),selectItemStyle:e.getModel(["select","itemStyle"]).getItemStyle(),focus:n.get("focus"),blurScope:n.get("blurScope"),emphasisDisabled:n.get("disabled"),hoverScale:n.get("scale"),labelStatesModels:Yh(e),cursorStyle:e.get("cursor")}}var qw=function(){function t(t){this.group=new Cr,this._SymbolCtor=t||Yw}return t.prototype.updateData=function(t,e){this._progressiveEls=null,e=Zw(e);var n=this.group,i=t.hostModel,r=this._data,o=this._SymbolCtor,a=e.disableAnimation,s=jw(t),l={disableAnimation:a},u=e.getSymbolPoint||function(e){return t.getItemLayout(e)};r||n.removeAll(),t.diff(r).add((function(i){var r=u(i);if(Xw(t,r,i,e)){var a=new o(t,i,s,l);a.setPosition(r),t.setItemGraphicEl(i,a),n.add(a)}})).update((function(h,c){var p=r.getItemGraphicEl(c),d=u(h);if(Xw(t,d,h,e)){var f=t.getItemVisual(h,"symbol")||"circle",g=p&&p.getSymbolType&&p.getSymbolType();if(!p||g&&g!==f)n.remove(p),(p=new o(t,h,s,l)).setPosition(d);else{p.updateData(t,h,s,l);var y={x:d[0],y:d[1]};a?p.attr(y):rh(p,y,i)}n.add(p),t.setItemGraphicEl(h,p)}else n.remove(p)})).remove((function(t){var e=r.getItemGraphicEl(t);e&&e.fadeOut((function(){n.remove(e)}),i)})).execute(),this._getSymbolPoint=u,this._data=t},t.prototype.updateLayout=function(){var t=this,e=this._data;e&&e.eachItemGraphicEl((function(e,n){var i=t._getSymbolPoint(n);e.setPosition(i),e.markRedraw()}))},t.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=jw(t),this._data=null,this.group.removeAll()},t.prototype.incrementalUpdate=function(t,e,n){function i(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}this._progressiveEls=[],n=Zw(n);for(var r=t.start;r<t.end;r++){var o=e.getItemLayout(r);if(Xw(e,o,r,n)){var a=new this._SymbolCtor(e,r,this._seriesScope);a.traverse(i),a.setPosition(o),this.group.add(a),e.setItemGraphicEl(r,a),this._progressiveEls.push(a)}}},t.prototype.eachRendered=function(t){Vh(this._progressiveEls||this.group,t)},t.prototype.remove=function(t){var e=this.group,n=this._data;n&&t?n.eachItemGraphicEl((function(t){t.fadeOut((function(){e.remove(t)}),n.hostModel)})):e.removeAll()},t}();function Kw(t,e,n){var i=t.getBaseAxis(),r=t.getOtherAxis(i),o=function(t,e){var n=0,i=t.scale.getExtent();"start"===e?n=i[0]:"end"===e?n=i[1]:j(e)&&!isNaN(e)?n=e:i[0]>0?n=i[0]:i[1]<0&&(n=i[1]);return n}(r,n),a=i.dim,s=r.dim,l=e.mapDimension(s),u=e.mapDimension(a),h="x"===s||"radius"===s?1:0,c=z(t.dimensions,(function(t){return e.mapDimension(t)})),p=!1,d=e.getCalculationInfo("stackResultDimension");return nx(e,c[0])&&(p=!0,c[0]=d),nx(e,c[1])&&(p=!0,c[1]=d),{dataDimsForPoint:c,valueStart:o,valueAxisDim:s,baseAxisDim:a,stacked:!!p,valueDim:l,baseDim:u,baseDataOffset:h,stackedOverDimension:e.getCalculationInfo("stackedOverDimension")}}function $w(t,e,n,i){var r=NaN;t.stacked&&(r=n.get(n.getCalculationInfo("stackedOverDimension"),i)),isNaN(r)&&(r=t.valueStart);var o=t.baseDataOffset,a=[];return a[o]=n.get(t.baseDim,i),a[1-o]=r,e.dataToPoint(a)}var Jw=Math.min,Qw=Math.max;function tS(t,e){return isNaN(t)||isNaN(e)}function eS(t,e,n,i,r,o,a,s,l){for(var u,h,c,p,d,f,g=n,y=0;y<i;y++){var v=e[2*g],m=e[2*g+1];if(g>=r||g<0)break;if(tS(v,m)){if(l){g+=o;continue}break}if(g===n)t[o>0?"moveTo":"lineTo"](v,m),c=v,p=m;else{var x=v-u,_=m-h;if(x*x+_*_<.5){g+=o;continue}if(a>0){for(var b=g+o,w=e[2*b],S=e[2*b+1];w===v&&S===m&&y<i;)y++,g+=o,w=e[2*(b+=o)],S=e[2*b+1],x=(v=e[2*g])-u,_=(m=e[2*g+1])-h;var M=y+1;if(l)for(;tS(w,S)&&M<i;)M++,w=e[2*(b+=o)],S=e[2*b+1];var I=.5,T=0,C=0,D=void 0,A=void 0;if(M>=i||tS(w,S))d=v,f=m;else{T=w-u,C=S-h;var k=v-u,L=w-v,P=m-h,O=S-m,R=void 0,N=void 0;if("x"===s){var E=T>0?1:-1;d=v-E*(R=Math.abs(k))*a,f=m,D=v+E*(N=Math.abs(L))*a,A=m}else if("y"===s){var z=C>0?1:-1;d=v,f=m-z*(R=Math.abs(P))*a,D=v,A=m+z*(N=Math.abs(O))*a}else R=Math.sqrt(k*k+P*P),d=v-T*a*(1-(I=(N=Math.sqrt(L*L+O*O))/(N+R))),f=m-C*a*(1-I),A=m+C*a*I,D=Jw(D=v+T*a*I,Qw(w,v)),A=Jw(A,Qw(S,m)),D=Qw(D,Jw(w,v)),f=m-(C=(A=Qw(A,Jw(S,m)))-m)*R/N,d=Jw(d=v-(T=D-v)*R/N,Qw(u,v)),f=Jw(f,Qw(h,m)),D=v+(T=v-(d=Qw(d,Jw(u,v))))*N/R,A=m+(C=m-(f=Qw(f,Jw(h,m))))*N/R}t.bezierCurveTo(c,p,d,f,v,m),c=D,p=A}else t.lineTo(v,m)}u=v,h=m,g+=o}return y}var nS=function(){this.smooth=0,this.smoothConstraint=!0},iS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-polyline",n}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new nS},e.prototype.buildPath=function(t,e){var n=e.points,i=0,r=n.length/2;if(e.connectNulls){for(;r>0&&tS(n[2*r-2],n[2*r-1]);r--);for(;i<r&&tS(n[2*i],n[2*i+1]);i++);}for(;i<r;)i+=eS(t,n,i,r,r,1,e.smooth,e.smoothMonotone,e.connectNulls)+1},e.prototype.getPointOn=function(t,e){this.path||(this.createPathProxy(),this.buildPath(this.path,this.shape));for(var n,i,r=this.path.data,o=qa.CMD,a="x"===e,s=[],l=0;l<r.length;){var u=void 0,h=void 0,c=void 0,p=void 0,d=void 0,f=void 0,g=void 0;switch(r[l++]){case o.M:n=r[l++],i=r[l++];break;case o.L:if(u=r[l++],h=r[l++],(g=a?(t-n)/(u-n):(t-i)/(h-i))<=1&&g>=0){var y=a?(h-i)*g+i:(u-n)*g+n;return a?[t,y]:[y,t]}n=u,i=h;break;case o.C:u=r[l++],h=r[l++],c=r[l++],p=r[l++],d=r[l++],f=r[l++];var v=a?Ue(n,u,c,d,t,s):Ue(i,h,p,f,t,s);if(v>0)for(var m=0;m<v;m++){var x=s[m];if(x<=1&&x>=0){y=a?He(i,h,p,f,x):He(n,u,c,d,x);return a?[t,y]:[y,t]}}n=d,i=f}}},e}(gs),rS=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e}(nS),oS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-polygon",n}return n(e,t),e.prototype.getDefaultShape=function(){return new rS},e.prototype.buildPath=function(t,e){var n=e.points,i=e.stackedOnPoints,r=0,o=n.length/2,a=e.smoothMonotone;if(e.connectNulls){for(;o>0&&tS(n[2*o-2],n[2*o-1]);o--);for(;r<o&&tS(n[2*r],n[2*r+1]);r++);}for(;r<o;){var s=eS(t,n,r,o,o,1,e.smooth,a,e.connectNulls);eS(t,i,r+s-1,s,o,-1,e.stackedOnSmooth,a,e.connectNulls),r+=s+1,t.closePath()}},e}(gs);function aS(t,e,n,i,r){var o=t.getArea(),a=o.x,s=o.y,l=o.width,u=o.height,h=n.get(["lineStyle","width"])||2;a-=h/2,s-=h/2,l+=h,u+=h,a=Math.floor(a),l=Math.round(l);var c=new Cs({shape:{x:a,y:s,width:l,height:u}});if(e){var p=t.getBaseAxis(),d=p.isHorizontal(),f=p.inverse;d?(f&&(c.shape.x+=l),c.shape.width=0):(f||(c.shape.y+=u),c.shape.height=0);var g=U(r)?function(t){r(t,c)}:null;oh(c,{shape:{width:l,height:u,x:a,y:s}},n,null,i,g)}return c}function sS(t,e,n){var i=t.getArea(),r=zr(i.r0,1),o=zr(i.r,1),a=new Cu({shape:{cx:zr(t.cx,1),cy:zr(t.cy,1),r0:r,r:o,startAngle:i.startAngle,endAngle:i.endAngle,clockwise:i.clockwise}});e&&("angle"===t.getBaseAxis().dim?a.shape.endAngle=i.startAngle:a.shape.r=r,oh(a,{shape:{endAngle:i.endAngle,r:o}},n));return a}function lS(t,e,n,i,r){return t?"polar"===t.type?sS(t,e,n):"cartesian2d"===t.type?aS(t,e,n,i,r):null:null}function uS(t,e){return t.type===e}function hS(t,e){if(t.length===e.length){for(var n=0;n<t.length;n++)if(t[n]!==e[n])return;return!0}}function cS(t){for(var e=1/0,n=1/0,i=-1/0,r=-1/0,o=0;o<t.length;){var a=t[o++],s=t[o++];isNaN(a)||(e=Math.min(a,e),i=Math.max(a,i)),isNaN(s)||(n=Math.min(s,n),r=Math.max(s,r))}return[[e,n],[i,r]]}function pS(t,e){var n=cS(t),i=n[0],r=n[1],o=cS(e),a=o[0],s=o[1];return Math.max(Math.abs(i[0]-a[0]),Math.abs(i[1]-a[1]),Math.abs(r[0]-s[0]),Math.abs(r[1]-s[1]))}function dS(t){return j(t)?t:t?.5:0}function fS(t,e,n,i){var r=e.getBaseAxis(),o="x"===r.dim||"radius"===r.dim?0:1,a=[],s=0,l=[],u=[],h=[],c=[];if(i){for(s=0;s<t.length;s+=2)isNaN(t[s])||isNaN(t[s+1])||c.push(t[s],t[s+1]);t=c}for(s=0;s<t.length-2;s+=2)switch(h[0]=t[s+2],h[1]=t[s+3],u[0]=t[s],u[1]=t[s+1],a.push(u[0],u[1]),n){case"end":l[o]=h[o],l[1-o]=u[1-o],a.push(l[0],l[1]);break;case"middle":var p=(u[o]+h[o])/2,d=[];l[o]=d[o]=p,l[1-o]=u[1-o],d[1-o]=h[1-o],a.push(l[0],l[1]),a.push(d[0],d[1]);break;default:l[o]=u[o],l[1-o]=h[1-o],a.push(l[0],l[1])}return a.push(t[s++],t[s++]),a}function gS(t,e,n){var i=t.getVisual("visualMeta");if(i&&i.length&&t.count()&&"cartesian2d"===e.type){for(var r,o,a=i.length-1;a>=0;a--){var s=t.getDimensionInfo(i[a].dimension);if("x"===(r=s&&s.coordDim)||"y"===r){o=i[a];break}}if(o){var l=e.getAxis(r),u=z(o.stops,(function(t){return{coord:l.toGlobalCoord(l.dataToCoord(t.value)),color:t.color}})),h=u.length,c=o.outerColors.slice();h&&u[0].coord>u[h-1].coord&&(u.reverse(),c.reverse());var p=function(t,e){var n,i,r=[],o=t.length;function a(t,e,n){var i=t.coord;return{coord:n,color:Tn((n-i)/(e.coord-i),[t.color,e.color])}}for(var s=0;s<o;s++){var l=t[s],u=l.coord;if(u<0)n=l;else{if(u>e){i?r.push(a(i,l,e)):n&&r.push(a(n,l,0),a(n,l,e));break}n&&(r.push(a(n,l,0)),n=null),r.push(l),i=l}}return r}(u,"x"===r?n.getWidth():n.getHeight()),d=p.length;if(!d&&h)return u[0].coord<0?c[1]?c[1]:u[h-1].color:c[0]?c[0]:u[0].color;var f=p[0].coord-10,g=p[d-1].coord+10,y=g-f;if(y<.001)return"transparent";E(p,(function(t){t.offset=(t.coord-f)/y})),p.push({offset:d?p[d-1].offset:.5,color:c[1]||"transparent"}),p.unshift({offset:d?p[0].offset:.5,color:c[0]||"transparent"});var v=new Xu(0,0,0,0,p,!0);return v[r]=f,v[r+"2"]=g,v}}}function yS(t,e,n){var i=t.get("showAllSymbol"),r="auto"===i;if(!i||r){var o=n.getAxesByScale("ordinal")[0];if(o&&(!r||!function(t,e){var n=t.getExtent(),i=Math.abs(n[1]-n[0])/t.scale.count();isNaN(i)&&(i=0);for(var r=e.count(),o=Math.max(1,Math.round(r/5)),a=0;a<r;a+=o)if(1.5*Yw.getSymbolSize(e,a)[t.isHorizontal()?1:0]>i)return!1;return!0}(o,e))){var a=e.mapDimension(o.dim),s={};return E(o.getViewLabels(),(function(t){var e=o.scale.getRawOrdinalNumber(t.tickValue);s[e]=1})),function(t){return!s.hasOwnProperty(e.get(a,t))}}}}function vS(t,e){return[t[2*e],t[2*e+1]]}function mS(t){if(t.get(["endLabel","show"]))return!0;for(var e=0;e<qs.length;e++)if(t.get([qs[e],"endLabel","show"]))return!0;return!1}function xS(t,e,n,i){if(uS(e,"cartesian2d")){var r=i.getModel("endLabel"),o=r.get("valueAnimation"),a=i.getData(),s={lastFrameIndex:0},l=mS(i)?function(n,i){t._endLabelOnDuring(n,i,a,s,o,r,e)}:null,u=e.getBaseAxis().isHorizontal(),h=aS(e,n,i,(function(){var e=t._endLabel;e&&n&&null!=s.originalX&&e.attr({x:s.originalX,y:s.originalY})}),l);if(!i.get("clip",!0)){var c=h.shape,p=Math.max(c.width,c.height);u?(c.y-=p,c.height+=2*p):(c.x-=p,c.width+=2*p)}return l&&l(1,h),h}return sS(e,n,i)}var _S=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(){var t=new Cr,e=new qw;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},e.prototype.render=function(t,e,n){var i=this,r=t.coordinateSystem,o=this.group,a=t.getData(),s=t.getModel("lineStyle"),l=t.getModel("areaStyle"),u=a.getLayout("points")||[],h="polar"===r.type,c=this._coordSys,p=this._symbolDraw,d=this._polyline,f=this._polygon,g=this._lineGroup,y=t.get("animation"),v=!l.isEmpty(),m=l.get("origin"),x=Kw(r,a,m),_=v&&function(t,e,n){if(!n.valueDim)return[];for(var i=e.count(),r=Sx(2*i),o=0;o<i;o++){var a=$w(n,t,e,o);r[2*o]=a[0],r[2*o+1]=a[1]}return r}(r,a,x),b=t.get("showSymbol"),w=t.get("connectNulls"),S=b&&!h&&yS(t,a,r),M=this._data;M&&M.eachItemGraphicEl((function(t,e){t.__temp&&(o.remove(t),M.setItemGraphicEl(e,null))})),b||p.remove(),o.add(g);var I,T=!h&&t.get("step");r&&r.getArea&&t.get("clip",!0)&&(null!=(I=r.getArea()).width?(I.x-=.1,I.y-=.1,I.width+=.2,I.height+=.2):I.r0&&(I.r0-=.5,I.r+=.5)),this._clipShapeForSymbol=I;var C=gS(a,r,n)||a.getVisual("style")[a.getVisual("drawType")];if(d&&c.type===r.type&&T===this._step){v&&!f?f=this._newPolygon(u,_):f&&!v&&(g.remove(f),f=this._polygon=null),h||this._initOrUpdateEndLabel(t,r,pp(C));var D=g.getClipPath();if(D)oh(D,{shape:xS(this,r,!1,t).shape},t);else g.setClipPath(xS(this,r,!0,t));b&&p.updateData(a,{isIgnore:S,clipShape:I,disableAnimation:!0,getSymbolPoint:function(t){return[u[2*t],u[2*t+1]]}}),hS(this._stackedOnPoints,_)&&hS(this._points,u)||(y?this._doUpdateAnimation(a,_,r,n,T,m,w):(T&&(u=fS(u,r,T,w),_&&(_=fS(_,r,T,w))),d.setShape({points:u}),f&&f.setShape({points:u,stackedOnPoints:_})))}else b&&p.updateData(a,{isIgnore:S,clipShape:I,disableAnimation:!0,getSymbolPoint:function(t){return[u[2*t],u[2*t+1]]}}),y&&this._initSymbolLabelAnimation(a,r,I),T&&(u=fS(u,r,T,w),_&&(_=fS(_,r,T,w))),d=this._newPolyline(u),v?f=this._newPolygon(u,_):f&&(g.remove(f),f=this._polygon=null),h||this._initOrUpdateEndLabel(t,r,pp(C)),g.setClipPath(xS(this,r,!0,t));var A=t.getModel("emphasis"),L=A.get("focus"),P=A.get("blurScope"),O=A.get("disabled");(d.useStyle(k(s.getLineStyle(),{fill:"none",stroke:C,lineJoin:"bevel"})),Vl(d,t,"lineStyle"),d.style.lineWidth>0&&"bolder"===t.get(["emphasis","lineStyle","width"]))&&(d.getState("emphasis").style.lineWidth=+d.style.lineWidth+1);Hs(d).seriesIndex=t.seriesIndex,Rl(d,L,P,O);var R=dS(t.get("smooth")),N=t.get("smoothMonotone");if(d.setShape({smooth:R,smoothMonotone:N,connectNulls:w}),f){var E=a.getCalculationInfo("stackedOnSeries"),z=0;f.useStyle(k(l.getAreaStyle(),{fill:C,opacity:.7,lineJoin:"bevel",decal:a.getVisual("style").decal})),E&&(z=dS(E.get("smooth"))),f.setShape({smooth:R,stackedOnSmooth:z,smoothMonotone:N,connectNulls:w}),Vl(f,t,"areaStyle"),Hs(f).seriesIndex=t.seriesIndex,Rl(f,L,P,O)}var V=function(t){i._changePolyState(t)};a.eachItemGraphicEl((function(t){t&&(t.onHoverStateChange=V)})),this._polyline.onHoverStateChange=V,this._data=a,this._coordSys=r,this._stackedOnPoints=_,this._points=u,this._step=T,this._valueOrigin=m,t.get("triggerLineEvent")&&(this.packEventData(t,d),f&&this.packEventData(t,f))},e.prototype.packEventData=function(t,e){Hs(e).eventData={componentType:"series",componentSubType:"line",componentIndex:t.componentIndex,seriesIndex:t.seriesIndex,seriesName:t.name,seriesType:"line"}},e.prototype.highlight=function(t,e,n,i){var r=t.getData(),o=wo(r,i);if(this._changePolyState("emphasis"),!(o instanceof Array)&&null!=o&&o>=0){var a=r.getLayout("points"),s=r.getItemGraphicEl(o);if(!s){var l=a[2*o],u=a[2*o+1];if(isNaN(l)||isNaN(u))return;if(this._clipShapeForSymbol&&!this._clipShapeForSymbol.contain(l,u))return;var h=t.get("zlevel"),c=t.get("z");(s=new Yw(r,o)).x=l,s.y=u,s.setZ(h,c);var p=s.getSymbolPath().getTextContent();p&&(p.zlevel=h,p.z=c,p.z2=this._polyline.z2+1),s.__temp=!0,r.setItemGraphicEl(o,s),s.stopSymbolAnimation(!0),this.group.add(s)}s.highlight()}else xg.prototype.highlight.call(this,t,e,n,i)},e.prototype.downplay=function(t,e,n,i){var r=t.getData(),o=wo(r,i);if(this._changePolyState("normal"),null!=o&&o>=0){var a=r.getItemGraphicEl(o);a&&(a.__temp?(r.setItemGraphicEl(o,null),this.group.remove(a)):a.downplay())}else xg.prototype.downplay.call(this,t,e,n,i)},e.prototype._changePolyState=function(t){var e=this._polygon;gl(this._polyline,t),e&&gl(e,t)},e.prototype._newPolyline=function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new iS({shape:{points:t},segmentIgnoreThreshold:2,z2:10}),this._lineGroup.add(e),this._polyline=e,e},e.prototype._newPolygon=function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new oS({shape:{points:t,stackedOnPoints:e},segmentIgnoreThreshold:2}),this._lineGroup.add(n),this._polygon=n,n},e.prototype._initSymbolLabelAnimation=function(t,e,n){var i,r,o=e.getBaseAxis(),a=o.inverse;"cartesian2d"===e.type?(i=o.isHorizontal(),r=!1):"polar"===e.type&&(i="angle"===o.dim,r=!0);var s=t.hostModel,l=s.get("animationDuration");U(l)&&(l=l(null));var u=s.get("animationDelay")||0,h=U(u)?u(null):u;t.eachItemGraphicEl((function(t,o){var s=t;if(s){var c=[t.x,t.y],p=void 0,d=void 0,f=void 0;if(n)if(r){var g=n,y=e.pointToCoord(c);i?(p=g.startAngle,d=g.endAngle,f=-y[1]/180*Math.PI):(p=g.r0,d=g.r,f=y[0])}else{var v=n;i?(p=v.x,d=v.x+v.width,f=t.x):(p=v.y+v.height,d=v.y,f=t.y)}var m=d===p?0:(f-p)/(d-p);a&&(m=1-m);var x=U(u)?u(o):l*m+h,_=s.getSymbolPath(),b=_.getTextContent();s.attr({scaleX:0,scaleY:0}),s.animateTo({scaleX:1,scaleY:1},{duration:200,setToFinal:!0,delay:x}),b&&b.animateFrom({style:{opacity:0}},{duration:300,delay:x}),_.disableLabelAnimation=!0}}))},e.prototype._initOrUpdateEndLabel=function(t,e,n){var i=t.getModel("endLabel");if(mS(t)){var r=t.getData(),o=this._polyline,a=r.getLayout("points");if(!a)return o.removeTextContent(),void(this._endLabel=null);var s=this._endLabel;s||((s=this._endLabel=new ks({z2:200})).ignoreClip=!0,o.setTextContent(this._endLabel),o.disableLabelAnimation=!0);var l=function(t){for(var e,n,i=t.length/2;i>0&&(e=t[2*i-2],n=t[2*i-1],isNaN(e)||isNaN(n));i--);return i-1}(a);l>=0&&(Hh(o,Yh(t,"endLabel"),{inheritColor:n,labelFetcher:t,labelDataIndex:l,defaultText:function(t,e,n){return null!=n?Hw(r,n):Ww(r,t)},enableTextSetter:!0},function(t,e){var n=e.getBaseAxis(),i=n.isHorizontal(),r=n.inverse,o=i?r?"right":"left":"center",a=i?"middle":r?"top":"bottom";return{normal:{align:t.get("align")||o,verticalAlign:t.get("verticalAlign")||a}}}(i,e)),o.textConfig.position=null)}else this._endLabel&&(this._polyline.removeTextContent(),this._endLabel=null)},e.prototype._endLabelOnDuring=function(t,e,n,i,r,o,a){var s=this._endLabel,l=this._polyline;if(s){t<1&&null==i.originalX&&(i.originalX=s.x,i.originalY=s.y);var u=n.getLayout("points"),h=n.hostModel,c=h.get("connectNulls"),p=o.get("precision"),d=o.get("distance")||0,f=a.getBaseAxis(),g=f.isHorizontal(),y=f.inverse,v=e.shape,m=y?g?v.x:v.y+v.height:g?v.x+v.width:v.y,x=(g?d:0)*(y?-1:1),_=(g?0:-d)*(y?-1:1),b=g?"x":"y",w=function(t,e,n){for(var i,r,o=t.length/2,a="x"===n?0:1,s=0,l=-1,u=0;u<o;u++)if(r=t[2*u+a],!isNaN(r)&&!isNaN(t[2*u+1-a]))if(0!==u){if(i<=e&&r>=e||i>=e&&r<=e){l=u;break}s=u,i=r}else i=r;return{range:[s,l],t:(e-i)/(r-i)}}(u,m,b),S=w.range,M=S[1]-S[0],I=void 0;if(M>=1){if(M>1&&!c){var T=vS(u,S[0]);s.attr({x:T[0]+x,y:T[1]+_}),r&&(I=h.getRawValue(S[0]))}else{(T=l.getPointOn(m,b))&&s.attr({x:T[0]+x,y:T[1]+_});var C=h.getRawValue(S[0]),D=h.getRawValue(S[1]);r&&(I=Po(n,p,C,D,w.t))}i.lastFrameIndex=S[0]}else{var A=1===t||i.lastFrameIndex>0?S[0]:0;T=vS(u,A);r&&(I=h.getRawValue(A)),s.attr({x:T[0]+x,y:T[1]+_})}r&&Jh(s).setLabelText(I)}},e.prototype._doUpdateAnimation=function(t,e,n,i,r,o,a){var s=this._polyline,l=this._polygon,u=t.hostModel,h=function(t,e,n,i,r,o,a,s){for(var l=function(t,e){var n=[];return e.diff(t).add((function(t){n.push({cmd:"+",idx:t})})).update((function(t,e){n.push({cmd:"=",idx:e,idx1:t})})).remove((function(t){n.push({cmd:"-",idx:t})})).execute(),n}(t,e),u=[],h=[],c=[],p=[],d=[],f=[],g=[],y=Kw(r,e,a),v=t.getLayout("points")||[],m=e.getLayout("points")||[],x=0;x<l.length;x++){var _=l[x],b=!0,w=void 0,S=void 0;switch(_.cmd){case"=":w=2*_.idx,S=2*_.idx1;var M=v[w],I=v[w+1],T=m[S],C=m[S+1];(isNaN(M)||isNaN(I))&&(M=T,I=C),u.push(M,I),h.push(T,C),c.push(n[w],n[w+1]),p.push(i[S],i[S+1]),g.push(e.getRawIndex(_.idx1));break;case"+":var D=_.idx,A=y.dataDimsForPoint,k=r.dataToPoint([e.get(A[0],D),e.get(A[1],D)]);S=2*D,u.push(k[0],k[1]),h.push(m[S],m[S+1]);var L=$w(y,r,e,D);c.push(L[0],L[1]),p.push(i[S],i[S+1]),g.push(e.getRawIndex(D));break;case"-":b=!1}b&&(d.push(_),f.push(f.length))}f.sort((function(t,e){return g[t]-g[e]}));var P=u.length,O=Sx(P),R=Sx(P),N=Sx(P),E=Sx(P),z=[];for(x=0;x<f.length;x++){var V=f[x],B=2*x,F=2*V;O[B]=u[F],O[B+1]=u[F+1],R[B]=h[F],R[B+1]=h[F+1],N[B]=c[F],N[B+1]=c[F+1],E[B]=p[F],E[B+1]=p[F+1],z[x]=d[V]}return{current:O,next:R,stackedOnCurrent:N,stackedOnNext:E,status:z}}(this._data,t,this._stackedOnPoints,e,this._coordSys,0,this._valueOrigin),c=h.current,p=h.stackedOnCurrent,d=h.next,f=h.stackedOnNext;if(r&&(c=fS(h.current,n,r,a),p=fS(h.stackedOnCurrent,n,r,a),d=fS(h.next,n,r,a),f=fS(h.stackedOnNext,n,r,a)),pS(c,d)>3e3||l&&pS(p,f)>3e3)return s.stopAnimation(),s.setShape({points:d}),void(l&&(l.stopAnimation(),l.setShape({points:d,stackedOnPoints:f})));s.shape.__points=h.current,s.shape.points=c;var g={shape:{points:d}};h.current!==c&&(g.shape.__points=h.next),s.stopAnimation(),rh(s,g,u),l&&(l.setShape({points:c,stackedOnPoints:p}),l.stopAnimation(),rh(l,{shape:{stackedOnPoints:f}},u),s.shape.points!==l.shape.points&&(l.shape.points=s.shape.points));for(var y=[],v=h.status,m=0;m<v.length;m++){if("="===v[m].cmd){var x=t.getItemGraphicEl(v[m].idx1);x&&y.push({el:x,ptIdx:m})}}s.animators&&s.animators.length&&s.animators[0].during((function(){l&&l.dirtyShape();for(var t=s.shape.__points,e=0;e<y.length;e++){var n=y[e].el,i=2*y[e].ptIdx;n.x=t[i],n.y=t[i+1],n.markRedraw()}}))},e.prototype.remove=function(t){var e=this.group,n=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),n&&n.eachItemGraphicEl((function(t,i){t.__temp&&(e.remove(t),n.setItemGraphicEl(i,null))})),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._endLabel=this._data=null},e.type="line",e}(xg);function bS(t,e){return{seriesType:t,plan:yg(),reset:function(t){var n=t.getData(),i=t.coordinateSystem,r=t.pipelineContext,o=e||r.large;if(i){var a=z(i.dimensions,(function(t){return n.mapDimension(t)})).slice(0,2),s=a.length,l=n.getCalculationInfo("stackResultDimension");nx(n,a[0])&&(a[0]=l),nx(n,a[1])&&(a[1]=l);var u=n.getStore(),h=n.getDimensionIndex(a[0]),c=n.getDimensionIndex(a[1]);return s&&{progress:function(t,e){for(var n=t.end-t.start,r=o&&Sx(n*s),a=[],l=[],p=t.start,d=0;p<t.end;p++){var f=void 0;if(1===s){var g=u.get(h,p);f=i.dataToPoint(g,null,l)}else a[0]=u.get(h,p),a[1]=u.get(c,p),f=i.dataToPoint(a,null,l);o?(r[d++]=f[0],r[d++]=f[1]):e.setItemLayout(p,f.slice())}o&&e.setLayout("points",r)}}}}}}var wS={average:function(t){for(var e=0,n=0,i=0;i<t.length;i++)isNaN(t[i])||(e+=t[i],n++);return 0===n?NaN:e/n},sum:function(t){for(var e=0,n=0;n<t.length;n++)e+=t[n]||0;return e},max:function(t){for(var e=-1/0,n=0;n<t.length;n++)t[n]>e&&(e=t[n]);return isFinite(e)?e:NaN},min:function(t){for(var e=1/0,n=0;n<t.length;n++)t[n]<e&&(e=t[n]);return isFinite(e)?e:NaN},nearest:function(t){return t[0]}},SS=function(t){return Math.round(t.length/2)};function MS(t){return{seriesType:t,reset:function(t,e,n){var i=t.getData(),r=t.get("sampling"),o=t.coordinateSystem,a=i.count();if(a>10&&"cartesian2d"===o.type&&r){var s=o.getBaseAxis(),l=o.getOtherAxis(s),u=s.getExtent(),h=n.getDevicePixelRatio(),c=Math.abs(u[1]-u[0])*(h||1),p=Math.round(a/c);if(isFinite(p)&&p>1){"lttb"===r&&t.setData(i.lttbDownSample(i.mapDimension(l.dim),1/p));var d=void 0;X(r)?d=wS[r]:U(r)&&(d=r),d&&t.setData(i.downSample(i.mapDimension(l.dim),1/p,d,SS))}}}}}var IS=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(t,e){return rx(null,this,{useEncodeDefaulter:!0})},e.prototype.getMarkerPosition=function(t){var e=this.coordinateSystem;if(e&&e.clampData){var n=e.dataToPoint(e.clampData(t)),i=this.getData(),r=i.getLayout("offset"),o=i.getLayout("size");return n[e.getBaseAxis().isHorizontal()?0:1]+=r+o/2,n}return[NaN,NaN]},e.type="series.__base_bar__",e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,large:!1,largeThreshold:400,progressive:3e3,progressiveChunkMode:"mod"},e}(sg);sg.registerClass(IS);var TS=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(){return rx(null,this,{useEncodeDefaulter:!0,createInvertedIndices:!!this.get("realtimeSort",!0)||null})},e.prototype.getProgressive=function(){return!!this.get("large")&&this.get("progressive")},e.prototype.getProgressiveThreshold=function(){var t=this.get("progressiveThreshold"),e=this.get("largeThreshold");return e>t&&(t=e),t},e.prototype.brushSelector=function(t,e,n){return n.rect(e.getItemLayout(t))},e.type="series.bar",e.dependencies=["grid","polar"],e.defaultOption=yc(IS.defaultOption,{clip:!0,roundCap:!1,showBackground:!1,backgroundStyle:{color:"rgba(180, 180, 180, 0.2)",borderColor:null,borderWidth:0,borderType:"solid",borderRadius:0,shadowBlur:0,shadowColor:null,shadowOffsetX:0,shadowOffsetY:0,opacity:1},select:{itemStyle:{borderColor:"#212121"}},realtimeSort:!1}),e}(IS),CS=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0},DS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="sausage",n}return n(e,t),e.prototype.getDefaultShape=function(){return new CS},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),o=Math.max(e.r,0),a=.5*(o-r),s=r+a,l=e.startAngle,u=e.endAngle,h=e.clockwise,c=2*Math.PI,p=h?u-l<c:l-u<c;p||(l=u-(h?c:-c));var d=Math.cos(l),f=Math.sin(l),g=Math.cos(u),y=Math.sin(u);p?(t.moveTo(d*r+n,f*r+i),t.arc(d*s+n,f*s+i,a,-Math.PI+l,l,!h)):t.moveTo(d*o+n,f*o+i),t.arc(n,i,o,l,u,!h),t.arc(g*s+n,y*s+i,a,u-2*Math.PI,u-Math.PI,!h),0!==r&&t.arc(n,i,r,u,l,h)},e}(gs);function AS(t,e,n){return e*Math.sin(t)*(n?-1:1)}function kS(t,e,n){return e*Math.cos(t)*(n?1:-1)}var LS=Math.max,PS=Math.min;var OS=function(t){function e(){var n=t.call(this)||this;return n.type=e.type,n._isFirstFrame=!0,n}return n(e,t),e.prototype.render=function(t,e,n,i){this._model=t,this._removeOnRenderedListener(n),this._updateDrawMode(t);var r=t.get("coordinateSystem");("cartesian2d"===r||"polar"===r)&&(this._progressiveEls=null,this._isLargeDraw?this._renderLarge(t,e,n):this._renderNormal(t,e,n,i))},e.prototype.incrementalPrepareRender=function(t){this._clear(),this._updateDrawMode(t),this._updateLargeClip(t)},e.prototype.incrementalRender=function(t,e){this._progressiveEls=[],this._incrementalRenderLarge(t,e)},e.prototype.eachRendered=function(t){Vh(this._progressiveEls||this.group,t)},e.prototype._updateDrawMode=function(t){var e=t.pipelineContext.large;null!=this._isLargeDraw&&e===this._isLargeDraw||(this._isLargeDraw=e,this._clear())},e.prototype._renderNormal=function(t,e,n,i){var r,o=this.group,a=t.getData(),s=this._data,l=t.coordinateSystem,u=l.getBaseAxis();"cartesian2d"===l.type?r=u.isHorizontal():"polar"===l.type&&(r="angle"===u.dim);var h=t.isAnimationEnabled()?t:null,c=function(t,e){var n=t.get("realtimeSort",!0),i=e.getBaseAxis();0;if(n&&"category"===i.type&&"cartesian2d"===e.type)return{baseAxis:i,otherAxis:e.getOtherAxis(i)}}(t,l);c&&this._enableRealtimeSort(c,a,n);var p=t.get("clip",!0)||c,d=function(t,e){var n=t.getArea&&t.getArea();if(uS(t,"cartesian2d")){var i=t.getBaseAxis();if("category"!==i.type||!i.onBand){var r=e.getLayout("bandWidth");i.isHorizontal()?(n.x-=r,n.width+=2*r):(n.y-=r,n.height+=2*r)}}return n}(l,a);o.removeClipPath();var f=t.get("roundCap",!0),g=t.get("showBackground",!0),y=t.getModel("backgroundStyle"),v=y.get("borderRadius")||0,m=[],x=this._backgroundEls,_=i&&i.isInitSort,b=i&&"changeAxisOrder"===i.type;function w(t){var e=GS[l.type](a,t),n=function(t,e,n){return new("polar"===t.type?Cu:Cs)({shape:jS(e,n,t),silent:!0,z2:0})}(l,r,e);return n.useStyle(y.getItemStyle()),"cartesian2d"===l.type&&n.setShape("r",v),m[t]=n,n}a.diff(s).add((function(e){var n=a.getItemModel(e),i=GS[l.type](a,e,n);if(g&&w(e),a.hasValue(e)&&FS[l.type](i)){var s=!1;p&&(s=RS[l.type](d,i));var y=NS[l.type](t,a,e,i,r,h,u.model,!1,f);c&&(y.forceLabelAnimation=!0),HS(y,a,e,n,i,t,r,"polar"===l.type),_?y.attr({shape:i}):c?ES(c,h,y,i,e,r,!1,!1):oh(y,{shape:i},t,e),a.setItemGraphicEl(e,y),o.add(y),y.ignore=s}})).update((function(e,n){var i=a.getItemModel(e),S=GS[l.type](a,e,i);if(g){var M=void 0;0===x.length?M=w(n):((M=x[n]).useStyle(y.getItemStyle()),"cartesian2d"===l.type&&M.setShape("r",v),m[e]=M);var I=GS[l.type](a,e);rh(M,{shape:jS(r,I,l)},h,e)}var T=s.getItemGraphicEl(n);if(a.hasValue(e)&&FS[l.type](S)){var C=!1;if(p&&(C=RS[l.type](d,S))&&o.remove(T),T?hh(T):T=NS[l.type](t,a,e,S,r,h,u.model,!!T,f),c&&(T.forceLabelAnimation=!0),b){var D=T.getTextContent();if(D){var A=Jh(D);null!=A.prevValue&&(A.prevValue=A.value)}}else HS(T,a,e,i,S,t,r,"polar"===l.type);_?T.attr({shape:S}):c?ES(c,h,T,S,e,r,!0,b):rh(T,{shape:S},t,e,null),a.setItemGraphicEl(e,T),T.ignore=C,o.add(T)}else o.remove(T)})).remove((function(e){var n=s.getItemGraphicEl(e);n&&uh(n,t,e)})).execute();var S=this._backgroundGroup||(this._backgroundGroup=new Cr);S.removeAll();for(var M=0;M<m.length;++M)S.add(m[M]);o.add(S),this._backgroundEls=m,this._data=a},e.prototype._renderLarge=function(t,e,n){this._clear(),XS(t,this.group),this._updateLargeClip(t)},e.prototype._incrementalRenderLarge=function(t,e){this._removeBackground(),XS(e,this.group,this._progressiveEls,!0)},e.prototype._updateLargeClip=function(t){var e=t.get("clip",!0)&&lS(t.coordinateSystem,!1,t),n=this.group;e?n.setClipPath(e):n.removeClipPath()},e.prototype._enableRealtimeSort=function(t,e,n){var i=this;if(e.count()){var r=t.baseAxis;if(this._isFirstFrame)this._dispatchInitSort(e,t,n),this._isFirstFrame=!1;else{var o=function(t){var n=e.getItemGraphicEl(t),i=n&&n.shape;return i&&Math.abs(r.isHorizontal()?i.height:i.width)||0};this._onRendered=function(){i._updateSortWithinSameData(e,o,r,n)},n.getZr().on("rendered",this._onRendered)}}},e.prototype._dataSort=function(t,e,n){var i=[];return t.each(t.mapDimension(e.dim),(function(t,e){var r=n(e);r=null==r?NaN:r,i.push({dataIndex:e,mappedValue:r,ordinalNumber:t})})),i.sort((function(t,e){return e.mappedValue-t.mappedValue})),{ordinalNumbers:z(i,(function(t){return t.ordinalNumber}))}},e.prototype._isOrderChangedWithinSameData=function(t,e,n){for(var i=n.scale,r=t.mapDimension(n.dim),o=Number.MAX_VALUE,a=0,s=i.getOrdinalMeta().categories.length;a<s;++a){var l=t.rawIndexOf(r,i.getRawOrdinalNumber(a)),u=l<0?Number.MIN_VALUE:e(t.indexOfRawIndex(l));if(u>o)return!0;o=u}return!1},e.prototype._isOrderDifferentInView=function(t,e){for(var n=e.scale,i=n.getExtent(),r=Math.max(0,i[0]),o=Math.min(i[1],n.getOrdinalMeta().categories.length-1);r<=o;++r)if(t.ordinalNumbers[r]!==n.getRawOrdinalNumber(r))return!0},e.prototype._updateSortWithinSameData=function(t,e,n,i){if(this._isOrderChangedWithinSameData(t,e,n)){var r=this._dataSort(t,n,e);this._isOrderDifferentInView(r,n)&&(this._removeOnRenderedListener(i),i.dispatchAction({type:"changeAxisOrder",componentType:n.dim+"Axis",axisId:n.index,sortInfo:r}))}},e.prototype._dispatchInitSort=function(t,e,n){var i=e.baseAxis,r=this._dataSort(t,i,(function(n){return t.get(t.mapDimension(e.otherAxis.dim),n)}));n.dispatchAction({type:"changeAxisOrder",componentType:i.dim+"Axis",isInitSort:!0,axisId:i.index,sortInfo:r})},e.prototype.remove=function(t,e){this._clear(this._model),this._removeOnRenderedListener(e)},e.prototype.dispose=function(t,e){this._removeOnRenderedListener(e)},e.prototype._removeOnRenderedListener=function(t){this._onRendered&&(t.getZr().off("rendered",this._onRendered),this._onRendered=null)},e.prototype._clear=function(t){var e=this.group,n=this._data;t&&t.isAnimationEnabled()&&n&&!this._isLargeDraw?(this._removeBackground(),this._backgroundEls=[],n.eachItemGraphicEl((function(e){uh(e,t,Hs(e).dataIndex)}))):e.removeAll(),this._data=null,this._isFirstFrame=!0},e.prototype._removeBackground=function(){this.group.remove(this._backgroundGroup),this._backgroundGroup=null},e.type="bar",e}(xg),RS={cartesian2d:function(t,e){var n=e.width<0?-1:1,i=e.height<0?-1:1;n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height);var r=t.x+t.width,o=t.y+t.height,a=LS(e.x,t.x),s=PS(e.x+e.width,r),l=LS(e.y,t.y),u=PS(e.y+e.height,o),h=s<a,c=u<l;return e.x=h&&a>r?s:a,e.y=c&&l>o?u:l,e.width=h?0:s-a,e.height=c?0:u-l,n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height),h||c},polar:function(t,e){var n=e.r0<=e.r?1:-1;if(n<0){var i=e.r;e.r=e.r0,e.r0=i}var r=PS(e.r,t.r),o=LS(e.r0,t.r0);e.r=r,e.r0=o;var a=r-o<0;if(n<0){i=e.r;e.r=e.r0,e.r0=i}return a}},NS={cartesian2d:function(t,e,n,i,r,o,a,s,l){var u=new Cs({shape:A({},i),z2:1});(u.__dataIndex=n,u.name="item",o)&&(u.shape[r?"height":"width"]=0);return u},polar:function(t,e,n,i,r,o,a,s,l){var u=!r&&l?DS:Cu,h=new u({shape:i,z2:1});h.name="item";var c,p,d=WS(r);if(h.calculateTextPosition=(c=d,p=({isRoundCap:u===DS}||{}).isRoundCap,function(t,e,n){var i=e.position;if(!i||i instanceof Array)return yr(t,e,n);var r=c(i),o=null!=e.distance?e.distance:5,a=this.shape,s=a.cx,l=a.cy,u=a.r,h=a.r0,d=(u+h)/2,f=a.startAngle,g=a.endAngle,y=(f+g)/2,v=p?Math.abs(u-h)/2:0,m=Math.cos,x=Math.sin,_=s+u*m(f),b=l+u*x(f),w="left",S="top";switch(r){case"startArc":_=s+(h-o)*m(y),b=l+(h-o)*x(y),w="center",S="top";break;case"insideStartArc":_=s+(h+o)*m(y),b=l+(h+o)*x(y),w="center",S="bottom";break;case"startAngle":_=s+d*m(f)+AS(f,o+v,!1),b=l+d*x(f)+kS(f,o+v,!1),w="right",S="middle";break;case"insideStartAngle":_=s+d*m(f)+AS(f,-o+v,!1),b=l+d*x(f)+kS(f,-o+v,!1),w="left",S="middle";break;case"middle":_=s+d*m(y),b=l+d*x(y),w="center",S="middle";break;case"endArc":_=s+(u+o)*m(y),b=l+(u+o)*x(y),w="center",S="bottom";break;case"insideEndArc":_=s+(u-o)*m(y),b=l+(u-o)*x(y),w="center",S="top";break;case"endAngle":_=s+d*m(g)+AS(g,o+v,!0),b=l+d*x(g)+kS(g,o+v,!0),w="left",S="middle";break;case"insideEndAngle":_=s+d*m(g)+AS(g,-o+v,!0),b=l+d*x(g)+kS(g,-o+v,!0),w="right",S="middle";break;default:return yr(t,e,n)}return(t=t||{}).x=_,t.y=b,t.align=w,t.verticalAlign=S,t}),o){var f=r?"r":"endAngle",g={};h.shape[f]=r?0:i.startAngle,g[f]=i[f],(s?rh:oh)(h,{shape:g},o)}return h}};function ES(t,e,n,i,r,o,a,s){var l,u;o?(u={x:i.x,width:i.width},l={y:i.y,height:i.height}):(u={y:i.y,height:i.height},l={x:i.x,width:i.width}),s||(a?rh:oh)(n,{shape:l},e,r,null),(a?rh:oh)(n,{shape:u},e?t.baseAxis.model:null,r)}function zS(t,e){for(var n=0;n<e.length;n++)if(!isFinite(t[e[n]]))return!0;return!1}var VS=["x","y","width","height"],BS=["cx","cy","r","startAngle","endAngle"],FS={cartesian2d:function(t){return!zS(t,VS)},polar:function(t){return!zS(t,BS)}},GS={cartesian2d:function(t,e,n){var i=t.getItemLayout(e),r=n?function(t,e){var n=t.get(["itemStyle","borderColor"]);if(!n||"none"===n)return 0;var i=t.get(["itemStyle","borderWidth"])||0,r=isNaN(e.width)?Number.MAX_VALUE:Math.abs(e.width),o=isNaN(e.height)?Number.MAX_VALUE:Math.abs(e.height);return Math.min(i,r,o)}(n,i):0,o=i.width>0?1:-1,a=i.height>0?1:-1;return{x:i.x+o*r/2,y:i.y+a*r/2,width:i.width-o*r,height:i.height-a*r}},polar:function(t,e,n){var i=t.getItemLayout(e);return{cx:i.cx,cy:i.cy,r0:i.r0,r:i.r,startAngle:i.startAngle,endAngle:i.endAngle,clockwise:i.clockwise}}};function WS(t){return function(t){var e=t?"Arc":"Angle";return function(t){switch(t){case"start":case"insideStart":case"end":case"insideEnd":return t+e;default:return t}}}(t)}function HS(t,e,n,i,r,o,a,s){var l=e.getItemVisual(n,"style");s||t.setShape("r",i.get(["itemStyle","borderRadius"])||0),t.useStyle(l);var u=i.getShallow("cursor");u&&t.attr("cursor",u);var h=s?a?r.r>=r.r0?"endArc":"startArc":r.endAngle>=r.startAngle?"endAngle":"startAngle":a?r.height>=0?"bottom":"top":r.width>=0?"right":"left",c=Yh(i);Hh(t,c,{labelFetcher:o,labelDataIndex:n,defaultText:Ww(o.getData(),n),inheritColor:l.fill,defaultOpacity:l.opacity,defaultOutsidePosition:h});var p=t.getTextContent();if(s&&p){var d=i.get(["label","position"]);t.textConfig.inside="middle"===d||null,function(t,e,n,i){if(j(i))t.setTextConfig({rotation:i});else if(Y(e))t.setTextConfig({rotation:0});else{var r,o=t.shape,a=o.clockwise?o.startAngle:o.endAngle,s=o.clockwise?o.endAngle:o.startAngle,l=(a+s)/2,u=n(e);switch(u){case"startArc":case"insideStartArc":case"middle":case"insideEndArc":case"endArc":r=l;break;case"startAngle":case"insideStartAngle":r=a;break;case"endAngle":case"insideEndAngle":r=s;break;default:return void t.setTextConfig({rotation:0})}var h=1.5*Math.PI-r;"middle"===u&&h>Math.PI/2&&h<1.5*Math.PI&&(h-=Math.PI),t.setTextConfig({rotation:h})}}(t,"outside"===d?h:d,WS(a),i.get(["label","rotate"]))}Qh(p,c,o.getRawValue(n),(function(t){return Hw(e,t)}));var f=i.getModel(["emphasis"]);Rl(t,f.get("focus"),f.get("blurScope"),f.get("disabled")),Vl(t,i),function(t){return null!=t.startAngle&&null!=t.endAngle&&t.startAngle===t.endAngle}(r)&&(t.style.fill="none",t.style.stroke="none",E(t.states,(function(t){t.style&&(t.style.fill=t.style.stroke="none")})))}var YS=function(){},US=function(t){function e(e){var n=t.call(this,e)||this;return n.type="largeBar",n}return n(e,t),e.prototype.getDefaultShape=function(){return new YS},e.prototype.buildPath=function(t,e){for(var n=e.points,i=this.baseDimIdx,r=1-this.baseDimIdx,o=[],a=[],s=this.barWidth,l=0;l<n.length;l+=3)a[i]=s,a[r]=n[l+2],o[i]=n[l+i],o[r]=n[l+r],t.rect(o[0],o[1],a[0],a[1])},e}(gs);function XS(t,e,n,i){var r=t.getData(),o=r.getLayout("valueAxisHorizontal")?1:0,a=r.getLayout("largeDataIndices"),s=r.getLayout("size"),l=t.getModel("backgroundStyle"),u=r.getLayout("largeBackgroundPoints");if(u){var h=new US({shape:{points:u},incremental:!!i,silent:!0,z2:0});h.baseDimIdx=o,h.largeDataIndices=a,h.barWidth=s,h.useStyle(l.getItemStyle()),e.add(h),n&&n.push(h)}var c=new US({shape:{points:r.getLayout("largePoints")},incremental:!!i,z2:1});c.baseDimIdx=o,c.largeDataIndices=a,c.barWidth=s,e.add(c),c.useStyle(r.getVisual("style")),Hs(c).seriesIndex=t.seriesIndex,t.get("silent")||(c.on("mousedown",ZS),c.on("mousemove",ZS)),n&&n.push(c)}var ZS=Dg((function(t){var e=function(t,e,n){for(var i=t.baseDimIdx,r=1-i,o=t.shape.points,a=t.largeDataIndices,s=[],l=[],u=t.barWidth,h=0,c=o.length/3;h<c;h++){var p=3*h;if(l[i]=u,l[r]=o[p+2],s[i]=o[p+i],s[r]=o[p+r],l[r]<0&&(s[r]+=l[r],l[r]=-l[r]),e>=s[0]&&e<=s[0]+l[0]&&n>=s[1]&&n<=s[1]+l[1])return a[h]}return-1}(this,t.offsetX,t.offsetY);Hs(this).dataIndex=e>=0?e:null}),30,!1);function jS(t,e,n){if(uS(n,"cartesian2d")){var i=e,r=n.getArea();return{x:t?i.x:r.x,y:t?r.y:i.y,width:t?i.width:r.width,height:t?r.height:i.height}}var o=e;return{cx:(r=n.getArea()).cx,cy:r.cy,r0:t?r.r0:o.r0,r:t?r.r:o.r,startAngle:t?o.startAngle:0,endAngle:t?o.endAngle:2*Math.PI}}var qS=2*Math.PI,KS=Math.PI/180;function $S(t,e){return xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function JS(t,e){var n=$S(t,e),i=t.get("center"),r=t.get("radius");Y(r)||(r=[0,r]),Y(i)||(i=[i,i]);var o=Er(n.width,e.getWidth()),a=Er(n.height,e.getHeight()),s=Math.min(o,a);return{cx:Er(i[0],o)+n.x,cy:Er(i[1],a)+n.y,r0:Er(r[0],s/2),r:Er(r[1],s/2)}}function QS(t,e,n){e.eachSeriesByType(t,(function(t){var e=t.getData(),i=e.mapDimension("value"),r=$S(t,n),o=JS(t,n),a=o.cx,s=o.cy,l=o.r,u=o.r0,h=-t.get("startAngle")*KS,c=t.get("minAngle")*KS,p=0;e.each(i,(function(t){!isNaN(t)&&p++}));var d=e.getSum(i),f=Math.PI/(d||p)*2,g=t.get("clockwise"),y=t.get("roseType"),v=t.get("stillShowZeroSum"),m=e.getDataExtent(i);m[0]=0;var x=qS,_=0,b=h,w=g?1:-1;if(e.setLayout({viewRect:r,r:l}),e.each(i,(function(t,n){var i;if(isNaN(t))e.setItemLayout(n,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:g,cx:a,cy:s,r0:u,r:y?NaN:l});else{(i="area"!==y?0===d&&v?f:t*f:qS/p)<c?(i=c,x-=c):_+=t;var r=b+w*i;e.setItemLayout(n,{angle:i,startAngle:b,endAngle:r,clockwise:g,cx:a,cy:s,r0:u,r:y?Nr(t,m,[u,l]):l}),b=r}})),x<qS&&p)if(x<=.001){var S=qS/p;e.each(i,(function(t,n){if(!isNaN(t)){var i=e.getItemLayout(n);i.angle=S,i.startAngle=h+w*n*S,i.endAngle=h+w*(n+1)*S}}))}else f=x/_,b=h,e.each(i,(function(t,n){if(!isNaN(t)){var i=e.getItemLayout(n),r=i.angle===c?c:t*f;i.startAngle=b,i.endAngle=b+w*r,b+=w*r}}))}))}function tM(t){return{seriesType:t,reset:function(t,e){var n=e.findComponents({mainType:"legend"});if(n&&n.length){var i=t.getData();i.filterSelf((function(t){for(var e=i.getName(t),r=0;r<n.length;r++)if(!n[r].isSelected(e))return!1;return!0}))}}}}var eM=Math.PI/180;function nM(t,e,n,i,r,o,a,s,l,u){if(!(t.length<2)){for(var h=t.length,c=0;c<h;c++)if("outer"===t[c].position&&"labelLine"===t[c].labelAlignTo){var p=t[c].label.x-u;t[c].linePoints[1][0]+=p,t[c].label.x=u}vb(t,l,l+a)&&function(t){for(var o={list:[],maxY:0},a={list:[],maxY:0},s=0;s<t.length;s++)if("none"===t[s].labelAlignTo){var l=t[s],u=l.label.y>n?a:o,h=Math.abs(l.label.y-n);if(h>=u.maxY){var c=l.label.x-e-l.len2*r,p=i+l.len,f=Math.abs(c)<p?Math.sqrt(h*h/(1-c*c/p/p)):p;u.rB=f,u.maxY=h}u.list.push(l)}d(o),d(a)}(t)}function d(t){for(var o=t.rB,a=o*o,s=0;s<t.list.length;s++){var l=t.list[s],u=Math.abs(l.label.y-n),h=i+l.len,c=h*h,p=Math.sqrt((1-Math.abs(u*u/a))*c),d=e+(p+l.len2)*r,f=d-l.label.x;iM(l,l.targetTextWidth-f*r,!0),l.label.x=d}}}function iM(t,e,n){if(void 0===n&&(n=!1),null==t.labelStyleWidth){var i=t.label,r=i.style,o=t.rect,a=r.backgroundColor,s=r.padding,l=s?s[1]+s[3]:0,u=r.overflow,h=o.width+(a?0:l);if(e<h||n){var c=o.height;if(u&&u.match("break")){i.setStyle("backgroundColor",null),i.setStyle("width",e-l);var p=i.getBoundingRect();i.setStyle("width",Math.ceil(p.width)),i.setStyle("backgroundColor",a)}else{var d=e-l,f=e<h?d:n?d>t.unconstrainedWidth?null:d:null;i.setStyle("width",f)}var g=i.getBoundingRect();o.width=g.width;var y=(i.style.margin||0)+2.1;o.height=g.height+y,o.y-=(o.height-c)/2}}}function rM(t){return"center"===t.position}function oM(t){var e,n,i=t.getData(),r=[],o=!1,a=(t.get("minShowLabelAngle")||0)*eM,s=i.getLayout("viewRect"),l=i.getLayout("r"),u=s.width,h=s.x,c=s.y,p=s.height;function d(t){t.ignore=!0}i.each((function(t){var s=i.getItemGraphicEl(t),c=s.shape,p=s.getTextContent(),f=s.getTextGuideLine(),g=i.getItemModel(t),y=g.getModel("label"),v=y.get("position")||g.get(["emphasis","label","position"]),m=y.get("distanceToLabelLine"),x=y.get("alignTo"),_=Er(y.get("edgeDistance"),u),b=y.get("bleedMargin"),w=g.getModel("labelLine"),S=w.get("length");S=Er(S,u);var M=w.get("length2");if(M=Er(M,u),Math.abs(c.endAngle-c.startAngle)<a)return E(p.states,d),void(p.ignore=!0);if(function(t){if(!t.ignore)return!0;for(var e in t.states)if(!1===t.states[e].ignore)return!0;return!1}(p)){var I,T,C,D,A=(c.startAngle+c.endAngle)/2,k=Math.cos(A),L=Math.sin(A);e=c.cx,n=c.cy;var P="inside"===v||"inner"===v;if("center"===v)I=c.cx,T=c.cy,D="center";else{var O=(P?(c.r+c.r0)/2*k:c.r*k)+e,R=(P?(c.r+c.r0)/2*L:c.r*L)+n;if(I=O+3*k,T=R+3*L,!P){var N=O+k*(S+l-c.r),z=R+L*(S+l-c.r),V=N+(k<0?-1:1)*M;I="edge"===x?k<0?h+_:h+u-_:V+(k<0?-m:m),T=z,C=[[O,R],[N,z],[V,z]]}D=P?"center":"edge"===x?k>0?"right":"left":k>0?"left":"right"}var B=Math.PI,F=0,G=y.get("rotate");if(j(G))F=G*(B/180);else if("center"===v)F=0;else if("radial"===G||!0===G){F=k<0?-A+B:-A}else if("tangential"===G&&"outside"!==v&&"outer"!==v){var W=Math.atan2(k,L);W<0&&(W=2*B+W),L>0&&(W=B+W),F=W-B}if(o=!!F,p.x=I,p.y=T,p.rotation=F,p.setStyle({verticalAlign:"middle"}),P){p.setStyle({align:D});var H=p.states.select;H&&(H.x+=p.x,H.y+=p.y)}else{var Y=p.getBoundingRect().clone();Y.applyTransform(p.getComputedTransform());var U=(p.style.margin||0)+2.1;Y.y-=U/2,Y.height+=U,r.push({label:p,labelLine:f,position:v,len:S,len2:M,minTurnAngle:w.get("minTurnAngle"),maxSurfaceAngle:w.get("maxSurfaceAngle"),surfaceNormal:new Ji(k,L),linePoints:C,textAlign:D,labelDistance:m,labelAlignTo:x,edgeDistance:_,bleedMargin:b,rect:Y,unconstrainedWidth:Y.width,labelStyleWidth:p.style.width})}s.setTextConfig({inside:P})}})),!o&&t.get("avoidLabelOverlap")&&function(t,e,n,i,r,o,a,s){for(var l=[],u=[],h=Number.MAX_VALUE,c=-Number.MAX_VALUE,p=0;p<t.length;p++){var d=t[p].label;rM(t[p])||(d.x<e?(h=Math.min(h,d.x),l.push(t[p])):(c=Math.max(c,d.x),u.push(t[p])))}for(p=0;p<t.length;p++)if(!rM(y=t[p])&&y.linePoints){if(null!=y.labelStyleWidth)continue;d=y.label;var f=y.linePoints,g=void 0;g="edge"===y.labelAlignTo?d.x<e?f[2][0]-y.labelDistance-a-y.edgeDistance:a+r-y.edgeDistance-f[2][0]-y.labelDistance:"labelLine"===y.labelAlignTo?d.x<e?h-a-y.bleedMargin:a+r-c-y.bleedMargin:d.x<e?d.x-a-y.bleedMargin:a+r-d.x-y.bleedMargin,y.targetTextWidth=g,iM(y,g)}for(nM(u,e,n,i,1,0,o,0,s,c),nM(l,e,n,i,-1,0,o,0,s,h),p=0;p<t.length;p++){var y;if(!rM(y=t[p])&&y.linePoints){d=y.label,f=y.linePoints;var v="edge"===y.labelAlignTo,m=d.style.padding,x=m?m[1]+m[3]:0,_=d.style.backgroundColor?0:x,b=y.rect.width+_,w=f[1][0]-f[2][0];v?d.x<e?f[2][0]=a+y.edgeDistance+b+y.labelDistance:f[2][0]=a+r-y.edgeDistance-b-y.labelDistance:(d.x<e?f[2][0]=d.x+y.labelDistance:f[2][0]=d.x-y.labelDistance,f[1][0]=f[2][0]+w),f[1][1]=f[2][1]=d.y}}}(r,e,n,l,u,p,h,c);for(var f=0;f<r.length;f++){var g=r[f],y=g.label,v=g.labelLine,m=isNaN(y.x)||isNaN(y.y);if(y){y.setStyle({align:g.textAlign}),m&&(E(y.states,d),y.ignore=!0);var x=y.states.select;x&&(x.x+=y.x,x.y+=y.y)}if(v){var _=g.linePoints;m||!_?(E(v.states,d),v.ignore=!0):(ub(_,g.minTurnAngle),hb(_,g.surfaceNormal,g.maxSurfaceAngle),v.setShape({points:_}),y.__hostTarget.textGuideLineConfig={anchor:new Ji(_[0][0],_[0][1])})}}}function aM(t,e,n){var i=t.get("borderRadius");if(null==i)return n?{cornerRadius:0}:null;Y(i)||(i=[i,i,i,i]);var r=Math.abs(e.r||0-e.r0||0);return{cornerRadius:z(i,(function(t){return gr(t,r)}))}}var sM=function(t){function e(e,n,i){var r=t.call(this)||this;r.z2=2;var o=new ks;return r.setTextContent(o),r.updateData(e,n,i,!0),r}return n(e,t),e.prototype.updateData=function(t,e,n,i){var r=this,o=t.hostModel,a=t.getItemModel(e),s=a.getModel("emphasis"),l=t.getItemLayout(e),u=A(aM(a.getModel("itemStyle"),l,!0),l);if(isNaN(u.startAngle))r.setShape(u);else{if(i){r.setShape(u);var h=o.getShallow("animationType");o.ecModel.ssr?(oh(r,{scaleX:0,scaleY:0},o,{dataIndex:e,isFrom:!0}),r.originX=u.cx,r.originY=u.cy):"scale"===h?(r.shape.r=l.r0,oh(r,{shape:{r:l.r}},o,e)):null!=n?(r.setShape({startAngle:n,endAngle:n}),oh(r,{shape:{startAngle:l.startAngle,endAngle:l.endAngle}},o,e)):(r.shape.endAngle=l.startAngle,rh(r,{shape:{endAngle:l.endAngle}},o,e))}else hh(r),rh(r,{shape:u},o,e);r.useStyle(t.getItemVisual(e,"style")),Vl(r,a);var c=(l.startAngle+l.endAngle)/2,p=o.get("selectedOffset"),d=Math.cos(c)*p,f=Math.sin(c)*p,g=a.getShallow("cursor");g&&r.attr("cursor",g),this._updateLabel(o,t,e),r.ensureState("emphasis").shape=A({r:l.r+(s.get("scale")&&s.get("scaleSize")||0)},aM(s.getModel("itemStyle"),l)),A(r.ensureState("select"),{x:d,y:f,shape:aM(a.getModel(["select","itemStyle"]),l)}),A(r.ensureState("blur"),{shape:aM(a.getModel(["blur","itemStyle"]),l)});var y=r.getTextGuideLine(),v=r.getTextContent();y&&A(y.ensureState("select"),{x:d,y:f}),A(v.ensureState("select"),{x:d,y:f}),Rl(this,s.get("focus"),s.get("blurScope"),s.get("disabled"))}},e.prototype._updateLabel=function(t,e,n){var i=this,r=e.getItemModel(n),o=r.getModel("labelLine"),a=e.getItemVisual(n,"style"),s=a&&a.fill,l=a&&a.opacity;Hh(i,Yh(r),{labelFetcher:e.hostModel,labelDataIndex:n,inheritColor:s,defaultOpacity:l,defaultText:t.getFormattedLabel(n,"normal")||e.getName(n)});var u=i.getTextContent();i.setTextConfig({position:null,rotation:null}),u.attr({z2:10});var h=t.get(["label","position"]);if("outside"!==h&&"outer"!==h)i.removeTextGuideLine();else{var c=this.getTextGuideLine();c||(c=new Ru,this.setTextGuideLine(c)),db(this,fb(r),{stroke:s,opacity:ot(o.get(["lineStyle","opacity"]),l,1)})}},e}(Cu),lM=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.ignoreLabelLineUpdate=!0,e}return n(e,t),e.prototype.render=function(t,e,n,i){var r,o=t.getData(),a=this._data,s=this.group;if(!a&&o.count()>0){for(var l=o.getItemLayout(0),u=1;isNaN(l&&l.startAngle)&&u<o.count();++u)l=o.getItemLayout(u);l&&(r=l.startAngle)}if(this._emptyCircleSector&&s.remove(this._emptyCircleSector),0===o.count()&&t.get("showEmptyCircle")){var h=new Cu({shape:JS(t,n)});h.useStyle(t.getModel("emptyCircleStyle").getItemStyle()),this._emptyCircleSector=h,s.add(h)}o.diff(a).add((function(t){var e=new sM(o,t,r);o.setItemGraphicEl(t,e),s.add(e)})).update((function(t,e){var n=a.getItemGraphicEl(e);n.updateData(o,t,r),n.off("click"),s.add(n),o.setItemGraphicEl(t,n)})).remove((function(e){uh(a.getItemGraphicEl(e),t,e)})).execute(),oM(t),"expansion"!==t.get("animationTypeUpdate")&&(this._data=o)},e.prototype.dispose=function(){},e.prototype.containPoint=function(t,e){var n=e.getData().getItemLayout(0);if(n){var i=t[0]-n.cx,r=t[1]-n.cy,o=Math.sqrt(i*i+r*r);return o<=n.r&&o>=n.r0}},e.type="pie",e}(xg);function uM(t,e,n){e=Y(e)&&{coordDimensions:e}||A({encodeDefine:t.getEncode()},e);var i=t.getSource(),r=Km(i,e).dimensions,o=new qm(r,t);return o.initData(i,n),o}var hM=function(){function t(t,e){this._getDataWithEncodedVisual=t,this._getRawData=e}return t.prototype.getAllNames=function(){var t=this._getRawData();return t.mapArray(t.getName)},t.prototype.containName=function(t){return this._getRawData().indexOfName(t)>=0},t.prototype.indexOfName=function(t){return this._getDataWithEncodedVisual().indexOfName(t)},t.prototype.getItemVisual=function(t,e){return this._getDataWithEncodedVisual().getItemVisual(t,e)},t}(),cM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new hM(W(this.getData,this),W(this.getRawData,this)),this._defaultLabelLine(e)},e.prototype.mergeOption=function(){t.prototype.mergeOption.apply(this,arguments)},e.prototype.getInitialData=function(){return uM(this,{coordDimensions:["value"],encodeDefaulter:H(Yp,this)})},e.prototype.getDataParams=function(e){var n=this.getData(),i=t.prototype.getDataParams.call(this,e),r=[];return n.each(n.mapDimension("value"),(function(t){r.push(t)})),i.percent=Wr(r,e,n.hostModel.get("percentPrecision")),i.$vars.push("percent"),i},e.prototype._defaultLabelLine=function(t){co(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},e.type="series.pie",e.defaultOption={z:2,legendHoverLink:!0,colorBy:"data",center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,minShowLabelAngle:0,selectedOffset:10,percentPrecision:2,stillShowZeroSum:!0,left:0,top:0,right:0,bottom:0,width:null,height:null,label:{rotate:0,show:!0,overflow:"truncate",position:"outer",alignTo:"none",edgeDistance:"25%",bleedMargin:10,distanceToLabelLine:5},labelLine:{show:!0,length:15,length2:15,smooth:!1,minTurnAngle:90,maxSurfaceAngle:90,lineStyle:{width:1,type:"solid"}},itemStyle:{borderWidth:1,borderJoin:"round"},showEmptyCircle:!0,emptyCircleStyle:{color:"lightgray",opacity:1},labelLayout:{hideOverlap:!0},emphasis:{scale:!0,scaleSize:5},avoidLabelOverlap:!0,animationType:"expansion",animationDuration:1e3,animationTypeUpdate:"transition",animationEasingUpdate:"cubicInOut",animationDurationUpdate:500,animationEasing:"cubicInOut"},e}(sg);var pM=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){return rx(null,this,{useEncodeDefaulter:!0})},e.prototype.getProgressive=function(){var t=this.option.progressive;return null==t?this.option.large?5e3:this.get("progressive"):t},e.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?1e4:this.get("progressiveThreshold"):t},e.prototype.brushSelector=function(t,e,n){return n.point(e.getItemLayout(t))},e.prototype.getZLevelKey=function(){return this.getData().count()>this.getProgressiveThreshold()?this.id:""},e.type="series.scatter",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={coordinateSystem:"cartesian2d",z:2,legendHoverLink:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{opacity:.8},emphasis:{scale:!0},clip:!0,select:{itemStyle:{borderColor:"#212121"}},universalTransition:{divideShape:"clone"}},e}(sg),dM=function(){},fM=function(t){function e(e){var n=t.call(this,e)||this;return n._off=0,n.hoverDataIdx=-1,n}return n(e,t),e.prototype.getDefaultShape=function(){return new dM},e.prototype.reset=function(){this.notClear=!1,this._off=0},e.prototype.buildPath=function(t,e){var n,i=e.points,r=e.size,o=this.symbolProxy,a=o.shape,s=t.getContext?t.getContext():t,l=s&&r[0]<4,u=this.softClipShape;if(l)this._ctx=s;else{for(this._ctx=null,n=this._off;n<i.length;){var h=i[n++],c=i[n++];isNaN(h)||isNaN(c)||(u&&!u.contain(h,c)||(a.x=h-r[0]/2,a.y=c-r[1]/2,a.width=r[0],a.height=r[1],o.buildPath(t,a,!0)))}this.incremental&&(this._off=n,this.notClear=!0)}},e.prototype.afterBrush=function(){var t,e=this.shape,n=e.points,i=e.size,r=this._ctx,o=this.softClipShape;if(r){for(t=this._off;t<n.length;){var a=n[t++],s=n[t++];isNaN(a)||isNaN(s)||(o&&!o.contain(a,s)||r.fillRect(a-i[0]/2,s-i[1]/2,i[0],i[1]))}this.incremental&&(this._off=t,this.notClear=!0)}},e.prototype.findDataIndex=function(t,e){for(var n=this.shape,i=n.points,r=n.size,o=Math.max(r[0],4),a=Math.max(r[1],4),s=i.length/2-1;s>=0;s--){var l=2*s,u=i[l]-o/2,h=i[l+1]-a/2;if(t>=u&&e>=h&&t<=u+o&&e<=h+a)return s}return-1},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return t=n[0],e=n[1],i.contain(t,e)?(this.hoverDataIdx=this.findDataIndex(t,e))>=0:(this.hoverDataIdx=-1,!1)},e.prototype.getBoundingRect=function(){var t=this._rect;if(!t){for(var e=this.shape,n=e.points,i=e.size,r=i[0],o=i[1],a=1/0,s=1/0,l=-1/0,u=-1/0,h=0;h<n.length;){var c=n[h++],p=n[h++];a=Math.min(c,a),l=Math.max(c,l),s=Math.min(p,s),u=Math.max(p,u)}t=this._rect=new sr(a-r/2,s-o/2,l-a+r,u-s+o)}return t},e}(gs),gM=function(){function t(){this.group=new Cr}return t.prototype.updateData=function(t,e){this._clear();var n=this._create();n.setShape({points:t.getLayout("points")}),this._setCommon(n,t,e)},t.prototype.updateLayout=function(t){var e=t.getLayout("points");this.group.eachChild((function(t){if(null!=t.startIndex){var n=2*(t.endIndex-t.startIndex),i=4*t.startIndex*2;e=new Float32Array(e.buffer,i,n)}t.setShape("points",e),t.reset()}))},t.prototype.incrementalPrepareUpdate=function(t){this._clear()},t.prototype.incrementalUpdate=function(t,e,n){var i=this._newAdded[0],r=e.getLayout("points"),o=i&&i.shape.points;if(o&&o.length<2e4){var a=o.length,s=new Float32Array(a+r.length);s.set(o),s.set(r,a),i.endIndex=t.end,i.setShape({points:s})}else{this._newAdded=[];var l=this._create();l.startIndex=t.start,l.endIndex=t.end,l.incremental=!0,l.setShape({points:r}),this._setCommon(l,e,n)}},t.prototype.eachRendered=function(t){this._newAdded[0]&&t(this._newAdded[0])},t.prototype._create=function(){var t=new fM({cursor:"default"});return this.group.add(t),this._newAdded.push(t),t},t.prototype._setCommon=function(t,e,n){var i=e.hostModel;n=n||{};var r=e.getVisual("symbolSize");t.setShape("size",r instanceof Array?r:[r,r]),t.softClipShape=n.clipShape||null,t.symbolProxy=Ly(e.getVisual("symbol"),0,0,0,0),t.setColor=t.symbolProxy.setColor;var o=t.shape.size[0]<4;t.useStyle(i.getModel("itemStyle").getItemStyle(o?["color","shadowBlur","shadowColor"]:["color"]));var a=e.getVisual("style"),s=a&&a.fill;s&&t.setColor(s);var l=Hs(t);l.seriesIndex=i.seriesIndex,t.on("mousemove",(function(e){l.dataIndex=null;var n=t.hoverDataIdx;n>=0&&(l.dataIndex=n+(t.startIndex||0))}))},t.prototype.remove=function(){this._clear()},t.prototype._clear=function(){this._newAdded=[],this.group.removeAll()},t}(),yM=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).updateData(i,{clipShape:this._getClipShape(t)}),this._finished=!0},e.prototype.incrementalPrepareRender=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).incrementalPrepareUpdate(i),this._finished=!1},e.prototype.incrementalRender=function(t,e,n){this._symbolDraw.incrementalUpdate(t,e.getData(),{clipShape:this._getClipShape(e)}),this._finished=t.end===e.getData().count()},e.prototype.updateTransform=function(t,e,n){var i=t.getData();if(this.group.dirty(),!this._finished||i.count()>1e4)return{update:!0};var r=bS("").reset(t,e,n);r.progress&&r.progress({start:0,end:i.count(),count:i.count()},i),this._symbolDraw.updateLayout(i)},e.prototype.eachRendered=function(t){this._symbolDraw&&this._symbolDraw.eachRendered(t)},e.prototype._getClipShape=function(t){var e=t.coordinateSystem,n=e&&e.getArea&&e.getArea();return t.get("clip",!0)?n:null},e.prototype._updateSymbolDraw=function(t,e){var n=this._symbolDraw,i=e.pipelineContext.large;return n&&i===this._isLargeDraw||(n&&n.remove(),n=this._symbolDraw=i?new gM:new qw,this._isLargeDraw=i,this.group.removeAll()),this.group.add(n.group),n},e.prototype.remove=function(t,e){this._symbolDraw&&this._symbolDraw.remove(!0),this._symbolDraw=null},e.prototype.dispose=function(){},e.type="scatter",e}(xg),vM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.type="grid",e.dependencies=["xAxis","yAxis"],e.layoutMode="box",e.defaultOption={show:!1,z:0,left:"10%",top:60,right:"10%",bottom:70,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"},e}(Tp),mM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getCoordSysModel=function(){return this.getReferringComponents("grid",Co).models[0]},e.type="cartesian2dAxis",e}(Tp);R(mM,p_);var xM={show:!0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#6E7079",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#E0E6F1"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.2)","rgba(210,219,238,0.2)"]}}},_M=C({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},xM),bM=C({boundaryGap:[0,0],axisLine:{show:"auto"},axisTick:{show:"auto"},splitNumber:5,minorTick:{show:!1,splitNumber:5,length:3,lineStyle:{}},minorSplitLine:{show:!1,lineStyle:{color:"#F4F7FD",width:1}}},xM),wM={category:_M,value:bM,time:C({splitNumber:6,axisLabel:{showMinLabel:!1,showMaxLabel:!1,rich:{primary:{fontWeight:"bold"}}},splitLine:{show:!1}},bM),log:k({logBase:10},bM)},SM={value:1,category:1,time:1,log:1};function MM(t,e,i,r){E(SM,(function(o,a){var s=C(C({},wM[a],!0),r,!0),l=function(t){function i(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e+"Axis."+a,n}return n(i,t),i.prototype.mergeDefaultAndTheme=function(t,e){var n=bp(this),i=n?Sp(t):{};C(t,e.getTheme().get(a+"Axis")),C(t,this.getDefaultOption()),t.type=IM(t),n&&wp(t,i,n)},i.prototype.optionUpdated=function(){"category"===this.option.type&&(this.__ordinalMeta=sx.createByAxisModel(this))},i.prototype.getCategories=function(t){var e=this.option;if("category"===e.type)return t?e.data:this.__ordinalMeta.categories},i.prototype.getOrdinalMeta=function(){return this.__ordinalMeta},i.type=e+"Axis."+a,i.defaultOption=s,i}(i);t.registerComponentModel(l)})),t.registerSubTypeDefaulter(e+"Axis",IM)}function IM(t){return t.type||(t.data?"category":"value")}var TM=function(){function t(t){this.type="cartesian",this._dimList=[],this._axes={},this.name=t||""}return t.prototype.getAxis=function(t){return this._axes[t]},t.prototype.getAxes=function(){return z(this._dimList,(function(t){return this._axes[t]}),this)},t.prototype.getAxesByScale=function(t){return t=t.toLowerCase(),B(this.getAxes(),(function(e){return e.scale.type===t}))},t.prototype.addAxis=function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},t}(),CM=["x","y"];function DM(t){return"interval"===t.type||"time"===t.type}var AM=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="cartesian2d",e.dimensions=CM,e}return n(e,t),e.prototype.calcAffineTransform=function(){this._transform=this._invTransform=null;var t=this.getAxis("x").scale,e=this.getAxis("y").scale;if(DM(t)&&DM(e)){var n=t.getExtent(),i=e.getExtent(),r=this.dataToPoint([n[0],i[0]]),o=this.dataToPoint([n[1],i[1]]),a=n[1]-n[0],s=i[1]-i[0];if(a&&s){var l=(o[0]-r[0])/a,u=(o[1]-r[1])/s,h=r[0]-n[0]*l,c=r[1]-i[0]*u,p=this._transform=[l,0,0,u,h,c];this._invTransform=Bi([],p)}}},e.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},e.prototype.containPoint=function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},e.prototype.containData=function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},e.prototype.containZone=function(t,e){var n=this.dataToPoint(t),i=this.dataToPoint(e),r=this.getArea(),o=new sr(n[0],n[1],i[0]-n[0],i[1]-n[1]);return r.intersect(o)},e.prototype.dataToPoint=function(t,e,n){n=n||[];var i=t[0],r=t[1];if(this._transform&&null!=i&&isFinite(i)&&null!=r&&isFinite(r))return Ft(n,t,this._transform);var o=this.getAxis("x"),a=this.getAxis("y");return n[0]=o.toGlobalCoord(o.dataToCoord(i,e)),n[1]=a.toGlobalCoord(a.dataToCoord(r,e)),n},e.prototype.clampData=function(t,e){var n=this.getAxis("x").scale,i=this.getAxis("y").scale,r=n.getExtent(),o=i.getExtent(),a=n.parse(t[0]),s=i.parse(t[1]);return(e=e||[])[0]=Math.min(Math.max(Math.min(r[0],r[1]),a),Math.max(r[0],r[1])),e[1]=Math.min(Math.max(Math.min(o[0],o[1]),s),Math.max(o[0],o[1])),e},e.prototype.pointToData=function(t,e){var n=[];if(this._invTransform)return Ft(n,t,this._invTransform);var i=this.getAxis("x"),r=this.getAxis("y");return n[0]=i.coordToData(i.toLocalCoord(t[0]),e),n[1]=r.coordToData(r.toLocalCoord(t[1]),e),n},e.prototype.getOtherAxis=function(t){return this.getAxis("x"===t.dim?"y":"x")},e.prototype.getArea=function(){var t=this.getAxis("x").getGlobalExtent(),e=this.getAxis("y").getGlobalExtent(),n=Math.min(t[0],t[1]),i=Math.min(e[0],e[1]),r=Math.max(t[0],t[1])-n,o=Math.max(e[0],e[1])-i;return new sr(n,i,r,o)},e}(TM),kM=function(t){function e(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.index=0,a.type=r||"value",a.position=o||"bottom",a}return n(e,t),e.prototype.isHorizontal=function(){var t=this.position;return"top"===t||"bottom"===t},e.prototype.getGlobalExtent=function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},e.prototype.pointToData=function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},e.prototype.setCategorySortInfo=function(t){if("category"!==this.type)return!1;this.model.option.categorySortInfo=t,this.scale.setSortInfo(t)},e}(H_);function LM(t,e,n){n=n||{};var i=t.coordinateSystem,r=e.axis,o={},a=r.getAxesOnZeroOf()[0],s=r.position,l=a?"onZero":s,u=r.dim,h=i.getRect(),c=[h.x,h.x+h.width,h.y,h.y+h.height],p={left:0,right:1,top:0,bottom:1,onZero:2},d=e.get("offset")||0,f="x"===u?[c[2]-d,c[3]+d]:[c[0]-d,c[1]+d];if(a){var g=a.toGlobalCoord(a.dataToCoord(0));f[p.onZero]=Math.max(Math.min(g,f[1]),f[0])}o.position=["y"===u?f[p[l]]:c[0],"x"===u?f[p[l]]:c[3]],o.rotation=Math.PI/2*("x"===u?0:1);o.labelDirection=o.tickDirection=o.nameDirection={top:-1,bottom:1,left:-1,right:1}[s],o.labelOffset=a?f[p[s]]-f[p.onZero]:0,e.get(["axisTick","inside"])&&(o.tickDirection=-o.tickDirection),it(n.labelInside,e.get(["axisLabel","inside"]))&&(o.labelDirection=-o.labelDirection);var y=e.get(["axisLabel","rotate"]);return o.labelRotate="top"===l?-y:y,o.z2=1,o}function PM(t){return"cartesian2d"===t.get("coordinateSystem")}function OM(t){var e={xAxisModel:null,yAxisModel:null};return E(e,(function(n,i){var r=i.replace(/Model$/,""),o=t.getReferringComponents(r,Co).models[0];e[i]=o})),e}var RM=Math.log;function NM(t,e,n){var i=xx.prototype,r=i.getTicks.call(n),o=i.getTicks.call(n,!0),a=r.length-1,s=i.getInterval.call(n),l=i_(t,e),u=l.extent,h=l.fixMin,c=l.fixMax;if("log"===t.type){var p=RM(t.base);u=[RM(u[0])/p,RM(u[1])/p]}t.setExtent(u[0],u[1]),t.calcNiceExtent({splitNumber:a,fixMin:h,fixMax:c});var d=i.getExtent.call(t);h&&(u[0]=d[0]),c&&(u[1]=d[1]);var f=i.getInterval.call(t),g=u[0],y=u[1];if(h&&c)f=(y-g)/a;else if(h)for(y=u[0]+f*a;y<u[1]&&isFinite(y)&&isFinite(u[1]);)f=cx(f),y=u[0]+f*a;else if(c)for(g=u[1]-f*a;g>u[0]&&isFinite(g)&&isFinite(u[0]);)f=cx(f),g=u[1]-f*a;else{t.getTicks().length-1>a&&(f=cx(f));var v=f*a;(g=zr((y=Math.ceil(u[1]/f)*f)-v))<0&&u[0]>=0?(g=0,y=zr(v)):y>0&&u[1]<=0&&(y=0,g=-zr(v))}var m=(r[0].value-o[0].value)/s,x=(r[a].value-o[a].value)/s;i.setExtent.call(t,g+f*m,y+f*x),i.setInterval.call(t,f),(m||x)&&i.setNiceExtent.call(t,g+f,y-f)}var EM=function(){function t(t,e,n){this.type="grid",this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this.axisPointerEnabled=!0,this.dimensions=CM,this._initCartesian(t,e,n),this.model=t}return t.prototype.getRect=function(){return this._rect},t.prototype.update=function(t,e){var n=this._axesMap;function i(t){var e,n=G(t),i=n.length;if(i){for(var r=[],o=i-1;o>=0;o--){var a=t[+n[o]],s=a.model,l=a.scale;ux(l)&&s.get("alignTicks")&&null==s.get("interval")?r.push(a):(r_(l,s),ux(l)&&(e=a))}r.length&&(e||r_((e=r.pop()).scale,e.model),E(r,(function(t){NM(t.scale,t.model,e.scale)})))}}this._updateScale(t,this.model),i(n.x),i(n.y);var r={};E(n.x,(function(t){VM(n,"y",t,r)})),E(n.y,(function(t){VM(n,"x",t,r)})),this.resize(this.model,e)},t.prototype.resize=function(t,e,n){var i=t.getBoxLayoutParams(),r=!n&&t.get("containLabel"),o=xp(i,{width:e.getWidth(),height:e.getHeight()});this._rect=o;var a=this._axesList;function s(){E(a,(function(t){var e=t.isHorizontal(),n=e?[0,o.width]:[0,o.height],i=t.inverse?1:0;t.setExtent(n[i],n[1-i]),function(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}(t,e?o.x:o.y)}))}s(),r&&(E(a,(function(t){if(!t.model.get(["axisLabel","inside"])){var e=function(t){var e=t.model,n=t.scale;if(e.get(["axisLabel","show"])&&!n.isBlank()){var i,r,o=n.getExtent();r=n instanceof vx?n.count():(i=n.getTicks()).length;var a,s=t.getLabelModel(),l=a_(t),u=1;r>40&&(u=Math.ceil(r/40));for(var h=0;h<r;h+=u){var c=l(i?i[h]:{value:o[0]+h},h),p=l_(s.getTextRect(c),s.get("rotate")||0);a?a.union(p):a=p}return a}}(t);if(e){var n=t.isHorizontal()?"height":"width",i=t.model.get(["axisLabel","margin"]);o[n]-=e[n]+i,"top"===t.position?o.y+=e.height+i:"left"===t.position&&(o.x+=e.width+i)}}})),s()),E(this._coordsList,(function(t){t.calcAffineTransform()}))},t.prototype.getAxis=function(t,e){var n=this._axesMap[t];if(null!=n)return n[e||0]},t.prototype.getAxes=function(){return this._axesList.slice()},t.prototype.getCartesian=function(t,e){if(null!=t&&null!=e){var n="x"+t+"y"+e;return this._coordsMap[n]}q(t)&&(e=t.yAxisIndex,t=t.xAxisIndex);for(var i=0,r=this._coordsList;i<r.length;i++)if(r[i].getAxis("x").index===t||r[i].getAxis("y").index===e)return r[i]},t.prototype.getCartesians=function(){return this._coordsList.slice()},t.prototype.convertToPixel=function(t,e,n){var i=this._findConvertTarget(e);return i.cartesian?i.cartesian.dataToPoint(n):i.axis?i.axis.toGlobalCoord(i.axis.dataToCoord(n)):null},t.prototype.convertFromPixel=function(t,e,n){var i=this._findConvertTarget(e);return i.cartesian?i.cartesian.pointToData(n):i.axis?i.axis.coordToData(i.axis.toLocalCoord(n)):null},t.prototype._findConvertTarget=function(t){var e,n,i=t.seriesModel,r=t.xAxisModel||i&&i.getReferringComponents("xAxis",Co).models[0],o=t.yAxisModel||i&&i.getReferringComponents("yAxis",Co).models[0],a=t.gridModel,s=this._coordsList;if(i)P(s,e=i.coordinateSystem)<0&&(e=null);else if(r&&o)e=this.getCartesian(r.componentIndex,o.componentIndex);else if(r)n=this.getAxis("x",r.componentIndex);else if(o)n=this.getAxis("y",o.componentIndex);else if(a){a.coordinateSystem===this&&(e=this._coordsList[0])}return{cartesian:e,axis:n}},t.prototype.containPoint=function(t){var e=this._coordsList[0];if(e)return e.containPoint(t)},t.prototype._initCartesian=function(t,e,n){var i=this,r=this,o={left:!1,right:!1,top:!1,bottom:!1},a={x:{},y:{}},s={x:0,y:0};if(e.eachComponent("xAxis",l("x"),this),e.eachComponent("yAxis",l("y"),this),!s.x||!s.y)return this._axesMap={},void(this._axesList=[]);function l(e){return function(n,i){if(zM(n,t)){var l=n.get("position");"x"===e?"top"!==l&&"bottom"!==l&&(l=o.bottom?"top":"bottom"):"left"!==l&&"right"!==l&&(l=o.left?"right":"left"),o[l]=!0;var u=new kM(e,o_(n),[0,0],n.get("type"),l),h="category"===u.type;u.onBand=h&&n.get("boundaryGap"),u.inverse=n.get("inverse"),n.axis=u,u.model=n,u.grid=r,u.index=i,r._axesList.push(u),a[e][i]=u,s[e]++}}}this._axesMap=a,E(a.x,(function(e,n){E(a.y,(function(r,o){var a="x"+n+"y"+o,s=new AM(a);s.master=i,s.model=t,i._coordsMap[a]=s,i._coordsList.push(s),s.addAxis(e),s.addAxis(r)}))}))},t.prototype._updateScale=function(t,e){function n(t,e){E(c_(t,e.dim),(function(n){e.scale.unionExtentFromData(t,n)}))}E(this._axesList,(function(t){if(t.scale.setExtent(1/0,-1/0),"category"===t.type){var e=t.model.get("categorySortInfo");t.scale.setSortInfo(e)}})),t.eachSeries((function(t){if(PM(t)){var i=OM(t),r=i.xAxisModel,o=i.yAxisModel;if(!zM(r,e)||!zM(o,e))return;var a=this.getCartesian(r.componentIndex,o.componentIndex),s=t.getData(),l=a.getAxis("x"),u=a.getAxis("y");n(s,l),n(s,u)}}),this)},t.prototype.getTooltipAxes=function(t){var e=[],n=[];return E(this.getCartesians(),(function(i){var r=null!=t&&"auto"!==t?i.getAxis(t):i.getBaseAxis(),o=i.getOtherAxis(r);P(e,r)<0&&e.push(r),P(n,o)<0&&n.push(o)})),{baseAxes:e,otherAxes:n}},t.create=function(e,n){var i=[];return e.eachComponent("grid",(function(r,o){var a=new t(r,e,n);a.name="grid_"+o,a.resize(r,n,!0),r.coordinateSystem=a,i.push(a)})),e.eachSeries((function(t){if(PM(t)){var e=OM(t),n=e.xAxisModel,i=e.yAxisModel,r=n.getCoordSysModel();0;var o=r.coordinateSystem;t.coordinateSystem=o.getCartesian(n.componentIndex,i.componentIndex)}})),i},t.dimensions=CM,t}();function zM(t,e){return t.getCoordSysModel()===e}function VM(t,e,n,i){n.getAxesOnZeroOf=function(){return r?[r]:[]};var r,o=t[e],a=n.model,s=a.get(["axisLine","onZero"]),l=a.get(["axisLine","onZeroAxisIndex"]);if(s){if(null!=l)BM(o[l])&&(r=o[l]);else for(var u in o)if(o.hasOwnProperty(u)&&BM(o[u])&&!i[h(o[u])]){r=o[u];break}r&&(i[h(r)]=!0)}function h(t){return t.dim+"_"+t.index}}function BM(t){return t&&"category"!==t.type&&"time"!==t.type&&function(t){var e=t.scale.getExtent(),n=e[0],i=e[1];return!(n>0&&i>0||n<0&&i<0)}(t)}var FM=Math.PI,GM=function(){function t(t,e){this.group=new Cr,this.opt=e,this.axisModel=t,k(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0,handleAutoShown:function(){return!0}});var n=new Cr({x:e.position[0],y:e.position[1],rotation:e.rotation});n.updateTransform(),this._transformGroup=n}return t.prototype.hasBuilder=function(t){return!!WM[t]},t.prototype.add=function(t){WM[t](this.opt,this.axisModel,this.group,this._transformGroup)},t.prototype.getGroup=function(){return this.group},t.innerTextLayout=function(t,e,n){var i,r,o=Ur(e-t);return Xr(o)?(r=n>0?"top":"bottom",i="center"):Xr(o-FM)?(r=n>0?"bottom":"top",i="center"):(r="middle",i=o>0&&o<FM?n>0?"right":"left":n>0?"left":"right"),{rotation:o,textAlign:i,textVerticalAlign:r}},t.makeAxisEventDataBase=function(t){var e={componentType:t.mainType,componentIndex:t.componentIndex};return e[t.mainType+"Index"]=t.componentIndex,e},t.isLabelSilent=function(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)},t}(),WM={axisLine:function(t,e,n,i){var r=e.get(["axisLine","show"]);if("auto"===r&&t.handleAutoShown&&(r=t.handleAutoShown("axisLine")),r){var o=e.axis.getExtent(),a=i.transform,s=[o[0],0],l=[o[1],0];a&&(Ft(s,s,a),Ft(l,l,a));var u=A({lineCap:"round"},e.getModel(["axisLine","lineStyle"]).getLineStyle()),h=new zu({subPixelOptimize:!0,shape:{x1:s[0],y1:s[1],x2:l[0],y2:l[1]},style:u,strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1});h.anid="line",n.add(h);var c=e.get(["axisLine","symbol"]);if(null!=c){var p=e.get(["axisLine","symbolSize"]);X(c)&&(c=[c,c]),(X(p)||j(p))&&(p=[p,p]);var d=Oy(e.get(["axisLine","symbolOffset"])||0,p),f=p[0],g=p[1];E([{rotate:t.rotation+Math.PI/2,offset:d[0],r:0},{rotate:t.rotation-Math.PI/2,offset:d[1],r:Math.sqrt((s[0]-l[0])*(s[0]-l[0])+(s[1]-l[1])*(s[1]-l[1]))}],(function(e,i){if("none"!==c[i]&&null!=c[i]){var r=Ly(c[i],-f/2,-g/2,f,g,u.stroke,!0),o=e.r+e.offset;r.attr({rotation:e.rotate,x:s[0]+o*Math.cos(t.rotation),y:s[1]-o*Math.sin(t.rotation),silent:!0,z2:11}),n.add(r)}}))}}},axisTickLabel:function(t,e,n,i){var r=function(t,e,n,i){var r=n.axis,o=n.getModel("axisTick"),a=o.get("show");"auto"===a&&i.handleAutoShown&&(a=i.handleAutoShown("axisTick"));if(!a||r.scale.isBlank())return;for(var s=o.getModel("lineStyle"),l=i.tickDirection*o.get("length"),u=XM(r.getTicksCoords(),e.transform,l,k(s.getLineStyle(),{stroke:n.get(["axisLine","lineStyle","color"])}),"ticks"),h=0;h<u.length;h++)t.add(u[h]);return u}(n,i,e,t),o=function(t,e,n,i){var r=n.axis;if(!it(i.axisLabelShow,n.get(["axisLabel","show"]))||r.scale.isBlank())return;var o=n.getModel("axisLabel"),a=o.get("margin"),s=r.getViewLabels(),l=(it(i.labelRotate,o.get("rotate"))||0)*FM/180,u=GM.innerTextLayout(i.rotation,l,i.labelDirection),h=n.getCategories&&n.getCategories(!0),c=[],p=GM.isLabelSilent(n),d=n.get("triggerEvent");return E(s,(function(s,l){var f="ordinal"===r.scale.type?r.scale.getRawOrdinalNumber(s.tickValue):s.tickValue,g=s.formattedLabel,y=s.rawLabel,v=o;if(h&&h[f]){var m=h[f];q(m)&&m.textStyle&&(v=new dc(m.textStyle,o,n.ecModel))}var x=v.getTextColor()||n.get(["axisLine","lineStyle","color"]),_=r.dataToCoord(f),b=new ks({x:_,y:i.labelOffset+i.labelDirection*a,rotation:u.rotation,silent:p,z2:10+(s.level||0),style:Uh(v,{text:g,align:v.getShallow("align",!0)||u.textAlign,verticalAlign:v.getShallow("verticalAlign",!0)||v.getShallow("baseline",!0)||u.textVerticalAlign,fill:U(x)?x("category"===r.type?y:"value"===r.type?f+"":f,l):x})});if(b.anid="label_"+f,d){var w=GM.makeAxisEventDataBase(n);w.targetType="axisLabel",w.value=y,w.tickIndex=l,"category"===r.type&&(w.dataIndex=f),Hs(b).eventData=w}e.add(b),b.updateTransform(),c.push(b),t.add(b),b.decomposeTransform()})),c}(n,i,e,t);(function(t,e,n){if(h_(t.axis))return;var i=t.get(["axisLabel","showMinLabel"]),r=t.get(["axisLabel","showMaxLabel"]);n=n||[];var o=(e=e||[])[0],a=e[1],s=e[e.length-1],l=e[e.length-2],u=n[0],h=n[1],c=n[n.length-1],p=n[n.length-2];!1===i?(HM(o),HM(u)):YM(o,a)&&(i?(HM(a),HM(h)):(HM(o),HM(u)));!1===r?(HM(s),HM(c)):YM(l,s)&&(r?(HM(l),HM(p)):(HM(s),HM(c)))}(e,o,r),function(t,e,n,i){var r=n.axis,o=n.getModel("minorTick");if(!o.get("show")||r.scale.isBlank())return;var a=r.getMinorTicksCoords();if(!a.length)return;for(var s=o.getModel("lineStyle"),l=i*o.get("length"),u=k(s.getLineStyle(),k(n.getModel("axisTick").getLineStyle(),{stroke:n.get(["axisLine","lineStyle","color"])})),h=0;h<a.length;h++)for(var c=XM(a[h],e.transform,l,u,"minorticks_"+h),p=0;p<c.length;p++)t.add(c[p])}(n,i,e,t.tickDirection),e.get(["axisLabel","hideOverlap"]))&&mb(gb(z(o,(function(t){return{label:t,priority:t.z2,defaultAttr:{ignore:t.ignore}}}))))},axisName:function(t,e,n,i){var r=it(t.axisName,e.get("name"));if(r){var o,a,s=e.get("nameLocation"),l=t.nameDirection,u=e.getModel("nameTextStyle"),h=e.get("nameGap")||0,c=e.axis.getExtent(),p=c[0]>c[1]?-1:1,d=["start"===s?c[0]-p*h:"end"===s?c[1]+p*h:(c[0]+c[1])/2,UM(s)?t.labelOffset+l*h:0],f=e.get("nameRotate");null!=f&&(f=f*FM/180),UM(s)?o=GM.innerTextLayout(t.rotation,null!=f?f:t.rotation,l):(o=function(t,e,n,i){var r,o,a=Ur(n-t),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;Xr(a-FM/2)?(o=l?"bottom":"top",r="center"):Xr(a-1.5*FM)?(o=l?"top":"bottom",r="center"):(o="middle",r=a<1.5*FM&&a>FM/2?l?"left":"right":l?"right":"left");return{rotation:a,textAlign:r,textVerticalAlign:o}}(t.rotation,s,f||0,c),null!=(a=t.axisNameAvailableWidth)&&(a=Math.abs(a/Math.sin(o.rotation)),!isFinite(a)&&(a=null)));var g=u.getFont(),y=e.get("nameTruncate",!0)||{},v=y.ellipsis,m=it(t.nameTruncateMaxWidth,y.maxWidth,a),x=new ks({x:d[0],y:d[1],rotation:o.rotation,silent:GM.isLabelSilent(e),style:Uh(u,{text:r,font:g,overflow:"truncate",width:m,ellipsis:v,fill:u.getTextColor()||e.get(["axisLine","lineStyle","color"]),align:u.get("align")||o.textAlign,verticalAlign:u.get("verticalAlign")||o.textVerticalAlign}),z2:1});if(Eh({el:x,componentModel:e,itemName:r}),x.__fullText=r,x.anid="name",e.get("triggerEvent")){var _=GM.makeAxisEventDataBase(e);_.targetType="axisName",_.name=r,Hs(x).eventData=_}i.add(x),x.updateTransform(),n.add(x),x.decomposeTransform()}}};function HM(t){t&&(t.ignore=!0)}function YM(t,e){var n=t&&t.getBoundingRect().clone(),i=e&&e.getBoundingRect().clone();if(n&&i){var r=Oi([]);return zi(r,r,-t.rotation),n.applyTransform(Ni([],r,t.getLocalTransform())),i.applyTransform(Ni([],r,e.getLocalTransform())),n.intersect(i)}}function UM(t){return"middle"===t||"center"===t}function XM(t,e,n,i,r){for(var o=[],a=[],s=[],l=0;l<t.length;l++){var u=t[l].coord;a[0]=u,a[1]=0,s[0]=u,s[1]=n,e&&(Ft(a,a,e),Ft(s,s,e));var h=new zu({subPixelOptimize:!0,shape:{x1:a[0],y1:a[1],x2:s[0],y2:s[1]},style:i,z2:2,autoBatch:!0,silent:!0});h.anid=r+"_"+t[l].tickValue,o.push(h)}return o}function ZM(t,e){var n={axesInfo:{},seriesInvolved:!1,coordSysAxesInfo:{},coordSysMap:{}};return function(t,e,n){var i=e.getComponent("tooltip"),r=e.getComponent("axisPointer"),o=r.get("link",!0)||[],a=[];E(n.getCoordinateSystems(),(function(n){if(n.axisPointerEnabled){var s=JM(n.model),l=t.coordSysAxesInfo[s]={};t.coordSysMap[s]=n;var u=n.model.getModel("tooltip",i);if(E(n.getAxes(),H(d,!1,null)),n.getTooltipAxes&&i&&u.get("show")){var h="axis"===u.get("trigger"),c="cross"===u.get(["axisPointer","type"]),p=n.getTooltipAxes(u.get(["axisPointer","axis"]));(h||c)&&E(p.baseAxes,H(d,!c||"cross",h)),c&&E(p.otherAxes,H(d,"cross",!1))}}function d(i,s,h){var c=h.model.getModel("axisPointer",r),p=c.get("show");if(p&&("auto"!==p||i||$M(c))){null==s&&(s=c.get("triggerTooltip"));var d=(c=i?function(t,e,n,i,r,o){var a=e.getModel("axisPointer"),s={};E(["type","snap","lineStyle","shadowStyle","label","animation","animationDurationUpdate","animationEasingUpdate","z"],(function(t){s[t]=T(a.get(t))})),s.snap="category"!==t.type&&!!o,"cross"===a.get("type")&&(s.type="line");var l=s.label||(s.label={});if(null==l.show&&(l.show=!1),"cross"===r){var u=a.get(["label","show"]);if(l.show=null==u||u,!o){var h=s.lineStyle=a.get("crossStyle");h&&k(l,h.textStyle)}}return t.model.getModel("axisPointer",new dc(s,n,i))}(h,u,r,e,i,s):c).get("snap"),f=JM(h.model),g=s||d||"category"===h.type,y=t.axesInfo[f]={key:f,axis:h,coordSys:n,axisPointerModel:c,triggerTooltip:s,involveSeries:g,snap:d,useHandle:$M(c),seriesModels:[],linkGroup:null};l[f]=y,t.seriesInvolved=t.seriesInvolved||g;var v=function(t,e){for(var n=e.model,i=e.dim,r=0;r<t.length;r++){var o=t[r]||{};if(jM(o[i+"AxisId"],n.id)||jM(o[i+"AxisIndex"],n.componentIndex)||jM(o[i+"AxisName"],n.name))return r}}(o,h);if(null!=v){var m=a[v]||(a[v]={axesInfo:{}});m.axesInfo[f]=y,m.mapper=o[v].mapper,y.linkGroup=m}}}}))}(n,t,e),n.seriesInvolved&&function(t,e){e.eachSeries((function(e){var n=e.coordinateSystem,i=e.get(["tooltip","trigger"],!0),r=e.get(["tooltip","show"],!0);n&&"none"!==i&&!1!==i&&"item"!==i&&!1!==r&&!1!==e.get(["axisPointer","show"],!0)&&E(t.coordSysAxesInfo[JM(n.model)],(function(t){var i=t.axis;n.getAxis(i.dim)===i&&(t.seriesModels.push(e),null==t.seriesDataCount&&(t.seriesDataCount=0),t.seriesDataCount+=e.getData().count())}))}))}(n,t),n}function jM(t,e){return"all"===t||Y(t)&&P(t,e)>=0||t===e}function qM(t){var e=KM(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,o=n.get("status"),a=n.get("value");null!=a&&(a=i.parse(a));var s=$M(n);null==o&&(r.status=s?"show":"hide");var l=i.getExtent().slice();l[0]>l[1]&&l.reverse(),(null==a||a>l[1])&&(a=l[1]),a<l[0]&&(a=l[0]),r.value=a,s&&(r.status=e.axis.scale.isBlank()?"hide":"show")}}function KM(t){var e=(t.ecModel.getComponent("axisPointer")||{}).coordSysAxesInfo;return e&&e.axesInfo[JM(t)]}function $M(t){return!!t.get(["handle","show"])}function JM(t){return t.type+"||"+t.id}var QM={},tI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(e,n,i,r){this.axisPointerClass&&qM(e),t.prototype.render.apply(this,arguments),this._doUpdateAxisPointerClass(e,i,!0)},e.prototype.updateAxisPointer=function(t,e,n,i){this._doUpdateAxisPointerClass(t,n,!1)},e.prototype.remove=function(t,e){var n=this._axisPointer;n&&n.remove(e)},e.prototype.dispose=function(e,n){this._disposeAxisPointer(n),t.prototype.dispose.apply(this,arguments)},e.prototype._doUpdateAxisPointerClass=function(t,n,i){var r=e.getAxisPointerClass(this.axisPointerClass);if(r){var o=function(t){var e=KM(t);return e&&e.axisPointerModel}(t);o?(this._axisPointer||(this._axisPointer=new r)).render(t,o,n,i):this._disposeAxisPointer(n)}},e.prototype._disposeAxisPointer=function(t){this._axisPointer&&this._axisPointer.dispose(t),this._axisPointer=null},e.registerAxisPointerClass=function(t,e){QM[t]=e},e.getAxisPointerClass=function(t){return t&&QM[t]},e.type="axis",e}(gg),eI=So();function nI(t,e,n,i){var r=n.axis;if(!r.scale.isBlank()){var o=n.getModel("splitArea"),a=o.getModel("areaStyle"),s=a.get("color"),l=i.coordinateSystem.getRect(),u=r.getTicksCoords({tickModel:o,clamp:!0});if(u.length){var h=s.length,c=eI(t).splitAreaColors,p=ft(),d=0;if(c)for(var f=0;f<u.length;f++){var g=c.get(u[f].tickValue);if(null!=g){d=(g+(h-1)*f)%h;break}}var y=r.toGlobalCoord(u[0].coord),v=a.getAreaStyle();s=Y(s)?s:[s];for(f=1;f<u.length;f++){var m=r.toGlobalCoord(u[f].coord),x=void 0,_=void 0,b=void 0,w=void 0;r.isHorizontal()?(x=y,_=l.y,b=m-x,w=l.height,y=x+b):(x=l.x,_=y,b=l.width,y=_+(w=m-_));var S=u[f-1].tickValue;null!=S&&p.set(S,d),e.add(new Cs({anid:null!=S?"area_"+S:null,shape:{x:x,y:_,width:b,height:w},style:k({fill:s[d]},v),autoBatch:!0,silent:!0})),d=(d+1)%h}eI(t).splitAreaColors=p}}}function iI(t){eI(t).splitAreaColors=null}var rI=["axisLine","axisTickLabel","axisName"],oI=["splitArea","splitLine","minorSplitLine"],aI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="CartesianAxisPointer",n}return n(e,t),e.prototype.render=function(e,n,i,r){this.group.removeAll();var o=this._axisGroup;if(this._axisGroup=new Cr,this.group.add(this._axisGroup),e.get("show")){var a=e.getCoordSysModel(),s=LM(a,e),l=new GM(e,A({handleAutoShown:function(t){for(var n=a.coordinateSystem.getCartesians(),i=0;i<n.length;i++)if(ux(n[i].getOtherAxis(e.axis).scale))return!0;return!1}},s));E(rI,l.add,l),this._axisGroup.add(l.getGroup()),E(oI,(function(t){e.get([t,"show"])&&sI[t](this,this._axisGroup,e,a)}),this),r&&"changeAxisOrder"===r.type&&r.isInitSort||Ah(o,this._axisGroup,e),t.prototype.render.call(this,e,n,i,r)}},e.prototype.remove=function(){iI(this)},e.type="cartesianAxis",e}(tI),sI={splitLine:function(t,e,n,i){var r=n.axis;if(!r.scale.isBlank()){var o=n.getModel("splitLine"),a=o.getModel("lineStyle"),s=a.get("color");s=Y(s)?s:[s];for(var l=i.coordinateSystem.getRect(),u=r.isHorizontal(),h=0,c=r.getTicksCoords({tickModel:o}),p=[],d=[],f=a.getLineStyle(),g=0;g<c.length;g++){var y=r.toGlobalCoord(c[g].coord);u?(p[0]=y,p[1]=l.y,d[0]=y,d[1]=l.y+l.height):(p[0]=l.x,p[1]=y,d[0]=l.x+l.width,d[1]=y);var v=h++%s.length,m=c[g].tickValue;e.add(new zu({anid:null!=m?"line_"+c[g].tickValue:null,subPixelOptimize:!0,autoBatch:!0,shape:{x1:p[0],y1:p[1],x2:d[0],y2:d[1]},style:k({stroke:s[v]},f),silent:!0}))}}},minorSplitLine:function(t,e,n,i){var r=n.axis,o=n.getModel("minorSplitLine").getModel("lineStyle"),a=i.coordinateSystem.getRect(),s=r.isHorizontal(),l=r.getMinorTicksCoords();if(l.length)for(var u=[],h=[],c=o.getLineStyle(),p=0;p<l.length;p++)for(var d=0;d<l[p].length;d++){var f=r.toGlobalCoord(l[p][d].coord);s?(u[0]=f,u[1]=a.y,h[0]=f,h[1]=a.y+a.height):(u[0]=a.x,u[1]=f,h[0]=a.x+a.width,h[1]=f),e.add(new zu({anid:"minor_line_"+l[p][d].tickValue,subPixelOptimize:!0,autoBatch:!0,shape:{x1:u[0],y1:u[1],x2:h[0],y2:h[1]},style:c,silent:!0}))}},splitArea:function(t,e,n,i){nI(t,e,n,i)}},lI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="xAxis",e}(aI),uI=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=lI.type,e}return n(e,t),e.type="yAxis",e}(aI),hI=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="grid",e}return n(e,t),e.prototype.render=function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new Cs({shape:t.coordinateSystem.getRect(),style:k({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0,z2:-1}))},e.type="grid",e}(gg),cI={offset:0};function pI(t){t.registerComponentView(hI),t.registerComponentModel(vM),t.registerCoordinateSystem("cartesian2d",EM),MM(t,"x",mM,cI),MM(t,"y",mM,cI),t.registerComponentView(lI),t.registerComponentView(uI),t.registerPreprocessor((function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})}))}function dI(t){t.eachSeriesByType("radar",(function(t){var e=t.getData(),n=[],i=t.coordinateSystem;if(i){var r=i.getIndicatorAxes();E(r,(function(t,o){e.each(e.mapDimension(r[o].dim),(function(t,e){n[e]=n[e]||[];var r=i.dataToPoint(t,o);n[e][o]=fI(r)?r:gI(i)}))})),e.each((function(t){var r=F(n[t],(function(t){return fI(t)}))||gI(i);n[t].push(r.slice()),e.setItemLayout(t,n[t])}))}}))}function fI(t){return!isNaN(t[0])&&!isNaN(t[1])}function gI(t){return[t.cx,t.cy]}function yI(t){var e=t.polar;if(e){Y(e)||(e=[e]);var n=[];E(e,(function(e,i){e.indicator?(e.type&&!e.shape&&(e.shape=e.type),t.radar=t.radar||[],Y(t.radar)||(t.radar=[t.radar]),t.radar.push(e)):n.push(e)})),t.polar=n}E(t.series,(function(t){t&&"radar"===t.type&&t.polarIndex&&(t.radarIndex=t.polarIndex)}))}var vI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.coordinateSystem,r=this.group,o=t.getData(),a=this._data;function s(t,e){var n=t.getItemVisual(e,"symbol")||"circle";if("none"!==n){var i=Py(t.getItemVisual(e,"symbolSize")),r=Ly(n,-1,-1,2,2),o=t.getItemVisual(e,"symbolRotate")||0;return r.attr({style:{strokeNoScale:!0},z2:100,scaleX:i[0]/2,scaleY:i[1]/2,rotation:o*Math.PI/180||0}),r}}function l(e,n,i,r,o,a){i.removeAll();for(var l=0;l<n.length-1;l++){var u=s(r,o);u&&(u.__dimIdx=l,e[l]?(u.setPosition(e[l]),Bh[a?"initProps":"updateProps"](u,{x:n[l][0],y:n[l][1]},t,o)):u.setPosition(n[l]),i.add(u))}}function u(t){return z(t,(function(t){return[i.cx,i.cy]}))}o.diff(a).add((function(e){var n=o.getItemLayout(e);if(n){var i=new Pu,r=new Ru,a={shape:{points:n}};i.shape.points=u(n),r.shape.points=u(n),oh(i,a,t,e),oh(r,a,t,e);var s=new Cr,h=new Cr;s.add(r),s.add(i),s.add(h),l(r.shape.points,n,h,o,e,!0),o.setItemGraphicEl(e,s)}})).update((function(e,n){var i=a.getItemGraphicEl(n),r=i.childAt(0),s=i.childAt(1),u=i.childAt(2),h={shape:{points:o.getItemLayout(e)}};h.shape.points&&(l(r.shape.points,h.shape.points,u,o,e,!1),hh(s),hh(r),rh(r,h,t),rh(s,h,t),o.setItemGraphicEl(e,i))})).remove((function(t){r.remove(a.getItemGraphicEl(t))})).execute(),o.eachItemGraphicEl((function(t,e){var n=o.getItemModel(e),i=t.childAt(0),a=t.childAt(1),s=t.childAt(2),l=o.getItemVisual(e,"style"),u=l.fill;r.add(t),i.useStyle(k(n.getModel("lineStyle").getLineStyle(),{fill:"none",stroke:u})),Vl(i,n,"lineStyle"),Vl(a,n,"areaStyle");var h=n.getModel("areaStyle"),c=h.isEmpty()&&h.parentModel.isEmpty();a.ignore=c,E(["emphasis","select","blur"],(function(t){var e=n.getModel([t,"areaStyle"]),i=e.isEmpty()&&e.parentModel.isEmpty();a.ensureState(t).ignore=i&&c})),a.useStyle(k(h.getAreaStyle(),{fill:u,opacity:.7,decal:l.decal}));var p=n.getModel("emphasis"),d=p.getModel("itemStyle").getItemStyle();s.eachChild((function(t){if(t instanceof _s){var i=t.style;t.useStyle(A({image:i.image,x:i.x,y:i.y,width:i.width,height:i.height},l))}else t.useStyle(l),t.setColor(u),t.style.strokeNoScale=!0;t.ensureState("emphasis").style=T(d);var r=o.getStore().get(o.getDimensionIndex(t.__dimIdx),e);(null==r||isNaN(r))&&(r=""),Hh(t,Yh(n),{labelFetcher:o.hostModel,labelDataIndex:e,labelDimIndex:t.__dimIdx,defaultText:r,inheritColor:u,defaultOpacity:l.opacity})})),Rl(t,p.get("focus"),p.get("blurScope"),p.get("disabled"))})),this._data=o},e.prototype.remove=function(){this.group.removeAll(),this._data=null},e.type="radar",e}(xg),mI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new hM(W(this.getData,this),W(this.getRawData,this))},e.prototype.getInitialData=function(t,e){return uM(this,{generateCoord:"indicator_",generateCoordCount:1/0})},e.prototype.formatTooltip=function(t,e,n){var i=this.getData(),r=this.coordinateSystem.getIndicatorAxes(),o=this.getData().getName(t),a=""===o?this.name:o,s=eg(this,t);return Xf("section",{header:a,sortBlocks:!0,blocks:z(r,(function(e){var n=i.get(i.mapDimension(e.dim),t);return Xf("nameValue",{markerType:"subItem",markerColor:s,name:e.name,value:n,sortParam:n})}))})},e.prototype.getTooltipPosition=function(t){if(null!=t)for(var e=this.getData(),n=this.coordinateSystem,i=e.getValues(z(n.dimensions,(function(t){return e.mapDimension(t)})),t),r=0,o=i.length;r<o;r++)if(!isNaN(i[r])){var a=n.getIndicatorAxes();return n.coordToPoint(a[r].dataToCoord(i[r]),r)}},e.type="series.radar",e.dependencies=["radar"],e.defaultOption={z:2,colorBy:"data",coordinateSystem:"radar",legendHoverLink:!0,radarIndex:0,lineStyle:{width:2,type:"solid",join:"round"},label:{position:"top"},symbolSize:8},e}(sg),xI=wM.value;function _I(t,e){return k({show:e},t)}var bI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(){var t=this.get("boundaryGap"),e=this.get("splitNumber"),n=this.get("scale"),i=this.get("axisLine"),r=this.get("axisTick"),o=this.get("axisLabel"),a=this.get("axisName"),s=this.get(["axisName","show"]),l=this.get(["axisName","formatter"]),u=this.get("axisNameGap"),h=this.get("triggerEvent"),c=z(this.get("indicator")||[],(function(c){null!=c.max&&c.max>0&&!c.min?c.min=0:null!=c.min&&c.min<0&&!c.max&&(c.max=0);var p=a;null!=c.color&&(p=k({color:c.color},a));var d=C(T(c),{boundaryGap:t,splitNumber:e,scale:n,axisLine:i,axisTick:r,axisLabel:o,name:c.text,showName:s,nameLocation:"end",nameGap:u,nameTextStyle:p,triggerEvent:h},!1);if(X(l)){var f=d.name;d.name=l.replace("{value}",null!=f?f:"")}else U(l)&&(d.name=l(d.name,d));var g=new dc(d,null,this.ecModel);return R(g,p_.prototype),g.mainType="radar",g.componentIndex=this.componentIndex,g}),this);this._indicatorModels=c},e.prototype.getIndicatorModels=function(){return this._indicatorModels},e.type="radar",e.defaultOption={z:0,center:["50%","50%"],radius:"75%",startAngle:90,axisName:{show:!0},boundaryGap:[0,0],splitNumber:5,axisNameGap:15,scale:!1,shape:"polygon",axisLine:C({lineStyle:{color:"#bbb"}},xI.axisLine),axisLabel:_I(xI.axisLabel,!1),axisTick:_I(xI.axisTick,!1),splitLine:_I(xI.splitLine,!0),splitArea:_I(xI.splitArea,!0),indicator:[]},e}(Tp),wI=["axisLine","axisTickLabel","axisName"],SI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeAll(),this._buildAxes(t),this._buildSplitLineAndArea(t)},e.prototype._buildAxes=function(t){var e=t.coordinateSystem;E(z(e.getIndicatorAxes(),(function(t){var n=t.model.get("showName")?t.name:"";return new GM(t.model,{axisName:n,position:[e.cx,e.cy],rotation:t.angle,labelDirection:-1,tickDirection:-1,nameDirection:1})})),(function(t){E(wI,t.add,t),this.group.add(t.getGroup())}),this)},e.prototype._buildSplitLineAndArea=function(t){var e=t.coordinateSystem,n=e.getIndicatorAxes();if(n.length){var i=t.get("shape"),r=t.getModel("splitLine"),o=t.getModel("splitArea"),a=r.getModel("lineStyle"),s=o.getModel("areaStyle"),l=r.get("show"),u=o.get("show"),h=a.get("color"),c=s.get("color"),p=Y(h)?h:[h],d=Y(c)?c:[c],f=[],g=[];if("circle"===i)for(var y=n[0].getTicksCoords(),v=e.cx,m=e.cy,x=0;x<y.length;x++){if(l)f[C(f,p,x)].push(new hu({shape:{cx:v,cy:m,r:y[x].coord}}));if(u&&x<y.length-1)g[C(g,d,x)].push(new Au({shape:{cx:v,cy:m,r0:y[x].coord,r:y[x+1].coord}}))}else{var _,b=z(n,(function(t,n){var i=t.getTicksCoords();return _=null==_?i.length-1:Math.min(i.length-1,_),z(i,(function(t){return e.coordToPoint(t.coord,n)}))})),w=[];for(x=0;x<=_;x++){for(var S=[],M=0;M<n.length;M++)S.push(b[M][x]);if(S[0]&&S.push(S[0].slice()),l)f[C(f,p,x)].push(new Ru({shape:{points:S}}));if(u&&w)g[C(g,d,x-1)].push(new Pu({shape:{points:S.concat(w)}}));w=S.slice().reverse()}}var I=a.getLineStyle(),T=s.getAreaStyle();E(g,(function(t,e){this.group.add(wh(t,{style:k({stroke:"none",fill:d[e%d.length]},T),silent:!0}))}),this),E(f,(function(t,e){this.group.add(wh(t,{style:k({fill:"none",stroke:p[e%p.length]},I),silent:!0}))}),this)}function C(t,e,n){var i=n%e.length;return t[i]=t[i]||[],i}},e.type="radar",e}(gg),MI=function(t){function e(e,n,i){var r=t.call(this,e,n,i)||this;return r.type="value",r.angle=0,r.name="",r}return n(e,t),e}(H_),II=function(){function t(t,e,n){this.dimensions=[],this._model=t,this._indicatorAxes=z(t.getIndicatorModels(),(function(t,e){var n="indicator_"+e,i=new MI(n,new xx);return i.name=t.get("name"),i.model=t,t.axis=i,this.dimensions.push(n),i}),this),this.resize(t,n)}return t.prototype.getIndicatorAxes=function(){return this._indicatorAxes},t.prototype.dataToPoint=function(t,e){var n=this._indicatorAxes[e];return this.coordToPoint(n.dataToCoord(t),e)},t.prototype.coordToPoint=function(t,e){var n=this._indicatorAxes[e].angle;return[this.cx+t*Math.cos(n),this.cy-t*Math.sin(n)]},t.prototype.pointToData=function(t){var e=t[0]-this.cx,n=t[1]-this.cy,i=Math.sqrt(e*e+n*n);e/=i,n/=i;for(var r,o=Math.atan2(-n,e),a=1/0,s=-1,l=0;l<this._indicatorAxes.length;l++){var u=this._indicatorAxes[l],h=Math.abs(o-u.angle);h<a&&(r=u,s=l,a=h)}return[s,+(r&&r.coordToData(i))]},t.prototype.resize=function(t,e){var n=t.get("center"),i=e.getWidth(),r=e.getHeight(),o=Math.min(i,r)/2;this.cx=Er(n[0],i),this.cy=Er(n[1],r),this.startAngle=t.get("startAngle")*Math.PI/180;var a=t.get("radius");(X(a)||j(a))&&(a=[0,a]),this.r0=Er(a[0],o),this.r=Er(a[1],o),E(this._indicatorAxes,(function(t,e){t.setExtent(this.r0,this.r);var n=this.startAngle+e*Math.PI*2/this._indicatorAxes.length;n=Math.atan2(Math.sin(n),Math.cos(n)),t.angle=n}),this)},t.prototype.update=function(t,e){var n=this._indicatorAxes,i=this._model;E(n,(function(t){t.scale.setExtent(1/0,-1/0)})),t.eachSeriesByType("radar",(function(e,r){if("radar"===e.get("coordinateSystem")&&t.getComponent("radar",e.get("radarIndex"))===i){var o=e.getData();E(n,(function(t){t.scale.unionExtentFromData(o,o.mapDimension(t.dim))}))}}),this);var r=i.get("splitNumber"),o=new xx;o.setExtent(0,r),o.setInterval(1),E(n,(function(t,e){NM(t.scale,t.model,o)}))},t.prototype.convertToPixel=function(t,e,n){return console.warn("Not implemented."),null},t.prototype.convertFromPixel=function(t,e,n){return console.warn("Not implemented."),null},t.prototype.containPoint=function(t){return console.warn("Not implemented."),!1},t.create=function(e,n){var i=[];return e.eachComponent("radar",(function(r){var o=new t(r,e,n);i.push(o),r.coordinateSystem=o})),e.eachSeriesByType("radar",(function(t){"radar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("radarIndex")||0])})),i},t.dimensions=[],t}();function TI(t){t.registerCoordinateSystem("radar",II),t.registerComponentModel(bI),t.registerComponentView(SI),t.registerVisual({seriesType:"radar",reset:function(t){var e=t.getData();e.each((function(t){e.setItemVisual(t,"legendIcon","roundRect")})),e.setVisual("legendIcon","roundRect")}})}var CI="\0_ec_interaction_mutex";function DI(t,e){return!!AI(t)[e]}function AI(t){return t[CI]||(t[CI]={})}cm({type:"takeGlobalCursor",event:"globalCursorTaken",update:"update"},xt);var kI=function(t){function e(e){var n=t.call(this)||this;n._zr=e;var i=W(n._mousedownHandler,n),r=W(n._mousemoveHandler,n),o=W(n._mouseupHandler,n),a=W(n._mousewheelHandler,n),s=W(n._pinchHandler,n);return n.enable=function(t,n){this.disable(),this._opt=k(T(n)||{},{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),null==t&&(t=!0),!0!==t&&"move"!==t&&"pan"!==t||(e.on("mousedown",i),e.on("mousemove",r),e.on("mouseup",o)),!0!==t&&"scale"!==t&&"zoom"!==t||(e.on("mousewheel",a),e.on("pinch",s))},n.disable=function(){e.off("mousedown",i),e.off("mousemove",r),e.off("mouseup",o),e.off("mousewheel",a),e.off("pinch",s)},n}return n(e,t),e.prototype.isDragging=function(){return this._dragging},e.prototype.isPinching=function(){return this._pinching},e.prototype.setPointerChecker=function(t){this.pointerChecker=t},e.prototype.dispose=function(){this.disable()},e.prototype._mousedownHandler=function(t){if(!(le(t)||t.target&&t.target.draggable)){var e=t.offsetX,n=t.offsetY;this.pointerChecker&&this.pointerChecker(t,e,n)&&(this._x=e,this._y=n,this._dragging=!0)}},e.prototype._mousemoveHandler=function(t){if(this._dragging&&OI("moveOnMouseMove",t,this._opt)&&"pinch"!==t.gestureEvent&&!DI(this._zr,"globalPan")){var e=t.offsetX,n=t.offsetY,i=this._x,r=this._y,o=e-i,a=n-r;this._x=e,this._y=n,this._opt.preventDefaultMouseMove&&se(t.event),PI(this,"pan","moveOnMouseMove",t,{dx:o,dy:a,oldX:i,oldY:r,newX:e,newY:n,isAvailableBehavior:null})}},e.prototype._mouseupHandler=function(t){le(t)||(this._dragging=!1)},e.prototype._mousewheelHandler=function(t){var e=OI("zoomOnMouseWheel",t,this._opt),n=OI("moveOnMouseWheel",t,this._opt),i=t.wheelDelta,r=Math.abs(i),o=t.offsetX,a=t.offsetY;if(0!==i&&(e||n)){if(e){var s=r>3?1.4:r>1?1.2:1.1;LI(this,"zoom","zoomOnMouseWheel",t,{scale:i>0?s:1/s,originX:o,originY:a,isAvailableBehavior:null})}if(n){var l=Math.abs(i);LI(this,"scrollMove","moveOnMouseWheel",t,{scrollDelta:(i>0?1:-1)*(l>3?.4:l>1?.15:.05),originX:o,originY:a,isAvailableBehavior:null})}}},e.prototype._pinchHandler=function(t){DI(this._zr,"globalPan")||LI(this,"zoom",null,t,{scale:t.pinchScale>1?1.1:1/1.1,originX:t.pinchX,originY:t.pinchY,isAvailableBehavior:null})},e}(Xt);function LI(t,e,n,i,r){t.pointerChecker&&t.pointerChecker(i,r.originX,r.originY)&&(se(i.event),PI(t,e,n,i,r))}function PI(t,e,n,i,r){r.isAvailableBehavior=W(OI,null,n,i),t.trigger(e,r)}function OI(t,e,n){var i=n[t];return!t||i&&(!X(i)||e.event[i+"Key"])}function RI(t,e,n){var i=t.target;i.x+=e,i.y+=n,i.dirty()}function NI(t,e,n,i){var r=t.target,o=t.zoomLimit,a=t.zoom=t.zoom||1;if(a*=e,o){var s=o.min||0,l=o.max||1/0;a=Math.max(Math.min(l,a),s)}var u=a/t.zoom;t.zoom=a,r.x-=(n-r.x)*(u-1),r.y-=(i-r.y)*(u-1),r.scaleX*=u,r.scaleY*=u,r.dirty()}var EI,zI={axisPointer:1,tooltip:1,brush:1};function VI(t,e,n){var i=e.getComponentByElement(t.topTarget),r=i&&i.coordinateSystem;return i&&i!==n&&!zI.hasOwnProperty(i.mainType)&&r&&r.model!==n}function BI(t){X(t)&&(t=(new DOMParser).parseFromString(t,"text/xml"));var e=t;for(9===e.nodeType&&(e=e.firstChild);"svg"!==e.nodeName.toLowerCase()||1!==e.nodeType;)e=e.nextSibling;return e}var FI={fill:"fill",stroke:"stroke","stroke-width":"lineWidth",opacity:"opacity","fill-opacity":"fillOpacity","stroke-opacity":"strokeOpacity","stroke-dasharray":"lineDash","stroke-dashoffset":"lineDashOffset","stroke-linecap":"lineCap","stroke-linejoin":"lineJoin","stroke-miterlimit":"miterLimit","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","text-anchor":"textAlign",visibility:"visibility",display:"display"},GI=G(FI),WI={"alignment-baseline":"textBaseline","stop-color":"stopColor"},HI=G(WI),YI=function(){function t(){this._defs={},this._root=null}return t.prototype.parse=function(t,e){e=e||{};var n=BI(t);this._defsUsePending=[];var i=new Cr;this._root=i;var r=[],o=n.getAttribute("viewBox")||"",a=parseFloat(n.getAttribute("width")||e.width),s=parseFloat(n.getAttribute("height")||e.height);isNaN(a)&&(a=null),isNaN(s)&&(s=null),KI(n,i,null,!0,!1);for(var l,u,h=n.firstChild;h;)this._parseNode(h,i,r,null,!1,!1),h=h.nextSibling;if(function(t,e){for(var n=0;n<e.length;n++){var i=e[n];i[0].style[i[1]]=t[i[2]]}}(this._defs,this._defsUsePending),this._defsUsePending=[],o){var c=tT(o);c.length>=4&&(l={x:parseFloat(c[0]||0),y:parseFloat(c[1]||0),width:parseFloat(c[2]),height:parseFloat(c[3])})}if(l&&null!=a&&null!=s&&(u=oT(l,{x:0,y:0,width:a,height:s}),!e.ignoreViewBox)){var p=i;(i=new Cr).add(p),p.scaleX=p.scaleY=u.scale,p.x=u.x,p.y=u.y}return e.ignoreRootClip||null==a||null==s||i.setClipPath(new Cs({shape:{x:0,y:0,width:a,height:s}})),{root:i,width:a,height:s,viewBoxRect:l,viewBoxTransform:u,named:r}},t.prototype._parseNode=function(t,e,n,i,r,o){var a,s=t.nodeName.toLowerCase(),l=i;if("defs"===s&&(r=!0),"text"===s&&(o=!0),"defs"===s||"switch"===s)a=e;else{if(!r){var u=EI[s];if(u&&mt(EI,s)){a=u.call(this,t,e);var h=t.getAttribute("name");if(h){var c={name:h,namedFrom:null,svgNodeTagLower:s,el:a};n.push(c),"g"===s&&(l=c)}else i&&n.push({name:i.name,namedFrom:i,svgNodeTagLower:s,el:a});e.add(a)}}var p=UI[s];if(p&&mt(UI,s)){var d=p.call(this,t),f=t.getAttribute("id");f&&(this._defs[f]=d)}}if(a&&a.isGroup)for(var g=t.firstChild;g;)1===g.nodeType?this._parseNode(g,a,n,l,r,o):3===g.nodeType&&o&&this._parseText(g,a),g=g.nextSibling},t.prototype._parseText=function(t,e){var n=new vs({style:{text:t.textContent},silent:!0,x:this._textX||0,y:this._textY||0});jI(e,n),KI(t,n,this._defsUsePending,!1,!1),function(t,e){var n=e.__selfStyle;if(n){var i=n.textBaseline,r=i;i&&"auto"!==i?"baseline"===i?r="alphabetic":"before-edge"===i||"text-before-edge"===i?r="top":"after-edge"===i||"text-after-edge"===i?r="bottom":"central"!==i&&"mathematical"!==i||(r="middle"):r="alphabetic",t.style.textBaseline=r}var o=e.__inheritedStyle;if(o){var a=o.textAlign,s=a;a&&("middle"===a&&(s="center"),t.style.textAlign=s)}}(n,e);var i=n.style,r=i.fontSize;r&&r<9&&(i.fontSize=9,n.scaleX*=r/9,n.scaleY*=r/9);var o=(i.fontSize||i.fontFamily)&&[i.fontStyle,i.fontWeight,(i.fontSize||12)+"px",i.fontFamily||"sans-serif"].join(" ");i.font=o;var a=n.getBoundingRect();return this._textX+=a.width,e.add(n),n},t.internalField=void(EI={g:function(t,e){var n=new Cr;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n},rect:function(t,e){var n=new Cs;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.setShape({x:parseFloat(t.getAttribute("x")||"0"),y:parseFloat(t.getAttribute("y")||"0"),width:parseFloat(t.getAttribute("width")||"0"),height:parseFloat(t.getAttribute("height")||"0")}),n.silent=!0,n},circle:function(t,e){var n=new hu;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),r:parseFloat(t.getAttribute("r")||"0")}),n.silent=!0,n},line:function(t,e){var n=new zu;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.setShape({x1:parseFloat(t.getAttribute("x1")||"0"),y1:parseFloat(t.getAttribute("y1")||"0"),x2:parseFloat(t.getAttribute("x2")||"0"),y2:parseFloat(t.getAttribute("y2")||"0")}),n.silent=!0,n},ellipse:function(t,e){var n=new pu;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),rx:parseFloat(t.getAttribute("rx")||"0"),ry:parseFloat(t.getAttribute("ry")||"0")}),n.silent=!0,n},polygon:function(t,e){var n,i=t.getAttribute("points");i&&(n=qI(i));var r=new Pu({shape:{points:n||[]},silent:!0});return jI(e,r),KI(t,r,this._defsUsePending,!1,!1),r},polyline:function(t,e){var n,i=t.getAttribute("points");i&&(n=qI(i));var r=new Ru({shape:{points:n||[]},silent:!0});return jI(e,r),KI(t,r,this._defsUsePending,!1,!1),r},image:function(t,e){var n=new _s;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.setStyle({image:t.getAttribute("xlink:href")||t.getAttribute("href"),x:+t.getAttribute("x"),y:+t.getAttribute("y"),width:+t.getAttribute("width"),height:+t.getAttribute("height")}),n.silent=!0,n},text:function(t,e){var n=t.getAttribute("x")||"0",i=t.getAttribute("y")||"0",r=t.getAttribute("dx")||"0",o=t.getAttribute("dy")||"0";this._textX=parseFloat(n)+parseFloat(r),this._textY=parseFloat(i)+parseFloat(o);var a=new Cr;return jI(e,a),KI(t,a,this._defsUsePending,!1,!0),a},tspan:function(t,e){var n=t.getAttribute("x"),i=t.getAttribute("y");null!=n&&(this._textX=parseFloat(n)),null!=i&&(this._textY=parseFloat(i));var r=t.getAttribute("dx")||"0",o=t.getAttribute("dy")||"0",a=new Cr;return jI(e,a),KI(t,a,this._defsUsePending,!1,!0),this._textX+=parseFloat(r),this._textY+=parseFloat(o),a},path:function(t,e){var n=su(t.getAttribute("d")||"");return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.silent=!0,n}}),t}(),UI={lineargradient:function(t){var e=parseInt(t.getAttribute("x1")||"0",10),n=parseInt(t.getAttribute("y1")||"0",10),i=parseInt(t.getAttribute("x2")||"10",10),r=parseInt(t.getAttribute("y2")||"0",10),o=new Xu(e,n,i,r);return XI(t,o),ZI(t,o),o},radialgradient:function(t){var e=parseInt(t.getAttribute("cx")||"0",10),n=parseInt(t.getAttribute("cy")||"0",10),i=parseInt(t.getAttribute("r")||"0",10),r=new Zu(e,n,i);return XI(t,r),ZI(t,r),r}};function XI(t,e){"userSpaceOnUse"===t.getAttribute("gradientUnits")&&(e.global=!0)}function ZI(t,e){for(var n=t.firstChild;n;){if(1===n.nodeType&&"stop"===n.nodeName.toLocaleLowerCase()){var i=n.getAttribute("offset"),r=void 0;r=i&&i.indexOf("%")>0?parseInt(i,10)/100:i?parseFloat(i):0;var o={};rT(n,o,o);var a=o.stopColor||n.getAttribute("stop-color")||"#000000";e.colorStops.push({offset:r,color:a})}n=n.nextSibling}}function jI(t,e){t&&t.__inheritedStyle&&(e.__inheritedStyle||(e.__inheritedStyle={}),k(e.__inheritedStyle,t.__inheritedStyle))}function qI(t){for(var e=tT(t),n=[],i=0;i<e.length;i+=2){var r=parseFloat(e[i]),o=parseFloat(e[i+1]);n.push([r,o])}return n}function KI(t,e,n,i,r){var o=e,a=o.__inheritedStyle=o.__inheritedStyle||{},s={};1===t.nodeType&&(function(t,e){var n=t.getAttribute("transform");if(n){n=n.replace(/,/g," ");var i=[],r=null;n.replace(eT,(function(t,e,n){return i.push(e,n),""}));for(var o=i.length-1;o>0;o-=2){var a=i[o],s=i[o-1],l=tT(a);switch(r=r||[1,0,0,1,0,0],s){case"translate":Ei(r,r,[parseFloat(l[0]),parseFloat(l[1]||"0")]);break;case"scale":Vi(r,r,[parseFloat(l[0]),parseFloat(l[1]||l[0])]);break;case"rotate":zi(r,r,-parseFloat(l[0])*nT);break;case"skewX":Ni(r,[1,0,Math.tan(parseFloat(l[0])*nT),1,0,0],r);break;case"skewY":Ni(r,[1,Math.tan(parseFloat(l[0])*nT),0,1,0,0],r);break;case"matrix":r[0]=parseFloat(l[0]),r[1]=parseFloat(l[1]),r[2]=parseFloat(l[2]),r[3]=parseFloat(l[3]),r[4]=parseFloat(l[4]),r[5]=parseFloat(l[5])}}e.setLocalTransform(r)}}(t,e),rT(t,a,s),i||function(t,e,n){for(var i=0;i<GI.length;i++){var r=GI[i];null!=(o=t.getAttribute(r))&&(e[FI[r]]=o)}for(i=0;i<HI.length;i++){var o;r=HI[i];null!=(o=t.getAttribute(r))&&(n[WI[r]]=o)}}(t,a,s)),o.style=o.style||{},null!=a.fill&&(o.style.fill=JI(o,"fill",a.fill,n)),null!=a.stroke&&(o.style.stroke=JI(o,"stroke",a.stroke,n)),E(["lineWidth","opacity","fillOpacity","strokeOpacity","miterLimit","fontSize"],(function(t){null!=a[t]&&(o.style[t]=parseFloat(a[t]))})),E(["lineDashOffset","lineCap","lineJoin","fontWeight","fontFamily","fontStyle","textAlign"],(function(t){null!=a[t]&&(o.style[t]=a[t])})),r&&(o.__selfStyle=s),a.lineDash&&(o.style.lineDash=z(tT(a.lineDash),(function(t){return parseFloat(t)}))),"hidden"!==a.visibility&&"collapse"!==a.visibility||(o.invisible=!0),"none"===a.display&&(o.ignore=!0)}var $I=/^url\(\s*#(.*?)\)/;function JI(t,e,n,i){var r=n&&n.match($I);if(!r)return"none"===n&&(n=null),n;var o=ut(r[1]);i.push([t,e,o])}var QI=/-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g;function tT(t){return t.match(QI)||[]}var eT=/(translate|scale|rotate|skewX|skewY|matrix)\(([\-\s0-9\.eE,]*)\)/g,nT=Math.PI/180;var iT=/([^\s:;]+)\s*:\s*([^:;]+)/g;function rT(t,e,n){var i,r=t.getAttribute("style");if(r)for(iT.lastIndex=0;null!=(i=iT.exec(r));){var o=i[1],a=mt(FI,o)?FI[o]:null;a&&(e[a]=i[2]);var s=mt(WI,o)?WI[o]:null;s&&(n[s]=i[2])}}function oT(t,e){var n=e.width/t.width,i=e.height/t.height,r=Math.min(n,i);return{scale:r,x:-(t.x+t.width/2)*r+(e.x+e.width/2),y:-(t.y+t.height/2)*r+(e.y+e.height/2)}}var aT=ft(["rect","circle","line","ellipse","polygon","polyline","path","text","tspan","g"]),sT=function(){function t(t,e){this.type="geoSVG",this._usedGraphicMap=ft(),this._freedGraphics=[],this._mapName=t,this._parsedXML=BI(e)}return t.prototype.load=function(){var t=this._firstGraphic;if(!t){t=this._firstGraphic=this._buildGraphic(this._parsedXML),this._freedGraphics.push(t),this._boundingRect=this._firstGraphic.boundingRect.clone();var e=function(t){var e=[],n=ft();return E(t,(function(t){if(null==t.namedFrom){var i=new M_(t.name,t.el);e.push(i),n.set(t.name,i)}})),{regions:e,regionsMap:n}}(t.named),n=e.regions,i=e.regionsMap;this._regions=n,this._regionsMap=i}return{boundingRect:this._boundingRect,regions:this._regions,regionsMap:this._regionsMap}},t.prototype._buildGraphic=function(t){var e,n,i,r;try{lt(null!=(n=(e=t&&(i=t,r={ignoreViewBox:!0,ignoreRootClip:!0},(new YI).parse(i,r))||{}).root))}catch(t){throw new Error("Invalid svg format\n"+t.message)}var o=new Cr;o.add(n),o.isGeoSVGGraphicRoot=!0;var a=e.width,s=e.height,l=e.viewBoxRect,u=this._boundingRect;if(!u){var h=void 0,c=void 0,p=void 0,d=void 0;if(null!=a?(h=0,p=a):l&&(h=l.x,p=l.width),null!=s?(c=0,d=s):l&&(c=l.y,d=l.height),null==h||null==c){var f=n.getBoundingRect();null==h&&(h=f.x,p=f.width),null==c&&(c=f.y,d=f.height)}u=this._boundingRect=new sr(h,c,p,d)}if(l){var g=oT(l,u);n.scaleX=n.scaleY=g.scale,n.x=g.x,n.y=g.y}o.setClipPath(new Cs({shape:u.plain()}));var y=[];return E(e.named,(function(t){var e;null!=aT.get(t.svgNodeTagLower)&&(y.push(t),(e=t.el).silent=!1,e.isGroup&&e.traverse((function(t){t.silent=!1})))})),{root:o,boundingRect:u,named:y}},t.prototype.useGraphic=function(t){var e=this._usedGraphicMap,n=e.get(t);return n||(n=this._freedGraphics.pop()||this._buildGraphic(this._parsedXML),e.set(t,n),n)},t.prototype.freeGraphic=function(t){var e=this._usedGraphicMap,n=e.get(t);n&&(e.removeKey(t),this._freedGraphics.push(n))},t}();for(var lT=[126,25],uT="南海诸岛",hT=[[[0,3.5],[7,11.2],[15,11.9],[30,7],[42,.7],[52,.7],[56,7.7],[59,.7],[64,.7],[64,0],[5,0],[0,3.5]],[[13,16.1],[19,14.7],[16,21.7],[11,23.1],[13,16.1]],[[12,32.2],[14,38.5],[15,38.5],[13,32.2],[12,32.2]],[[16,47.6],[12,53.2],[13,53.2],[18,47.6],[16,47.6]],[[6,64.4],[8,70],[9,70],[8,64.4],[6,64.4]],[[23,82.6],[29,79.8],[30,79.8],[25,82.6],[23,82.6]],[[37,70.7],[43,62.3],[44,62.3],[39,70.7],[37,70.7]],[[48,51.1],[51,45.5],[53,45.5],[50,51.1],[48,51.1]],[[51,35],[51,28.7],[53,28.7],[53,35],[51,35]],[[52,22.4],[55,17.5],[56,17.5],[53,22.4],[52,22.4]],[[58,12.6],[62,7],[63,7],[60,12.6],[58,12.6]],[[0,3.5],[0,93.1],[64,93.1],[64,0],[63,0],[63,92.4],[1,92.4],[1,3.5],[0,3.5]]],cT=0;cT<hT.length;cT++)for(var pT=0;pT<hT[cT].length;pT++)hT[cT][pT][0]/=10.5,hT[cT][pT][1]/=-14,hT[cT][pT][0]+=lT[0],hT[cT][pT][1]+=lT[1];var dT={"南海诸岛":[32,80],"广东":[0,-10],"香港":[10,5],"澳门":[-10,10],"天津":[5,5]};var fT=[[[123.45165252685547,25.73527164402261],[123.49731445312499,25.73527164402261],[123.49731445312499,25.750734064600884],[123.45165252685547,25.750734064600884],[123.45165252685547,25.73527164402261]]];var gT=function(){function t(t,e,n){var i;this.type="geoJSON",this._parsedMap=ft(),this._mapName=t,this._specialAreas=n,this._geoJSON=X(i=e)?"undefined"!=typeof JSON&&JSON.parse?JSON.parse(i):new Function("return ("+i+");")():i}return t.prototype.load=function(t,e){e=e||"name";var n=this._parsedMap.get(e);if(!n){var i=this._parseToRegions(e);n=this._parsedMap.set(e,{regions:i,boundingRect:yT(i)})}var r=ft(),o=[];return E(n.regions,(function(e){var n=e.name;t&&mt(t,n)&&(e=e.cloneShallow(n=t[n])),o.push(e),r.set(n,e)})),{regions:o,boundingRect:n.boundingRect||new sr(0,0,0,0),regionsMap:r}},t.prototype._parseToRegions=function(t){var e,n=this._mapName,i=this._geoJSON;try{e=i?C_(i,t):[]}catch(t){throw new Error("Invalid geoJson format\n"+t.message)}return function(t,e){if("china"===t){for(var n=0;n<e.length;n++)if(e[n].name===uT)return;e.push(new S_(uT,z(hT,(function(t){return{type:"polygon",exterior:t}})),lT))}}(n,e),E(e,(function(t){var e=t.name;!function(t,e){if("china"===t){var n=dT[e.name];if(n){var i=e.getCenter();i[0]+=n[0]/10.5,i[1]+=-n[1]/14,e.setCenter(i)}}}(n,t),function(t,e){"china"===t&&"台湾"===e.name&&e.geometries.push({type:"polygon",exterior:fT[0]})}(n,t);var i=this._specialAreas&&this._specialAreas[e];i&&t.transformTo(i.left,i.top,i.width,i.height)}),this),e},t.prototype.getMapForUser=function(){return{geoJson:this._geoJSON,geoJSON:this._geoJSON,specialAreas:this._specialAreas}},t}();function yT(t){for(var e,n=0;n<t.length;n++){var i=t[n].getBoundingRect();(e=e||i.clone()).union(i)}return e}var vT=ft(),mT=function(t,e,n){if(e.svg){var i=new sT(t,e.svg);vT.set(t,i)}else{var r=e.geoJson||e.geoJSON;r&&!e.features?n=e.specialAreas:r=e;i=new gT(t,r,n);vT.set(t,i)}},xT=function(t){return vT.get(t)},_T=function(t){var e=vT.get(t);return e&&"geoJSON"===e.type&&e.getMapForUser()},bT=function(t,e,n){var i=vT.get(t);if(i)return i.load(e,n)},wT=["rect","circle","line","ellipse","polygon","polyline","path"],ST=ft(wT),MT=ft(wT.concat(["g"])),IT=ft(wT.concat(["g"])),TT=So();function CT(t){var e=t.getItemStyle(),n=t.get("areaColor");return null!=n&&(e.fill=n),e}function DT(t){var e=t.style;e&&(e.stroke=e.stroke||e.fill,e.fill=null)}var AT=function(){function t(t){var e=new Cr;this.uid=gc("ec_map_draw"),this._controller=new kI(t.getZr()),this._controllerHost={target:e},this.group=e,e.add(this._regionsGroup=new Cr),e.add(this._svgGroup=new Cr)}return t.prototype.draw=function(t,e,n,i,r){var o="geo"===t.mainType,a=t.getData&&t.getData();o&&e.eachComponent({mainType:"series",subType:"map"},(function(e){a||e.getHostGeoModel()!==t||(a=e.getData())}));var s=t.coordinateSystem,l=this._regionsGroup,u=this.group,h=s.getTransformInfo(),c=h.raw,p=h.roam;!l.childAt(0)||r?(u.x=p.x,u.y=p.y,u.scaleX=p.scaleX,u.scaleY=p.scaleY,u.dirty()):rh(u,p,t);var d=a&&a.getVisual("visualMeta")&&a.getVisual("visualMeta").length>0,f={api:n,geo:s,mapOrGeoModel:t,data:a,isVisualEncodedByVisualMap:d,isGeo:o,transformInfoRaw:c};"geoJSON"===s.resourceType?this._buildGeoJSON(f):"geoSVG"===s.resourceType&&this._buildSVG(f),this._updateController(t,e,n),this._updateMapSelectHandler(t,l,n,i)},t.prototype._buildGeoJSON=function(t){var e=this._regionsGroupByName=ft(),n=ft(),i=this._regionsGroup,r=t.transformInfoRaw,o=t.mapOrGeoModel,a=t.data,s=t.geo.projection,l=s&&s.stream;function u(t,e){return e&&(t=e(t)),t&&[t[0]*r.scaleX+r.x,t[1]*r.scaleY+r.y]}function h(t){for(var e=[],n=!l&&s&&s.project,i=0;i<t.length;++i){var r=u(t[i],n);r&&e.push(r)}return e}function c(t){return{shape:{points:h(t)}}}i.removeAll(),E(t.geo.regions,(function(r){var h=r.name,p=e.get(h),d=n.get(h)||{},f=d.dataIdx,g=d.regionModel;p||(p=e.set(h,new Cr),i.add(p),f=a?a.indexOfName(h):null,g=t.isGeo?o.getRegionModel(h):a?a.getItemModel(f):null,n.set(h,{dataIdx:f,regionModel:g}));var y=[],v=[];E(r.geometries,(function(t){if("polygon"===t.type){var e=[t.exterior].concat(t.interiors||[]);l&&(e=NT(e,l)),E(e,(function(t){y.push(new Pu(c(t)))}))}else{var n=t.points;l&&(n=NT(n,l,!0)),E(n,(function(t){v.push(new Ru(c(t)))}))}}));var m=u(r.getCenter(),s&&s.project);function x(e,n){if(e.length){var i=new Yu({culling:!0,segmentIgnoreThreshold:1,shape:{paths:e}});p.add(i),kT(t,i,f,g),LT(t,i,h,g,o,f,m),n&&(DT(i),E(i.states,DT))}}x(y),x(v,!0)})),e.each((function(e,i){var r=n.get(i),a=r.dataIdx,s=r.regionModel;PT(t,e,i,s,o,a),OT(t,e,i,s,o),RT(t,e,i,s,o)}),this)},t.prototype._buildSVG=function(t){var e=t.geo.map,n=t.transformInfoRaw;this._svgGroup.x=n.x,this._svgGroup.y=n.y,this._svgGroup.scaleX=n.scaleX,this._svgGroup.scaleY=n.scaleY,this._svgResourceChanged(e)&&(this._freeSVG(),this._useSVG(e));var i=this._svgDispatcherMap=ft(),r=!1;E(this._svgGraphicRecord.named,(function(e){var n=e.name,o=t.mapOrGeoModel,a=t.data,s=e.svgNodeTagLower,l=e.el,u=a?a.indexOfName(n):null,h=o.getRegionModel(n);(null!=ST.get(s)&&l instanceof da&&kT(t,l,u,h),l instanceof da&&(l.culling=!0),l.z2EmphasisLift=0,e.namedFrom)||(null!=IT.get(s)&<(t,l,n,h,o,u,null),PT(t,l,n,h,o,u),OT(t,l,n,h,o),null!=MT.get(s)&&("self"===RT(t,l,n,h,o)&&(r=!0),(i.get(n)||i.set(n,[])).push(l)))}),this),this._enableBlurEntireSVG(r,t)},t.prototype._enableBlurEntireSVG=function(t,e){if(t&&e.isGeo){var n=e.mapOrGeoModel.getModel(["blur","itemStyle"]).getItemStyle().opacity;this._svgGraphicRecord.root.traverse((function(t){if(!t.isGroup){vl(t);var e=t.ensureState("blur").style||{};null==e.opacity&&null!=n&&(e.opacity=n),t.ensureState("emphasis")}}))}},t.prototype.remove=function(){this._regionsGroup.removeAll(),this._regionsGroupByName=null,this._svgGroup.removeAll(),this._freeSVG(),this._controller.dispose(),this._controllerHost=null},t.prototype.findHighDownDispatchers=function(t,e){if(null==t)return[];var n=e.coordinateSystem;if("geoJSON"===n.resourceType){var i=this._regionsGroupByName;if(i){var r=i.get(t);return r?[r]:[]}}else if("geoSVG"===n.resourceType)return this._svgDispatcherMap&&this._svgDispatcherMap.get(t)||[]},t.prototype._svgResourceChanged=function(t){return this._svgMapName!==t},t.prototype._useSVG=function(t){var e=xT(t);if(e&&"geoSVG"===e.type){var n=e.useGraphic(this.uid);this._svgGroup.add(n.root),this._svgGraphicRecord=n,this._svgMapName=t}},t.prototype._freeSVG=function(){var t=this._svgMapName;if(null!=t){var e=xT(t);e&&"geoSVG"===e.type&&e.freeGraphic(this.uid),this._svgGraphicRecord=null,this._svgDispatcherMap=null,this._svgGroup.removeAll(),this._svgMapName=null}},t.prototype._updateController=function(t,e,n){var i=t.coordinateSystem,r=this._controller,o=this._controllerHost;o.zoomLimit=t.get("scaleLimit"),o.zoom=i.getZoom(),r.enable(t.get("roam")||!1);var a=t.mainType;function s(){var e={type:"geoRoam",componentType:a};return e[a+"Id"]=t.id,e}r.off("pan").on("pan",(function(t){this._mouseDownFlag=!1,RI(o,t.dx,t.dy),n.dispatchAction(A(s(),{dx:t.dx,dy:t.dy,animation:{duration:0}}))}),this),r.off("zoom").on("zoom",(function(t){this._mouseDownFlag=!1,NI(o,t.scale,t.originX,t.originY),n.dispatchAction(A(s(),{zoom:t.scale,originX:t.originX,originY:t.originY,animation:{duration:0}}))}),this),r.setPointerChecker((function(e,r,o){return i.containPoint([r,o])&&!VI(e,n,t)}))},t.prototype.resetForLabelLayout=function(){this.group.traverse((function(t){var e=t.getTextContent();e&&(e.ignore=TT(e).ignore)}))},t.prototype._updateMapSelectHandler=function(t,e,n,i){var r=this;e.off("mousedown"),e.off("click"),t.get("selectedMode")&&(e.on("mousedown",(function(){r._mouseDownFlag=!0})),e.on("click",(function(t){r._mouseDownFlag&&(r._mouseDownFlag=!1)})))},t}();function kT(t,e,n,i){var r=i.getModel("itemStyle"),o=i.getModel(["emphasis","itemStyle"]),a=i.getModel(["blur","itemStyle"]),s=i.getModel(["select","itemStyle"]),l=CT(r),u=CT(o),h=CT(s),c=CT(a),p=t.data;if(p){var d=p.getItemVisual(n,"style"),f=p.getItemVisual(n,"decal");t.isVisualEncodedByVisualMap&&d.fill&&(l.fill=d.fill),f&&(l.decal=rv(f,t.api))}e.setStyle(l),e.style.strokeNoScale=!0,e.ensureState("emphasis").style=u,e.ensureState("select").style=h,e.ensureState("blur").style=c,vl(e)}function LT(t,e,n,i,r,o,a){var s=t.data,l=t.isGeo,u=s&&isNaN(s.get(s.mapDimension("value"),o)),h=s&&s.getItemLayout(o);if(l||u||h&&h.showLabel){var c=l?n:o,p=void 0;(!s||o>=0)&&(p=r);var d=a?{normal:{align:"center",verticalAlign:"middle"}}:null;Hh(e,Yh(i),{labelFetcher:p,labelDataIndex:c,defaultText:n},d);var f=e.getTextContent();if(f&&(TT(f).ignore=f.ignore,e.textConfig&&a)){var g=e.getBoundingRect().clone();e.textConfig.layoutRect=g,e.textConfig.position=[(a[0]-g.x)/g.width*100+"%",(a[1]-g.y)/g.height*100+"%"]}e.disableLabelAnimation=!0}else e.removeTextContent(),e.removeTextConfig(),e.disableLabelAnimation=null}function PT(t,e,n,i,r,o){t.data?t.data.setItemGraphicEl(o,e):Hs(e).eventData={componentType:"geo",componentIndex:r.componentIndex,geoIndex:r.componentIndex,name:n,region:i&&i.option||{}}}function OT(t,e,n,i,r){t.data||Eh({el:e,componentModel:r,itemName:n,itemTooltipOption:i.get("tooltip")})}function RT(t,e,n,i,r){e.highDownSilentOnTouch=!!r.get("selectedMode");var o=i.getModel("emphasis"),a=o.get("focus");return Rl(e,a,o.get("blurScope"),o.get("disabled")),t.isGeo&&function(t,e,n){var i=Hs(t);i.componentMainType=e.mainType,i.componentIndex=e.componentIndex,i.componentHighDownName=n}(e,r,n),a}function NT(t,e,n){var i,r=[];function o(){i=[]}function a(){i.length&&(r.push(i),i=[])}var s=e({polygonStart:o,polygonEnd:a,lineStart:o,lineEnd:a,point:function(t,e){isFinite(t)&&isFinite(e)&&i.push([t,e])},sphere:function(){}});return!n&&s.polygonStart(),E(t,(function(t){s.lineStart();for(var e=0;e<t.length;e++)s.point(t[e][0],t[e][1]);s.lineEnd()})),!n&&s.polygonEnd(),r}var ET=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){if(!i||"mapToggleSelect"!==i.type||i.from!==this.uid){var r=this.group;if(r.removeAll(),!t.getHostGeoModel()){if(this._mapDraw&&i&&"geoRoam"===i.type&&this._mapDraw.resetForLabelLayout(),i&&"geoRoam"===i.type&&"series"===i.componentType&&i.seriesId===t.id)(o=this._mapDraw)&&r.add(o.group);else if(t.needsDrawMap){var o=this._mapDraw||new AT(n);r.add(o.group),o.draw(t,e,n,this,i),this._mapDraw=o}else this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null;t.get("showLegendSymbol")&&e.getComponent("legend")&&this._renderSymbols(t,e,n)}}},e.prototype.remove=function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null,this.group.removeAll()},e.prototype.dispose=function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null},e.prototype._renderSymbols=function(t,e,n){var i=t.originalData,r=this.group;i.each(i.mapDimension("value"),(function(e,n){if(!isNaN(e)){var o=i.getItemLayout(n);if(o&&o.point){var a=o.point,s=o.offset,l=new hu({style:{fill:t.getData().getVisual("style").fill},shape:{cx:a[0]+9*s,cy:a[1],r:3},silent:!0,z2:8+(s?0:11)});if(!s){var u=t.mainSeries.getData(),h=i.getName(n),c=u.indexOfName(h),p=i.getItemModel(n),d=p.getModel("label"),f=u.getItemGraphicEl(c);Hh(l,Yh(p),{labelFetcher:{getFormattedLabel:function(e,n){return t.getFormattedLabel(c,n)}},defaultText:h}),l.disableLabelAnimation=!0,d.get("position")||l.setTextConfig({position:"bottom"}),f.onHoverStateChange=function(t){gl(l,t)}}r.add(l)}}}))},e.type="map",e}(xg),zT=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.needsDrawMap=!1,n.seriesGroup=[],n.getTooltipPosition=function(t){if(null!=t){var e=this.getData().getName(t),n=this.coordinateSystem,i=n.getRegion(e);return i&&n.dataToPoint(i.getCenter())}},n}return n(e,t),e.prototype.getInitialData=function(t){for(var e=uM(this,{coordDimensions:["value"],encodeDefaulter:H(Yp,this)}),n=ft(),i=[],r=0,o=e.count();r<o;r++){var a=e.getName(r);n.set(a,!0)}return E(bT(this.getMapType(),this.option.nameMap,this.option.nameProperty).regions,(function(t){var e=t.name;n.get(e)||i.push(e)})),e.appendValues([],i),e},e.prototype.getHostGeoModel=function(){var t=this.option.geoIndex;return null!=t?this.ecModel.getComponent("geo",t):null},e.prototype.getMapType=function(){return(this.getHostGeoModel()||this).option.map},e.prototype.getRawValue=function(t){var e=this.getData();return e.get(e.mapDimension("value"),t)},e.prototype.getRegionModel=function(t){var e=this.getData();return e.getItemModel(e.indexOfName(t))},e.prototype.formatTooltip=function(t,e,n){for(var i=this.getData(),r=this.getRawValue(t),o=i.getName(t),a=this.seriesGroup,s=[],l=0;l<a.length;l++){var u=a[l].originalData.indexOfName(o),h=i.mapDimension("value");isNaN(a[l].originalData.get(h,u))||s.push(a[l].name)}return Xf("section",{header:s.join(", "),noHeader:!s.length,blocks:[Xf("nameValue",{name:o,value:r})]})},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.getLegendIcon=function(t){var e=t.icon||"roundRect",n=Ly(e,0,0,t.itemWidth,t.itemHeight,t.itemStyle.fill);return n.setStyle(t.itemStyle),n.style.stroke="none",e.indexOf("empty")>-1&&(n.style.stroke=n.style.fill,n.style.fill="#fff",n.style.lineWidth=2),n},e.type="series.map",e.dependencies=["geo"],e.layoutMode="box",e.defaultOption={z:2,coordinateSystem:"geo",map:"",left:"center",top:"center",aspectScale:null,showLegendSymbol:!0,boundingCoords:null,center:null,zoom:1,scaleLimit:null,selectedMode:!0,label:{show:!1,color:"#000"},itemStyle:{borderWidth:.5,borderColor:"#444",areaColor:"#eee"},emphasis:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{areaColor:"rgba(255,215,0,0.8)"}},select:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{color:"rgba(255,215,0,0.8)"}},nameProperty:"name"},e}(sg);function VT(t){var e={};t.eachSeriesByType("map",(function(t){var n=t.getHostGeoModel(),i=n?"o"+n.id:"i"+t.getMapType();(e[i]=e[i]||[]).push(t)})),E(e,(function(t,e){for(var n,i,r,o=(n=z(t,(function(t){return t.getData()})),i=t[0].get("mapValueCalculation"),r={},E(n,(function(t){t.each(t.mapDimension("value"),(function(e,n){var i="ec-"+t.getName(n);r[i]=r[i]||[],isNaN(e)||r[i].push(e)}))})),n[0].map(n[0].mapDimension("value"),(function(t,e){for(var o="ec-"+n[0].getName(e),a=0,s=1/0,l=-1/0,u=r[o].length,h=0;h<u;h++)s=Math.min(s,r[o][h]),l=Math.max(l,r[o][h]),a+=r[o][h];return 0===u?NaN:"min"===i?s:"max"===i?l:"average"===i?a/u:a}))),a=0;a<t.length;a++)t[a].originalData=t[a].getData();for(a=0;a<t.length;a++)t[a].seriesGroup=t,t[a].needsDrawMap=0===a&&!t[a].getHostGeoModel(),t[a].setData(o.cloneShallow()),t[a].mainSeries=t[0]}))}function BT(t){var e={};t.eachSeriesByType("map",(function(n){var i=n.getMapType();if(!n.getHostGeoModel()&&!e[i]){var r={};E(n.seriesGroup,(function(e){var n=e.coordinateSystem,i=e.originalData;e.get("showLegendSymbol")&&t.getComponent("legend")&&i.each(i.mapDimension("value"),(function(t,e){var o=i.getName(e),a=n.getRegion(o);if(a&&!isNaN(t)){var s=r[o]||0,l=n.dataToPoint(a.getCenter());r[o]=s+1,i.setItemLayout(e,{point:l,offset:s})}}))}));var o=n.getData();o.each((function(t){var e=o.getName(t),n=o.getItemLayout(t)||{};n.showLabel=!r[e],o.setItemLayout(t,n)})),e[i]=!0}}))}var FT=Ft,GT=function(t){function e(e){var n=t.call(this)||this;return n.type="view",n.dimensions=["x","y"],n._roamTransformable=new qi,n._rawTransformable=new qi,n.name=e,n}return n(e,t),e.prototype.setBoundingRect=function(t,e,n,i){return this._rect=new sr(t,e,n,i),this._rect},e.prototype.getBoundingRect=function(){return this._rect},e.prototype.setViewRect=function(t,e,n,i){this._transformTo(t,e,n,i),this._viewRect=new sr(t,e,n,i)},e.prototype._transformTo=function(t,e,n,i){var r=this.getBoundingRect(),o=this._rawTransformable;o.transform=r.calculateTransform(new sr(t,e,n,i));var a=o.parent;o.parent=null,o.decomposeTransform(),o.parent=a,this._updateTransform()},e.prototype.setCenter=function(t,e){t&&(this._center=[Er(t[0],e.getWidth()),Er(t[1],e.getHeight())],this._updateCenterAndZoom())},e.prototype.setZoom=function(t){t=t||1;var e=this.zoomLimit;e&&(null!=e.max&&(t=Math.min(e.max,t)),null!=e.min&&(t=Math.max(e.min,t))),this._zoom=t,this._updateCenterAndZoom()},e.prototype.getDefaultCenter=function(){var t=this.getBoundingRect();return[t.x+t.width/2,t.y+t.height/2]},e.prototype.getCenter=function(){return this._center||this.getDefaultCenter()},e.prototype.getZoom=function(){return this._zoom||1},e.prototype.getRoamTransform=function(){return this._roamTransformable.getLocalTransform()},e.prototype._updateCenterAndZoom=function(){var t=this._rawTransformable.getLocalTransform(),e=this._roamTransformable,n=this.getDefaultCenter(),i=this.getCenter(),r=this.getZoom();i=Ft([],i,t),n=Ft([],n,t),e.originX=i[0],e.originY=i[1],e.x=n[0]-i[0],e.y=n[1]-i[1],e.scaleX=e.scaleY=r,this._updateTransform()},e.prototype._updateTransform=function(){var t=this._roamTransformable,e=this._rawTransformable;e.parent=t,t.updateTransform(),e.updateTransform(),Ri(this.transform||(this.transform=[]),e.transform||[1,0,0,1,0,0]),this._rawTransform=e.getLocalTransform(),this.invTransform=this.invTransform||[],Bi(this.invTransform,this.transform),this.decomposeTransform()},e.prototype.getTransformInfo=function(){var t=this._rawTransformable,e=this._roamTransformable,n=new qi;return n.transform=e.transform,n.decomposeTransform(),{roam:{x:n.x,y:n.y,scaleX:n.scaleX,scaleY:n.scaleY},raw:{x:t.x,y:t.y,scaleX:t.scaleX,scaleY:t.scaleY}}},e.prototype.getViewRect=function(){return this._viewRect},e.prototype.getViewRectAfterRoam=function(){var t=this.getBoundingRect().clone();return t.applyTransform(this.transform),t},e.prototype.dataToPoint=function(t,e,n){var i=e?this._rawTransform:this.transform;return n=n||[],i?FT(n,t,i):St(n,t)},e.prototype.pointToData=function(t){var e=this.invTransform;return e?FT([],t,e):[t[0],t[1]]},e.prototype.convertToPixel=function(t,e,n){var i=WT(e);return i===this?i.dataToPoint(n):null},e.prototype.convertFromPixel=function(t,e,n){var i=WT(e);return i===this?i.pointToData(n):null},e.prototype.containPoint=function(t){return this.getViewRectAfterRoam().contain(t[0],t[1])},e.dimensions=["x","y"],e}(qi);function WT(t){var e=t.seriesModel;return e?e.coordinateSystem:null}var HT={geoJSON:{aspectScale:.75,invertLongitute:!0},geoSVG:{aspectScale:1,invertLongitute:!1}},YT=["lng","lat"],UT=function(t){function e(e,n,i){var r=t.call(this,e)||this;r.dimensions=YT,r.type="geo",r._nameCoordMap=ft(),r.map=n;var o,a=i.projection,s=bT(n,i.nameMap,i.nameProperty),l=xT(n),u=(r.resourceType=l?l.type:null,r.regions=s.regions),h=HT[l.type];if(r._regionsMap=s.regionsMap,r.regions=s.regions,r.projection=a,a)for(var c=0;c<u.length;c++){var p=u[c].getBoundingRect(a);(o=o||p.clone()).union(p)}else o=s.boundingRect;return r.setBoundingRect(o.x,o.y,o.width,o.height),r.aspectScale=a?1:rt(i.aspectScale,h.aspectScale),r._invertLongitute=!a&&h.invertLongitute,r}return n(e,t),e.prototype._transformTo=function(t,e,n,i){var r=this.getBoundingRect(),o=this._invertLongitute;r=r.clone(),o&&(r.y=-r.y-r.height);var a=this._rawTransformable;a.transform=r.calculateTransform(new sr(t,e,n,i));var s=a.parent;a.parent=null,a.decomposeTransform(),a.parent=s,o&&(a.scaleY=-a.scaleY),this._updateTransform()},e.prototype.getRegion=function(t){return this._regionsMap.get(t)},e.prototype.getRegionByCoord=function(t){for(var e=this.regions,n=0;n<e.length;n++){var i=e[n];if("geoJSON"===i.type&&i.contain(t))return e[n]}},e.prototype.addGeoCoord=function(t,e){this._nameCoordMap.set(t,e)},e.prototype.getGeoCoord=function(t){var e=this._regionsMap.get(t);return this._nameCoordMap.get(t)||e&&e.getCenter()},e.prototype.dataToPoint=function(t,e,n){if(X(t)&&(t=this.getGeoCoord(t)),t){var i=this.projection;return i&&(t=i.project(t)),t&&this.projectedToPoint(t,e,n)}},e.prototype.pointToData=function(t){var e=this.projection;return e&&(t=e.unproject(t)),t&&this.pointToProjected(t)},e.prototype.pointToProjected=function(e){return t.prototype.pointToData.call(this,e)},e.prototype.projectedToPoint=function(e,n,i){return t.prototype.dataToPoint.call(this,e,n,i)},e.prototype.convertToPixel=function(t,e,n){var i=XT(e);return i===this?i.dataToPoint(n):null},e.prototype.convertFromPixel=function(t,e,n){var i=XT(e);return i===this?i.pointToData(n):null},e}(GT);function XT(t){var e=t.geoModel,n=t.seriesModel;return e?e.coordinateSystem:n?n.coordinateSystem||(n.getReferringComponents("geo",Co).models[0]||{}).coordinateSystem:null}function ZT(t,e){var n=t.get("boundingCoords");if(null!=n){var i=n[0],r=n[1];if(isFinite(i[0])&&isFinite(i[1])&&isFinite(r[0])&&isFinite(r[1])){var o=this.projection;if(o){var a=i[0],s=i[1],l=r[0],u=r[1];i=[1/0,1/0],r=[-1/0,-1/0];var h=function(t,e,n,a){for(var s=n-t,l=a-e,u=0;u<=100;u++){var h=u/100,c=o.project([t+s*h,e+l*h]);Gt(i,i,c),Wt(r,r,c)}};h(a,s,l,s),h(l,s,l,u),h(l,u,a,u),h(a,u,l,s)}this.setBoundingRect(i[0],i[1],r[0]-i[0],r[1]-i[1])}else 0}var c,p,d,f=this.getBoundingRect(),g=t.get("layoutCenter"),y=t.get("layoutSize"),v=e.getWidth(),m=e.getHeight(),x=f.width/f.height*this.aspectScale,_=!1;if(g&&y&&(c=[Er(g[0],v),Er(g[1],m)],p=Er(y,Math.min(v,m)),isNaN(c[0])||isNaN(c[1])||isNaN(p)||(_=!0)),_)d={},x>1?(d.width=p,d.height=p/x):(d.height=p,d.width=p*x),d.y=c[1]-d.height/2,d.x=c[0]-d.width/2;else{var b=t.getBoxLayoutParams();b.aspect=x,d=xp(b,{width:v,height:m})}this.setViewRect(d.x,d.y,d.width,d.height),this.setCenter(t.get("center"),e),this.setZoom(t.get("zoom"))}R(UT,GT);var jT=new(function(){function t(){this.dimensions=YT}return t.prototype.create=function(t,e){var n=[];function i(t){return{nameProperty:t.get("nameProperty"),aspectScale:t.get("aspectScale"),projection:t.get("projection")}}t.eachComponent("geo",(function(t,r){var o=t.get("map"),a=new UT(o+r,o,A({nameMap:t.get("nameMap")},i(t)));a.zoomLimit=t.get("scaleLimit"),n.push(a),t.coordinateSystem=a,a.model=t,a.resize=ZT,a.resize(t,e)})),t.eachSeries((function(t){if("geo"===t.get("coordinateSystem")){var e=t.get("geoIndex")||0;t.coordinateSystem=n[e]}}));var r={};return t.eachSeriesByType("map",(function(t){if(!t.getHostGeoModel()){var e=t.getMapType();r[e]=r[e]||[],r[e].push(t)}})),E(r,(function(t,r){var o=z(t,(function(t){return t.get("nameMap")})),a=new UT(r,r,A({nameMap:D(o)},i(t[0])));a.zoomLimit=it.apply(null,z(t,(function(t){return t.get("scaleLimit")}))),n.push(a),a.resize=ZT,a.resize(t[0],e),E(t,(function(t){t.coordinateSystem=a,function(t,e){E(e.get("geoCoord"),(function(e,n){t.addGeoCoord(n,e)}))}(a,t)}))})),n},t.prototype.getFilledRegions=function(t,e,n,i){for(var r=(t||[]).slice(),o=ft(),a=0;a<r.length;a++)o.set(r[a].name,r[a]);return E(bT(e,n,i).regions,(function(t){var e=t.name;!o.get(e)&&r.push({name:e})})),r},t}()),qT=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e,n){var i=xT(t.map);if(i&&"geoJSON"===i.type){var r=t.itemStyle=t.itemStyle||{};"color"in r||(r.color="#eee")}this.mergeDefaultAndTheme(t,n),co(t,"label",["show"])},e.prototype.optionUpdated=function(){var t=this,e=this.option;e.regions=jT.getFilledRegions(e.regions,e.map,e.nameMap,e.nameProperty);var n={};this._optionModelMap=V(e.regions||[],(function(e,i){var r=i.name;return r&&(e.set(r,new dc(i,t,t.ecModel)),i.selected&&(n[r]=!0)),e}),ft()),e.selectedMap||(e.selectedMap=n)},e.prototype.getRegionModel=function(t){return this._optionModelMap.get(t)||new dc(null,this,this.ecModel)},e.prototype.getFormattedLabel=function(t,e){var n=this.getRegionModel(t),i="normal"===e?n.get(["label","formatter"]):n.get(["emphasis","label","formatter"]),r={name:t};return U(i)?(r.status=e,i(r)):X(i)?i.replace("{a}",null!=t?t:""):void 0},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.select=function(t){var e=this.option,n=e.selectedMode;n&&("multiple"!==n&&(e.selectedMap=null),(e.selectedMap||(e.selectedMap={}))[t]=!0)},e.prototype.unSelect=function(t){var e=this.option.selectedMap;e&&(e[t]=!1)},e.prototype.toggleSelected=function(t){this[this.isSelected(t)?"unSelect":"select"](t)},e.prototype.isSelected=function(t){var e=this.option.selectedMap;return!(!e||!e[t])},e.type="geo",e.layoutMode="box",e.defaultOption={z:0,show:!0,left:"center",top:"center",aspectScale:null,silent:!1,map:"",boundingCoords:null,center:null,zoom:1,scaleLimit:null,label:{show:!1,color:"#000"},itemStyle:{borderWidth:.5,borderColor:"#444"},emphasis:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{color:"rgba(255,215,0,0.8)"}},select:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{color:"rgba(255,215,0,0.8)"}},regions:[]},e}(Tp);function KT(t,e){return t.pointToProjected?t.pointToProjected(e):t.pointToData(e)}function $T(t,e,n,i){var r=t.getZoom(),o=t.getCenter(),a=e.zoom,s=t.projectedToPoint?t.projectedToPoint(o):t.dataToPoint(o);if(null!=e.dx&&null!=e.dy&&(s[0]-=e.dx,s[1]-=e.dy,t.setCenter(KT(t,s),i)),null!=a){if(n){var l=n.min||0,u=n.max||1/0;a=Math.max(Math.min(r*a,u),l)/r}t.scaleX*=a,t.scaleY*=a;var h=(e.originX-t.x)*(a-1),c=(e.originY-t.y)*(a-1);t.x-=h,t.y-=c,t.updateTransform(),t.setCenter(KT(t,s),i),t.setZoom(a*r)}return{center:t.getCenter(),zoom:t.getZoom()}}var JT=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.focusBlurEnabled=!0,n}return n(e,t),e.prototype.init=function(t,e){this._api=e},e.prototype.render=function(t,e,n,i){if(this._model=t,!t.get("show"))return this._mapDraw&&this._mapDraw.remove(),void(this._mapDraw=null);this._mapDraw||(this._mapDraw=new AT(n));var r=this._mapDraw;r.draw(t,e,n,this,i),r.group.on("click",this._handleRegionClick,this),r.group.silent=t.get("silent"),this.group.add(r.group),this.updateSelectStatus(t,e,n)},e.prototype._handleRegionClick=function(t){var e;xy(t.target,(function(t){return null!=(e=Hs(t).eventData)}),!0),e&&this._api.dispatchAction({type:"geoToggleSelect",geoId:this._model.id,name:e.name})},e.prototype.updateSelectStatus=function(t,e,n){var i=this;this._mapDraw.group.traverse((function(t){var e=Hs(t).eventData;if(e)return i._model.isSelected(e.name)?n.enterSelect(t):n.leaveSelect(t),!0}))},e.prototype.findHighDownDispatchers=function(t){return this._mapDraw&&this._mapDraw.findHighDownDispatchers(t,this._model)},e.prototype.dispose=function(){this._mapDraw&&this._mapDraw.remove()},e.type="geo",e}(gg);function QT(t,e,n){mT(t,e,n)}function tC(t){function e(e,n){n.update="geo:updateSelectStatus",t.registerAction(n,(function(t,n){var i={},r=[];return n.eachComponent({mainType:"geo",query:t},(function(n){n[e](t.name),E(n.coordinateSystem.regions,(function(t){i[t.name]=n.isSelected(t.name)||!1}));var o=[];E(i,(function(t,e){i[e]&&o.push(e)})),r.push({geoIndex:n.componentIndex,name:o})})),{selected:i,allSelected:r,name:t.name}}))}t.registerCoordinateSystem("geo",jT),t.registerComponentModel(qT),t.registerComponentView(JT),t.registerImpl("registerMap",QT),t.registerImpl("getMap",(function(t){return _T(t)})),e("toggleSelected",{type:"geoToggleSelect",event:"geoselectchanged"}),e("select",{type:"geoSelect",event:"geoselected"}),e("unSelect",{type:"geoUnSelect",event:"geounselected"}),t.registerAction({type:"geoRoam",event:"geoRoam",update:"updateTransform"},(function(t,e,n){var i=t.componentType||"series";e.eachComponent({mainType:i,query:t},(function(e){var r=e.coordinateSystem;if("geo"===r.type){var o=$T(r,t,e.get("scaleLimit"),n);e.setCenter&&e.setCenter(o.center),e.setZoom&&e.setZoom(o.zoom),"series"===i&&E(e.seriesGroup,(function(t){t.setCenter(o.center),t.setZoom(o.zoom)}))}}))}))}function eC(t,e){var n=t.isExpand?t.children:[],i=t.parentNode.children,r=t.hierNode.i?i[t.hierNode.i-1]:null;if(n.length){!function(t){var e=t.children,n=e.length,i=0,r=0;for(;--n>=0;){var o=e[n];o.hierNode.prelim+=i,o.hierNode.modifier+=i,r+=o.hierNode.change,i+=o.hierNode.shift+r}}(t);var o=(n[0].hierNode.prelim+n[n.length-1].hierNode.prelim)/2;r?(t.hierNode.prelim=r.hierNode.prelim+e(t,r),t.hierNode.modifier=t.hierNode.prelim-o):t.hierNode.prelim=o}else r&&(t.hierNode.prelim=r.hierNode.prelim+e(t,r));t.parentNode.hierNode.defaultAncestor=function(t,e,n,i){if(e){for(var r=t,o=t,a=o.parentNode.children[0],s=e,l=r.hierNode.modifier,u=o.hierNode.modifier,h=a.hierNode.modifier,c=s.hierNode.modifier;s=oC(s),o=aC(o),s&&o;){r=oC(r),a=aC(a),r.hierNode.ancestor=t;var p=s.hierNode.prelim+c-o.hierNode.prelim-u+i(s,o);p>0&&(lC(sC(s,t,n),t,p),u+=p,l+=p),c+=s.hierNode.modifier,u+=o.hierNode.modifier,l+=r.hierNode.modifier,h+=a.hierNode.modifier}s&&!oC(r)&&(r.hierNode.thread=s,r.hierNode.modifier+=c-l),o&&!aC(a)&&(a.hierNode.thread=o,a.hierNode.modifier+=u-h,n=t)}return n}(t,r,t.parentNode.hierNode.defaultAncestor||i[0],e)}function nC(t){var e=t.hierNode.prelim+t.parentNode.hierNode.modifier;t.setLayout({x:e},!0),t.hierNode.modifier+=t.parentNode.hierNode.modifier}function iC(t){return arguments.length?t:uC}function rC(t,e){return t-=Math.PI/2,{x:e*Math.cos(t),y:e*Math.sin(t)}}function oC(t){var e=t.children;return e.length&&t.isExpand?e[e.length-1]:t.hierNode.thread}function aC(t){var e=t.children;return e.length&&t.isExpand?e[0]:t.hierNode.thread}function sC(t,e,n){return t.hierNode.ancestor.parentNode===e.parentNode?t.hierNode.ancestor:n}function lC(t,e,n){var i=n/(e.hierNode.i-t.hierNode.i);e.hierNode.change-=i,e.hierNode.shift+=n,e.hierNode.modifier+=n,e.hierNode.prelim+=n,t.hierNode.change+=i}function uC(t,e){return t.parentNode===e.parentNode?1:2}var hC=function(){this.parentPoint=[],this.childPoints=[]},cC=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new hC},e.prototype.buildPath=function(t,e){var n=e.childPoints,i=n.length,r=e.parentPoint,o=n[0],a=n[i-1];if(1===i)return t.moveTo(r[0],r[1]),void t.lineTo(o[0],o[1]);var s=e.orient,l="TB"===s||"BT"===s?0:1,u=1-l,h=Er(e.forkPosition,1),c=[];c[l]=r[l],c[u]=r[u]+(a[u]-r[u])*h,t.moveTo(r[0],r[1]),t.lineTo(c[0],c[1]),t.moveTo(o[0],o[1]),c[l]=o[l],t.lineTo(c[0],c[1]),c[l]=a[l],t.lineTo(c[0],c[1]),t.lineTo(a[0],a[1]);for(var p=1;p<i-1;p++){var d=n[p];t.moveTo(d[0],d[1]),c[l]=d[l],t.lineTo(c[0],c[1])}},e}(gs),pC=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._mainGroup=new Cr,n}return n(e,t),e.prototype.init=function(t,e){this._controller=new kI(e.getZr()),this._controllerHost={target:this.group},this.group.add(this._mainGroup)},e.prototype.render=function(t,e,n){var i=t.getData(),r=t.layoutInfo,o=this._mainGroup;"radial"===t.get("layout")?(o.x=r.x+r.width/2,o.y=r.y+r.height/2):(o.x=r.x,o.y=r.y),this._updateViewCoordSys(t,n),this._updateController(t,e,n);var a=this._data;i.diff(a).add((function(e){dC(i,e)&&fC(i,e,null,o,t)})).update((function(e,n){var r=a.getItemGraphicEl(n);dC(i,e)?fC(i,e,r,o,t):r&&vC(a,n,r,o,t)})).remove((function(e){var n=a.getItemGraphicEl(e);n&&vC(a,e,n,o,t)})).execute(),this._nodeScaleRatio=t.get("nodeScaleRatio"),this._updateNodeAndLinkScale(t),!0===t.get("expandAndCollapse")&&i.eachItemGraphicEl((function(e,i){e.off("click").on("click",(function(){n.dispatchAction({type:"treeExpandAndCollapse",seriesId:t.id,dataIndex:i})}))})),this._data=i},e.prototype._updateViewCoordSys=function(t,e){var n=t.getData(),i=[];n.each((function(t){var e=n.getItemLayout(t);!e||isNaN(e.x)||isNaN(e.y)||i.push([+e.x,+e.y])}));var r=[],o=[];Ma(i,r,o);var a=this._min,s=this._max;o[0]-r[0]==0&&(r[0]=a?a[0]:r[0]-1,o[0]=s?s[0]:o[0]+1),o[1]-r[1]==0&&(r[1]=a?a[1]:r[1]-1,o[1]=s?s[1]:o[1]+1);var l=t.coordinateSystem=new GT;l.zoomLimit=t.get("scaleLimit"),l.setBoundingRect(r[0],r[1],o[0]-r[0],o[1]-r[1]),l.setCenter(t.get("center"),e),l.setZoom(t.get("zoom")),this.group.attr({x:l.x,y:l.y,scaleX:l.scaleX,scaleY:l.scaleY}),this._min=r,this._max=o},e.prototype._updateController=function(t,e,n){var i=this,r=this._controller,o=this._controllerHost,a=this.group;r.setPointerChecker((function(e,i,r){var o=a.getBoundingRect();return o.applyTransform(a.transform),o.contain(i,r)&&!VI(e,n,t)})),r.enable(t.get("roam")),o.zoomLimit=t.get("scaleLimit"),o.zoom=t.coordinateSystem.getZoom(),r.off("pan").off("zoom").on("pan",(function(e){RI(o,e.dx,e.dy),n.dispatchAction({seriesId:t.id,type:"treeRoam",dx:e.dx,dy:e.dy})})).on("zoom",(function(e){NI(o,e.scale,e.originX,e.originY),n.dispatchAction({seriesId:t.id,type:"treeRoam",zoom:e.scale,originX:e.originX,originY:e.originY}),i._updateNodeAndLinkScale(t),n.updateLabelLayout()}))},e.prototype._updateNodeAndLinkScale=function(t){var e=t.getData(),n=this._getNodeGlobalScale(t);e.eachItemGraphicEl((function(t,e){t.setSymbolScale(n)}))},e.prototype._getNodeGlobalScale=function(t){var e=t.coordinateSystem;if("view"!==e.type)return 1;var n=this._nodeScaleRatio,i=e.scaleX||1;return((e.getZoom()-1)*n+1)/i},e.prototype.dispose=function(){this._controller&&this._controller.dispose(),this._controllerHost=null},e.prototype.remove=function(){this._mainGroup.removeAll(),this._data=null},e.type="tree",e}(xg);function dC(t,e){var n=t.getItemLayout(e);return n&&!isNaN(n.x)&&!isNaN(n.y)}function fC(t,e,n,i,r){var o=!n,a=t.tree.getNodeByDataIndex(e),s=a.getModel(),l=a.getVisual("style").fill,u=!1===a.isExpand&&0!==a.children.length?l:"#fff",h=t.tree.root,c=a.parentNode===h?a:a.parentNode||a,p=t.getItemGraphicEl(c.dataIndex),d=c.getLayout(),f=p?{x:p.__oldX,y:p.__oldY,rawX:p.__radialOldRawX,rawY:p.__radialOldRawY}:d,g=a.getLayout();o?((n=new Yw(t,e,null,{symbolInnerColor:u,useNameLabel:!0})).x=f.x,n.y=f.y):n.updateData(t,e,null,{symbolInnerColor:u,useNameLabel:!0}),n.__radialOldRawX=n.__radialRawX,n.__radialOldRawY=n.__radialRawY,n.__radialRawX=g.rawX,n.__radialRawY=g.rawY,i.add(n),t.setItemGraphicEl(e,n),n.__oldX=n.x,n.__oldY=n.y,rh(n,{x:g.x,y:g.y},r);var y=n.getSymbolPath();if("radial"===r.get("layout")){var v=h.children[0],m=v.getLayout(),x=v.children.length,_=void 0,b=void 0;if(g.x===m.x&&!0===a.isExpand&&v.children.length){var w={x:(v.children[0].getLayout().x+v.children[x-1].getLayout().x)/2,y:(v.children[0].getLayout().y+v.children[x-1].getLayout().y)/2};(_=Math.atan2(w.y-m.y,w.x-m.x))<0&&(_=2*Math.PI+_),(b=w.x<m.x)&&(_-=Math.PI)}else(_=Math.atan2(g.y-m.y,g.x-m.x))<0&&(_=2*Math.PI+_),0===a.children.length||0!==a.children.length&&!1===a.isExpand?(b=g.x<m.x)&&(_-=Math.PI):(b=g.x>m.x)||(_-=Math.PI);var S=b?"left":"right",M=s.getModel("label"),I=M.get("rotate"),T=I*(Math.PI/180),C=y.getTextContent();C&&(y.setTextConfig({position:M.get("position")||S,rotation:null==I?-_:T,origin:"center"}),C.setStyle("verticalAlign","middle"))}var D=s.get(["emphasis","focus"]),A="relative"===D?gt(a.getAncestorsIndices(),a.getDescendantIndices()):"ancestor"===D?a.getAncestorsIndices():"descendant"===D?a.getDescendantIndices():null;A&&(Hs(n).focus=A),function(t,e,n,i,r,o,a,s){var l=e.getModel(),u=t.get("edgeShape"),h=t.get("layout"),c=t.getOrient(),p=t.get(["lineStyle","curveness"]),d=t.get("edgeForkPosition"),f=l.getModel("lineStyle").getLineStyle(),g=i.__edge;if("curve"===u)e.parentNode&&e.parentNode!==n&&(g||(g=i.__edge=new Gu({shape:mC(h,c,p,r,r)})),rh(g,{shape:mC(h,c,p,o,a)},t));else if("polyline"===u)if("orthogonal"===h){if(e!==n&&e.children&&0!==e.children.length&&!0===e.isExpand){for(var y=e.children,v=[],m=0;m<y.length;m++){var x=y[m].getLayout();v.push([x.x,x.y])}g||(g=i.__edge=new cC({shape:{parentPoint:[a.x,a.y],childPoints:[[a.x,a.y]],orient:c,forkPosition:d}})),rh(g,{shape:{parentPoint:[a.x,a.y],childPoints:v}},t)}}else 0;g&&("polyline"!==u||e.isExpand)&&(g.useStyle(k({strokeNoScale:!0,fill:null},f)),Vl(g,l,"lineStyle"),vl(g),s.add(g))}(r,a,h,n,f,d,g,i),n.__edge&&(n.onHoverStateChange=function(e){if("blur"!==e){var i=a.parentNode&&t.getItemGraphicEl(a.parentNode.dataIndex);i&&1===i.hoverState||gl(n.__edge,e)}})}function gC(t,e,n,i,r){var o=yC(e.tree.root,t),a=o.source,s=o.sourceLayout,l=e.getItemGraphicEl(t.dataIndex);if(l){var u=e.getItemGraphicEl(a.dataIndex).__edge,h=l.__edge||(!1===a.isExpand||1===a.children.length?u:void 0),c=i.get("edgeShape"),p=i.get("layout"),d=i.get("orient"),f=i.get(["lineStyle","curveness"]);h&&("curve"===c?sh(h,{shape:mC(p,d,f,s,s),style:{opacity:0}},i,{cb:function(){n.remove(h)},removeOpt:r}):"polyline"===c&&"orthogonal"===i.get("layout")&&sh(h,{shape:{parentPoint:[s.x,s.y],childPoints:[[s.x,s.y]]},style:{opacity:0}},i,{cb:function(){n.remove(h)},removeOpt:r}))}}function yC(t,e){for(var n,i=e.parentNode===t?e:e.parentNode||e;null==(n=i.getLayout());)i=i.parentNode===t?i:i.parentNode||i;return{source:i,sourceLayout:n}}function vC(t,e,n,i,r){var o=t.tree.getNodeByDataIndex(e),a=yC(t.tree.root,o).sourceLayout,s={duration:r.get("animationDurationUpdate"),easing:r.get("animationEasingUpdate")};sh(n,{x:a.x+1,y:a.y+1},r,{cb:function(){i.remove(n),t.setItemGraphicEl(e,null)},removeOpt:s}),n.fadeOut(null,t.hostModel,{fadeLabel:!0,animation:s}),o.children.forEach((function(e){gC(e,t,i,r,s)})),gC(o,t,i,r,s)}function mC(t,e,n,i,r){var o,a,s,l,u,h,c,p;if("radial"===t){u=i.rawX,c=i.rawY,h=r.rawX,p=r.rawY;var d=rC(u,c),f=rC(u,c+(p-c)*n),g=rC(h,p+(c-p)*n),y=rC(h,p);return{x1:d.x||0,y1:d.y||0,x2:y.x||0,y2:y.y||0,cpx1:f.x||0,cpy1:f.y||0,cpx2:g.x||0,cpy2:g.y||0}}return u=i.x,c=i.y,h=r.x,p=r.y,"LR"!==e&&"RL"!==e||(o=u+(h-u)*n,a=c,s=h+(u-h)*n,l=p),"TB"!==e&&"BT"!==e||(o=u,a=c+(p-c)*n,s=h,l=p+(c-p)*n),{x1:u,y1:c,x2:h,y2:p,cpx1:o,cpy1:a,cpx2:s,cpy2:l}}var xC=So();function _C(t){var e=t.mainData,n=t.datas;n||(n={main:e},t.datasAttr={main:"data"}),t.datas=t.mainData=null,TC(e,n,t),E(n,(function(n){E(e.TRANSFERABLE_METHODS,(function(e){n.wrapMethod(e,H(bC,t))}))})),e.wrapMethod("cloneShallow",H(SC,t)),E(e.CHANGABLE_METHODS,(function(n){e.wrapMethod(n,H(wC,t))})),lt(n[e.dataType]===e)}function bC(t,e){if(xC(i=this).mainData===i){var n=A({},xC(this).datas);n[this.dataType]=e,TC(e,n,t)}else CC(e,this.dataType,xC(this).mainData,t);var i;return e}function wC(t,e){return t.struct&&t.struct.update(),e}function SC(t,e){return E(xC(e).datas,(function(n,i){n!==e&&CC(n.cloneShallow(),i,e,t)})),e}function MC(t){var e=xC(this).mainData;return null==t||null==e?e:xC(e).datas[t]}function IC(){var t=xC(this).mainData;return null==t?[{data:t}]:z(G(xC(t).datas),(function(e){return{type:e,data:xC(t).datas[e]}}))}function TC(t,e,n){xC(t).datas={},E(e,(function(e,i){CC(e,i,t,n)}))}function CC(t,e,n,i){xC(n).datas[e]=t,xC(t).mainData=n,t.dataType=e,i.struct&&(t[i.structAttr]=i.struct,i.struct[i.datasAttr[e]]=t),t.getLinkedData=MC,t.getLinkedDataAll=IC}var DC=function(){function t(t,e){this.depth=0,this.height=0,this.dataIndex=-1,this.children=[],this.viewChildren=[],this.isExpand=!1,this.name=t||"",this.hostTree=e}return t.prototype.isRemoved=function(){return this.dataIndex<0},t.prototype.eachNode=function(t,e,n){U(t)&&(n=e,e=t,t=null),X(t=t||{})&&(t={order:t});var i,r=t.order||"preorder",o=this[t.attr||"children"];"preorder"===r&&(i=e.call(n,this));for(var a=0;!i&&a<o.length;a++)o[a].eachNode(t,e,n);"postorder"===r&&e.call(n,this)},t.prototype.updateDepthAndHeight=function(t){var e=0;this.depth=t;for(var n=0;n<this.children.length;n++){var i=this.children[n];i.updateDepthAndHeight(t+1),i.height>e&&(e=i.height)}this.height=e+1},t.prototype.getNodeById=function(t){if(this.getId()===t)return this;for(var e=0,n=this.children,i=n.length;e<i;e++){var r=n[e].getNodeById(t);if(r)return r}},t.prototype.contains=function(t){if(t===this)return!0;for(var e=0,n=this.children,i=n.length;e<i;e++){var r=n[e].contains(t);if(r)return r}},t.prototype.getAncestors=function(t){for(var e=[],n=t?this:this.parentNode;n;)e.push(n),n=n.parentNode;return e.reverse(),e},t.prototype.getAncestorsIndices=function(){for(var t=[],e=this;e;)t.push(e.dataIndex),e=e.parentNode;return t.reverse(),t},t.prototype.getDescendantIndices=function(){var t=[];return this.eachNode((function(e){t.push(e.dataIndex)})),t},t.prototype.getValue=function(t){var e=this.hostTree.data;return e.getStore().get(e.getDimensionIndex(t||"value"),this.dataIndex)},t.prototype.setLayout=function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemLayout(this.dataIndex,t,e)},t.prototype.getLayout=function(){return this.hostTree.data.getItemLayout(this.dataIndex)},t.prototype.getModel=function(t){if(!(this.dataIndex<0))return this.hostTree.data.getItemModel(this.dataIndex).getModel(t)},t.prototype.getLevelModel=function(){return(this.hostTree.levelModels||[])[this.depth]},t.prototype.setVisual=function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemVisual(this.dataIndex,t,e)},t.prototype.getVisual=function(t){return this.hostTree.data.getItemVisual(this.dataIndex,t)},t.prototype.getRawIndex=function(){return this.hostTree.data.getRawIndex(this.dataIndex)},t.prototype.getId=function(){return this.hostTree.data.getId(this.dataIndex)},t.prototype.getChildIndex=function(){if(this.parentNode){for(var t=this.parentNode.children,e=0;e<t.length;++e)if(t[e]===this)return e;return-1}return-1},t.prototype.isAncestorOf=function(t){for(var e=t.parentNode;e;){if(e===this)return!0;e=e.parentNode}return!1},t.prototype.isDescendantOf=function(t){return t!==this&&t.isAncestorOf(this)},t}(),AC=function(){function t(t){this.type="tree",this._nodes=[],this.hostModel=t}return t.prototype.eachNode=function(t,e,n){this.root.eachNode(t,e,n)},t.prototype.getNodeByDataIndex=function(t){var e=this.data.getRawIndex(t);return this._nodes[e]},t.prototype.getNodeById=function(t){return this.root.getNodeById(t)},t.prototype.update=function(){for(var t=this.data,e=this._nodes,n=0,i=e.length;n<i;n++)e[n].dataIndex=-1;for(n=0,i=t.count();n<i;n++)e[t.getRawIndex(n)].dataIndex=n},t.prototype.clearLayouts=function(){this.data.clearItemLayouts()},t.createTree=function(e,n,i){var r=new t(n),o=[],a=1;!function t(e,n){var i=e.value;a=Math.max(a,Y(i)?i.length:1),o.push(e);var s=new DC(xo(e.name,""),r);n?function(t,e){var n=e.children;if(t.parentNode===e)return;n.push(t),t.parentNode=e}(s,n):r.root=s,r._nodes.push(s);var l=e.children;if(l)for(var u=0;u<l.length;u++)t(l[u],s)}(e),r.root.updateDepthAndHeight(0);var s=Km(o,{coordDimensions:["value"],dimensionsCount:a}).dimensions,l=new qm(s,n);return l.initData(o),i&&i(l),_C({mainData:l,struct:r,structAttr:"tree"}),r.update(),r},t}();function kC(t,e,n){if(t&&P(e,t.type)>=0){var i=n.getData().tree.root,r=t.targetNode;if(X(r)&&(r=i.getNodeById(r)),r&&i.contains(r))return{node:r};var o=t.targetNodeId;if(null!=o&&(r=i.getNodeById(o)))return{node:r}}}function LC(t){for(var e=[];t;)(t=t.parentNode)&&e.push(t);return e.reverse()}function PC(t,e){return P(LC(t),e)>=0}function OC(t,e){for(var n=[];t;){var i=t.dataIndex;n.push({name:t.name,dataIndex:i,value:e.getRawValue(i)}),t=t.parentNode}return n.reverse(),n}var RC=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.hasSymbolVisual=!0,e.ignoreStyleOnData=!0,e}return n(e,t),e.prototype.getInitialData=function(t){var e={name:t.name,children:t.data},n=t.leaves||{},i=new dc(n,this,this.ecModel),r=AC.createTree(e,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=r.getNodeByDataIndex(e);return n&&n.children.length&&n.isExpand||(t.parentModel=i),t}))}));var o=0;r.eachNode("preorder",(function(t){t.depth>o&&(o=t.depth)}));var a=t.expandAndCollapse&&t.initialTreeDepth>=0?t.initialTreeDepth:o;return r.root.eachNode("preorder",(function(t){var e=t.hostTree.data.getRawDataItem(t.dataIndex);t.isExpand=e&&null!=e.collapsed?!e.collapsed:t.depth<=a})),r.data},e.prototype.getOrient=function(){var t=this.get("orient");return"horizontal"===t?t="LR":"vertical"===t&&(t="TB"),t},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.formatTooltip=function(t,e,n){for(var i=this.getData().tree,r=i.root.children[0],o=i.getNodeByDataIndex(t),a=o.getValue(),s=o.name;o&&o!==r;)s=o.parentNode.name+"."+s,o=o.parentNode;return Xf("nameValue",{name:s,value:a,noValue:isNaN(a)||null==a})},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treeAncestors=OC(i,this),n.collapsed=!i.isExpand,n},e.type="series.tree",e.layoutMode="box",e.defaultOption={z:2,coordinateSystem:"view",left:"12%",top:"12%",right:"12%",bottom:"12%",layout:"orthogonal",edgeShape:"curve",edgeForkPosition:"50%",roam:!1,nodeScaleRatio:.4,center:null,zoom:1,orient:"LR",symbol:"emptyCircle",symbolSize:7,expandAndCollapse:!0,initialTreeDepth:2,lineStyle:{color:"#ccc",width:1.5,curveness:.5},itemStyle:{color:"lightsteelblue",borderWidth:1.5},label:{show:!0},animationEasing:"linear",animationDuration:700,animationDurationUpdate:500},e}(sg);function NC(t,e){for(var n,i=[t];n=i.pop();)if(e(n),n.isExpand){var r=n.children;if(r.length)for(var o=r.length-1;o>=0;o--)i.push(r[o])}}function EC(t,e){t.eachSeriesByType("tree",(function(t){!function(t,e){var n=function(t,e){return xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e);t.layoutInfo=n;var i=t.get("layout"),r=0,o=0,a=null;"radial"===i?(r=2*Math.PI,o=Math.min(n.height,n.width)/2,a=iC((function(t,e){return(t.parentNode===e.parentNode?1:2)/t.depth}))):(r=n.width,o=n.height,a=iC());var s=t.getData().tree.root,l=s.children[0];if(l){!function(t){var e=t;e.hierNode={defaultAncestor:null,ancestor:e,prelim:0,modifier:0,change:0,shift:0,i:0,thread:null};for(var n,i,r=[e];n=r.pop();)if(i=n.children,n.isExpand&&i.length)for(var o=i.length-1;o>=0;o--){var a=i[o];a.hierNode={defaultAncestor:null,ancestor:a,prelim:0,modifier:0,change:0,shift:0,i:o,thread:null},r.push(a)}}(s),function(t,e,n){for(var i,r=[t],o=[];i=r.pop();)if(o.push(i),i.isExpand){var a=i.children;if(a.length)for(var s=0;s<a.length;s++)r.push(a[s])}for(;i=o.pop();)e(i,n)}(l,eC,a),s.hierNode.modifier=-l.hierNode.prelim,NC(l,nC);var u=l,h=l,c=l;NC(l,(function(t){var e=t.getLayout().x;e<u.getLayout().x&&(u=t),e>h.getLayout().x&&(h=t),t.depth>c.depth&&(c=t)}));var p=u===h?1:a(u,h)/2,d=p-u.getLayout().x,f=0,g=0,y=0,v=0;if("radial"===i)f=r/(h.getLayout().x+p+d),g=o/(c.depth-1||1),NC(l,(function(t){y=(t.getLayout().x+d)*f,v=(t.depth-1)*g;var e=rC(y,v);t.setLayout({x:e.x,y:e.y,rawX:y,rawY:v},!0)}));else{var m=t.getOrient();"RL"===m||"LR"===m?(g=o/(h.getLayout().x+p+d),f=r/(c.depth-1||1),NC(l,(function(t){v=(t.getLayout().x+d)*g,y="LR"===m?(t.depth-1)*f:r-(t.depth-1)*f,t.setLayout({x:y,y:v},!0)}))):"TB"!==m&&"BT"!==m||(f=r/(h.getLayout().x+p+d),g=o/(c.depth-1||1),NC(l,(function(t){y=(t.getLayout().x+d)*f,v="TB"===m?(t.depth-1)*g:o-(t.depth-1)*g,t.setLayout({x:y,y:v},!0)})))}}}(t,e)}))}function zC(t){t.eachSeriesByType("tree",(function(t){var e=t.getData();e.tree.eachNode((function(t){var n=t.getModel().getModel("itemStyle").getItemStyle();A(e.ensureUniqueItemVisual(t.dataIndex,"style"),n)}))}))}var VC=["treemapZoomToNode","treemapRender","treemapMove"];function BC(t){var e=t.getData().tree,n={};e.eachNode((function(e){for(var i=e;i&&i.depth>1;)i=i.parentNode;var r=ed(t.ecModel,i.name||i.dataIndex+"",n);e.setVisual("decal",r)}))}var FC=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.preventUsingHoverLayer=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){var n={name:t.name,children:t.data};GC(n);var i=t.levels||[],r=this.designatedVisualItemStyle={},o=new dc({itemStyle:r},this,e),a=z((i=t.levels=function(t,e){var n,i,r=ho(e.get("color")),o=ho(e.get(["aria","decal","decals"]));if(!r)return;E(t=t||[],(function(t){var e=new dc(t),r=e.get("color"),o=e.get("decal");(e.get(["itemStyle","color"])||r&&"none"!==r)&&(n=!0),(e.get(["itemStyle","decal"])||o&&"none"!==o)&&(i=!0)}));var a=t[0]||(t[0]={});n||(a.color=r.slice());!i&&o&&(a.decal=o.slice());return t}(i,e))||[],(function(t){return new dc(t,o,e)}),this),s=AC.createTree(n,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=s.getNodeByDataIndex(e),i=n?a[n.depth]:null;return t.parentModel=i||o,t}))}));return s.data},e.prototype.optionUpdated=function(){this.resetViewRoot()},e.prototype.formatTooltip=function(t,e,n){var i=this.getData(),r=this.getRawValue(t);return Xf("nameValue",{name:i.getName(t),value:r})},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treeAncestors=OC(i,this),n.treePathInfo=n.treeAncestors,n},e.prototype.setLayoutInfo=function(t){this.layoutInfo=this.layoutInfo||{},A(this.layoutInfo,t)},e.prototype.mapIdToIndex=function(t){var e=this._idIndexMap;e||(e=this._idIndexMap=ft(),this._idIndexMapCount=0);var n=e.get(t);return null==n&&e.set(t,n=this._idIndexMapCount++),n},e.prototype.getViewRoot=function(){return this._viewRoot},e.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)},e.prototype.enableAriaDecal=function(){BC(this)},e.type="series.treemap",e.layoutMode="box",e.defaultOption={progressive:0,left:"center",top:"middle",width:"80%",height:"80%",sort:!0,clipWindow:"origin",squareRatio:.5*(1+Math.sqrt(5)),leafDepth:null,drillDownIcon:"▶",zoomToNodeRatio:.1024,roam:!0,nodeClick:"zoomToNode",animation:!0,animationDurationUpdate:900,animationEasing:"quinticInOut",breadcrumb:{show:!0,height:22,left:"center",top:"bottom",emptyItemWidth:25,itemStyle:{color:"rgba(0,0,0,0.7)",textStyle:{color:"#fff"}}},label:{show:!0,distance:0,padding:5,position:"inside",color:"#fff",overflow:"truncate"},upperLabel:{show:!1,position:[0,"50%"],height:20,overflow:"truncate",verticalAlign:"middle"},itemStyle:{color:null,colorAlpha:null,colorSaturation:null,borderWidth:0,gapWidth:0,borderColor:"#fff",borderColorSaturation:null},emphasis:{upperLabel:{show:!0,position:[0,"50%"],overflow:"truncate",verticalAlign:"middle"}},visualDimension:0,visualMin:null,visualMax:null,color:[],colorAlpha:null,colorSaturation:null,colorMappingBy:"index",visibleMin:10,childrenVisibleMin:null,levels:[]},e}(sg);function GC(t){var e=0;E(t.children,(function(t){GC(t);var n=t.value;Y(n)&&(n=n[0]),e+=n}));var n=t.value;Y(n)&&(n=n[0]),(null==n||isNaN(n))&&(n=e),n<0&&(n=0),Y(t.value)?t.value[0]=n:t.value=n}var WC=function(){function t(t){this.group=new Cr,t.add(this.group)}return t.prototype.render=function(t,e,n,i){var r=t.getModel("breadcrumb"),o=this.group;if(o.removeAll(),r.get("show")&&n){var a=r.getModel("itemStyle"),s=a.getModel("textStyle"),l={pos:{left:r.get("left"),right:r.get("right"),top:r.get("top"),bottom:r.get("bottom")},box:{width:e.getWidth(),height:e.getHeight()},emptyItemWidth:r.get("emptyItemWidth"),totalWidth:0,renderList:[]};this._prepare(n,l,s),this._renderContent(t,l,a,s,i),_p(o,l.pos,l.box)}},t.prototype._prepare=function(t,e,n){for(var i=t;i;i=i.parentNode){var r=xo(i.getModel().get("name"),""),o=n.getTextRect(r),a=Math.max(o.width+16,e.emptyItemWidth);e.totalWidth+=a+8,e.renderList.push({node:i,text:r,width:a})}},t.prototype._renderContent=function(t,e,n,i,r){for(var o,a,s,l,u,h,c,p,d,f=0,g=e.emptyItemWidth,y=t.get(["breadcrumb","height"]),v=(o=e.pos,a=e.box,l=a.width,u=a.height,h=Er(o.left,l),c=Er(o.top,u),p=Er(o.right,l),d=Er(o.bottom,u),(isNaN(h)||isNaN(parseFloat(o.left)))&&(h=0),(isNaN(p)||isNaN(parseFloat(o.right)))&&(p=l),(isNaN(c)||isNaN(parseFloat(o.top)))&&(c=0),(isNaN(d)||isNaN(parseFloat(o.bottom)))&&(d=u),s=ip(s||0),{width:Math.max(p-h-s[1]-s[3],0),height:Math.max(d-c-s[0]-s[2],0)}),m=e.totalWidth,x=e.renderList,_=x.length-1;_>=0;_--){var b=x[_],w=b.node,S=b.width,M=b.text;m>v.width&&(m-=S-g,S=g,M=null);var I=new Pu({shape:{points:HC(f,0,S,y,_===x.length-1,0===_)},style:k(n.getItemStyle(),{lineJoin:"bevel"}),textContent:new ks({style:{text:M,fill:i.getTextColor(),font:i.getFont()}}),textConfig:{position:"inside"},z2:1e5,onclick:H(r,w)});I.disableLabelAnimation=!0,this.group.add(I),YC(I,t,w),f+=S+8}},t.prototype.remove=function(){this.group.removeAll()},t}();function HC(t,e,n,i,r,o){var a=[[r?t:t-5,e],[t+n,e],[t+n,e+i],[r?t:t-5,e+i]];return!o&&a.splice(2,0,[t+n+5,e+i/2]),!r&&a.push([t,e+i/2]),a}function YC(t,e,n){Hs(t).eventData={componentType:"series",componentSubType:"treemap",componentIndex:e.componentIndex,seriesIndex:e.seriesIndex,seriesName:e.name,seriesType:"treemap",selfType:"breadcrumb",nodeData:{dataIndex:n&&n.dataIndex,name:n&&n.name},treePathInfo:n&&OC(n,e)}}var UC=function(){function t(){this._storage=[],this._elExistsMap={}}return t.prototype.add=function(t,e,n,i,r){return!this._elExistsMap[t.id]&&(this._elExistsMap[t.id]=!0,this._storage.push({el:t,target:e,duration:n,delay:i,easing:r}),!0)},t.prototype.finished=function(t){return this._finishedCallback=t,this},t.prototype.start=function(){for(var t=this,e=this._storage.length,n=function(){--e<=0&&(t._storage.length=0,t._elExistsMap={},t._finishedCallback&&t._finishedCallback())},i=0,r=this._storage.length;i<r;i++){var o=this._storage[i];o.el.animateTo(o.target,{duration:o.duration,delay:o.delay,easing:o.easing,setToFinal:!0,done:n,aborted:n})}return this},t}();var XC=Cr,ZC=Cs,jC="label",qC="upperLabel",KC=Wo([["fill","color"],["stroke","strokeColor"],["lineWidth","strokeWidth"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),$C=function(t){var e=KC(t);return e.stroke=e.fill=e.lineWidth=null,e},JC=So(),QC=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._state="ready",n._storage={nodeGroup:[],background:[],content:[]},n}return n(e,t),e.prototype.render=function(t,e,n,i){if(!(P(e.findComponents({mainType:"series",subType:"treemap",query:i}),t)<0)){this.seriesModel=t,this.api=n,this.ecModel=e;var r=kC(i,["treemapZoomToNode","treemapRootToNode"],t),o=i&&i.type,a=t.layoutInfo,s=!this._oldTree,l=this._storage,u="treemapRootToNode"===o&&r&&l?{rootNodeGroup:l.nodeGroup[r.node.getRawIndex()],direction:i.direction}:null,h=this._giveContainerGroup(a),c=t.get("animation"),p=this._doRender(h,t,u);!c||s||o&&"treemapZoomToNode"!==o&&"treemapRootToNode"!==o?p.renderFinally():this._doAnimation(h,p,t,u),this._resetController(n),this._renderBreadcrumb(t,n,r)}},e.prototype._giveContainerGroup=function(t){var e=this._containerGroup;return e||(e=this._containerGroup=new XC,this._initEvents(e),this.group.add(e)),e.x=t.x,e.y=t.y,e},e.prototype._doRender=function(t,e,n){var i=e.getData().tree,r=this._oldTree,o={nodeGroup:[],background:[],content:[]},a={nodeGroup:[],background:[],content:[]},s=this._storage,l=[];function u(t,i,r,u){return function(t,e,n,i,r,o,a,s,l,u){if(!a)return;var h=a.getLayout(),c=t.getData(),p=a.getModel();if(c.setItemGraphicEl(a.dataIndex,null),!h||!h.isInView)return;var d=h.width,f=h.height,g=h.borderWidth,y=h.invisible,v=a.getRawIndex(),m=s&&s.getRawIndex(),x=a.viewChildren,_=h.upperHeight,b=x&&x.length,w=p.getModel("itemStyle"),S=p.getModel(["emphasis","itemStyle"]),M=p.getModel(["blur","itemStyle"]),I=p.getModel(["select","itemStyle"]),T=w.get("borderRadius")||0,C=G("nodeGroup",XC);if(!C)return;if(l.add(C),C.x=h.x||0,C.y=h.y||0,C.markRedraw(),JC(C).nodeWidth=d,JC(C).nodeHeight=f,h.isAboveViewRoot)return C;var D=G("background",ZC,u,20);D&&E(C,D,b&&h.upperLabelHeight);var k=p.getModel("emphasis"),L=k.get("focus"),P=k.get("blurScope"),O=k.get("disabled"),R="ancestor"===L?a.getAncestorsIndices():"descendant"===L?a.getDescendantIndices():L;if(b)Fl(C)&&Bl(C,!1),D&&(Bl(D,!O),c.setItemGraphicEl(a.dataIndex,D),Nl(D,R,P));else{var N=G("content",ZC,u,30);N&&z(C,N),D.disableMorphing=!0,D&&Fl(D)&&Bl(D,!1),Bl(C,!O),c.setItemGraphicEl(a.dataIndex,C),Nl(C,R,P)}return C;function E(e,n,i){var r=Hs(n);if(r.dataIndex=a.dataIndex,r.seriesIndex=t.seriesIndex,n.setShape({x:0,y:0,width:d,height:f,r:T}),y)V(n);else{n.invisible=!1;var o=a.getVisual("style"),s=o.stroke,l=$C(w);l.fill=s;var u=KC(S);u.fill=S.get("borderColor");var h=KC(M);h.fill=M.get("borderColor");var c=KC(I);if(c.fill=I.get("borderColor"),i){var p=d-2*g;B(n,s,o.opacity,{x:g,y:0,width:p,height:_})}else n.removeTextContent();n.setStyle(l),n.ensureState("emphasis").style=u,n.ensureState("blur").style=h,n.ensureState("select").style=c,vl(n)}e.add(n)}function z(e,n){var i=Hs(n);i.dataIndex=a.dataIndex,i.seriesIndex=t.seriesIndex;var r=Math.max(d-2*g,0),o=Math.max(f-2*g,0);if(n.culling=!0,n.setShape({x:g,y:g,width:r,height:o,r:T}),y)V(n);else{n.invisible=!1;var s=a.getVisual("style"),l=s.fill,u=$C(w);u.fill=l,u.decal=s.decal;var h=KC(S),c=KC(M),p=KC(I);B(n,l,s.opacity,null),n.setStyle(u),n.ensureState("emphasis").style=h,n.ensureState("blur").style=c,n.ensureState("select").style=p,vl(n)}e.add(n)}function V(t){!t.invisible&&o.push(t)}function B(e,n,i,r){var o=p.getModel(r?qC:jC),s=xo(p.get("name"),null),l=o.getShallow("show");Hh(e,Yh(p,r?qC:jC),{defaultText:l?s:null,inheritColor:n,defaultOpacity:i,labelFetcher:t,labelDataIndex:a.dataIndex});var u=e.getTextContent();if(u){var c=u.style,d=st(c.padding||0);r&&(e.setTextConfig({layoutRect:r}),u.disableLabelLayout=!0),u.beforeUpdate=function(){var t=Math.max((r?r.width:e.shape.width)-d[1]-d[3],0),n=Math.max((r?r.height:e.shape.height)-d[0]-d[2],0);c.width===t&&c.height===n||u.setStyle({width:t,height:n})},c.truncateMinChar=2,c.lineOverflow="truncate",F(c,r,h);var f=u.getState("emphasis");F(f?f.style:null,r,h)}}function F(e,n,i){var r=e?e.text:null;if(!n&&i.isLeafRoot&&null!=r){var o=t.get("drillDownIcon",!0);e.text=o?o+" "+r:r}}function G(t,i,o,a){var s=null!=m&&n[t][m],l=r[t];return s?(n[t][m]=null,W(l,s)):y||((s=new i)instanceof da&&(s.z2=function(t,e){return 100*t+e}(o,a)),H(l,s)),e[t][v]=s}function W(t,e){var n=t[v]={};e instanceof XC?(n.oldX=e.x,n.oldY=e.y):n.oldShape=A({},e.shape)}function H(t,e){var n=t[v]={},o=a.parentNode,s=e instanceof Cr;if(o&&(!i||"drillDown"===i.direction)){var l=0,u=0,h=r.background[o.getRawIndex()];!i&&h&&h.oldShape&&(l=h.oldShape.width,u=h.oldShape.height),s?(n.oldX=0,n.oldY=u):n.oldShape={x:l,y:u,width:0,height:0}}n.fadein=!s}}(e,a,s,n,o,l,t,i,r,u)}!function t(e,n,i,r,o){r?(n=e,E(e,(function(t,e){!t.isRemoved()&&s(e,e)}))):new Im(n,e,a,a).add(s).update(s).remove(H(s,null)).execute();function a(t){return t.getId()}function s(a,s){var l=null!=a?e[a]:null,h=null!=s?n[s]:null,c=u(l,h,i,o);c&&t(l&&l.viewChildren||[],h&&h.viewChildren||[],c,r,o+1)}}(i.root?[i.root]:[],r&&r.root?[r.root]:[],t,i===r||!r,0);var h=function(t){var e={nodeGroup:[],background:[],content:[]};return t&&E(t,(function(t,n){var i=e[n];E(t,(function(t){t&&(i.push(t),JC(t).willDelete=!0)}))})),e}(s);return this._oldTree=i,this._storage=a,{lastsForAnimation:o,willDeleteEls:h,renderFinally:function(){E(h,(function(t){E(t,(function(t){t.parent&&t.parent.remove(t)}))})),E(l,(function(t){t.invisible=!0,t.dirty()}))}}},e.prototype._doAnimation=function(t,e,n,i){var r=n.get("animationDurationUpdate"),o=n.get("animationEasing"),a=(U(r)?0:r)||0,s=(U(o)?null:o)||"cubicOut",l=new UC;E(e.willDeleteEls,(function(t,e){E(t,(function(t,n){if(!t.invisible){var r,o=t.parent,u=JC(o);if(i&&"drillDown"===i.direction)r=o===i.rootNodeGroup?{shape:{x:0,y:0,width:u.nodeWidth,height:u.nodeHeight},style:{opacity:0}}:{style:{opacity:0}};else{var h=0,c=0;u.willDelete||(h=u.nodeWidth/2,c=u.nodeHeight/2),r="nodeGroup"===e?{x:h,y:c,style:{opacity:0}}:{shape:{x:h,y:c,width:0,height:0},style:{opacity:0}}}r&&l.add(t,r,a,0,s)}}))})),E(this._storage,(function(t,n){E(t,(function(t,i){var r=e.lastsForAnimation[n][i],o={};r&&(t instanceof Cr?null!=r.oldX&&(o.x=t.x,o.y=t.y,t.x=r.oldX,t.y=r.oldY):(r.oldShape&&(o.shape=A({},t.shape),t.setShape(r.oldShape)),r.fadein?(t.setStyle("opacity",0),o.style={opacity:1}):1!==t.style.opacity&&(o.style={opacity:1})),l.add(t,o,a,0,s))}))}),this),this._state="animating",l.finished(W((function(){this._state="ready",e.renderFinally()}),this)).start()},e.prototype._resetController=function(t){var e=this._controller;e||((e=this._controller=new kI(t.getZr())).enable(this.seriesModel.get("roam")),e.on("pan",W(this._onPan,this)),e.on("zoom",W(this._onZoom,this)));var n=new sr(0,0,t.getWidth(),t.getHeight());e.setPointerChecker((function(t,e,i){return n.contain(e,i)}))},e.prototype._clearController=function(){var t=this._controller;t&&(t.dispose(),t=null)},e.prototype._onPan=function(t){if("animating"!==this._state&&(Math.abs(t.dx)>3||Math.abs(t.dy)>3)){var e=this.seriesModel.getData().tree.root;if(!e)return;var n=e.getLayout();if(!n)return;this.api.dispatchAction({type:"treemapMove",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:n.x+t.dx,y:n.y+t.dy,width:n.width,height:n.height}})}},e.prototype._onZoom=function(t){var e=t.originX,n=t.originY;if("animating"!==this._state){var i=this.seriesModel.getData().tree.root;if(!i)return;var r=i.getLayout();if(!r)return;var o=new sr(r.x,r.y,r.width,r.height),a=this.seriesModel.layoutInfo,s=[1,0,0,1,0,0];Ei(s,s,[-(e-=a.x),-(n-=a.y)]),Vi(s,s,[t.scale,t.scale]),Ei(s,s,[e,n]),o.applyTransform(s),this.api.dispatchAction({type:"treemapRender",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:o.x,y:o.y,width:o.width,height:o.height}})}},e.prototype._initEvents=function(t){var e=this;t.on("click",(function(t){if("ready"===e._state){var n=e.seriesModel.get("nodeClick",!0);if(n){var i=e.findTarget(t.offsetX,t.offsetY);if(i){var r=i.node;if(r.getLayout().isLeafRoot)e._rootToNode(i);else if("zoomToNode"===n)e._zoomToNode(i);else if("link"===n){var o=r.hostTree.data.getItemModel(r.dataIndex),a=o.get("link",!0),s=o.get("target",!0)||"blank";a&&dp(a,s)}}}}}),this)},e.prototype._renderBreadcrumb=function(t,e,n){var i=this;n||(n=null!=t.get("leafDepth",!0)?{node:t.getViewRoot()}:this.findTarget(e.getWidth()/2,e.getHeight()/2))||(n={node:t.getData().tree.root}),(this._breadcrumb||(this._breadcrumb=new WC(this.group))).render(t,e,n.node,(function(e){"animating"!==i._state&&(PC(t.getViewRoot(),e)?i._rootToNode({node:e}):i._zoomToNode({node:e}))}))},e.prototype.remove=function(){this._clearController(),this._containerGroup&&this._containerGroup.removeAll(),this._storage={nodeGroup:[],background:[],content:[]},this._state="ready",this._breadcrumb&&this._breadcrumb.remove()},e.prototype.dispose=function(){this._clearController()},e.prototype._zoomToNode=function(t){this.api.dispatchAction({type:"treemapZoomToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},e.prototype._rootToNode=function(t){this.api.dispatchAction({type:"treemapRootToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},e.prototype.findTarget=function(t,e){var n;return this.seriesModel.getViewRoot().eachNode({attr:"viewChildren",order:"preorder"},(function(i){var r=this._storage.background[i.getRawIndex()];if(r){var o=r.transformCoordToLocal(t,e),a=r.shape;if(!(a.x<=o[0]&&o[0]<=a.x+a.width&&a.y<=o[1]&&o[1]<=a.y+a.height))return!1;n={node:i,offsetX:o[0],offsetY:o[1]}}}),this),n},e.type="treemap",e}(xg);var tD=E,eD=q,nD=-1,iD=function(){function t(e){var n=e.mappingMethod,i=e.type,r=this.option=T(e);this.type=i,this.mappingMethod=n,this._normalizeData=dD[n];var o=t.visualHandlers[i];this.applyVisual=o.applyVisual,this.getColorMapper=o.getColorMapper,this._normalizedToVisual=o._normalizedToVisual[n],"piecewise"===n?(rD(r),function(t){var e=t.pieceList;t.hasSpecialVisual=!1,E(e,(function(e,n){e.originIndex=n,null!=e.visual&&(t.hasSpecialVisual=!0)}))}(r)):"category"===n?r.categories?function(t){var e=t.categories,n=t.categoryMap={},i=t.visual;if(tD(e,(function(t,e){n[t]=e})),!Y(i)){var r=[];q(i)?tD(i,(function(t,e){var i=n[e];r[null!=i?i:nD]=t})):r[-1]=i,i=pD(t,r)}for(var o=e.length-1;o>=0;o--)null==i[o]&&(delete n[e[o]],e.pop())}(r):rD(r,!0):(lt("linear"!==n||r.dataExtent),rD(r))}return t.prototype.mapValueToVisual=function(t){var e=this._normalizeData(t);return this._normalizedToVisual(e,t)},t.prototype.getNormalizer=function(){return W(this._normalizeData,this)},t.listVisualTypes=function(){return G(t.visualHandlers)},t.isValidType=function(e){return t.visualHandlers.hasOwnProperty(e)},t.eachVisual=function(t,e,n){q(t)?E(t,e,n):e.call(n,t)},t.mapVisual=function(e,n,i){var r,o=Y(e)?[]:q(e)?{}:(r=!0,null);return t.eachVisual(e,(function(t,e){var a=n.call(i,t,e);r?o=a:o[e]=a})),o},t.retrieveVisuals=function(e){var n,i={};return e&&tD(t.visualHandlers,(function(t,r){e.hasOwnProperty(r)&&(i[r]=e[r],n=!0)})),n?i:null},t.prepareVisualTypes=function(t){if(Y(t))t=t.slice();else{if(!eD(t))return[];var e=[];tD(t,(function(t,n){e.push(n)})),t=e}return t.sort((function(t,e){return"color"===e&&"color"!==t&&0===t.indexOf("color")?1:-1})),t},t.dependsOn=function(t,e){return"color"===e?!(!t||0!==t.indexOf(e)):t===e},t.findPieceIndex=function(t,e,n){for(var i,r=1/0,o=0,a=e.length;o<a;o++){var s=e[o].value;if(null!=s){if(s===t||X(s)&&s===t+"")return o;n&&c(s,o)}}for(o=0,a=e.length;o<a;o++){var l=e[o],u=l.interval,h=l.close;if(u){if(u[0]===-1/0){if(fD(h[1],t,u[1]))return o}else if(u[1]===1/0){if(fD(h[0],u[0],t))return o}else if(fD(h[0],u[0],t)&&fD(h[1],t,u[1]))return o;n&&c(u[0],o),n&&c(u[1],o)}}if(n)return t===1/0?e.length-1:t===-1/0?0:i;function c(e,n){var o=Math.abs(e-t);o<r&&(r=o,i=n)}},t.visualHandlers={color:{applyVisual:sD("color"),getColorMapper:function(){var t=this.option;return W("category"===t.mappingMethod?function(t,e){return!e&&(t=this._normalizeData(t)),lD.call(this,t)}:function(e,n,i){var r=!!i;return!n&&(e=this._normalizeData(e)),i=Mn(e,t.parsedVisual,i),r?i:kn(i,"rgba")},this)},_normalizedToVisual:{linear:function(t){return kn(Mn(t,this.option.parsedVisual),"rgba")},category:lD,piecewise:function(t,e){var n=cD.call(this,e);return null==n&&(n=kn(Mn(t,this.option.parsedVisual),"rgba")),n},fixed:uD}},colorHue:oD((function(t,e){return Dn(t,e)})),colorSaturation:oD((function(t,e){return Dn(t,null,e)})),colorLightness:oD((function(t,e){return Dn(t,null,null,e)})),colorAlpha:oD((function(t,e){return An(t,e)})),decal:{applyVisual:sD("decal"),_normalizedToVisual:{linear:null,category:lD,piecewise:null,fixed:null}},opacity:{applyVisual:sD("opacity"),_normalizedToVisual:hD([0,1])},liftZ:{applyVisual:sD("liftZ"),_normalizedToVisual:{linear:uD,category:uD,piecewise:uD,fixed:uD}},symbol:{applyVisual:function(t,e,n){n("symbol",this.mapValueToVisual(t))},_normalizedToVisual:{linear:aD,category:lD,piecewise:function(t,e){var n=cD.call(this,e);return null==n&&(n=aD.call(this,t)),n},fixed:uD}},symbolSize:{applyVisual:sD("symbolSize"),_normalizedToVisual:hD([0,1])}},t}();function rD(t,e){var n=t.visual,i=[];q(n)?tD(n,(function(t){i.push(t)})):null!=n&&i.push(n);e||1!==i.length||{color:1,symbol:1}.hasOwnProperty(t.type)||(i[1]=i[0]),pD(t,i)}function oD(t){return{applyVisual:function(e,n,i){var r=this.mapValueToVisual(e);i("color",t(n("color"),r))},_normalizedToVisual:hD([0,1])}}function aD(t){var e=this.option.visual;return e[Math.round(Nr(t,[0,1],[0,e.length-1],!0))]||{}}function sD(t){return function(e,n,i){i(t,this.mapValueToVisual(e))}}function lD(t){var e=this.option.visual;return e[this.option.loop&&t!==nD?t%e.length:t]}function uD(){return this.option.visual[0]}function hD(t){return{linear:function(e){return Nr(e,t,this.option.visual,!0)},category:lD,piecewise:function(e,n){var i=cD.call(this,n);return null==i&&(i=Nr(e,t,this.option.visual,!0)),i},fixed:uD}}function cD(t){var e=this.option,n=e.pieceList;if(e.hasSpecialVisual){var i=n[iD.findPieceIndex(t,n)];if(i&&i.visual)return i.visual[this.type]}}function pD(t,e){return t.visual=e,"color"===t.type&&(t.parsedVisual=z(e,(function(t){var e=bn(t);return e||[0,0,0,1]}))),e}var dD={linear:function(t){return Nr(t,this.option.dataExtent,[0,1],!0)},piecewise:function(t){var e=this.option.pieceList,n=iD.findPieceIndex(t,e,!0);if(null!=n)return Nr(n,[0,e.length-1],[0,1],!0)},category:function(t){var e=this.option.categories?this.option.categoryMap[t]:t;return null==e?nD:e},fixed:xt};function fD(t,e,n){return t?e<=n:e<n}var gD=So(),yD={seriesType:"treemap",reset:function(t){var e=t.getData().tree.root;e.isRemoved()||vD(e,{},t.getViewRoot().getAncestors(),t)}};function vD(t,e,n,i){var r=t.getModel(),o=t.getLayout(),a=t.hostTree.data;if(o&&!o.invisible&&o.isInView){var s,l=r.getModel("itemStyle"),u=function(t,e,n){var i=A({},e),r=n.designatedVisualItemStyle;return E(["color","colorAlpha","colorSaturation"],(function(n){r[n]=e[n];var o=t.get(n);r[n]=null,null!=o&&(i[n]=o)})),i}(l,e,i),h=a.ensureUniqueItemVisual(t.dataIndex,"style"),c=l.get("borderColor"),p=l.get("borderColorSaturation");null!=p&&(c=function(t,e){return null!=e?Dn(e,null,null,t):null}(p,s=mD(u))),h.stroke=c;var d=t.viewChildren;if(d&&d.length){var f=function(t,e,n,i,r,o){if(!o||!o.length)return;var a=_D(e,"color")||null!=r.color&&"none"!==r.color&&(_D(e,"colorAlpha")||_D(e,"colorSaturation"));if(!a)return;var s=e.get("visualMin"),l=e.get("visualMax"),u=n.dataExtent.slice();null!=s&&s<u[0]&&(u[0]=s),null!=l&&l>u[1]&&(u[1]=l);var h=e.get("colorMappingBy"),c={type:a.name,dataExtent:u,visual:a.range};"color"!==c.type||"index"!==h&&"id"!==h?c.mappingMethod="linear":(c.mappingMethod="category",c.loop=!0);var p=new iD(c);return gD(p).drColorMappingBy=h,p}(0,r,o,0,u,d);E(d,(function(t,e){if(t.depth>=n.length||t===n[t.depth]){var o=function(t,e,n,i,r,o){var a=A({},e);if(r){var s=r.type,l="color"===s&&gD(r).drColorMappingBy,u="index"===l?i:"id"===l?o.mapIdToIndex(n.getId()):n.getValue(t.get("visualDimension"));a[s]=r.mapValueToVisual(u)}return a}(r,u,t,e,f,i);vD(t,o,n,i)}}))}else s=mD(u),h.fill=s}}function mD(t){var e=xD(t,"color");if(e){var n=xD(t,"colorAlpha"),i=xD(t,"colorSaturation");return i&&(e=Dn(e,null,null,i)),n&&(e=An(e,n)),e}}function xD(t,e){var n=t[e];if(null!=n&&"none"!==n)return n}function _D(t,e){var n=t.get(e);return Y(n)&&n.length?{name:e,range:n}:null}var bD=Math.max,wD=Math.min,SD=it,MD=E,ID=["itemStyle","borderWidth"],TD=["itemStyle","gapWidth"],CD=["upperLabel","show"],DD=["upperLabel","height"],AD={seriesType:"treemap",reset:function(t,e,n,i){var r=n.getWidth(),o=n.getHeight(),a=t.option,s=xp(t.getBoxLayoutParams(),{width:n.getWidth(),height:n.getHeight()}),l=a.size||[],u=Er(SD(s.width,l[0]),r),h=Er(SD(s.height,l[1]),o),c=i&&i.type,p=kC(i,["treemapZoomToNode","treemapRootToNode"],t),d="treemapRender"===c||"treemapMove"===c?i.rootRect:null,f=t.getViewRoot(),g=LC(f);if("treemapMove"!==c){var y="treemapZoomToNode"===c?function(t,e,n,i,r){var o,a=(e||{}).node,s=[i,r];if(!a||a===n)return s;var l=i*r,u=l*t.option.zoomToNodeRatio;for(;o=a.parentNode;){for(var h=0,c=o.children,p=0,d=c.length;p<d;p++)h+=c[p].getValue();var f=a.getValue();if(0===f)return s;u*=h/f;var g=o.getModel(),y=g.get(ID);(u+=4*y*y+(3*y+Math.max(y,RD(g)))*Math.pow(u,.5))>Yr&&(u=Yr),a=o}u<l&&(u=l);var v=Math.pow(u/l,.5);return[i*v,r*v]}(t,p,f,u,h):d?[d.width,d.height]:[u,h],v=a.sort;v&&"asc"!==v&&"desc"!==v&&(v="desc");var m={squareRatio:a.squareRatio,sort:v,leafDepth:a.leafDepth};f.hostTree.clearLayouts();var x={x:0,y:0,width:y[0],height:y[1],area:y[0]*y[1]};f.setLayout(x),kD(f,m,!1,0),x=f.getLayout(),MD(g,(function(t,e){var n=(g[e+1]||f).getValue();t.setLayout(A({dataExtent:[n,n],borderWidth:0,upperHeight:0},x))}))}var _=t.getData().tree.root;_.setLayout(function(t,e,n){if(e)return{x:e.x,y:e.y};var i={x:0,y:0};if(!n)return i;var r=n.node,o=r.getLayout();if(!o)return i;var a=[o.width/2,o.height/2],s=r;for(;s;){var l=s.getLayout();a[0]+=l.x,a[1]+=l.y,s=s.parentNode}return{x:t.width/2-a[0],y:t.height/2-a[1]}}(s,d,p),!0),t.setLayoutInfo(s),OD(_,new sr(-s.x,-s.y,r,o),g,f,0)}};function kD(t,e,n,i){var r,o;if(!t.isRemoved()){var a=t.getLayout();r=a.width,o=a.height;var s=t.getModel(),l=s.get(ID),u=s.get(TD)/2,h=RD(s),c=Math.max(l,h),p=l-u,d=c-u;t.setLayout({borderWidth:l,upperHeight:c,upperLabelHeight:h},!0);var f=(r=bD(r-2*p,0))*(o=bD(o-p-d,0)),g=function(t,e,n,i,r,o){var a=t.children||[],s=i.sort;"asc"!==s&&"desc"!==s&&(s=null);var l=null!=i.leafDepth&&i.leafDepth<=o;if(r&&!l)return t.viewChildren=[];!function(t,e){e&&t.sort((function(t,n){var i="asc"===e?t.getValue()-n.getValue():n.getValue()-t.getValue();return 0===i?"asc"===e?t.dataIndex-n.dataIndex:n.dataIndex-t.dataIndex:i}))}(a=B(a,(function(t){return!t.isRemoved()})),s);var u=function(t,e,n){for(var i=0,r=0,o=e.length;r<o;r++)i+=e[r].getValue();var a,s=t.get("visualDimension");e&&e.length?"value"===s&&n?(a=[e[e.length-1].getValue(),e[0].getValue()],"asc"===n&&a.reverse()):(a=[1/0,-1/0],MD(e,(function(t){var e=t.getValue(s);e<a[0]&&(a[0]=e),e>a[1]&&(a[1]=e)}))):a=[NaN,NaN];return{sum:i,dataExtent:a}}(e,a,s);if(0===u.sum)return t.viewChildren=[];if(u.sum=function(t,e,n,i,r){if(!i)return n;for(var o=t.get("visibleMin"),a=r.length,s=a,l=a-1;l>=0;l--){var u=r["asc"===i?a-l-1:l].getValue();u/n*e<o&&(s=l,n-=u)}return"asc"===i?r.splice(0,a-s):r.splice(s,a-s),n}(e,n,u.sum,s,a),0===u.sum)return t.viewChildren=[];for(var h=0,c=a.length;h<c;h++){var p=a[h].getValue()/u.sum*n;a[h].setLayout({area:p})}l&&(a.length&&t.setLayout({isLeafRoot:!0},!0),a.length=0);return t.viewChildren=a,t.setLayout({dataExtent:u.dataExtent},!0),a}(t,s,f,e,n,i);if(g.length){var y={x:p,y:d,width:r,height:o},v=wD(r,o),m=1/0,x=[];x.area=0;for(var _=0,b=g.length;_<b;){var w=g[_];x.push(w),x.area+=w.getLayout().area;var S=LD(x,v,e.squareRatio);S<=m?(_++,m=S):(x.area-=x.pop().getLayout().area,PD(x,v,y,u,!1),v=wD(y.width,y.height),x.length=x.area=0,m=1/0)}if(x.length&&PD(x,v,y,u,!0),!n){var M=s.get("childrenVisibleMin");null!=M&&f<M&&(n=!0)}for(_=0,b=g.length;_<b;_++)kD(g[_],e,n,i+1)}}}function LD(t,e,n){for(var i=0,r=1/0,o=0,a=void 0,s=t.length;o<s;o++)(a=t[o].getLayout().area)&&(a<r&&(r=a),a>i&&(i=a));var l=t.area*t.area,u=e*e*n;return l?bD(u*i/l,l/(u*r)):1/0}function PD(t,e,n,i,r){var o=e===n.width?0:1,a=1-o,s=["x","y"],l=["width","height"],u=n[s[o]],h=e?t.area/e:0;(r||h>n[l[a]])&&(h=n[l[a]]);for(var c=0,p=t.length;c<p;c++){var d=t[c],f={},g=h?d.getLayout().area/h:0,y=f[l[a]]=bD(h-2*i,0),v=n[s[o]]+n[l[o]]-u,m=c===p-1||v<g?v:g,x=f[l[o]]=bD(m-2*i,0);f[s[a]]=n[s[a]]+wD(i,y/2),f[s[o]]=u+wD(i,x/2),u+=m,d.setLayout(f,!0)}n[s[a]]+=h,n[l[a]]-=h}function OD(t,e,n,i,r){var o=t.getLayout(),a=n[r],s=a&&a===t;if(!(a&&!s||r===n.length&&t!==i)){t.setLayout({isInView:!0,invisible:!s&&!e.intersect(o),isAboveViewRoot:s},!0);var l=new sr(e.x-o.x,e.y-o.y,e.width,e.height);MD(t.viewChildren||[],(function(t){OD(t,l,n,i,r+1)}))}}function RD(t){return t.get(CD)?t.get(DD):0}function ND(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.eachSeriesByType("graph",(function(t){var n=t.getCategoriesData(),i=t.getGraph().data,r=n.mapArray(n.getName);i.filterSelf((function(t){var n=i.getItemModel(t).getShallow("category");if(null!=n){j(n)&&(n=r[n]);for(var o=0;o<e.length;o++)if(!e[o].isSelected(n))return!1}return!0}))}))}function ED(t){var e={};t.eachSeriesByType("graph",(function(t){var n=t.getCategoriesData(),i=t.getData(),r={};n.each((function(i){var o=n.getName(i);r["ec-"+o]=i;var a=n.getItemModel(i),s=a.getModel("itemStyle").getItemStyle();s.fill||(s.fill=t.getColorFromPalette(o,e)),n.setItemVisual(i,"style",s);for(var l=["symbol","symbolSize","symbolKeepAspect"],u=0;u<l.length;u++){var h=a.getShallow(l[u],!0);null!=h&&n.setItemVisual(i,l[u],h)}})),n.count()&&i.each((function(t){var e=i.getItemModel(t).getShallow("category");if(null!=e){X(e)&&(e=r["ec-"+e]);var o=n.getItemVisual(e,"style");A(i.ensureUniqueItemVisual(t,"style"),o);for(var a=["symbol","symbolSize","symbolKeepAspect"],s=0;s<a.length;s++)i.setItemVisual(t,a[s],n.getItemVisual(e,a[s]))}}))}))}function zD(t){return t instanceof Array||(t=[t,t]),t}function VD(t){t.eachSeriesByType("graph",(function(t){var e=t.getGraph(),n=t.getEdgeData(),i=zD(t.get("edgeSymbol")),r=zD(t.get("edgeSymbolSize"));n.setVisual("fromSymbol",i&&i[0]),n.setVisual("toSymbol",i&&i[1]),n.setVisual("fromSymbolSize",r&&r[0]),n.setVisual("toSymbolSize",r&&r[1]),n.setVisual("style",t.getModel("lineStyle").getLineStyle()),n.each((function(t){var i=n.getItemModel(t),r=e.getEdgeByIndex(t),o=zD(i.getShallow("symbol",!0)),a=zD(i.getShallow("symbolSize",!0)),s=i.getModel("lineStyle").getLineStyle(),l=n.ensureUniqueItemVisual(t,"style");switch(A(l,s),l.stroke){case"source":var u=r.node1.getVisual("style");l.stroke=u&&u.fill;break;case"target":u=r.node2.getVisual("style");l.stroke=u&&u.fill}o[0]&&r.setVisual("fromSymbol",o[0]),o[1]&&r.setVisual("toSymbol",o[1]),a[0]&&r.setVisual("fromSymbolSize",a[0]),a[1]&&r.setVisual("toSymbolSize",a[1])}))}))}var BD="--\x3e",FD=function(t){return t.get("autoCurveness")||null},GD=function(t,e){var n=FD(t),i=20,r=[];if(j(n))i=n;else if(Y(n))return void(t.__curvenessList=n);e>i&&(i=e);var o=i%2?i+2:i+3;r=[];for(var a=0;a<o;a++)r.push((a%2?a+1:a)/10*(a%2?-1:1));t.__curvenessList=r},WD=function(t,e,n){var i=[t.id,t.dataIndex].join("."),r=[e.id,e.dataIndex].join(".");return[n.uid,i,r].join(BD)},HD=function(t){var e=t.split(BD);return[e[0],e[2],e[1]].join(BD)},YD=function(t,e){var n=e.__edgeMap;return n[t]?n[t].length:0};function UD(t,e,n,i){var r=FD(e),o=Y(r);if(!r)return null;var a=function(t,e){var n=WD(t.node1,t.node2,e);return e.__edgeMap[n]}(t,e);if(!a)return null;for(var s=-1,l=0;l<a.length;l++)if(a[l]===n){s=l;break}var u=function(t,e){return YD(WD(t.node1,t.node2,e),e)+YD(WD(t.node2,t.node1,e),e)}(t,e);GD(e,u),t.lineStyle=t.lineStyle||{};var h=WD(t.node1,t.node2,e),c=e.__curvenessList,p=o||u%2?0:1;if(a.isForward)return c[p+s];var d=HD(h),f=YD(d,e),g=c[s+f+p];return i?o?r&&0===r[0]?(f+p)%2?g:-g:((f%2?0:1)+p)%2?g:-g:(f+p)%2?g:-g:c[s+f+p]}function XD(t){var e=t.coordinateSystem;if(!e||"view"===e.type){var n=t.getGraph();n.eachNode((function(t){var e=t.getModel();t.setLayout([+e.get("x"),+e.get("y")])})),ZD(n,t)}}function ZD(t,e){t.eachEdge((function(t,n){var i=ot(t.getModel().get(["lineStyle","curveness"]),-UD(t,e,n,!0),0),r=Mt(t.node1.getLayout()),o=Mt(t.node2.getLayout()),a=[r,o];+i&&a.push([(r[0]+o[0])/2-(r[1]-o[1])*i,(r[1]+o[1])/2-(o[0]-r[0])*i]),t.setLayout(a)}))}function jD(t,e){t.eachSeriesByType("graph",(function(t){var e=t.get("layout"),n=t.coordinateSystem;if(n&&"view"!==n.type){var i=t.getData(),r=[];E(n.dimensions,(function(t){r=r.concat(i.mapDimensionsAll(t))}));for(var o=0;o<i.count();o++){for(var a=[],s=!1,l=0;l<r.length;l++){var u=i.get(r[l],o);isNaN(u)||(s=!0),a.push(u)}s?i.setItemLayout(o,n.dataToPoint(a)):i.setItemLayout(o,[NaN,NaN])}ZD(i.graph,t)}else e&&"none"!==e||XD(t)}))}function qD(t){var e=t.coordinateSystem;if("view"!==e.type)return 1;var n=t.option.nodeScaleRatio,i=e.scaleX;return((e.getZoom()-1)*n+1)/i}function KD(t){var e=t.getVisual("symbolSize");return e instanceof Array&&(e=(e[0]+e[1])/2),+e}var $D=Math.PI,JD=[];function QD(t,e){var n=t.coordinateSystem;if(!n||"view"===n.type){var i=n.getBoundingRect(),r=t.getData(),o=r.graph,a=i.width/2+i.x,s=i.height/2+i.y,l=Math.min(i.width,i.height)/2,u=r.count();r.setLayout({cx:a,cy:s}),u&&(tA[e](t,o,r,l,a,s,u),o.eachEdge((function(e,n){var i,r=ot(e.getModel().get(["lineStyle","curveness"]),UD(e,t,n),0),o=Mt(e.node1.getLayout()),l=Mt(e.node2.getLayout()),u=(o[0]+l[0])/2,h=(o[1]+l[1])/2;+r&&(i=[a*(r*=3)+u*(1-r),s*r+h*(1-r)]),e.setLayout([o,l,i])})))}}var tA={value:function(t,e,n,i,r,o,a){var s=0,l=n.getSum("value"),u=2*Math.PI/(l||a);e.eachNode((function(t){var e=t.getValue("value"),n=u*(l?e:1)/2;s+=n,t.setLayout([i*Math.cos(s)+r,i*Math.sin(s)+o]),s+=n}))},symbolSize:function(t,e,n,i,r,o,a){var s=0;JD.length=a;var l=qD(t);e.eachNode((function(t){var e=KD(t);isNaN(e)&&(e=2),e<0&&(e=0),e*=l;var n=Math.asin(e/2/i);isNaN(n)&&(n=$D/2),JD[t.dataIndex]=n,s+=2*n}));var u=(2*$D-s)/a/2,h=0;e.eachNode((function(t){var e=u+JD[t.dataIndex];h+=e,t.setLayout([i*Math.cos(h)+r,i*Math.sin(h)+o]),h+=e}))}};function eA(t){t.eachSeriesByType("graph",(function(t){"circular"===t.get("layout")&&QD(t,"symbolSize")}))}var nA=Ct;function iA(t){t.eachSeriesByType("graph",(function(t){var e=t.coordinateSystem;if(!e||"view"===e.type)if("force"===t.get("layout")){var n=t.preservedPoints||{},i=t.getGraph(),r=i.data,o=i.edgeData,a=t.getModel("force"),s=a.get("initLayout");t.preservedPoints?r.each((function(t){var e=r.getId(t);r.setItemLayout(t,n[e]||[NaN,NaN])})):s&&"none"!==s?"circular"===s&&QD(t,"value"):XD(t);var l=r.getDataExtent("value"),u=o.getDataExtent("value"),h=a.get("repulsion"),c=a.get("edgeLength"),p=Y(h)?h:[h,h],d=Y(c)?c:[c,c];d=[d[1],d[0]];var f=r.mapArray("value",(function(t,e){var n=r.getItemLayout(e),i=Nr(t,l,p);return isNaN(i)&&(i=(p[0]+p[1])/2),{w:i,rep:i,fixed:r.getItemModel(e).get("fixed"),p:!n||isNaN(n[0])||isNaN(n[1])?null:n}})),g=o.mapArray("value",(function(e,n){var r=i.getEdgeByIndex(n),o=Nr(e,u,d);isNaN(o)&&(o=(d[0]+d[1])/2);var a=r.getModel(),s=ot(r.getModel().get(["lineStyle","curveness"]),-UD(r,t,n,!0),0);return{n1:f[r.node1.dataIndex],n2:f[r.node2.dataIndex],d:o,curveness:s,ignoreForceLayout:a.get("ignoreForceLayout")}})),y=e.getBoundingRect(),v=function(t,e,n){for(var i=t,r=e,o=n.rect,a=o.width,s=o.height,l=[o.x+a/2,o.y+s/2],u=null==n.gravity?.1:n.gravity,h=0;h<i.length;h++){var c=i[h];c.p||(c.p=wt(a*(Math.random()-.5)+l[0],s*(Math.random()-.5)+l[1])),c.pp=Mt(c.p),c.edges=null}var p,d,f=null==n.friction?.6:n.friction,g=f;return{warmUp:function(){g=.8*f},setFixed:function(t){i[t].fixed=!0},setUnfixed:function(t){i[t].fixed=!1},beforeStep:function(t){p=t},afterStep:function(t){d=t},step:function(t){p&&p(i,r);for(var e=[],n=i.length,o=0;o<r.length;o++){var a=r[o];if(!a.ignoreForceLayout){var s=a.n1;Dt(e,(y=a.n2).p,s.p);var h=At(e)-a.d,c=y.w/(s.w+y.w);isNaN(c)&&(c=0),Rt(e,e),!s.fixed&&nA(s.p,s.p,e,c*h*g),!y.fixed&&nA(y.p,y.p,e,-(1-c)*h*g)}}for(o=0;o<n;o++)(x=i[o]).fixed||(Dt(e,l,x.p),nA(x.p,x.p,e,u*g));for(o=0;o<n;o++){s=i[o];for(var f=o+1;f<n;f++){var y;Dt(e,(y=i[f]).p,s.p),0===(h=At(e))&&(It(e,Math.random()-.5,Math.random()-.5),h=1);var v=(s.rep+y.rep)/h/h;!s.fixed&&nA(s.pp,s.pp,e,v),!y.fixed&&nA(y.pp,y.pp,e,-v)}}var m=[];for(o=0;o<n;o++){var x;(x=i[o]).fixed||(Dt(m,x.p,x.pp),nA(x.p,x.p,m,g),St(x.pp,x.p))}var _=(g*=.992)<.01;d&&d(i,r,_),t&&t(_)}}}(f,g,{rect:y,gravity:a.get("gravity"),friction:a.get("friction")});v.beforeStep((function(t,e){for(var n=0,r=t.length;n<r;n++)t[n].fixed&&St(t[n].p,i.getNodeByIndex(n).getLayout())})),v.afterStep((function(t,e,o){for(var a=0,s=t.length;a<s;a++)t[a].fixed||i.getNodeByIndex(a).setLayout(t[a].p),n[r.getId(a)]=t[a].p;for(a=0,s=e.length;a<s;a++){var l=e[a],u=i.getEdgeByIndex(a),h=l.n1.p,c=l.n2.p,p=u.getLayout();(p=p?p.slice():[])[0]=p[0]||[],p[1]=p[1]||[],St(p[0],h),St(p[1],c),+l.curveness&&(p[2]=[(h[0]+c[0])/2-(h[1]-c[1])*l.curveness,(h[1]+c[1])/2-(c[0]-h[0])*l.curveness]),u.setLayout(p)}})),t.forceLayout=v,t.preservedPoints=n,v.step()}else t.forceLayout=null}))}function rA(t,e){var n=[];return t.eachSeriesByType("graph",(function(t){var i=t.get("coordinateSystem");if(!i||"view"===i){var r=t.getData(),o=[],a=[];Ma(r.mapArray((function(t){var e=r.getItemModel(t);return[+e.get("x"),+e.get("y")]})),o,a),a[0]-o[0]==0&&(a[0]+=1,o[0]-=1),a[1]-o[1]==0&&(a[1]+=1,o[1]-=1);var s=(a[0]-o[0])/(a[1]-o[1]),l=function(t,e,n){return xp(A(t.getBoxLayoutParams(),{aspect:n}),{width:e.getWidth(),height:e.getHeight()})}(t,e,s);isNaN(s)&&(o=[l.x,l.y],a=[l.x+l.width,l.y+l.height]);var u=a[0]-o[0],h=a[1]-o[1],c=l.width,p=l.height,d=t.coordinateSystem=new GT;d.zoomLimit=t.get("scaleLimit"),d.setBoundingRect(o[0],o[1],u,h),d.setViewRect(l.x,l.y,c,p),d.setCenter(t.get("center"),e),d.setZoom(t.get("zoom")),n.push(d)}})),n}var oA=zu.prototype,aA=Gu.prototype,sA=function(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.percent=1};!function(t){function e(){return null!==t&&t.apply(this,arguments)||this}n(e,t)}(sA);function lA(t){return isNaN(+t.cpx1)||isNaN(+t.cpy1)}var uA=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-line",n}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new sA},e.prototype.buildPath=function(t,e){lA(e)?oA.buildPath.call(this,t,e):aA.buildPath.call(this,t,e)},e.prototype.pointAt=function(t){return lA(this.shape)?oA.pointAt.call(this,t):aA.pointAt.call(this,t)},e.prototype.tangentAt=function(t){var e=this.shape,n=lA(e)?[e.x2-e.x1,e.y2-e.y1]:aA.tangentAt.call(this,t);return Rt(n,n)},e}(gs),hA=["fromSymbol","toSymbol"];function cA(t){return"_"+t+"Type"}function pA(t,e,n){var i=e.getItemVisual(n,t);if(i&&"none"!==i){var r=e.getItemVisual(n,t+"Size"),o=e.getItemVisual(n,t+"Rotate"),a=e.getItemVisual(n,t+"Offset"),s=e.getItemVisual(n,t+"KeepAspect"),l=Py(r),u=Oy(a||0,l),h=Ly(i,-l[0]/2+u[0],-l[1]/2+u[1],l[0],l[1],null,s);return h.__specifiedRotation=null==o||isNaN(o)?void 0:+o*Math.PI/180||0,h.name=t,h}}function dA(t,e){t.x1=e[0][0],t.y1=e[0][1],t.x2=e[1][0],t.y2=e[1][1],t.percent=1;var n=e[2];n?(t.cpx1=n[0],t.cpy1=n[1]):(t.cpx1=NaN,t.cpy1=NaN)}var fA=function(t){function e(e,n,i){var r=t.call(this)||this;return r._createLine(e,n,i),r}return n(e,t),e.prototype._createLine=function(t,e,n){var i=t.hostModel,r=function(t){var e=new uA({name:"line",subPixelOptimize:!0});return dA(e.shape,t),e}(t.getItemLayout(e));r.shape.percent=0,oh(r,{shape:{percent:1}},i,e),this.add(r),E(hA,(function(n){var i=pA(n,t,e);this.add(i),this[cA(n)]=t.getItemVisual(e,n)}),this),this._updateCommonStl(t,e,n)},e.prototype.updateData=function(t,e,n){var i=t.hostModel,r=this.childOfName("line"),o=t.getItemLayout(e),a={shape:{}};dA(a.shape,o),rh(r,a,i,e),E(hA,(function(n){var i=t.getItemVisual(e,n),r=cA(n);if(this[r]!==i){this.remove(this.childOfName(n));var o=pA(n,t,e);this.add(o)}this[r]=i}),this),this._updateCommonStl(t,e,n)},e.prototype.getLinePath=function(){return this.childAt(0)},e.prototype._updateCommonStl=function(t,e,n){var i=t.hostModel,r=this.childOfName("line"),o=n&&n.emphasisLineStyle,a=n&&n.blurLineStyle,s=n&&n.selectLineStyle,l=n&&n.labelStatesModels,u=n&&n.emphasisDisabled,h=n&&n.focus,c=n&&n.blurScope;if(!n||t.hasItemOption){var p=t.getItemModel(e),d=p.getModel("emphasis");o=d.getModel("lineStyle").getLineStyle(),a=p.getModel(["blur","lineStyle"]).getLineStyle(),s=p.getModel(["select","lineStyle"]).getLineStyle(),u=d.get("disabled"),h=d.get("focus"),c=d.get("blurScope"),l=Yh(p)}var f=t.getItemVisual(e,"style"),g=f.stroke;r.useStyle(f),r.style.fill=null,r.style.strokeNoScale=!0,r.ensureState("emphasis").style=o,r.ensureState("blur").style=a,r.ensureState("select").style=s,E(hA,(function(t){var e=this.childOfName(t);if(e){e.setColor(g),e.style.opacity=f.opacity;for(var n=0;n<qs.length;n++){var i=qs[n],o=r.getState(i);if(o){var a=o.style||{},s=e.ensureState(i),l=s.style||(s.style={});null!=a.stroke&&(l[e.__isEmptyBrush?"stroke":"fill"]=a.stroke),null!=a.opacity&&(l.opacity=a.opacity)}}e.markRedraw()}}),this);var y=i.getRawValue(e);Hh(this,l,{labelDataIndex:e,labelFetcher:{getFormattedLabel:function(e,n){return i.getFormattedLabel(e,n,t.dataType)}},inheritColor:g||"#000",defaultOpacity:f.opacity,defaultText:(null==y?t.getName(e):isFinite(y)?zr(y):y)+""});var v=this.getTextContent();if(v){var m=l.normal;v.__align=v.style.align,v.__verticalAlign=v.style.verticalAlign,v.__position=m.get("position")||"middle";var x=m.get("distance");Y(x)||(x=[x,x]),v.__labelDistance=x}this.setTextConfig({position:null,local:!0,inside:!1}),Rl(this,h,c,u)},e.prototype.highlight=function(){_l(this)},e.prototype.downplay=function(){bl(this)},e.prototype.updateLayout=function(t,e){this.setLinePoints(t.getItemLayout(e))},e.prototype.setLinePoints=function(t){var e=this.childOfName("line");dA(e.shape,t),e.dirty()},e.prototype.beforeUpdate=function(){var t=this,e=t.childOfName("fromSymbol"),n=t.childOfName("toSymbol"),i=t.getTextContent();if(e||n||i&&!i.ignore){for(var r=1,o=this.parent;o;)o.scaleX&&(r/=o.scaleX),o=o.parent;var a=t.childOfName("line");if(this.__dirty||a.__dirty){var s=a.shape.percent,l=a.pointAt(0),u=a.pointAt(s),h=Dt([],u,l);if(Rt(h,h),e&&(e.setPosition(l),S(e,0),e.scaleX=e.scaleY=r*s,e.markRedraw()),n&&(n.setPosition(u),S(n,1),n.scaleX=n.scaleY=r*s,n.markRedraw()),i&&!i.ignore){i.x=i.y=0,i.originX=i.originY=0;var c=void 0,p=void 0,d=i.__labelDistance,f=d[0]*r,g=d[1]*r,y=s/2,v=a.tangentAt(y),m=[v[1],-v[0]],x=a.pointAt(y);m[1]>0&&(m[0]=-m[0],m[1]=-m[1]);var _=v[0]<0?-1:1;if("start"!==i.__position&&"end"!==i.__position){var b=-Math.atan2(v[1],v[0]);u[0]<l[0]&&(b=Math.PI+b),i.rotation=b}var w=void 0;switch(i.__position){case"insideStartTop":case"insideMiddleTop":case"insideEndTop":case"middle":w=-g,p="bottom";break;case"insideStartBottom":case"insideMiddleBottom":case"insideEndBottom":w=g,p="top";break;default:w=0,p="middle"}switch(i.__position){case"end":i.x=h[0]*f+u[0],i.y=h[1]*g+u[1],c=h[0]>.8?"left":h[0]<-.8?"right":"center",p=h[1]>.8?"top":h[1]<-.8?"bottom":"middle";break;case"start":i.x=-h[0]*f+l[0],i.y=-h[1]*g+l[1],c=h[0]>.8?"right":h[0]<-.8?"left":"center",p=h[1]>.8?"bottom":h[1]<-.8?"top":"middle";break;case"insideStartTop":case"insideStart":case"insideStartBottom":i.x=f*_+l[0],i.y=l[1]+w,c=v[0]<0?"right":"left",i.originX=-f*_,i.originY=-w;break;case"insideMiddleTop":case"insideMiddle":case"insideMiddleBottom":case"middle":i.x=x[0],i.y=x[1]+w,c="center",i.originY=-w;break;case"insideEndTop":case"insideEnd":case"insideEndBottom":i.x=-f*_+u[0],i.y=u[1]+w,c=v[0]>=0?"right":"left",i.originX=f*_,i.originY=-w}i.scaleX=i.scaleY=r,i.setStyle({verticalAlign:i.__verticalAlign||p,align:i.__align||c})}}}function S(t,e){var n=t.__specifiedRotation;if(null==n){var i=a.tangentAt(e);t.attr("rotation",(1===e?-1:1)*Math.PI/2-Math.atan2(i[1],i[0]))}else t.attr("rotation",n)}},e}(Cr),gA=function(){function t(t){this.group=new Cr,this._LineCtor=t||fA}return t.prototype.updateData=function(t){var e=this;this._progressiveEls=null;var n=this,i=n.group,r=n._lineData;n._lineData=t,r||i.removeAll();var o=yA(t);t.diff(r).add((function(n){e._doAdd(t,n,o)})).update((function(n,i){e._doUpdate(r,t,i,n,o)})).remove((function(t){i.remove(r.getItemGraphicEl(t))})).execute()},t.prototype.updateLayout=function(){var t=this._lineData;t&&t.eachItemGraphicEl((function(e,n){e.updateLayout(t,n)}),this)},t.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=yA(t),this._lineData=null,this.group.removeAll()},t.prototype.incrementalUpdate=function(t,e){function n(t){t.isGroup||function(t){return t.animators&&t.animators.length>0}(t)||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}this._progressiveEls=[];for(var i=t.start;i<t.end;i++){if(mA(e.getItemLayout(i))){var r=new this._LineCtor(e,i,this._seriesScope);r.traverse(n),this.group.add(r),e.setItemGraphicEl(i,r),this._progressiveEls.push(r)}}},t.prototype.remove=function(){this.group.removeAll()},t.prototype.eachRendered=function(t){Vh(this._progressiveEls||this.group,t)},t.prototype._doAdd=function(t,e,n){if(mA(t.getItemLayout(e))){var i=new this._LineCtor(t,e,n);t.setItemGraphicEl(e,i),this.group.add(i)}},t.prototype._doUpdate=function(t,e,n,i,r){var o=t.getItemGraphicEl(n);mA(e.getItemLayout(i))?(o?o.updateData(e,i,r):o=new this._LineCtor(e,i,r),e.setItemGraphicEl(i,o),this.group.add(o)):this.group.remove(o)},t}();function yA(t){var e=t.hostModel,n=e.getModel("emphasis");return{lineStyle:e.getModel("lineStyle").getLineStyle(),emphasisLineStyle:n.getModel(["lineStyle"]).getLineStyle(),blurLineStyle:e.getModel(["blur","lineStyle"]).getLineStyle(),selectLineStyle:e.getModel(["select","lineStyle"]).getLineStyle(),emphasisDisabled:n.get("disabled"),blurScope:n.get("blurScope"),focus:n.get("focus"),labelStatesModels:Yh(e)}}function vA(t){return isNaN(t[0])||isNaN(t[1])}function mA(t){return t&&!vA(t[0])&&!vA(t[1])}var xA=[],_A=[],bA=[],wA=Ke,SA=Vt,MA=Math.abs;function IA(t,e,n){for(var i,r=t[0],o=t[1],a=t[2],s=1/0,l=n*n,u=.1,h=.1;h<=.9;h+=.1){xA[0]=wA(r[0],o[0],a[0],h),xA[1]=wA(r[1],o[1],a[1],h),(d=MA(SA(xA,e)-l))<s&&(s=d,i=h)}for(var c=0;c<32;c++){var p=i+u;_A[0]=wA(r[0],o[0],a[0],i),_A[1]=wA(r[1],o[1],a[1],i),bA[0]=wA(r[0],o[0],a[0],p),bA[1]=wA(r[1],o[1],a[1],p);var d=SA(_A,e)-l;if(MA(d)<.01)break;var f=SA(bA,e)-l;u/=2,d<0?f>=0?i+=u:i-=u:f>=0?i-=u:i+=u}return i}function TA(t,e){var n=[],i=Qe,r=[[],[],[]],o=[[],[]],a=[];e/=2,t.eachEdge((function(t,s){var l=t.getLayout(),u=t.getVisual("fromSymbol"),h=t.getVisual("toSymbol");l.__original||(l.__original=[Mt(l[0]),Mt(l[1])],l[2]&&l.__original.push(Mt(l[2])));var c=l.__original;if(null!=l[2]){if(St(r[0],c[0]),St(r[1],c[2]),St(r[2],c[1]),u&&"none"!==u){var p=KD(t.node1),d=IA(r,c[0],p*e);i(r[0][0],r[1][0],r[2][0],d,n),r[0][0]=n[3],r[1][0]=n[4],i(r[0][1],r[1][1],r[2][1],d,n),r[0][1]=n[3],r[1][1]=n[4]}if(h&&"none"!==h){p=KD(t.node2),d=IA(r,c[1],p*e);i(r[0][0],r[1][0],r[2][0],d,n),r[1][0]=n[1],r[2][0]=n[2],i(r[0][1],r[1][1],r[2][1],d,n),r[1][1]=n[1],r[2][1]=n[2]}St(l[0],r[0]),St(l[1],r[2]),St(l[2],r[1])}else{if(St(o[0],c[0]),St(o[1],c[1]),Dt(a,o[1],o[0]),Rt(a,a),u&&"none"!==u){p=KD(t.node1);Ct(o[0],o[0],a,p*e)}if(h&&"none"!==h){p=KD(t.node2);Ct(o[1],o[1],a,-p*e)}St(l[0],o[0]),St(l[1],o[1])}}))}function CA(t){return"view"===t.type}var DA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){var n=new qw,i=new gA,r=this.group;this._controller=new kI(e.getZr()),this._controllerHost={target:r},r.add(n.group),r.add(i.group),this._symbolDraw=n,this._lineDraw=i,this._firstRender=!0},e.prototype.render=function(t,e,n){var i=this,r=t.coordinateSystem;this._model=t;var o=this._symbolDraw,a=this._lineDraw,s=this.group;if(CA(r)){var l={x:r.x,y:r.y,scaleX:r.scaleX,scaleY:r.scaleY};this._firstRender?s.attr(l):rh(s,l,t)}TA(t.getGraph(),qD(t));var u=t.getData();o.updateData(u);var h=t.getEdgeData();a.updateData(h),this._updateNodeAndLinkScale(),this._updateController(t,e,n),clearTimeout(this._layoutTimeout);var c=t.forceLayout,p=t.get(["force","layoutAnimation"]);c&&this._startForceLayoutIteration(c,p),u.graph.eachNode((function(t){var e=t.dataIndex,n=t.getGraphicEl(),r=t.getModel();if(n){n.off("drag").off("dragend");var o=r.get("draggable");o&&n.on("drag",(function(){c&&(c.warmUp(),!i._layouting&&i._startForceLayoutIteration(c,p),c.setFixed(e),u.setItemLayout(e,[n.x,n.y]))})).on("dragend",(function(){c&&c.setUnfixed(e)})),n.setDraggable(o&&!!c,!!r.get("cursor")),"adjacency"===r.get(["emphasis","focus"])&&(Hs(n).focus=t.getAdjacentDataIndices())}})),u.graph.eachEdge((function(t){var e=t.getGraphicEl(),n=t.getModel().get(["emphasis","focus"]);e&&"adjacency"===n&&(Hs(e).focus={edge:[t.dataIndex],node:[t.node1.dataIndex,t.node2.dataIndex]})}));var d="circular"===t.get("layout")&&t.get(["circular","rotateLabel"]),f=u.getLayout("cx"),g=u.getLayout("cy");u.eachItemGraphicEl((function(t,e){var n=u.getItemModel(e).get(["label","rotate"])||0,i=t.getSymbolPath();if(d){var r=u.getItemLayout(e),o=Math.atan2(r[1]-g,r[0]-f);o<0&&(o=2*Math.PI+o);var a=r[0]<f;a&&(o-=Math.PI);var s=a?"left":"right";i.setTextConfig({rotation:-o,position:s,origin:"center"});var l=i.ensureState("emphasis");A(l.textConfig||(l.textConfig={}),{position:s})}else i.setTextConfig({rotation:n*=Math.PI/180})})),this._firstRender=!1},e.prototype.dispose=function(){this._controller&&this._controller.dispose(),this._controllerHost=null},e.prototype._startForceLayoutIteration=function(t,e){var n=this;!function i(){t.step((function(t){n.updateLayout(n._model),(n._layouting=!t)&&(e?n._layoutTimeout=setTimeout(i,16):i())}))}()},e.prototype._updateController=function(t,e,n){var i=this,r=this._controller,o=this._controllerHost,a=this.group;r.setPointerChecker((function(e,i,r){var o=a.getBoundingRect();return o.applyTransform(a.transform),o.contain(i,r)&&!VI(e,n,t)})),CA(t.coordinateSystem)?(r.enable(t.get("roam")),o.zoomLimit=t.get("scaleLimit"),o.zoom=t.coordinateSystem.getZoom(),r.off("pan").off("zoom").on("pan",(function(e){RI(o,e.dx,e.dy),n.dispatchAction({seriesId:t.id,type:"graphRoam",dx:e.dx,dy:e.dy})})).on("zoom",(function(e){NI(o,e.scale,e.originX,e.originY),n.dispatchAction({seriesId:t.id,type:"graphRoam",zoom:e.scale,originX:e.originX,originY:e.originY}),i._updateNodeAndLinkScale(),TA(t.getGraph(),qD(t)),i._lineDraw.updateLayout(),n.updateLabelLayout()}))):r.disable()},e.prototype._updateNodeAndLinkScale=function(){var t=this._model,e=t.getData(),n=qD(t);e.eachItemGraphicEl((function(t,e){t&&t.setSymbolScale(n)}))},e.prototype.updateLayout=function(t){TA(t.getGraph(),qD(t)),this._symbolDraw.updateLayout(),this._lineDraw.updateLayout()},e.prototype.remove=function(t,e){this._symbolDraw&&this._symbolDraw.remove(),this._lineDraw&&this._lineDraw.remove()},e.type="graph",e}(xg);function AA(t){return"_EC_"+t}var kA=function(){function t(t){this.type="graph",this.nodes=[],this.edges=[],this._nodesMap={},this._edgesMap={},this._directed=t||!1}return t.prototype.isDirected=function(){return this._directed},t.prototype.addNode=function(t,e){t=null==t?""+e:""+t;var n=this._nodesMap;if(!n[AA(t)]){var i=new LA(t,e);return i.hostGraph=this,this.nodes.push(i),n[AA(t)]=i,i}},t.prototype.getNodeByIndex=function(t){var e=this.data.getRawIndex(t);return this.nodes[e]},t.prototype.getNodeById=function(t){return this._nodesMap[AA(t)]},t.prototype.addEdge=function(t,e,n){var i=this._nodesMap,r=this._edgesMap;if(j(t)&&(t=this.nodes[t]),j(e)&&(e=this.nodes[e]),t instanceof LA||(t=i[AA(t)]),e instanceof LA||(e=i[AA(e)]),t&&e){var o=t.id+"-"+e.id,a=new PA(t,e,n);return a.hostGraph=this,this._directed&&(t.outEdges.push(a),e.inEdges.push(a)),t.edges.push(a),t!==e&&e.edges.push(a),this.edges.push(a),r[o]=a,a}},t.prototype.getEdgeByIndex=function(t){var e=this.edgeData.getRawIndex(t);return this.edges[e]},t.prototype.getEdge=function(t,e){t instanceof LA&&(t=t.id),e instanceof LA&&(e=e.id);var n=this._edgesMap;return this._directed?n[t+"-"+e]:n[t+"-"+e]||n[e+"-"+t]},t.prototype.eachNode=function(t,e){for(var n=this.nodes,i=n.length,r=0;r<i;r++)n[r].dataIndex>=0&&t.call(e,n[r],r)},t.prototype.eachEdge=function(t,e){for(var n=this.edges,i=n.length,r=0;r<i;r++)n[r].dataIndex>=0&&n[r].node1.dataIndex>=0&&n[r].node2.dataIndex>=0&&t.call(e,n[r],r)},t.prototype.breadthFirstTraverse=function(t,e,n,i){if(e instanceof LA||(e=this._nodesMap[AA(e)]),e){for(var r="out"===n?"outEdges":"in"===n?"inEdges":"edges",o=0;o<this.nodes.length;o++)this.nodes[o].__visited=!1;if(!t.call(i,e,null))for(var a=[e];a.length;){var s=a.shift(),l=s[r];for(o=0;o<l.length;o++){var u=l[o],h=u.node1===s?u.node2:u.node1;if(!h.__visited){if(t.call(i,h,s))return;a.push(h),h.__visited=!0}}}}},t.prototype.update=function(){for(var t=this.data,e=this.edgeData,n=this.nodes,i=this.edges,r=0,o=n.length;r<o;r++)n[r].dataIndex=-1;for(r=0,o=t.count();r<o;r++)n[t.getRawIndex(r)].dataIndex=r;e.filterSelf((function(t){var n=i[e.getRawIndex(t)];return n.node1.dataIndex>=0&&n.node2.dataIndex>=0}));for(r=0,o=i.length;r<o;r++)i[r].dataIndex=-1;for(r=0,o=e.count();r<o;r++)i[e.getRawIndex(r)].dataIndex=r},t.prototype.clone=function(){for(var e=new t(this._directed),n=this.nodes,i=this.edges,r=0;r<n.length;r++)e.addNode(n[r].id,n[r].dataIndex);for(r=0;r<i.length;r++){var o=i[r];e.addEdge(o.node1.id,o.node2.id,o.dataIndex)}return e},t}(),LA=function(){function t(t,e){this.inEdges=[],this.outEdges=[],this.edges=[],this.dataIndex=-1,this.id=null==t?"":t,this.dataIndex=null==e?-1:e}return t.prototype.degree=function(){return this.edges.length},t.prototype.inDegree=function(){return this.inEdges.length},t.prototype.outDegree=function(){return this.outEdges.length},t.prototype.getModel=function(t){if(!(this.dataIndex<0))return this.hostGraph.data.getItemModel(this.dataIndex).getModel(t)},t.prototype.getAdjacentDataIndices=function(){for(var t={edge:[],node:[]},e=0;e<this.edges.length;e++){var n=this.edges[e];n.dataIndex<0||(t.edge.push(n.dataIndex),t.node.push(n.node1.dataIndex,n.node2.dataIndex))}return t},t}(),PA=function(){function t(t,e,n){this.dataIndex=-1,this.node1=t,this.node2=e,this.dataIndex=null==n?-1:n}return t.prototype.getModel=function(t){if(!(this.dataIndex<0))return this.hostGraph.edgeData.getItemModel(this.dataIndex).getModel(t)},t.prototype.getAdjacentDataIndices=function(){return{edge:[this.dataIndex],node:[this.node1.dataIndex,this.node2.dataIndex]}},t}();function OA(t,e){return{getValue:function(n){var i=this[t][e];return i.getStore().get(i.getDimensionIndex(n||"value"),this.dataIndex)},setVisual:function(n,i){this.dataIndex>=0&&this[t][e].setItemVisual(this.dataIndex,n,i)},getVisual:function(n){return this[t][e].getItemVisual(this.dataIndex,n)},setLayout:function(n,i){this.dataIndex>=0&&this[t][e].setItemLayout(this.dataIndex,n,i)},getLayout:function(){return this[t][e].getItemLayout(this.dataIndex)},getGraphicEl:function(){return this[t][e].getItemGraphicEl(this.dataIndex)},getRawIndex:function(){return this[t][e].getRawIndex(this.dataIndex)}}}function RA(t,e,n,i,r){for(var o=new kA(i),a=0;a<t.length;a++)o.addNode(it(t[a].id,t[a].name,a),a);var s=[],l=[],u=0;for(a=0;a<e.length;a++){var h=e[a],c=h.source,p=h.target;o.addEdge(c,p,u)&&(l.push(h),s.push(it(xo(h.id,null),c+" > "+p)),u++)}var d,f=n.get("coordinateSystem");if("cartesian2d"===f||"polar"===f)d=rx(t,n);else{var g=hd.get(f),y=g&&g.dimensions||[];P(y,"value")<0&&y.concat(["value"]);var v=Km(t,{coordDimensions:y,encodeDefine:n.getEncode()}).dimensions;(d=new qm(v,n)).initData(t)}var m=new qm(["value"],n);return m.initData(l,s),r&&r(d,m),_C({mainData:d,struct:o,structAttr:"graph",datas:{node:d,edge:m},datasAttr:{node:"data",edge:"edgeData"}}),o.update(),o}R(LA,OA("hostGraph","data")),R(PA,OA("hostGraph","edgeData"));var NA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments);var n=this;function i(){return n._categoriesData}this.legendVisualProvider=new hM(i,i),this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},e.prototype.mergeDefaultAndTheme=function(e){t.prototype.mergeDefaultAndTheme.apply(this,arguments),co(e,"edgeLabel",["show"])},e.prototype.getInitialData=function(t,e){var n,i=t.edges||t.links||[],r=t.data||t.nodes||[],o=this;if(r&&i){FD(n=this)&&(n.__curvenessList=[],n.__edgeMap={},GD(n));var a=RA(r,i,this,!0,(function(t,e){t.wrapMethod("getItemModel",(function(t){var e=o._categoriesModels[t.getShallow("category")];return e&&(e.parentModel=t.parentModel,t.parentModel=e),t}));var n=dc.prototype.getModel;function i(t,e){var i=n.call(this,t,e);return i.resolveParentPath=r,i}function r(t){if(t&&("label"===t[0]||"label"===t[1])){var e=t.slice();return"label"===t[0]?e[0]="edgeLabel":"label"===t[1]&&(e[1]="edgeLabel"),e}return t}e.wrapMethod("getItemModel",(function(t){return t.resolveParentPath=r,t.getModel=i,t}))}));return E(a.edges,(function(t){!function(t,e,n,i){if(FD(n)){var r=WD(t,e,n),o=n.__edgeMap,a=o[HD(r)];o[r]&&!a?o[r].isForward=!0:a&&o[r]&&(a.isForward=!0,o[r].isForward=!1),o[r]=o[r]||[],o[r].push(i)}}(t.node1,t.node2,this,t.dataIndex)}),this),a.data}},e.prototype.getGraph=function(){return this.getData().graph},e.prototype.getEdgeData=function(){return this.getGraph().edgeData},e.prototype.getCategoriesData=function(){return this._categoriesData},e.prototype.formatTooltip=function(t,e,n){if("edge"===n){var i=this.getData(),r=this.getDataParams(t,n),o=i.graph.getEdgeByIndex(t),a=i.getName(o.node1.dataIndex),s=i.getName(o.node2.dataIndex),l=[];return null!=a&&l.push(a),null!=s&&l.push(s),Xf("nameValue",{name:l.join(" > "),value:r.value,noValue:null==r.value})}return rg({series:this,dataIndex:t,multipleSeries:e})},e.prototype._updateCategoriesData=function(){var t=z(this.option.categories||[],(function(t){return null!=t.value?t:A({value:0},t)})),e=new qm(["value"],this);e.initData(t),this._categoriesData=e,this._categoriesModels=e.mapArray((function(t){return e.getItemModel(t)}))},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.isAnimationEnabled=function(){return t.prototype.isAnimationEnabled.call(this)&&!("force"===this.get("layout")&&this.get(["force","layoutAnimation"]))},e.type="series.graph",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={z:2,coordinateSystem:"view",legendHoverLink:!0,layout:null,circular:{rotateLabel:!1},force:{initLayout:null,repulsion:[0,50],gravity:.1,friction:.6,edgeLength:30,layoutAnimation:!0},left:"center",top:"center",symbol:"circle",symbolSize:10,edgeSymbol:["none","none"],edgeSymbolSize:10,edgeLabel:{position:"middle",distance:5},draggable:!1,roam:!1,center:null,zoom:1,nodeScaleRatio:.6,label:{show:!1,formatter:"{b}"},itemStyle:{},lineStyle:{color:"#aaa",width:1,opacity:.5},emphasis:{scale:!0,label:{show:!0}},select:{itemStyle:{borderColor:"#212121"}}},e}(sg),EA={type:"graphRoam",event:"graphRoam",update:"none"};var zA=function(){this.angle=0,this.width=10,this.r=10,this.x=0,this.y=0},VA=function(t){function e(e){var n=t.call(this,e)||this;return n.type="pointer",n}return n(e,t),e.prototype.getDefaultShape=function(){return new zA},e.prototype.buildPath=function(t,e){var n=Math.cos,i=Math.sin,r=e.r,o=e.width,a=e.angle,s=e.x-n(a)*o*(o>=r/3?1:2),l=e.y-i(a)*o*(o>=r/3?1:2);a=e.angle-Math.PI/2,t.moveTo(s,l),t.lineTo(e.x+n(a)*o,e.y+i(a)*o),t.lineTo(e.x+n(e.angle)*r,e.y+i(e.angle)*r),t.lineTo(e.x-n(a)*o,e.y-i(a)*o),t.lineTo(s,l)},e}(gs);function BA(t,e){var n=null==t?"":t+"";return e&&(X(e)?n=e.replace("{value}",n):U(e)&&(n=e(t))),n}var FA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeAll();var i=t.get(["axisLine","lineStyle","color"]),r=function(t,e){var n=t.get("center"),i=e.getWidth(),r=e.getHeight(),o=Math.min(i,r);return{cx:Er(n[0],e.getWidth()),cy:Er(n[1],e.getHeight()),r:Er(t.get("radius"),o/2)}}(t,n);this._renderMain(t,e,n,i,r),this._data=t.getData()},e.prototype.dispose=function(){},e.prototype._renderMain=function(t,e,n,i,r){var o=this.group,a=t.get("clockwise"),s=-t.get("startAngle")/180*Math.PI,l=-t.get("endAngle")/180*Math.PI,u=t.getModel("axisLine"),h=u.get("roundCap")?DS:Cu,c=u.get("show"),p=u.getModel("lineStyle"),d=p.get("width"),f=[s,l];ja(f,!a);for(var g=(l=f[1])-(s=f[0]),y=s,v=0;c&&v<i.length;v++){var m=new h({shape:{startAngle:y,endAngle:l=s+g*Math.min(Math.max(i[v][0],0),1),cx:r.cx,cy:r.cy,clockwise:a,r0:r.r-d,r:r.r},silent:!0});m.setStyle({fill:i[v][1]}),m.setStyle(p.getLineStyle(["color","width"])),o.add(m),y=l}var x=function(t){if(t<=0)return i[0][1];var e;for(e=0;e<i.length;e++)if(i[e][0]>=t&&(0===e?0:i[e-1][0])<t)return i[e][1];return i[e-1][1]};this._renderTicks(t,e,n,x,r,s,l,a,d),this._renderTitleAndDetail(t,e,n,x,r),this._renderAnchor(t,r),this._renderPointer(t,e,n,x,r,s,l,a,d)},e.prototype._renderTicks=function(t,e,n,i,r,o,a,s,l){for(var u,h,c=this.group,p=r.cx,d=r.cy,f=r.r,g=+t.get("min"),y=+t.get("max"),v=t.getModel("splitLine"),m=t.getModel("axisTick"),x=t.getModel("axisLabel"),_=t.get("splitNumber"),b=m.get("splitNumber"),w=Er(v.get("length"),f),S=Er(m.get("length"),f),M=o,I=(a-o)/_,T=I/b,C=v.getModel("lineStyle").getLineStyle(),D=m.getModel("lineStyle").getLineStyle(),A=v.get("distance"),k=0;k<=_;k++){if(u=Math.cos(M),h=Math.sin(M),v.get("show")){var L=new zu({shape:{x1:u*(f-(P=A?A+l:l))+p,y1:h*(f-P)+d,x2:u*(f-w-P)+p,y2:h*(f-w-P)+d},style:C,silent:!0});"auto"===C.stroke&&L.setStyle({stroke:i(k/_)}),c.add(L)}if(x.get("show")){var P=x.get("distance")+A,O=BA(zr(k/_*(y-g)+g),x.get("formatter")),R=i(k/_);c.add(new ks({style:Uh(x,{text:O,x:u*(f-w-P)+p,y:h*(f-w-P)+d,verticalAlign:h<-.8?"top":h>.8?"bottom":"middle",align:u<-.4?"left":u>.4?"right":"center"},{inheritColor:R}),silent:!0}))}if(m.get("show")&&k!==_){P=(P=m.get("distance"))?P+l:l;for(var N=0;N<=b;N++){u=Math.cos(M),h=Math.sin(M);var E=new zu({shape:{x1:u*(f-P)+p,y1:h*(f-P)+d,x2:u*(f-S-P)+p,y2:h*(f-S-P)+d},silent:!0,style:D});"auto"===D.stroke&&E.setStyle({stroke:i((k+N/b)/_)}),c.add(E),M+=T}M-=T}else M+=I}},e.prototype._renderPointer=function(t,e,n,i,r,o,a,s,l){var u=this.group,h=this._data,c=this._progressEls,p=[],d=t.get(["pointer","show"]),f=t.getModel("progress"),g=f.get("show"),y=t.getData(),v=y.mapDimension("value"),m=+t.get("min"),x=+t.get("max"),_=[m,x],b=[o,a];function w(e,n){var i,o=y.getItemModel(e).getModel("pointer"),a=Er(o.get("width"),r.r),s=Er(o.get("length"),r.r),l=t.get(["pointer","icon"]),u=o.get("offsetCenter"),h=Er(u[0],r.r),c=Er(u[1],r.r),p=o.get("keepAspect");return(i=l?Ly(l,h-a/2,c-s,a,s,null,p):new VA({shape:{angle:-Math.PI/2,width:a,r:s,x:h,y:c}})).rotation=-(n+Math.PI/2),i.x=r.cx,i.y=r.cy,i}function S(t,e){var n=f.get("roundCap")?DS:Cu,i=f.get("overlap"),a=i?f.get("width"):l/y.count(),u=i?r.r-a:r.r-(t+1)*a,h=i?r.r:r.r-t*a,c=new n({shape:{startAngle:o,endAngle:e,cx:r.cx,cy:r.cy,clockwise:s,r0:u,r:h}});return i&&(c.z2=x-y.get(v,t)%x),c}(g||d)&&(y.diff(h).add((function(e){var n=y.get(v,e);if(d){var i=w(e,o);oh(i,{rotation:-((isNaN(+n)?b[0]:Nr(n,_,b,!0))+Math.PI/2)},t),u.add(i),y.setItemGraphicEl(e,i)}if(g){var r=S(e,o),a=f.get("clip");oh(r,{shape:{endAngle:Nr(n,_,b,a)}},t),u.add(r),Ys(t.seriesIndex,y.dataType,e,r),p[e]=r}})).update((function(e,n){var i=y.get(v,e);if(d){var r=h.getItemGraphicEl(n),a=r?r.rotation:o,s=w(e,a);s.rotation=a,rh(s,{rotation:-((isNaN(+i)?b[0]:Nr(i,_,b,!0))+Math.PI/2)},t),u.add(s),y.setItemGraphicEl(e,s)}if(g){var l=c[n],m=S(e,l?l.shape.endAngle:o),x=f.get("clip");rh(m,{shape:{endAngle:Nr(i,_,b,x)}},t),u.add(m),Ys(t.seriesIndex,y.dataType,e,m),p[e]=m}})).execute(),y.each((function(t){var e=y.getItemModel(t),n=e.getModel("emphasis"),r=n.get("focus"),o=n.get("blurScope"),a=n.get("disabled");if(d){var s=y.getItemGraphicEl(t),l=y.getItemVisual(t,"style"),u=l.fill;if(s instanceof _s){var h=s.style;s.useStyle(A({image:h.image,x:h.x,y:h.y,width:h.width,height:h.height},l))}else s.useStyle(l),"pointer"!==s.type&&s.setColor(u);s.setStyle(e.getModel(["pointer","itemStyle"]).getItemStyle()),"auto"===s.style.fill&&s.setStyle("fill",i(Nr(y.get(v,t),_,[0,1],!0))),s.z2EmphasisLift=0,Vl(s,e),Rl(s,r,o,a)}if(g){var c=p[t];c.useStyle(y.getItemVisual(t,"style")),c.setStyle(e.getModel(["progress","itemStyle"]).getItemStyle()),c.z2EmphasisLift=0,Vl(c,e),Rl(c,r,o,a)}})),this._progressEls=p)},e.prototype._renderAnchor=function(t,e){var n=t.getModel("anchor");if(n.get("show")){var i=n.get("size"),r=n.get("icon"),o=n.get("offsetCenter"),a=n.get("keepAspect"),s=Ly(r,e.cx-i/2+Er(o[0],e.r),e.cy-i/2+Er(o[1],e.r),i,i,null,a);s.z2=n.get("showAbove")?1:0,s.setStyle(n.getModel("itemStyle").getItemStyle()),this.group.add(s)}},e.prototype._renderTitleAndDetail=function(t,e,n,i,r){var o=this,a=t.getData(),s=a.mapDimension("value"),l=+t.get("min"),u=+t.get("max"),h=new Cr,c=[],p=[],d=t.isAnimationEnabled(),f=t.get(["pointer","showAbove"]);a.diff(this._data).add((function(t){c[t]=new ks({silent:!0}),p[t]=new ks({silent:!0})})).update((function(t,e){c[t]=o._titleEls[e],p[t]=o._detailEls[e]})).execute(),a.each((function(e){var n=a.getItemModel(e),o=a.get(s,e),g=new Cr,y=i(Nr(o,[l,u],[0,1],!0)),v=n.getModel("title");if(v.get("show")){var m=v.get("offsetCenter"),x=r.cx+Er(m[0],r.r),_=r.cy+Er(m[1],r.r);(D=c[e]).attr({z2:f?0:2,style:Uh(v,{x:x,y:_,text:a.getName(e),align:"center",verticalAlign:"middle"},{inheritColor:y})}),g.add(D)}var b=n.getModel("detail");if(b.get("show")){var w=b.get("offsetCenter"),S=r.cx+Er(w[0],r.r),M=r.cy+Er(w[1],r.r),I=Er(b.get("width"),r.r),T=Er(b.get("height"),r.r),C=t.get(["progress","show"])?a.getItemVisual(e,"style").fill:y,D=p[e],A=b.get("formatter");D.attr({z2:f?0:2,style:Uh(b,{x:S,y:M,text:BA(o,A),width:isNaN(I)?null:I,height:isNaN(T)?null:T,align:"center",verticalAlign:"middle"},{inheritColor:C})}),Qh(D,{normal:b},o,(function(t){return BA(t,A)})),d&&tc(D,e,a,t,{getFormattedLabel:function(t,e,n,i,r,a){return BA(a?a.interpolatedValue:o,A)}}),g.add(D)}h.add(g)})),this.group.add(h),this._titleEls=c,this._detailEls=p},e.type="gauge",e}(xg),GA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.visualStyleAccessPath="itemStyle",n}return n(e,t),e.prototype.getInitialData=function(t,e){return uM(this,["value"])},e.type="series.gauge",e.defaultOption={z:2,colorBy:"data",center:["50%","50%"],legendHoverLink:!0,radius:"75%",startAngle:225,endAngle:-45,clockwise:!0,min:0,max:100,splitNumber:10,axisLine:{show:!0,roundCap:!1,lineStyle:{color:[[1,"#E6EBF8"]],width:10}},progress:{show:!1,overlap:!0,width:10,roundCap:!1,clip:!0},splitLine:{show:!0,length:10,distance:10,lineStyle:{color:"#63677A",width:3,type:"solid"}},axisTick:{show:!0,splitNumber:5,length:6,distance:10,lineStyle:{color:"#63677A",width:1,type:"solid"}},axisLabel:{show:!0,distance:15,color:"#464646",fontSize:12},pointer:{icon:null,offsetCenter:[0,0],show:!0,showAbove:!0,length:"60%",width:6,keepAspect:!1},anchor:{show:!1,showAbove:!1,size:6,icon:"circle",offsetCenter:[0,0],keepAspect:!1,itemStyle:{color:"#fff",borderWidth:0,borderColor:"#5470c6"}},title:{show:!0,offsetCenter:[0,"20%"],color:"#464646",fontSize:16,valueAnimation:!1},detail:{show:!0,backgroundColor:"rgba(0,0,0,0)",borderWidth:0,borderColor:"#ccc",width:100,height:null,padding:[5,10],offsetCenter:[0,"40%"],color:"#464646",fontSize:30,fontWeight:"bold",lineHeight:30,valueAnimation:!1}},e}(sg);var WA=["itemStyle","opacity"],HA=function(t){function e(e,n){var i=t.call(this)||this,r=i,o=new Ru,a=new ks;return r.setTextContent(a),i.setTextGuideLine(o),i.updateData(e,n,!0),i}return n(e,t),e.prototype.updateData=function(t,e,n){var i=this,r=t.hostModel,o=t.getItemModel(e),a=t.getItemLayout(e),s=o.getModel("emphasis"),l=o.get(WA);l=null==l?1:l,n||hh(i),i.useStyle(t.getItemVisual(e,"style")),i.style.lineJoin="round",n?(i.setShape({points:a.points}),i.style.opacity=0,oh(i,{style:{opacity:l}},r,e)):rh(i,{style:{opacity:l},shape:{points:a.points}},r,e),Vl(i,o),this._updateLabel(t,e),Rl(this,s.get("focus"),s.get("blurScope"),s.get("disabled"))},e.prototype._updateLabel=function(t,e){var n=this,i=this.getTextGuideLine(),r=n.getTextContent(),o=t.hostModel,a=t.getItemModel(e),s=t.getItemLayout(e).label,l=t.getItemVisual(e,"style"),u=l.fill;Hh(r,Yh(a),{labelFetcher:t.hostModel,labelDataIndex:e,defaultOpacity:l.opacity,defaultText:t.getName(e)},{normal:{align:s.textAlign,verticalAlign:s.verticalAlign}}),n.setTextConfig({local:!0,inside:!!s.inside,insideStroke:u,outsideFill:u});var h=s.linePoints;i.setShape({points:h}),n.textGuideLineConfig={anchor:h?new Ji(h[0][0],h[0][1]):null},rh(r,{style:{x:s.x,y:s.y}},o,e),r.attr({rotation:s.rotation,originX:s.x,originY:s.y,z2:10}),db(n,fb(a),{stroke:u})},e}(Pu),YA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.ignoreLabelLineUpdate=!0,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this._data,o=this.group;i.diff(r).add((function(t){var e=new HA(i,t);i.setItemGraphicEl(t,e),o.add(e)})).update((function(t,e){var n=r.getItemGraphicEl(e);n.updateData(i,t),o.add(n),i.setItemGraphicEl(t,n)})).remove((function(e){uh(r.getItemGraphicEl(e),t,e)})).execute(),this._data=i},e.prototype.remove=function(){this.group.removeAll(),this._data=null},e.prototype.dispose=function(){},e.type="funnel",e}(xg),UA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new hM(W(this.getData,this),W(this.getRawData,this)),this._defaultLabelLine(e)},e.prototype.getInitialData=function(t,e){return uM(this,{coordDimensions:["value"],encodeDefaulter:H(Yp,this)})},e.prototype._defaultLabelLine=function(t){co(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},e.prototype.getDataParams=function(e){var n=this.getData(),i=t.prototype.getDataParams.call(this,e),r=n.mapDimension("value"),o=n.getSum(r);return i.percent=o?+(n.get(r,e)/o*100).toFixed(2):0,i.$vars.push("percent"),i},e.type="series.funnel",e.defaultOption={z:2,legendHoverLink:!0,colorBy:"data",left:80,top:60,right:80,bottom:60,minSize:"0%",maxSize:"100%",sort:"descending",orient:"vertical",gap:0,funnelAlign:"center",label:{show:!0,position:"outer"},labelLine:{show:!0,length:20,lineStyle:{width:1}},itemStyle:{borderColor:"#fff",borderWidth:1},emphasis:{label:{show:!0}},select:{itemStyle:{borderColor:"#212121"}}},e}(sg);function XA(t,e){t.eachSeriesByType("funnel",(function(t){var n=t.getData(),i=n.mapDimension("value"),r=t.get("sort"),o=function(t,e){return xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e),a=t.get("orient"),s=o.width,l=o.height,u=function(t,e){for(var n=t.mapDimension("value"),i=t.mapArray(n,(function(t){return t})),r=[],o="ascending"===e,a=0,s=t.count();a<s;a++)r[a]=a;return U(e)?r.sort(e):"none"!==e&&r.sort((function(t,e){return o?i[t]-i[e]:i[e]-i[t]})),r}(n,r),h=o.x,c=o.y,p="horizontal"===a?[Er(t.get("minSize"),l),Er(t.get("maxSize"),l)]:[Er(t.get("minSize"),s),Er(t.get("maxSize"),s)],d=n.getDataExtent(i),f=t.get("min"),g=t.get("max");null==f&&(f=Math.min(d[0],0)),null==g&&(g=d[1]);var y=t.get("funnelAlign"),v=t.get("gap"),m=(("horizontal"===a?s:l)-v*(n.count()-1))/n.count(),x=function(t,e){if("horizontal"===a){var r=Nr(n.get(i,t)||0,[f,g],p,!0),o=void 0;switch(y){case"top":o=c;break;case"center":o=c+(l-r)/2;break;case"bottom":o=c+(l-r)}return[[e,o],[e,o+r]]}var u,d=Nr(n.get(i,t)||0,[f,g],p,!0);switch(y){case"left":u=h;break;case"center":u=h+(s-d)/2;break;case"right":u=h+s-d}return[[u,e],[u+d,e]]};"ascending"===r&&(m=-m,v=-v,"horizontal"===a?h+=s:c+=l,u=u.reverse());for(var _=0;_<u.length;_++){var b=u[_],w=u[_+1],S=n.getItemModel(b);if("horizontal"===a){var M=S.get(["itemStyle","width"]);null==M?M=m:(M=Er(M,s),"ascending"===r&&(M=-M));var I=x(b,h),T=x(w,h+M);h+=M+v,n.setItemLayout(b,{points:I.concat(T.slice().reverse())})}else{var C=S.get(["itemStyle","height"]);null==C?C=m:(C=Er(C,l),"ascending"===r&&(C=-C));I=x(b,c),T=x(w,c+C);c+=C+v,n.setItemLayout(b,{points:I.concat(T.slice().reverse())})}}!function(t){var e=t.hostModel.get("orient");t.each((function(n){var i,r,o,a,s=t.getItemModel(n),l=s.getModel("label").get("position"),u=s.getModel("labelLine"),h=t.getItemLayout(n),c=h.points,p="inner"===l||"inside"===l||"center"===l||"insideLeft"===l||"insideRight"===l;if(p)"insideLeft"===l?(r=(c[0][0]+c[3][0])/2+5,o=(c[0][1]+c[3][1])/2,i="left"):"insideRight"===l?(r=(c[1][0]+c[2][0])/2-5,o=(c[1][1]+c[2][1])/2,i="right"):(r=(c[0][0]+c[1][0]+c[2][0]+c[3][0])/4,o=(c[0][1]+c[1][1]+c[2][1]+c[3][1])/4,i="center"),a=[[r,o],[r,o]];else{var d=void 0,f=void 0,g=void 0,y=void 0,v=u.get("length");"left"===l?(d=(c[3][0]+c[0][0])/2,f=(c[3][1]+c[0][1])/2,r=(g=d-v)-5,i="right"):"right"===l?(d=(c[1][0]+c[2][0])/2,f=(c[1][1]+c[2][1])/2,r=(g=d+v)+5,i="left"):"top"===l?(d=(c[3][0]+c[0][0])/2,o=(y=(f=(c[3][1]+c[0][1])/2)-v)-5,i="center"):"bottom"===l?(d=(c[1][0]+c[2][0])/2,o=(y=(f=(c[1][1]+c[2][1])/2)+v)+5,i="center"):"rightTop"===l?(d="horizontal"===e?c[3][0]:c[1][0],f="horizontal"===e?c[3][1]:c[1][1],"horizontal"===e?(o=(y=f-v)-5,i="center"):(r=(g=d+v)+5,i="top")):"rightBottom"===l?(d=c[2][0],f=c[2][1],"horizontal"===e?(o=(y=f+v)+5,i="center"):(r=(g=d+v)+5,i="bottom")):"leftTop"===l?(d=c[0][0],f="horizontal"===e?c[0][1]:c[1][1],"horizontal"===e?(o=(y=f-v)-5,i="center"):(r=(g=d-v)-5,i="right")):"leftBottom"===l?(d="horizontal"===e?c[1][0]:c[3][0],f="horizontal"===e?c[1][1]:c[2][1],"horizontal"===e?(o=(y=f+v)+5,i="center"):(r=(g=d-v)-5,i="right")):(d=(c[1][0]+c[2][0])/2,f=(c[1][1]+c[2][1])/2,"horizontal"===e?(o=(y=f+v)+5,i="center"):(r=(g=d+v)+5,i="left")),"horizontal"===e?r=g=d:o=y=f,a=[[d,f],[g,y]]}h.label={linePoints:a,x:r,y:o,verticalAlign:"middle",textAlign:i,inside:p}}))}(n)}))}var ZA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._dataGroup=new Cr,n._initialized=!1,n}return n(e,t),e.prototype.init=function(){this.group.add(this._dataGroup)},e.prototype.render=function(t,e,n,i){this._progressiveEls=null;var r=this._dataGroup,o=t.getData(),a=this._data,s=t.coordinateSystem,l=s.dimensions,u=KA(t);if(o.diff(a).add((function(t){$A(qA(o,r,t,l,s),o,t,u)})).update((function(e,n){var i=a.getItemGraphicEl(n),r=jA(o,e,l,s);o.setItemGraphicEl(e,i),rh(i,{shape:{points:r}},t,e),hh(i),$A(i,o,e,u)})).remove((function(t){var e=a.getItemGraphicEl(t);r.remove(e)})).execute(),!this._initialized){this._initialized=!0;var h=function(t,e,n){var i=t.model,r=t.getRect(),o=new Cs({shape:{x:r.x,y:r.y,width:r.width,height:r.height}}),a="horizontal"===i.get("layout")?"width":"height";return o.setShape(a,0),oh(o,{shape:{width:r.width,height:r.height}},e,n),o}(s,t,(function(){setTimeout((function(){r.removeClipPath()}))}));r.setClipPath(h)}this._data=o},e.prototype.incrementalPrepareRender=function(t,e,n){this._initialized=!0,this._data=null,this._dataGroup.removeAll()},e.prototype.incrementalRender=function(t,e,n){for(var i=e.getData(),r=e.coordinateSystem,o=r.dimensions,a=KA(e),s=this._progressiveEls=[],l=t.start;l<t.end;l++){var u=qA(i,this._dataGroup,l,o,r);u.incremental=!0,$A(u,i,l,a),s.push(u)}},e.prototype.remove=function(){this._dataGroup&&this._dataGroup.removeAll(),this._data=null},e.type="parallel",e}(xg);function jA(t,e,n,i){for(var r,o=[],a=0;a<n.length;a++){var s=n[a],l=t.get(t.mapDimension(s),e);r=l,("category"===i.getAxis(s).type?null==r:null==r||isNaN(r))||o.push(i.dataToPoint(l,s))}return o}function qA(t,e,n,i,r){var o=jA(t,n,i,r),a=new Ru({shape:{points:o},z2:10});return e.add(a),t.setItemGraphicEl(n,a),a}function KA(t){var e=t.get("smooth",!0);return!0===e&&(e=.3),nt(e=to(e))&&(e=0),{smooth:e}}function $A(t,e,n,i){t.useStyle(e.getItemVisual(n,"style")),t.style.fill=null,t.setShape("smooth",i.smooth);var r=e.getItemModel(n),o=r.getModel("emphasis");Vl(t,r,"lineStyle"),Rl(t,o.get("focus"),o.get("blurScope"),o.get("disabled"))}var JA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.visualStyleAccessPath="lineStyle",n.visualDrawType="stroke",n}return n(e,t),e.prototype.getInitialData=function(t,e){return rx(null,this,{useEncodeDefaulter:W(QA,null,this)})},e.prototype.getRawIndicesByActiveState=function(t){var e=this.coordinateSystem,n=this.getData(),i=[];return e.eachActiveState(n,(function(e,r){t===e&&i.push(n.getRawIndex(r))})),i},e.type="series.parallel",e.dependencies=["parallel"],e.defaultOption={z:2,coordinateSystem:"parallel",parallelIndex:0,label:{show:!1},inactiveOpacity:.05,activeOpacity:1,lineStyle:{width:1,opacity:.45,type:"solid"},emphasis:{label:{show:!1}},progressive:500,smooth:!1,animationEasing:"linear"},e}(sg);function QA(t){var e=t.ecModel.getComponent("parallel",t.get("parallelIndex"));if(e){var n={};return E(e.dimensions,(function(t){var e=+t.replace("dim","");n[t]=e})),n}}var tk=["lineStyle","opacity"],ek={seriesType:"parallel",reset:function(t,e){var n=t.coordinateSystem,i={normal:t.get(["lineStyle","opacity"]),active:t.get("activeOpacity"),inactive:t.get("inactiveOpacity")};return{progress:function(t,e){n.eachActiveState(e,(function(t,n){var r=i[t];if("normal"===t&&e.hasItemOption){var o=e.getItemModel(n).get(tk,!0);null!=o&&(r=o)}e.ensureUniqueItemVisual(n,"style").opacity=r}),t.start,t.end)}}}};function nk(t){!function(t){if(t.parallel)return;var e=!1;E(t.series,(function(t){t&&"parallel"===t.type&&(e=!0)})),e&&(t.parallel=[{}])}(t),function(t){E(ho(t.parallelAxis),(function(e){if(q(e)){var n=e.parallelIndex||0,i=ho(t.parallel)[n];i&&i.parallelAxisDefault&&C(e,i.parallelAxisDefault,!1)}}))}(t)}var ik=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this._model=t,this._api=n,this._handlers||(this._handlers={},E(rk,(function(t,e){n.getZr().on(e,this._handlers[e]=W(t,this))}),this)),Ag(this,"_throttledDispatchExpand",t.get("axisExpandRate"),"fixRate")},e.prototype.dispose=function(t,e){kg(this,"_throttledDispatchExpand"),E(this._handlers,(function(t,n){e.getZr().off(n,t)})),this._handlers=null},e.prototype._throttledDispatchExpand=function(t){this._dispatchExpand(t)},e.prototype._dispatchExpand=function(t){t&&this._api.dispatchAction(A({type:"parallelAxisExpand"},t))},e.type="parallel",e}(gg),rk={mousedown:function(t){ok(this,"click")&&(this._mouseDownPoint=[t.offsetX,t.offsetY])},mouseup:function(t){var e=this._mouseDownPoint;if(ok(this,"click")&&e){var n=[t.offsetX,t.offsetY];if(Math.pow(e[0]-n[0],2)+Math.pow(e[1]-n[1],2)>5)return;var i=this._model.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]);"none"!==i.behavior&&this._dispatchExpand({axisExpandWindow:i.axisExpandWindow})}this._mouseDownPoint=null},mousemove:function(t){if(!this._mouseDownPoint&&ok(this,"mousemove")){var e=this._model,n=e.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]),i=n.behavior;"jump"===i&&this._throttledDispatchExpand.debounceNextCall(e.get("axisExpandDebounce")),this._throttledDispatchExpand("none"===i?null:{axisExpandWindow:n.axisExpandWindow,animation:"jump"===i?null:{duration:0}})}}};function ok(t,e){var n=t._model;return n.get("axisExpandable")&&n.get("axisExpandTriggerOn")===e}var ak=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){t.prototype.init.apply(this,arguments),this.mergeOption({})},e.prototype.mergeOption=function(t){var e=this.option;t&&C(e,t,!0),this._initDimensions()},e.prototype.contains=function(t,e){var n=t.get("parallelIndex");return null!=n&&e.getComponent("parallel",n)===this},e.prototype.setAxisExpand=function(t){E(["axisExpandable","axisExpandCenter","axisExpandCount","axisExpandWidth","axisExpandWindow"],(function(e){t.hasOwnProperty(e)&&(this.option[e]=t[e])}),this)},e.prototype._initDimensions=function(){var t=this.dimensions=[],e=this.parallelAxisIndex=[];E(B(this.ecModel.queryComponents({mainType:"parallelAxis"}),(function(t){return(t.get("parallelIndex")||0)===this.componentIndex}),this),(function(n){t.push("dim"+n.get("dim")),e.push(n.componentIndex)}))},e.type="parallel",e.dependencies=["parallelAxis"],e.layoutMode="box",e.defaultOption={z:0,left:80,top:60,right:80,bottom:60,layout:"horizontal",axisExpandable:!1,axisExpandCenter:null,axisExpandCount:0,axisExpandWidth:50,axisExpandRate:17,axisExpandDebounce:50,axisExpandSlideTriggerArea:[-.15,.05,.4],axisExpandTriggerOn:"click",parallelAxisDefault:null},e}(Tp),sk=function(t){function e(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.type=r||"value",a.axisIndex=o,a}return n(e,t),e.prototype.isHorizontal=function(){return"horizontal"!==this.coordinateSystem.getModel().get("layout")},e}(H_);function lk(t,e,n,i,r,o){t=t||0;var a=n[1]-n[0];if(null!=r&&(r=hk(r,[0,a])),null!=o&&(o=Math.max(o,null!=r?r:0)),"all"===i){var s=Math.abs(e[1]-e[0]);s=hk(s,[0,a]),r=o=hk(s,[r,o]),i=0}e[0]=hk(e[0],n),e[1]=hk(e[1],n);var l=uk(e,i);e[i]+=t;var u,h=r||0,c=n.slice();return l.sign<0?c[0]+=h:c[1]-=h,e[i]=hk(e[i],c),u=uk(e,i),null!=r&&(u.sign!==l.sign||u.span<r)&&(e[1-i]=e[i]+l.sign*r),u=uk(e,i),null!=o&&u.span>o&&(e[1-i]=e[i]+u.sign*o),e}function uk(t,e){var n=t[e]-t[1-e];return{span:Math.abs(n),sign:n>0?-1:n<0?1:e?-1:1}}function hk(t,e){return Math.min(null!=e[1]?e[1]:1/0,Math.max(null!=e[0]?e[0]:-1/0,t))}var ck=E,pk=Math.min,dk=Math.max,fk=Math.floor,gk=Math.ceil,yk=zr,vk=Math.PI,mk=function(){function t(t,e,n){this.type="parallel",this._axesMap=ft(),this._axesLayout={},this.dimensions=t.dimensions,this._model=t,this._init(t,e,n)}return t.prototype._init=function(t,e,n){var i=t.dimensions,r=t.parallelAxisIndex;ck(i,(function(t,n){var i=r[n],o=e.getComponent("parallelAxis",i),a=this._axesMap.set(t,new sk(t,o_(o),[0,0],o.get("type"),i)),s="category"===a.type;a.onBand=s&&o.get("boundaryGap"),a.inverse=o.get("inverse"),o.axis=a,a.model=o,a.coordinateSystem=o.coordinateSystem=this}),this)},t.prototype.update=function(t,e){this._updateAxesFromSeries(this._model,t)},t.prototype.containPoint=function(t){var e=this._makeLayoutInfo(),n=e.axisBase,i=e.layoutBase,r=e.pixelDimIndex,o=t[1-r],a=t[r];return o>=n&&o<=n+e.axisLength&&a>=i&&a<=i+e.layoutLength},t.prototype.getModel=function(){return this._model},t.prototype._updateAxesFromSeries=function(t,e){e.eachSeries((function(n){if(t.contains(n,e)){var i=n.getData();ck(this.dimensions,(function(t){var e=this._axesMap.get(t);e.scale.unionExtentFromData(i,i.mapDimension(t)),r_(e.scale,e.model)}),this)}}),this)},t.prototype.resize=function(t,e){this._rect=xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),this._layoutAxes()},t.prototype.getRect=function(){return this._rect},t.prototype._makeLayoutInfo=function(){var t,e=this._model,n=this._rect,i=["x","y"],r=["width","height"],o=e.get("layout"),a="horizontal"===o?0:1,s=n[r[a]],l=[0,s],u=this.dimensions.length,h=xk(e.get("axisExpandWidth"),l),c=xk(e.get("axisExpandCount")||0,[0,u]),p=e.get("axisExpandable")&&u>3&&u>c&&c>1&&h>0&&s>0,d=e.get("axisExpandWindow");d?(t=xk(d[1]-d[0],l),d[1]=d[0]+t):(t=xk(h*(c-1),l),(d=[h*(e.get("axisExpandCenter")||fk(u/2))-t/2])[1]=d[0]+t);var f=(s-t)/(u-c);f<3&&(f=0);var g=[fk(yk(d[0]/h,1))+1,gk(yk(d[1]/h,1))-1],y=f/h*d[0];return{layout:o,pixelDimIndex:a,layoutBase:n[i[a]],layoutLength:s,axisBase:n[i[1-a]],axisLength:n[r[1-a]],axisExpandable:p,axisExpandWidth:h,axisCollapseWidth:f,axisExpandWindow:d,axisCount:u,winInnerIndices:g,axisExpandWindow0Pos:y}},t.prototype._layoutAxes=function(){var t=this._rect,e=this._axesMap,n=this.dimensions,i=this._makeLayoutInfo(),r=i.layout;e.each((function(t){var e=[0,i.axisLength],n=t.inverse?1:0;t.setExtent(e[n],e[1-n])})),ck(n,(function(e,n){var o=(i.axisExpandable?bk:_k)(n,i),a={horizontal:{x:o.position,y:i.axisLength},vertical:{x:0,y:o.position}},s={horizontal:vk/2,vertical:0},l=[a[r].x+t.x,a[r].y+t.y],u=s[r],h=[1,0,0,1,0,0];zi(h,h,u),Ei(h,h,l),this._axesLayout[e]={position:l,rotation:u,transform:h,axisNameAvailableWidth:o.axisNameAvailableWidth,axisLabelShow:o.axisLabelShow,nameTruncateMaxWidth:o.nameTruncateMaxWidth,tickDirection:1,labelDirection:1}}),this)},t.prototype.getAxis=function(t){return this._axesMap.get(t)},t.prototype.dataToPoint=function(t,e){return this.axisCoordToPoint(this._axesMap.get(e).dataToCoord(t),e)},t.prototype.eachActiveState=function(t,e,n,i){null==n&&(n=0),null==i&&(i=t.count());var r=this._axesMap,o=this.dimensions,a=[],s=[];E(o,(function(e){a.push(t.mapDimension(e)),s.push(r.get(e).model)}));for(var l=this.hasAxisBrushed(),u=n;u<i;u++){var h=void 0;if(l){h="active";for(var c=t.getValues(a,u),p=0,d=o.length;p<d;p++){if("inactive"===s[p].getActiveState(c[p])){h="inactive";break}}}else h="normal";e(h,u)}},t.prototype.hasAxisBrushed=function(){for(var t=this.dimensions,e=this._axesMap,n=!1,i=0,r=t.length;i<r;i++)"normal"!==e.get(t[i]).model.getActiveState()&&(n=!0);return n},t.prototype.axisCoordToPoint=function(t,e){return Th([t,0],this._axesLayout[e].transform)},t.prototype.getAxisLayout=function(t){return T(this._axesLayout[t])},t.prototype.getSlidedAxisExpandWindow=function(t){var e=this._makeLayoutInfo(),n=e.pixelDimIndex,i=e.axisExpandWindow.slice(),r=i[1]-i[0],o=[0,e.axisExpandWidth*(e.axisCount-1)];if(!this.containPoint(t))return{behavior:"none",axisExpandWindow:i};var a,s=t[n]-e.layoutBase-e.axisExpandWindow0Pos,l="slide",u=e.axisCollapseWidth,h=this._model.get("axisExpandSlideTriggerArea"),c=null!=h[0];if(u)c&&u&&s<r*h[0]?(l="jump",a=s-r*h[2]):c&&u&&s>r*(1-h[0])?(l="jump",a=s-r*(1-h[2])):(a=s-r*h[1])>=0&&(a=s-r*(1-h[1]))<=0&&(a=0),(a*=e.axisExpandWidth/u)?lk(a,i,o,"all"):l="none";else{var p=i[1]-i[0];(i=[dk(0,o[1]*s/p-p/2)])[1]=pk(o[1],i[0]+p),i[0]=i[1]-p}return{axisExpandWindow:i,behavior:l}},t}();function xk(t,e){return pk(dk(t,e[0]),e[1])}function _k(t,e){var n=e.layoutLength/(e.axisCount-1);return{position:n*t,axisNameAvailableWidth:n,axisLabelShow:!0}}function bk(t,e){var n,i,r=e.layoutLength,o=e.axisExpandWidth,a=e.axisCount,s=e.axisCollapseWidth,l=e.winInnerIndices,u=s,h=!1;return t<l[0]?(n=t*s,i=s):t<=l[1]?(n=e.axisExpandWindow0Pos+t*o-e.axisExpandWindow[0],u=o,h=!0):(n=r-(a-1-t)*s,i=s),{position:n,axisNameAvailableWidth:u,axisLabelShow:h,nameTruncateMaxWidth:i}}var wk={create:function(t,e){var n=[];return t.eachComponent("parallel",(function(i,r){var o=new mk(i,t,e);o.name="parallel_"+r,o.resize(i,e),i.coordinateSystem=o,o.model=i,n.push(o)})),t.eachSeries((function(t){if("parallel"===t.get("coordinateSystem")){var e=t.getReferringComponents("parallel",Co).models[0];t.coordinateSystem=e.coordinateSystem}})),n}},Sk=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.activeIntervals=[],n}return n(e,t),e.prototype.getAreaSelectStyle=function(){return Wo([["fill","color"],["lineWidth","borderWidth"],["stroke","borderColor"],["width","width"],["opacity","opacity"]])(this.getModel("areaSelectStyle"))},e.prototype.setActiveIntervals=function(t){var e=this.activeIntervals=T(t);if(e)for(var n=e.length-1;n>=0;n--)Vr(e[n])},e.prototype.getActiveState=function(t){var e=this.activeIntervals;if(!e.length)return"normal";if(null==t||isNaN(+t))return"inactive";if(1===e.length){var n=e[0];if(n[0]<=t&&t<=n[1])return"active"}else for(var i=0,r=e.length;i<r;i++)if(e[i][0]<=t&&t<=e[i][1])return"active";return"inactive"},e}(Tp);R(Sk,p_);var Mk=!0,Ik=Math.min,Tk=Math.max,Ck=Math.pow,Dk="globalPan",Ak={w:[0,0],e:[0,1],n:[1,0],s:[1,1]},kk={w:"ew",e:"ew",n:"ns",s:"ns",ne:"nesw",sw:"nesw",nw:"nwse",se:"nwse"},Lk={brushStyle:{lineWidth:2,stroke:"rgba(210,219,238,0.3)",fill:"#D2DBEE"},transformable:!0,brushMode:"single",removeOnClick:!1},Pk=0,Ok=function(t){function e(e){var n=t.call(this)||this;return n._track=[],n._covers=[],n._handlers={},n._zr=e,n.group=new Cr,n._uid="brushController_"+Pk++,E(aL,(function(t,e){this._handlers[e]=W(t,this)}),n),n}return n(e,t),e.prototype.enableBrush=function(t){return this._brushType&&this._doDisableBrush(),t.brushType&&this._doEnableBrush(t),this},e.prototype._doEnableBrush=function(t){var e=this._zr;this._enableGlobalPan||function(t,e,n){AI(t)[e]=n}(e,Dk,this._uid),E(this._handlers,(function(t,n){e.on(n,t)})),this._brushType=t.brushType,this._brushOption=C(T(Lk),t,!0)},e.prototype._doDisableBrush=function(){var t=this._zr;!function(t,e,n){var i=AI(t);i[e]===n&&(i[e]=null)}(t,Dk,this._uid),E(this._handlers,(function(e,n){t.off(n,e)})),this._brushType=this._brushOption=null},e.prototype.setPanels=function(t){if(t&&t.length){var e=this._panels={};E(t,(function(t){e[t.panelId]=T(t)}))}else this._panels=null;return this},e.prototype.mount=function(t){t=t||{},this._enableGlobalPan=t.enableGlobalPan;var e=this.group;return this._zr.add(e),e.attr({x:t.x||0,y:t.y||0,rotation:t.rotation||0,scaleX:t.scaleX||1,scaleY:t.scaleY||1}),this._transform=e.getLocalTransform(),this},e.prototype.updateCovers=function(t){t=z(t,(function(t){return C(T(Lk),t,!0)}));var e=this._covers,n=this._covers=[],i=this,r=this._creatingCover;return new Im(e,t,(function(t,e){return o(t.__brushOption,e)}),o).add(a).update(a).remove((function(t){e[t]!==r&&i.group.remove(e[t])})).execute(),this;function o(t,e){return(null!=t.id?t.id:"\0-brush-index-"+e)+"-"+t.brushType}function a(o,a){var s=t[o];if(null!=a&&e[a]===r)n[o]=e[a];else{var l=n[o]=null!=a?(e[a].__brushOption=s,e[a]):Nk(i,Rk(i,s));Vk(i,l)}}},e.prototype.unmount=function(){return this.enableBrush(!1),Wk(this),this._zr.remove(this.group),this},e.prototype.dispose=function(){this.unmount(),this.off()},e}(Xt);function Rk(t,e){var n=lL[e.brushType].createCover(t,e);return n.__brushOption=e,zk(n,e),t.group.add(n),n}function Nk(t,e){var n=Bk(e);return n.endCreating&&(n.endCreating(t,e),zk(e,e.__brushOption)),e}function Ek(t,e){var n=e.__brushOption;Bk(e).updateCoverShape(t,e,n.range,n)}function zk(t,e){var n=e.z;null==n&&(n=1e4),t.traverse((function(t){t.z=n,t.z2=n}))}function Vk(t,e){Bk(e).updateCommon(t,e),Ek(t,e)}function Bk(t){return lL[t.__brushOption.brushType]}function Fk(t,e,n){var i,r=t._panels;if(!r)return Mk;var o=t._transform;return E(r,(function(t){t.isTargetByCursor(e,n,o)&&(i=t)})),i}function Gk(t,e){var n=t._panels;if(!n)return Mk;var i=e.__brushOption.panelId;return null!=i?n[i]:Mk}function Wk(t){var e=t._covers,n=e.length;return E(e,(function(e){t.group.remove(e)}),t),e.length=0,!!n}function Hk(t,e){var n=z(t._covers,(function(t){var e=t.__brushOption,n=T(e.range);return{brushType:e.brushType,panelId:e.panelId,range:n}}));t.trigger("brush",{areas:n,isEnd:!!e.isEnd,removeOnClick:!!e.removeOnClick})}function Yk(t){var e=t.length-1;return e<0&&(e=0),[t[0],t[e]]}function Uk(t,e,n,i){var r=new Cr;return r.add(new Cs({name:"main",style:qk(n),silent:!0,draggable:!0,cursor:"move",drift:H(Jk,t,e,r,["n","s","w","e"]),ondragend:H(Hk,e,{isEnd:!0})})),E(i,(function(n){r.add(new Cs({name:n.join(""),style:{opacity:0},draggable:!0,silent:!0,invisible:!0,drift:H(Jk,t,e,r,n),ondragend:H(Hk,e,{isEnd:!0})}))})),r}function Xk(t,e,n,i){var r=i.brushStyle.lineWidth||0,o=Tk(r,6),a=n[0][0],s=n[1][0],l=a-r/2,u=s-r/2,h=n[0][1],c=n[1][1],p=h-o+r/2,d=c-o+r/2,f=h-a,g=c-s,y=f+r,v=g+r;jk(t,e,"main",a,s,f,g),i.transformable&&(jk(t,e,"w",l,u,o,v),jk(t,e,"e",p,u,o,v),jk(t,e,"n",l,u,y,o),jk(t,e,"s",l,d,y,o),jk(t,e,"nw",l,u,o,o),jk(t,e,"ne",p,u,o,o),jk(t,e,"sw",l,d,o,o),jk(t,e,"se",p,d,o,o))}function Zk(t,e){var n=e.__brushOption,i=n.transformable,r=e.childAt(0);r.useStyle(qk(n)),r.attr({silent:!i,cursor:i?"move":"default"}),E([["w"],["e"],["n"],["s"],["s","e"],["s","w"],["n","e"],["n","w"]],(function(n){var r=e.childOfName(n.join("")),o=1===n.length?$k(t,n[0]):function(t,e){var n=[$k(t,e[0]),$k(t,e[1])];return("e"===n[0]||"w"===n[0])&&n.reverse(),n.join("")}(t,n);r&&r.attr({silent:!i,invisible:!i,cursor:i?kk[o]+"-resize":null})}))}function jk(t,e,n,i,r,o,a){var s=e.childOfName(n);s&&s.setShape(function(t){var e=Ik(t[0][0],t[1][0]),n=Ik(t[0][1],t[1][1]),i=Tk(t[0][0],t[1][0]),r=Tk(t[0][1],t[1][1]);return{x:e,y:n,width:i-e,height:r-n}}(eL(t,e,[[i,r],[i+o,r+a]])))}function qk(t){return k({strokeNoScale:!0},t.brushStyle)}function Kk(t,e,n,i){var r=[Ik(t,n),Ik(e,i)],o=[Tk(t,n),Tk(e,i)];return[[r[0],o[0]],[r[1],o[1]]]}function $k(t,e){return{left:"w",right:"e",top:"n",bottom:"s"}[Ch({w:"left",e:"right",n:"top",s:"bottom"}[e],function(t){return Ih(t.group)}(t))]}function Jk(t,e,n,i,r,o){var a=n.__brushOption,s=t.toRectRange(a.range),l=tL(e,r,o);E(i,(function(t){var e=Ak[t];s[e[0]][e[1]]+=l[e[0]]})),a.range=t.fromRectRange(Kk(s[0][0],s[1][0],s[0][1],s[1][1])),Vk(e,n),Hk(e,{isEnd:!1})}function Qk(t,e,n,i){var r=e.__brushOption.range,o=tL(t,n,i);E(r,(function(t){t[0]+=o[0],t[1]+=o[1]})),Vk(t,e),Hk(t,{isEnd:!1})}function tL(t,e,n){var i=t.group,r=i.transformCoordToLocal(e,n),o=i.transformCoordToLocal(0,0);return[r[0]-o[0],r[1]-o[1]]}function eL(t,e,n){var i=Gk(t,e);return i&&i!==Mk?i.clipPath(n,t._transform):T(n)}function nL(t){var e=t.event;e.preventDefault&&e.preventDefault()}function iL(t,e,n){return t.childOfName("main").contain(e,n)}function rL(t,e,n,i){var r,o=t._creatingCover,a=t._creatingPanel,s=t._brushOption;if(t._track.push(n.slice()),function(t){var e=t._track;if(!e.length)return!1;var n=e[e.length-1],i=e[0],r=n[0]-i[0],o=n[1]-i[1];return Ck(r*r+o*o,.5)>6}(t)||o){if(a&&!o){"single"===s.brushMode&&Wk(t);var l=T(s);l.brushType=oL(l.brushType,a),l.panelId=a===Mk?null:a.panelId,o=t._creatingCover=Rk(t,l),t._covers.push(o)}if(o){var u=lL[oL(t._brushType,a)];o.__brushOption.range=u.getCreatingRange(eL(t,o,t._track)),i&&(Nk(t,o),u.updateCommon(t,o)),Ek(t,o),r={isEnd:i}}}else i&&"single"===s.brushMode&&s.removeOnClick&&Fk(t,e,n)&&Wk(t)&&(r={isEnd:i,removeOnClick:!0});return r}function oL(t,e){return"auto"===t?e.defaultBrushType:t}var aL={mousedown:function(t){if(this._dragging)sL(this,t);else if(!t.target||!t.target.draggable){nL(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);this._creatingCover=null,(this._creatingPanel=Fk(this,t,e))&&(this._dragging=!0,this._track=[e.slice()])}},mousemove:function(t){var e=t.offsetX,n=t.offsetY,i=this.group.transformCoordToLocal(e,n);if(function(t,e,n){if(t._brushType&&!function(t,e,n){var i=t._zr;return e<0||e>i.getWidth()||n<0||n>i.getHeight()}(t,e.offsetX,e.offsetY)){var i=t._zr,r=t._covers,o=Fk(t,e,n);if(!t._dragging)for(var a=0;a<r.length;a++){var s=r[a].__brushOption;if(o&&(o===Mk||s.panelId===o.panelId)&&lL[s.brushType].contain(r[a],n[0],n[1]))return}o&&i.setCursorStyle("crosshair")}}(this,t,i),this._dragging){nL(t);var r=rL(this,t,i,!1);r&&Hk(this,r)}},mouseup:function(t){sL(this,t)}};function sL(t,e){if(t._dragging){nL(e);var n=e.offsetX,i=e.offsetY,r=t.group.transformCoordToLocal(n,i),o=rL(t,e,r,!0);t._dragging=!1,t._track=[],t._creatingCover=null,o&&Hk(t,o)}}var lL={lineX:uL(0),lineY:uL(1),rect:{createCover:function(t,e){function n(t){return t}return Uk({toRectRange:n,fromRectRange:n},t,e,[["w"],["e"],["n"],["s"],["s","e"],["s","w"],["n","e"],["n","w"]])},getCreatingRange:function(t){var e=Yk(t);return Kk(e[1][0],e[1][1],e[0][0],e[0][1])},updateCoverShape:function(t,e,n,i){Xk(t,e,n,i)},updateCommon:Zk,contain:iL},polygon:{createCover:function(t,e){var n=new Cr;return n.add(new Ru({name:"main",style:qk(e),silent:!0})),n},getCreatingRange:function(t){return t},endCreating:function(t,e){e.remove(e.childAt(0)),e.add(new Pu({name:"main",draggable:!0,drift:H(Qk,t,e),ondragend:H(Hk,t,{isEnd:!0})}))},updateCoverShape:function(t,e,n,i){e.childAt(0).setShape({points:eL(t,e,n)})},updateCommon:Zk,contain:iL}};function uL(t){return{createCover:function(e,n){return Uk({toRectRange:function(e){var n=[e,[0,100]];return t&&n.reverse(),n},fromRectRange:function(e){return e[t]}},e,n,[[["w"],["e"]],[["n"],["s"]]][t])},getCreatingRange:function(e){var n=Yk(e);return[Ik(n[0][t],n[1][t]),Tk(n[0][t],n[1][t])]},updateCoverShape:function(e,n,i,r){var o,a=Gk(e,n);if(a!==Mk&&a.getLinearBrushOtherExtent)o=a.getLinearBrushOtherExtent(t);else{var s=e._zr;o=[0,[s.getWidth(),s.getHeight()][1-t]]}var l=[i,o];t&&l.reverse(),Xk(e,n,l,r)},updateCommon:Zk,contain:iL}}function hL(t){return t=dL(t),function(e){return kh(e,t)}}function cL(t,e){return t=dL(t),function(n){var i=null!=e?e:n,r=i?t.width:t.height,o=i?t.x:t.y;return[o,o+(r||0)]}}function pL(t,e,n){var i=dL(t);return function(t,r){return i.contain(r[0],r[1])&&!VI(t,e,n)}}function dL(t){return sr.create(t)}var fL=["axisLine","axisTickLabel","axisName"],gL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e,n){t.prototype.init.apply(this,arguments),(this._brushController=new Ok(n.getZr())).on("brush",W(this._onBrush,this))},e.prototype.render=function(t,e,n,i){if(!function(t,e,n){return n&&"axisAreaSelect"===n.type&&e.findComponents({mainType:"parallelAxis",query:n})[0]===t}(t,e,i)){this.axisModel=t,this.api=n,this.group.removeAll();var r=this._axisGroup;if(this._axisGroup=new Cr,this.group.add(this._axisGroup),t.get("show")){var o=function(t,e){return e.getComponent("parallel",t.get("parallelIndex"))}(t,e),a=o.coordinateSystem,s=t.getAreaSelectStyle(),l=s.width,u=t.axis.dim,h=A({strokeContainThreshold:l},a.getAxisLayout(u)),c=new GM(t,h);E(fL,c.add,c),this._axisGroup.add(c.getGroup()),this._refreshBrushController(h,s,t,o,l,n),Ah(r,this._axisGroup,t)}}},e.prototype._refreshBrushController=function(t,e,n,i,r,o){var a=n.axis.getExtent(),s=a[1]-a[0],l=Math.min(30,.1*Math.abs(s)),u=sr.create({x:a[0],y:-r/2,width:s,height:r});u.x-=l,u.width+=2*l,this._brushController.mount({enableGlobalPan:!0,rotation:t.rotation,x:t.position[0],y:t.position[1]}).setPanels([{panelId:"pl",clipPath:hL(u),isTargetByCursor:pL(u,o,i),getLinearBrushOtherExtent:cL(u,0)}]).enableBrush({brushType:"lineX",brushStyle:e,removeOnClick:!0}).updateCovers(function(t){var e=t.axis;return z(t.activeIntervals,(function(t){return{brushType:"lineX",panelId:"pl",range:[e.dataToCoord(t[0],!0),e.dataToCoord(t[1],!0)]}}))}(n))},e.prototype._onBrush=function(t){var e=t.areas,n=this.axisModel,i=n.axis,r=z(e,(function(t){return[i.coordToData(t.range[0],!0),i.coordToData(t.range[1],!0)]}));(!n.option.realtime===t.isEnd||t.removeOnClick)&&this.api.dispatchAction({type:"axisAreaSelect",parallelAxisId:n.id,intervals:r})},e.prototype.dispose=function(){this._brushController.dispose()},e.type="parallelAxis",e}(gg);var yL={type:"axisAreaSelect",event:"axisAreaSelected"};var vL={type:"value",areaSelectStyle:{width:20,borderWidth:1,borderColor:"rgba(160,197,232)",color:"rgba(160,197,232)",opacity:.3},realtime:!0,z:10};function mL(t){t.registerComponentView(ik),t.registerComponentModel(ak),t.registerCoordinateSystem("parallel",wk),t.registerPreprocessor(nk),t.registerComponentModel(Sk),t.registerComponentView(gL),MM(t,"parallel",Sk,vL),function(t){t.registerAction(yL,(function(t,e){e.eachComponent({mainType:"parallelAxis",query:t},(function(e){e.axis.model.setActiveIntervals(t.intervals)}))})),t.registerAction("parallelAxisExpand",(function(t,e){e.eachComponent({mainType:"parallel",query:t},(function(e){e.setAxisExpand(t)}))}))}(t)}var xL=function(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.cpx1=0,this.cpy1=0,this.cpx2=0,this.cpy2=0,this.extent=0},_L=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new xL},e.prototype.buildPath=function(t,e){var n=e.extent;t.moveTo(e.x1,e.y1),t.bezierCurveTo(e.cpx1,e.cpy1,e.cpx2,e.cpy2,e.x2,e.y2),"vertical"===e.orient?(t.lineTo(e.x2+n,e.y2),t.bezierCurveTo(e.cpx2+n,e.cpy2,e.cpx1+n,e.cpy1,e.x1+n,e.y1)):(t.lineTo(e.x2,e.y2+n),t.bezierCurveTo(e.cpx2,e.cpy2+n,e.cpx1,e.cpy1+n,e.x1,e.y1+n)),t.closePath()},e.prototype.highlight=function(){_l(this)},e.prototype.downplay=function(){bl(this)},e}(gs),bL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._focusAdjacencyDisabled=!1,n}return n(e,t),e.prototype.render=function(t,e,n){var i=this,r=t.getGraph(),o=this.group,a=t.layoutInfo,s=a.width,l=a.height,u=t.getData(),h=t.getData("edge"),c=t.get("orient");this._model=t,o.removeAll(),o.x=a.x,o.y=a.y,r.eachEdge((function(e){var n=new _L,i=Hs(n);i.dataIndex=e.dataIndex,i.seriesIndex=t.seriesIndex,i.dataType="edge";var r,a,u,p,d,f,g,y,v=e.getModel(),m=v.getModel("lineStyle"),x=m.get("curveness"),_=e.node1.getLayout(),b=e.node1.getModel(),w=b.get("localX"),S=b.get("localY"),M=e.node2.getLayout(),I=e.node2.getModel(),T=I.get("localX"),C=I.get("localY"),D=e.getLayout();switch(n.shape.extent=Math.max(1,D.dy),n.shape.orient=c,"vertical"===c?(r=(null!=w?w*s:_.x)+D.sy,a=(null!=S?S*l:_.y)+_.dy,u=(null!=T?T*s:M.x)+D.ty,d=r,f=a*(1-x)+(p=null!=C?C*l:M.y)*x,g=u,y=a*x+p*(1-x)):(r=(null!=w?w*s:_.x)+_.dx,a=(null!=S?S*l:_.y)+D.sy,d=r*(1-x)+(u=null!=T?T*s:M.x)*x,f=a,g=r*x+u*(1-x),y=p=(null!=C?C*l:M.y)+D.ty),n.setShape({x1:r,y1:a,x2:u,y2:p,cpx1:d,cpy1:f,cpx2:g,cpy2:y}),n.useStyle(m.getItemStyle()),n.style.fill){case"source":n.style.fill=e.node1.getVisual("color"),n.style.decal=e.node1.getVisual("style").decal;break;case"target":n.style.fill=e.node2.getVisual("color"),n.style.decal=e.node2.getVisual("style").decal;break;case"gradient":var A=e.node1.getVisual("color"),k=e.node2.getVisual("color");X(A)&&X(k)&&(n.style.fill=new Xu(0,0,+("horizontal"===c),+("vertical"===c),[{color:A,offset:0},{color:k,offset:1}]))}var L=v.getModel("emphasis");Vl(n,v,"lineStyle",(function(t){return t.getItemStyle()})),o.add(n),h.setItemGraphicEl(e.dataIndex,n);var P=L.get("focus");Rl(n,"adjacency"===P?e.getAdjacentDataIndices():P,L.get("blurScope"),L.get("disabled")),Hs(n).dataType="edge"})),r.eachNode((function(e){var n=e.getLayout(),i=e.getModel(),r=i.get("localX"),a=i.get("localY"),h=i.getModel("emphasis"),c=new Cs({shape:{x:null!=r?r*s:n.x,y:null!=a?a*l:n.y,width:n.dx,height:n.dy},style:i.getModel("itemStyle").getItemStyle(),z2:10});Hh(c,Yh(i),{labelFetcher:t,labelDataIndex:e.dataIndex,defaultText:e.id}),c.disableLabelAnimation=!0,c.setStyle("fill",e.getVisual("color")),c.setStyle("decal",e.getVisual("style").decal),Vl(c,i),o.add(c),u.setItemGraphicEl(e.dataIndex,c),Hs(c).dataType="node";var p=h.get("focus");Rl(c,"adjacency"===p?e.getAdjacentDataIndices():p,h.get("blurScope"),h.get("disabled"))})),u.eachItemGraphicEl((function(e,r){u.getItemModel(r).get("draggable")&&(e.drift=function(e,o){i._focusAdjacencyDisabled=!0,this.shape.x+=e,this.shape.y+=o,this.dirty(),n.dispatchAction({type:"dragNode",seriesId:t.id,dataIndex:u.getRawIndex(r),localX:this.shape.x/s,localY:this.shape.y/l})},e.ondragend=function(){i._focusAdjacencyDisabled=!1},e.draggable=!0,e.cursor="move")})),!this._data&&t.isAnimationEnabled()&&o.setClipPath(function(t,e,n){var i=new Cs({shape:{x:t.x-10,y:t.y-10,width:0,height:t.height+20}});return oh(i,{shape:{width:t.width+20}},e,n),i}(o.getBoundingRect(),t,(function(){o.removeClipPath()}))),this._data=t.getData()},e.prototype.dispose=function(){},e.type="sankey",e}(xg);var wL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(t,e){var n=t.edges||t.links,i=t.data||t.nodes,r=t.levels;this.levelModels=[];for(var o=this.levelModels,a=0;a<r.length;a++)null!=r[a].depth&&r[a].depth>=0&&(o[r[a].depth]=new dc(r[a],this,e));if(i&&n)return RA(i,n,this,!0,(function(t,e){t.wrapMethod("getItemModel",(function(t,e){var n=t.parentModel,i=n.getData().getItemLayout(e);if(i){var r=i.depth,o=n.levelModels[r];o&&(t.parentModel=o)}return t})),e.wrapMethod("getItemModel",(function(t,e){var n=t.parentModel,i=n.getGraph().getEdgeByIndex(e).node1.getLayout();if(i){var r=i.depth,o=n.levelModels[r];o&&(t.parentModel=o)}return t}))})).data},e.prototype.setNodePosition=function(t,e){var n=(this.option.data||this.option.nodes)[t];n.localX=e[0],n.localY=e[1]},e.prototype.getGraph=function(){return this.getData().graph},e.prototype.getEdgeData=function(){return this.getGraph().edgeData},e.prototype.formatTooltip=function(t,e,n){function i(t){return isNaN(t)||null==t}if("edge"===n){var r=this.getDataParams(t,n),o=r.data,a=r.value;return Xf("nameValue",{name:o.source+" -- "+o.target,value:a,noValue:i(a)})}var s=this.getGraph().getNodeByIndex(t).getLayout().value,l=this.getDataParams(t,n).data.name;return Xf("nameValue",{name:null!=l?l+"":null,value:s,noValue:i(s)})},e.prototype.optionUpdated=function(){},e.prototype.getDataParams=function(e,n){var i=t.prototype.getDataParams.call(this,e,n);if(null==i.value&&"node"===n){var r=this.getGraph().getNodeByIndex(e).getLayout().value;i.value=r}return i},e.type="series.sankey",e.defaultOption={z:2,coordinateSystem:"view",left:"5%",top:"5%",right:"20%",bottom:"5%",orient:"horizontal",nodeWidth:20,nodeGap:8,draggable:!0,layoutIterations:32,label:{show:!0,position:"right",fontSize:12},levels:[],nodeAlign:"justify",lineStyle:{color:"#314656",opacity:.2,curveness:.5},emphasis:{label:{show:!0},lineStyle:{opacity:.5}},select:{itemStyle:{borderColor:"#212121"}},animationEasing:"linear",animationDuration:1e3},e}(sg);function SL(t,e){t.eachSeriesByType("sankey",(function(t){var n=t.get("nodeWidth"),i=t.get("nodeGap"),r=function(t,e){return xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e);t.layoutInfo=r;var o=r.width,a=r.height,s=t.getGraph(),l=s.nodes,u=s.edges;!function(t){E(t,(function(t){var e=OL(t.outEdges,PL),n=OL(t.inEdges,PL),i=t.getValue()||0,r=Math.max(e,n,i);t.setLayout({value:r},!0)}))}(l),function(t,e,n,i,r,o,a,s,l){(function(t,e,n,i,r,o,a){for(var s=[],l=[],u=[],h=[],c=0,p=0;p<e.length;p++)s[p]=1;for(p=0;p<t.length;p++)l[p]=t[p].inEdges.length,0===l[p]&&u.push(t[p]);var d=-1;for(;u.length;){for(var f=0;f<u.length;f++){var g=u[f],y=g.hostGraph.data.getRawDataItem(g.dataIndex),v=null!=y.depth&&y.depth>=0;v&&y.depth>d&&(d=y.depth),g.setLayout({depth:v?y.depth:c},!0),"vertical"===o?g.setLayout({dy:n},!0):g.setLayout({dx:n},!0);for(var m=0;m<g.outEdges.length;m++){var x=g.outEdges[m];s[e.indexOf(x)]=0;var _=x.node2;0==--l[t.indexOf(_)]&&h.indexOf(_)<0&&h.push(_)}}++c,u=h,h=[]}for(p=0;p<s.length;p++)if(1===s[p])throw new Error("Sankey is a DAG, the original data has cycle!");var b=d>c-1?d:c-1;a&&"left"!==a&&function(t,e,n,i){if("right"===e){for(var r=[],o=t,a=0;o.length;){for(var s=0;s<o.length;s++){var l=o[s];l.setLayout({skNodeHeight:a},!0);for(var u=0;u<l.inEdges.length;u++){var h=l.inEdges[u];r.indexOf(h.node1)<0&&r.push(h.node1)}}o=r,r=[],++a}E(t,(function(t){ML(t)||t.setLayout({depth:Math.max(0,i-t.getLayout().skNodeHeight)},!0)}))}else"justify"===e&&function(t,e){E(t,(function(t){ML(t)||t.outEdges.length||t.setLayout({depth:e},!0)}))}(t,i)}(t,a,0,b);!function(t,e,n){E(t,(function(t){var i=t.getLayout().depth*e;"vertical"===n?t.setLayout({y:i},!0):t.setLayout({x:i},!0)}))}(t,"vertical"===o?(r-n)/b:(i-n)/b,o)})(t,e,n,r,o,s,l),function(t,e,n,i,r,o,a){var s=function(t,e){var n=[],i="vertical"===e?"y":"x",r=Lo(t,(function(t){return t.getLayout()[i]}));return r.keys.sort((function(t,e){return t-e})),E(r.keys,(function(t){n.push(r.buckets.get(t))})),n}(t,a);(function(t,e,n,i,r,o){var a=1/0;E(t,(function(t){var e=t.length,s=0;E(t,(function(t){s+=t.getLayout().value}));var l="vertical"===o?(i-(e-1)*r)/s:(n-(e-1)*r)/s;l<a&&(a=l)})),E(t,(function(t){E(t,(function(t,e){var n=t.getLayout().value*a;"vertical"===o?(t.setLayout({x:e},!0),t.setLayout({dx:n},!0)):(t.setLayout({y:e},!0),t.setLayout({dy:n},!0))}))})),E(e,(function(t){var e=+t.getValue()*a;t.setLayout({dy:e},!0)}))})(s,e,n,i,r,a),IL(s,r,n,i,a);for(var l=1;o>0;o--)TL(s,l*=.99,a),IL(s,r,n,i,a),RL(s,l,a),IL(s,r,n,i,a)}(t,e,o,r,i,a,s),function(t,e){var n="vertical"===e?"x":"y";E(t,(function(t){t.outEdges.sort((function(t,e){return t.node2.getLayout()[n]-e.node2.getLayout()[n]})),t.inEdges.sort((function(t,e){return t.node1.getLayout()[n]-e.node1.getLayout()[n]}))})),E(t,(function(t){var e=0,n=0;E(t.outEdges,(function(t){t.setLayout({sy:e},!0),e+=t.getLayout().dy})),E(t.inEdges,(function(t){t.setLayout({ty:n},!0),n+=t.getLayout().dy}))}))}(t,s)}(l,u,n,i,o,a,0!==B(l,(function(t){return 0===t.getLayout().value})).length?0:t.get("layoutIterations"),t.get("orient"),t.get("nodeAlign"))}))}function ML(t){var e=t.hostGraph.data.getRawDataItem(t.dataIndex);return null!=e.depth&&e.depth>=0}function IL(t,e,n,i,r){var o="vertical"===r?"x":"y";E(t,(function(t){var a,s,l;t.sort((function(t,e){return t.getLayout()[o]-e.getLayout()[o]}));for(var u=0,h=t.length,c="vertical"===r?"dx":"dy",p=0;p<h;p++)(l=u-(s=t[p]).getLayout()[o])>0&&(a=s.getLayout()[o]+l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0)),u=s.getLayout()[o]+s.getLayout()[c]+e;if((l=u-e-("vertical"===r?i:n))>0){a=s.getLayout()[o]-l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0),u=a;for(p=h-2;p>=0;--p)(l=(s=t[p]).getLayout()[o]+s.getLayout()[c]+e-u)>0&&(a=s.getLayout()[o]-l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0)),u=s.getLayout()[o]}}))}function TL(t,e,n){E(t.slice().reverse(),(function(t){E(t,(function(t){if(t.outEdges.length){var i=OL(t.outEdges,CL,n)/OL(t.outEdges,PL);if(isNaN(i)){var r=t.outEdges.length;i=r?OL(t.outEdges,DL,n)/r:0}if("vertical"===n){var o=t.getLayout().x+(i-LL(t,n))*e;t.setLayout({x:o},!0)}else{var a=t.getLayout().y+(i-LL(t,n))*e;t.setLayout({y:a},!0)}}}))}))}function CL(t,e){return LL(t.node2,e)*t.getValue()}function DL(t,e){return LL(t.node2,e)}function AL(t,e){return LL(t.node1,e)*t.getValue()}function kL(t,e){return LL(t.node1,e)}function LL(t,e){return"vertical"===e?t.getLayout().x+t.getLayout().dx/2:t.getLayout().y+t.getLayout().dy/2}function PL(t){return t.getValue()}function OL(t,e,n){for(var i=0,r=t.length,o=-1;++o<r;){var a=+e(t[o],n);isNaN(a)||(i+=a)}return i}function RL(t,e,n){E(t,(function(t){E(t,(function(t){if(t.inEdges.length){var i=OL(t.inEdges,AL,n)/OL(t.inEdges,PL);if(isNaN(i)){var r=t.inEdges.length;i=r?OL(t.inEdges,kL,n)/r:0}if("vertical"===n){var o=t.getLayout().x+(i-LL(t,n))*e;t.setLayout({x:o},!0)}else{var a=t.getLayout().y+(i-LL(t,n))*e;t.setLayout({y:a},!0)}}}))}))}function NL(t){t.eachSeriesByType("sankey",(function(t){var e=t.getGraph().nodes;if(e.length){var n=1/0,i=-1/0;E(e,(function(t){var e=t.getLayout().value;e<n&&(n=e),e>i&&(i=e)})),E(e,(function(e){var r=new iD({type:"color",mappingMethod:"linear",dataExtent:[n,i],visual:t.get("color")}).mapValueToVisual(e.getLayout().value),o=e.getModel().get(["itemStyle","color"]);null!=o?(e.setVisual("color",o),e.setVisual("style",{fill:o})):(e.setVisual("color",r),e.setVisual("style",{fill:r}))}))}}))}var EL=function(){function t(){}return t.prototype.getInitialData=function(t,e){var n,i,r=e.getComponent("xAxis",this.get("xAxisIndex")),o=e.getComponent("yAxis",this.get("yAxisIndex")),a=r.get("type"),s=o.get("type");"category"===a?(t.layout="horizontal",n=r.getOrdinalMeta(),i=!0):"category"===s?(t.layout="vertical",n=o.getOrdinalMeta(),i=!0):t.layout=t.layout||"horizontal";var l=["x","y"],u="horizontal"===t.layout?0:1,h=this._baseAxisDim=l[u],c=l[1-u],p=[r,o],d=p[u].get("type"),f=p[1-u].get("type"),g=t.data;if(g&&i){var y=[];E(g,(function(t,e){var n;Y(t)?(n=t.slice(),t.unshift(e)):Y(t.value)?((n=A({},t)).value=n.value.slice(),t.value.unshift(e)):n=t,y.push(n)})),t.data=y}var v=this.defaultValueDimensions,m=[{name:h,type:Dm(d),ordinalMeta:n,otherDims:{tooltip:!1,itemName:0},dimsDef:["base"]},{name:c,type:Dm(f),dimsDef:v.slice()}];return uM(this,{coordDimensions:m,dimensionsCount:v.length+1,encodeDefaulter:H(Hp,m,this)})},t.prototype.getBaseAxis=function(){var t=this._baseAxisDim;return this.ecModel.getComponent(t+"Axis",this.get(t+"AxisIndex")).axis},t}(),zL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.defaultValueDimensions=[{name:"min",defaultTooltip:!0},{name:"Q1",defaultTooltip:!0},{name:"median",defaultTooltip:!0},{name:"Q3",defaultTooltip:!0},{name:"max",defaultTooltip:!0}],n.visualDrawType="stroke",n}return n(e,t),e.type="series.boxplot",e.dependencies=["xAxis","yAxis","grid"],e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,layout:null,boxWidth:[7,50],itemStyle:{color:"#fff",borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2,shadowBlur:5,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0,0,0,0.2)"}},animationDuration:800},e}(sg);R(zL,EL,!0);var VL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this.group,o=this._data;this._data||r.removeAll();var a="horizontal"===t.get("layout")?1:0;i.diff(o).add((function(t){if(i.hasValue(t)){var e=GL(i.getItemLayout(t),i,t,a,!0);i.setItemGraphicEl(t,e),r.add(e)}})).update((function(t,e){var n=o.getItemGraphicEl(e);if(i.hasValue(t)){var s=i.getItemLayout(t);n?(hh(n),WL(s,n,i,t)):n=GL(s,i,t,a),r.add(n),i.setItemGraphicEl(t,n)}else r.remove(n)})).remove((function(t){var e=o.getItemGraphicEl(t);e&&r.remove(e)})).execute(),this._data=i},e.prototype.remove=function(t){var e=this.group,n=this._data;this._data=null,n&&n.eachItemGraphicEl((function(t){t&&e.remove(t)}))},e.type="boxplot",e}(xg),BL=function(){},FL=function(t){function e(e){var n=t.call(this,e)||this;return n.type="boxplotBoxPath",n}return n(e,t),e.prototype.getDefaultShape=function(){return new BL},e.prototype.buildPath=function(t,e){var n=e.points,i=0;for(t.moveTo(n[i][0],n[i][1]),i++;i<4;i++)t.lineTo(n[i][0],n[i][1]);for(t.closePath();i<n.length;i++)t.moveTo(n[i][0],n[i][1]),i++,t.lineTo(n[i][0],n[i][1])},e}(gs);function GL(t,e,n,i,r){var o=t.ends,a=new FL({shape:{points:r?HL(o,i,t):o}});return WL(t,a,e,n,r),a}function WL(t,e,n,i,r){var o=n.hostModel;(0,Bh[r?"initProps":"updateProps"])(e,{shape:{points:t.ends}},o,i),e.useStyle(n.getItemVisual(i,"style")),e.style.strokeNoScale=!0,e.z2=100;var a=n.getItemModel(i),s=a.getModel("emphasis");Vl(e,a),Rl(e,s.get("focus"),s.get("blurScope"),s.get("disabled"))}function HL(t,e,n){return z(t,(function(t){return(t=t.slice())[e]=n.initBaseline,t}))}function YL(t,e){}var UL=E;function XL(t){var e=function(t){var e=[],n=[];return t.eachSeriesByType("boxplot",(function(t){var i=t.getBaseAxis(),r=P(n,i);r<0&&(r=n.length,n[r]=i,e[r]={axis:i,seriesModels:[]}),e[r].seriesModels.push(t)})),e}(t);UL(e,(function(t){var e=t.seriesModels;e.length&&(!function(t){var e,n=t.axis,i=t.seriesModels,r=i.length,o=t.boxWidthList=[],a=t.boxOffsetList=[],s=[];if("category"===n.type)e=n.getBandWidth();else{var l=0;UL(i,(function(t){l=Math.max(l,t.getData().count())}));var u=n.getExtent();e=Math.abs(u[1]-u[0])/l}UL(i,(function(t){var n=t.get("boxWidth");Y(n)||(n=[n,n]),s.push([Er(n[0],e)||0,Er(n[1],e)||0])}));var h=.8*e-2,c=h/r*.3,p=(h-c*(r-1))/r,d=p/2-h/2;UL(i,(function(t,e){a.push(d),d+=c+p,o.push(Math.min(Math.max(p,s[e][0]),s[e][1]))}))}(t),UL(e,(function(e,n){!function(t,e,n){var i=t.coordinateSystem,r=t.getData(),o=n/2,a="horizontal"===t.get("layout")?0:1,s=1-a,l=["x","y"],u=r.mapDimension(l[a]),h=r.mapDimensionsAll(l[s]);if(null==u||h.length<5)return;for(var c=0;c<r.count();c++){var p=r.get(u,c),d=x(p,h[2],c),f=x(p,h[0],c),g=x(p,h[1],c),y=x(p,h[3],c),v=x(p,h[4],c),m=[];_(m,g,!1),_(m,y,!0),m.push(f,g,v,y),b(m,f),b(m,v),b(m,d),r.setItemLayout(c,{initBaseline:d[s],ends:m})}function x(t,n,o){var l,u=r.get(n,o),h=[];return h[a]=t,h[s]=u,isNaN(t)||isNaN(u)?l=[NaN,NaN]:(l=i.dataToPoint(h))[a]+=e,l}function _(t,e,n){var i=e.slice(),r=e.slice();i[a]+=o,r[a]-=o,n?t.push(i,r):t.push(r,i)}function b(t,e){var n=e.slice(),i=e.slice();n[a]-=o,i[a]+=o,t.push(n,i)}}(e,t.boxOffsetList[n],t.boxWidthList[n])})))}))}var ZL={type:"echarts:boxplot",transform:function(t){var e=t.upstream;if(e.sourceFormat!==Pp){var n="";0,ao(n)}var i=function(t,e){for(var n=[],i=[],r=(e=e||{}).boundIQR,o="none"===r||0===r,a=0;a<t.length;a++){var s=Vr(t[a].slice()),l=Jr(s,.25),u=Jr(s,.5),h=Jr(s,.75),c=s[0],p=s[s.length-1],d=(null==r?1.5:r)*(h-l),f=o?c:Math.max(c,l-d),g=o?p:Math.min(p,h+d),y=e.itemNameFormatter,v=U(y)?y({value:a}):X(y)?y.replace("{value}",a+""):a+"";n.push([v,f,l,u,h,g]);for(var m=0;m<s.length;m++){var x=s[m];if(x<f||x>g){var _=[v,x];i.push(_)}}}return{boxData:n,outliers:i}}(e.getRawData(),t.config);return[{dimensions:["ItemName","Low","Q1","Q2","Q3","High"],data:i.boxData},{data:i.outliers}]}};var jL=["color","borderColor"],qL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeClipPath(),this._progressiveEls=null,this._updateDrawMode(t),this._isLargeDraw?this._renderLarge(t):this._renderNormal(t)},e.prototype.incrementalPrepareRender=function(t,e,n){this._clear(),this._updateDrawMode(t)},e.prototype.incrementalRender=function(t,e,n,i){this._progressiveEls=[],this._isLargeDraw?this._incrementalRenderLarge(t,e):this._incrementalRenderNormal(t,e)},e.prototype.eachRendered=function(t){Vh(this._progressiveEls||this.group,t)},e.prototype._updateDrawMode=function(t){var e=t.pipelineContext.large;null!=this._isLargeDraw&&e===this._isLargeDraw||(this._isLargeDraw=e,this._clear())},e.prototype._renderNormal=function(t){var e=t.getData(),n=this._data,i=this.group,r=e.getLayout("isSimpleBox"),o=t.get("clip",!0),a=t.coordinateSystem,s=a.getArea&&a.getArea();this._data||i.removeAll(),e.diff(n).add((function(n){if(e.hasValue(n)){var a=e.getItemLayout(n);if(o&&QL(s,a))return;var l=JL(a,n,!0);oh(l,{shape:{points:a.ends}},t,n),tP(l,e,n,r),i.add(l),e.setItemGraphicEl(n,l)}})).update((function(a,l){var u=n.getItemGraphicEl(l);if(e.hasValue(a)){var h=e.getItemLayout(a);o&&QL(s,h)?i.remove(u):(u?(rh(u,{shape:{points:h.ends}},t,a),hh(u)):u=JL(h),tP(u,e,a,r),i.add(u),e.setItemGraphicEl(a,u))}else i.remove(u)})).remove((function(t){var e=n.getItemGraphicEl(t);e&&i.remove(e)})).execute(),this._data=e},e.prototype._renderLarge=function(t){this._clear(),rP(t,this.group);var e=t.get("clip",!0)?lS(t.coordinateSystem,!1,t):null;e?this.group.setClipPath(e):this.group.removeClipPath()},e.prototype._incrementalRenderNormal=function(t,e){for(var n,i=e.getData(),r=i.getLayout("isSimpleBox");null!=(n=t.next());){var o=JL(i.getItemLayout(n));tP(o,i,n,r),o.incremental=!0,this.group.add(o),this._progressiveEls.push(o)}},e.prototype._incrementalRenderLarge=function(t,e){rP(e,this.group,this._progressiveEls,!0)},e.prototype.remove=function(t){this._clear()},e.prototype._clear=function(){this.group.removeAll(),this._data=null},e.type="candlestick",e}(xg),KL=function(){},$L=function(t){function e(e){var n=t.call(this,e)||this;return n.type="normalCandlestickBox",n}return n(e,t),e.prototype.getDefaultShape=function(){return new KL},e.prototype.buildPath=function(t,e){var n=e.points;this.__simpleBox?(t.moveTo(n[4][0],n[4][1]),t.lineTo(n[6][0],n[6][1])):(t.moveTo(n[0][0],n[0][1]),t.lineTo(n[1][0],n[1][1]),t.lineTo(n[2][0],n[2][1]),t.lineTo(n[3][0],n[3][1]),t.closePath(),t.moveTo(n[4][0],n[4][1]),t.lineTo(n[5][0],n[5][1]),t.moveTo(n[6][0],n[6][1]),t.lineTo(n[7][0],n[7][1]))},e}(gs);function JL(t,e,n){var i=t.ends;return new $L({shape:{points:n?eP(i,t):i},z2:100})}function QL(t,e){for(var n=!0,i=0;i<e.ends.length;i++)if(t.contain(e.ends[i][0],e.ends[i][1])){n=!1;break}return n}function tP(t,e,n,i){var r=e.getItemModel(n);t.useStyle(e.getItemVisual(n,"style")),t.style.strokeNoScale=!0,t.__simpleBox=i,Vl(t,r)}function eP(t,e){return z(t,(function(t){return(t=t.slice())[1]=e.initBaseline,t}))}var nP=function(){},iP=function(t){function e(e){var n=t.call(this,e)||this;return n.type="largeCandlestickBox",n}return n(e,t),e.prototype.getDefaultShape=function(){return new nP},e.prototype.buildPath=function(t,e){for(var n=e.points,i=0;i<n.length;)if(this.__sign===n[i++]){var r=n[i++];t.moveTo(r,n[i++]),t.lineTo(r,n[i++])}else i+=3},e}(gs);function rP(t,e,n,i){var r=t.getData().getLayout("largePoints"),o=new iP({shape:{points:r},__sign:1});e.add(o);var a=new iP({shape:{points:r},__sign:-1});e.add(a),oP(1,o,t),oP(-1,a,t),i&&(o.incremental=!0,a.incremental=!0),n&&n.push(o,a)}function oP(t,e,n,i){var r=n.get(["itemStyle",t>0?"borderColor":"borderColor0"])||n.get(["itemStyle",t>0?"color":"color0"]),o=n.getModel("itemStyle").getItemStyle(jL);e.useStyle(o),e.style.fill=null,e.style.stroke=r}var aP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.defaultValueDimensions=[{name:"open",defaultTooltip:!0},{name:"close",defaultTooltip:!0},{name:"lowest",defaultTooltip:!0},{name:"highest",defaultTooltip:!0}],n}return n(e,t),e.prototype.getShadowDim=function(){return"open"},e.prototype.brushSelector=function(t,e,n){var i=e.getItemLayout(t);return i&&n.rect(i.brushRect)},e.type="series.candlestick",e.dependencies=["xAxis","yAxis","grid"],e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,layout:null,clip:!0,itemStyle:{color:"#eb5454",color0:"#47b262",borderColor:"#eb5454",borderColor0:"#47b262",borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2}},barMaxWidth:null,barMinWidth:null,barWidth:null,large:!0,largeThreshold:600,progressive:3e3,progressiveThreshold:1e4,progressiveChunkMode:"mod",animationEasing:"linear",animationDuration:300},e}(sg);function sP(t){t&&Y(t.series)&&E(t.series,(function(t){q(t)&&"k"===t.type&&(t.type="candlestick")}))}R(aP,EL,!0);var lP=["itemStyle","borderColor"],uP=["itemStyle","borderColor0"],hP=["itemStyle","color"],cP=["itemStyle","color0"],pP={seriesType:"candlestick",plan:yg(),performRawSeries:!0,reset:function(t,e){function n(t,e){return e.get(t>0?hP:cP)}function i(t,e){return e.get(t>0?lP:uP)}if(!e.isSeriesFiltered(t))return!t.pipelineContext.large&&{progress:function(t,e){for(var r;null!=(r=t.next());){var o=e.getItemModel(r),a=e.getItemLayout(r).sign,s=o.getItemStyle();s.fill=n(a,o),s.stroke=i(a,o)||s.fill,A(e.ensureUniqueItemVisual(r,"style"),s)}}}}},dP={seriesType:"candlestick",plan:yg(),reset:function(t){var e=t.coordinateSystem,n=t.getData(),i=function(t,e){var n,i=t.getBaseAxis(),r="category"===i.type?i.getBandWidth():(n=i.getExtent(),Math.abs(n[1]-n[0])/e.count()),o=Er(rt(t.get("barMaxWidth"),r),r),a=Er(rt(t.get("barMinWidth"),1),r),s=t.get("barWidth");return null!=s?Er(s,r):Math.max(Math.min(r/2,o),a)}(t,n),r=["x","y"],o=n.getDimensionIndex(n.mapDimension(r[0])),a=z(n.mapDimensionsAll(r[1]),n.getDimensionIndex,n),s=a[0],l=a[1],u=a[2],h=a[3];if(n.setLayout({candleWidth:i,isSimpleBox:i<=1.3}),!(o<0||a.length<4))return{progress:t.pipelineContext.large?function(t,n){var i,r,a=Sx(4*t.count),c=0,p=[],d=[],f=n.getStore();for(;null!=(r=t.next());){var g=f.get(o,r),y=f.get(s,r),v=f.get(l,r),m=f.get(u,r),x=f.get(h,r);isNaN(g)||isNaN(m)||isNaN(x)?(a[c++]=NaN,c+=3):(a[c++]=fP(f,r,y,v,l),p[0]=g,p[1]=m,i=e.dataToPoint(p,null,d),a[c++]=i?i[0]:NaN,a[c++]=i?i[1]:NaN,p[1]=x,i=e.dataToPoint(p,null,d),a[c++]=i?i[1]:NaN)}n.setLayout("largePoints",a)}:function(t,n){var r,a=n.getStore();for(;null!=(r=t.next());){var c=a.get(o,r),p=a.get(s,r),d=a.get(l,r),f=a.get(u,r),g=a.get(h,r),y=Math.min(p,d),v=Math.max(p,d),m=S(y,c),x=S(v,c),_=S(f,c),b=S(g,c),w=[];M(w,x,0),M(w,m,1),w.push(T(b),T(x),T(_),T(m)),n.setItemLayout(r,{sign:fP(a,r,p,d,l),initBaseline:p>d?x[1]:m[1],ends:w,brushRect:I(f,g,c)})}function S(t,n){var i=[];return i[0]=n,i[1]=t,isNaN(n)||isNaN(t)?[NaN,NaN]:e.dataToPoint(i)}function M(t,e,n){var r=e.slice(),o=e.slice();r[0]=Mh(r[0]+i/2,1,!1),o[0]=Mh(o[0]-i/2,1,!0),n?t.push(r,o):t.push(o,r)}function I(t,e,n){var r=S(t,n),o=S(e,n);return r[0]-=i/2,o[0]-=i/2,{x:r[0],y:r[1],width:i,height:o[1]-r[1]}}function T(t){return t[0]=Mh(t[0],1),t}}}}};function fP(t,e,n,i,r){return n>i?-1:n<i?1:e>0?t.get(r,e-1)<=i?1:-1:1}function gP(t,e){var n=e.rippleEffectColor||e.color;t.eachChild((function(t){t.attr({z:e.z,zlevel:e.zlevel,style:{stroke:"stroke"===e.brushType?n:null,fill:"fill"===e.brushType?n:null}})}))}var yP=function(t){function e(e,n){var i=t.call(this)||this,r=new Yw(e,n),o=new Cr;return i.add(r),i.add(o),i.updateData(e,n),i}return n(e,t),e.prototype.stopEffectAnimation=function(){this.childAt(1).removeAll()},e.prototype.startEffectAnimation=function(t){for(var e=t.symbolType,n=t.color,i=t.rippleNumber,r=this.childAt(1),o=0;o<i;o++){var a=Ly(e,-1,-1,2,2,n);a.attr({style:{strokeNoScale:!0},z2:99,silent:!0,scaleX:.5,scaleY:.5});var s=-o/i*t.period+t.effectOffset;a.animate("",!0).when(t.period,{scaleX:t.rippleScale/2,scaleY:t.rippleScale/2}).delay(s).start(),a.animateStyle(!0).when(t.period,{opacity:0}).delay(s).start(),r.add(a)}gP(r,t)},e.prototype.updateEffectAnimation=function(t){for(var e=this._effectCfg,n=this.childAt(1),i=["symbolType","period","rippleScale","rippleNumber"],r=0;r<i.length;r++){var o=i[r];if(e[o]!==t[o])return this.stopEffectAnimation(),void this.startEffectAnimation(t)}gP(n,t)},e.prototype.highlight=function(){_l(this)},e.prototype.downplay=function(){bl(this)},e.prototype.getSymbolType=function(){var t=this.childAt(0);return t&&t.getSymbolType()},e.prototype.updateData=function(t,e){var n=this,i=t.hostModel;this.childAt(0).updateData(t,e);var r=this.childAt(1),o=t.getItemModel(e),a=t.getItemVisual(e,"symbol"),s=Py(t.getItemVisual(e,"symbolSize")),l=t.getItemVisual(e,"style"),u=l&&l.fill,h=o.getModel("emphasis");r.setScale(s),r.traverse((function(t){t.setStyle("fill",u)}));var c=Oy(t.getItemVisual(e,"symbolOffset"),s);c&&(r.x=c[0],r.y=c[1]);var p=t.getItemVisual(e,"symbolRotate");r.rotation=(p||0)*Math.PI/180||0;var d={};d.showEffectOn=i.get("showEffectOn"),d.rippleScale=o.get(["rippleEffect","scale"]),d.brushType=o.get(["rippleEffect","brushType"]),d.period=1e3*o.get(["rippleEffect","period"]),d.effectOffset=e/t.count(),d.z=i.getShallow("z")||0,d.zlevel=i.getShallow("zlevel")||0,d.symbolType=a,d.color=u,d.rippleEffectColor=o.get(["rippleEffect","color"]),d.rippleNumber=o.get(["rippleEffect","number"]),"render"===d.showEffectOn?(this._effectCfg?this.updateEffectAnimation(d):this.startEffectAnimation(d),this._effectCfg=d):(this._effectCfg=null,this.stopEffectAnimation(),this.onHoverStateChange=function(t){"emphasis"===t?"render"!==d.showEffectOn&&n.startEffectAnimation(d):"normal"===t&&"render"!==d.showEffectOn&&n.stopEffectAnimation()}),this._effectCfg=d,Rl(this,h.get("focus"),h.get("blurScope"),h.get("disabled"))},e.prototype.fadeOut=function(t){t&&t()},e}(Cr),vP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){this._symbolDraw=new qw(yP)},e.prototype.render=function(t,e,n){var i=t.getData(),r=this._symbolDraw;r.updateData(i,{clipShape:this._getClipShape(t)}),this.group.add(r.group)},e.prototype._getClipShape=function(t){var e=t.coordinateSystem,n=e&&e.getArea&&e.getArea();return t.get("clip",!0)?n:null},e.prototype.updateTransform=function(t,e,n){var i=t.getData();this.group.dirty();var r=bS("").reset(t,e,n);r.progress&&r.progress({start:0,end:i.count(),count:i.count()},i),this._symbolDraw.updateLayout()},e.prototype._updateGroupTransform=function(t){var e=t.coordinateSystem;e&&e.getRoamTransform&&(this.group.transform=Fi(e.getRoamTransform()),this.group.decomposeTransform())},e.prototype.remove=function(t,e){this._symbolDraw&&this._symbolDraw.remove(!0)},e.type="effectScatter",e}(xg),mP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){return rx(null,this,{useEncodeDefaulter:!0})},e.prototype.brushSelector=function(t,e,n){return n.point(e.getItemLayout(t))},e.type="series.effectScatter",e.dependencies=["grid","polar"],e.defaultOption={coordinateSystem:"cartesian2d",z:2,legendHoverLink:!0,effectType:"ripple",progressive:0,showEffectOn:"render",clip:!0,rippleEffect:{period:4,scale:2.5,brushType:"fill",number:3},universalTransition:{divideShape:"clone"},symbolSize:10},e}(sg);var xP=function(t){function e(e,n,i){var r=t.call(this)||this;return r.add(r.createLine(e,n,i)),r._updateEffectSymbol(e,n),r}return n(e,t),e.prototype.createLine=function(t,e,n){return new fA(t,e,n)},e.prototype._updateEffectSymbol=function(t,e){var n=t.getItemModel(e).getModel("effect"),i=n.get("symbolSize"),r=n.get("symbol");Y(i)||(i=[i,i]);var o=t.getItemVisual(e,"style"),a=n.get("color")||o&&o.stroke,s=this.childAt(1);this._symbolType!==r&&(this.remove(s),(s=Ly(r,-.5,-.5,1,1,a)).z2=100,s.culling=!0,this.add(s)),s&&(s.setStyle("shadowColor",a),s.setStyle(n.getItemStyle(["color"])),s.scaleX=i[0],s.scaleY=i[1],s.setColor(a),this._symbolType=r,this._symbolScale=i,this._updateEffectAnimation(t,n,e))},e.prototype._updateEffectAnimation=function(t,e,n){var i=this.childAt(1);if(i){var r=t.getItemLayout(n),o=1e3*e.get("period"),a=e.get("loop"),s=e.get("constantSpeed"),l=it(e.get("delay"),(function(e){return e/t.count()*o/3}));if(i.ignore=!0,this._updateAnimationPoints(i,r),s>0&&(o=this._getLineLength(i)/s*1e3),o!==this._period||a!==this._loop){i.stopAnimation();var u=void 0;u=U(l)?l(n):l,i.__t>0&&(u=-o*i.__t),this._animateSymbol(i,o,u,a)}this._period=o,this._loop=a}},e.prototype._animateSymbol=function(t,e,n,i){if(e>0){t.__t=0;var r=this,o=t.animate("",i).when(e,{__t:1}).delay(n).during((function(){r._updateSymbolPosition(t)}));i||o.done((function(){r.remove(t)})),o.start()}},e.prototype._getLineLength=function(t){return Et(t.__p1,t.__cp1)+Et(t.__cp1,t.__p2)},e.prototype._updateAnimationPoints=function(t,e){t.__p1=e[0],t.__p2=e[1],t.__cp1=e[2]||[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]},e.prototype.updateData=function(t,e,n){this.childAt(0).updateData(t,e,n),this._updateEffectSymbol(t,e)},e.prototype._updateSymbolPosition=function(t){var e=t.__p1,n=t.__p2,i=t.__cp1,r=t.__t,o=[t.x,t.y],a=o.slice(),s=Ke,l=$e;o[0]=s(e[0],i[0],n[0],r),o[1]=s(e[1],i[1],n[1],r);var u=l(e[0],i[0],n[0],r),h=l(e[1],i[1],n[1],r);t.rotation=-Math.atan2(h,u)-Math.PI/2,"line"!==this._symbolType&&"rect"!==this._symbolType&&"roundRect"!==this._symbolType||(void 0!==t.__lastT&&t.__lastT<t.__t?(t.scaleY=1.05*Et(a,o),1===r&&(o[0]=a[0]+(o[0]-a[0])/2,o[1]=a[1]+(o[1]-a[1])/2)):1===t.__lastT?t.scaleY=2*Et(e,o):t.scaleY=this._symbolScale[1]),t.__lastT=t.__t,t.ignore=!1,t.x=o[0],t.y=o[1]},e.prototype.updateLayout=function(t,e){this.childAt(0).updateLayout(t,e);var n=t.getItemModel(e).getModel("effect");this._updateEffectAnimation(t,n,e)},e}(Cr),_P=function(t){function e(e,n,i){var r=t.call(this)||this;return r._createPolyline(e,n,i),r}return n(e,t),e.prototype._createPolyline=function(t,e,n){var i=t.getItemLayout(e),r=new Ru({shape:{points:i}});this.add(r),this._updateCommonStl(t,e,n)},e.prototype.updateData=function(t,e,n){var i=t.hostModel;rh(this.childAt(0),{shape:{points:t.getItemLayout(e)}},i,e),this._updateCommonStl(t,e,n)},e.prototype._updateCommonStl=function(t,e,n){var i=this.childAt(0),r=t.getItemModel(e),o=n&&n.emphasisLineStyle,a=n&&n.focus,s=n&&n.blurScope,l=n&&n.emphasisDisabled;if(!n||t.hasItemOption){var u=r.getModel("emphasis");o=u.getModel("lineStyle").getLineStyle(),l=u.get("disabled"),a=u.get("focus"),s=u.get("blurScope")}i.useStyle(t.getItemVisual(e,"style")),i.style.fill=null,i.style.strokeNoScale=!0,i.ensureState("emphasis").style=o,Rl(this,a,s,l)},e.prototype.updateLayout=function(t,e){this.childAt(0).setShape("points",t.getItemLayout(e))},e}(Cr),bP=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._lastFrame=0,e._lastFramePercent=0,e}return n(e,t),e.prototype.createLine=function(t,e,n){return new _P(t,e,n)},e.prototype._updateAnimationPoints=function(t,e){this._points=e;for(var n=[0],i=0,r=1;r<e.length;r++){var o=e[r-1],a=e[r];i+=Et(o,a),n.push(i)}if(0!==i){for(r=0;r<n.length;r++)n[r]/=i;this._offsets=n,this._length=i}else this._length=0},e.prototype._getLineLength=function(){return this._length},e.prototype._updateSymbolPosition=function(t){var e=t.__t,n=this._points,i=this._offsets,r=n.length;if(i){var o,a=this._lastFrame;if(e<this._lastFramePercent){for(o=Math.min(a+1,r-1);o>=0&&!(i[o]<=e);o--);o=Math.min(o,r-2)}else{for(o=a;o<r&&!(i[o]>e);o++);o=Math.min(o-1,r-2)}var s=(e-i[o])/(i[o+1]-i[o]),l=n[o],u=n[o+1];t.x=l[0]*(1-s)+s*u[0],t.y=l[1]*(1-s)+s*u[1];var h=u[0]-l[0],c=u[1]-l[1];t.rotation=-Math.atan2(c,h)-Math.PI/2,this._lastFrame=o,this._lastFramePercent=e,t.ignore=!1}},e}(xP),wP=function(){this.polyline=!1,this.curveness=0,this.segs=[]},SP=function(t){function e(e){var n=t.call(this,e)||this;return n._off=0,n.hoverDataIdx=-1,n}return n(e,t),e.prototype.reset=function(){this.notClear=!1,this._off=0},e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new wP},e.prototype.buildPath=function(t,e){var n,i=e.segs,r=e.curveness;if(e.polyline)for(n=this._off;n<i.length;){var o=i[n++];if(o>0){t.moveTo(i[n++],i[n++]);for(var a=1;a<o;a++)t.lineTo(i[n++],i[n++])}}else for(n=this._off;n<i.length;){var s=i[n++],l=i[n++],u=i[n++],h=i[n++];if(t.moveTo(s,l),r>0){var c=(s+u)/2-(l-h)*r,p=(l+h)/2-(u-s)*r;t.quadraticCurveTo(c,p,u,h)}else t.lineTo(u,h)}this.incremental&&(this._off=n,this.notClear=!0)},e.prototype.findDataIndex=function(t,e){var n=this.shape,i=n.segs,r=n.curveness,o=this.style.lineWidth;if(n.polyline)for(var a=0,s=0;s<i.length;){var l=i[s++];if(l>0)for(var u=i[s++],h=i[s++],c=1;c<l;c++){if(Ka(u,h,p=i[s++],d=i[s++],o,t,e))return a}a++}else for(a=0,s=0;s<i.length;){u=i[s++],h=i[s++];var p=i[s++],d=i[s++];if(r>0){if(Ja(u,h,(u+p)/2-(h-d)*r,(h+d)/2-(p-u)*r,p,d,o,t,e))return a}else if(Ka(u,h,p,d,o,t,e))return a;a++}return-1},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return t=n[0],e=n[1],i.contain(t,e)?(this.hoverDataIdx=this.findDataIndex(t,e))>=0:(this.hoverDataIdx=-1,!1)},e.prototype.getBoundingRect=function(){var t=this._rect;if(!t){for(var e=this.shape.segs,n=1/0,i=1/0,r=-1/0,o=-1/0,a=0;a<e.length;){var s=e[a++],l=e[a++];n=Math.min(s,n),r=Math.max(s,r),i=Math.min(l,i),o=Math.max(l,o)}t=this._rect=new sr(n,i,r,o)}return t},e}(gs),MP=function(){function t(){this.group=new Cr}return t.prototype.updateData=function(t){this._clear();var e=this._create();e.setShape({segs:t.getLayout("linesPoints")}),this._setCommon(e,t)},t.prototype.incrementalPrepareUpdate=function(t){this.group.removeAll(),this._clear()},t.prototype.incrementalUpdate=function(t,e){var n=this._newAdded[0],i=e.getLayout("linesPoints"),r=n&&n.shape.segs;if(r&&r.length<2e4){var o=r.length,a=new Float32Array(o+i.length);a.set(r),a.set(i,o),n.setShape({segs:a})}else{this._newAdded=[];var s=this._create();s.incremental=!0,s.setShape({segs:i}),this._setCommon(s,e),s.__startIndex=t.start}},t.prototype.remove=function(){this._clear()},t.prototype.eachRendered=function(t){this._newAdded[0]&&t(this._newAdded[0])},t.prototype._create=function(){var t=new SP({cursor:"default"});return this._newAdded.push(t),this.group.add(t),t},t.prototype._setCommon=function(t,e,n){var i=e.hostModel;t.setShape({polyline:i.get("polyline"),curveness:i.get(["lineStyle","curveness"])}),t.useStyle(i.getModel("lineStyle").getLineStyle()),t.style.strokeNoScale=!0;var r=e.getVisual("style");r&&r.stroke&&t.setStyle("stroke",r.stroke),t.setStyle("fill",null);var o=Hs(t);o.seriesIndex=i.seriesIndex,t.on("mousemove",(function(e){o.dataIndex=null;var n=t.hoverDataIdx;n>0&&(o.dataIndex=n+t.__startIndex)}))},t.prototype._clear=function(){this._newAdded=[],this.group.removeAll()},t}(),IP={seriesType:"lines",plan:yg(),reset:function(t){var e=t.coordinateSystem;if(e){var n=t.get("polyline"),i=t.pipelineContext.large;return{progress:function(r,o){var a=[];if(i){var s=void 0,l=r.end-r.start;if(n){for(var u=0,h=r.start;h<r.end;h++)u+=t.getLineCoordsCount(h);s=new Float32Array(l+2*u)}else s=new Float32Array(4*l);var c=0,p=[];for(h=r.start;h<r.end;h++){var d=t.getLineCoords(h,a);n&&(s[c++]=d);for(var f=0;f<d;f++)p=e.dataToPoint(a[f],!1,p),s[c++]=p[0],s[c++]=p[1]}o.setLayout("linesPoints",s)}else for(h=r.start;h<r.end;h++){var g=o.getItemModel(h),y=(d=t.getLineCoords(h,a),[]);if(n)for(var v=0;v<d;v++)y.push(e.dataToPoint(a[v]));else{y[0]=e.dataToPoint(a[0]),y[1]=e.dataToPoint(a[1]);var m=g.get(["lineStyle","curveness"]);+m&&(y[2]=[(y[0][0]+y[1][0])/2-(y[0][1]-y[1][1])*m,(y[0][1]+y[1][1])/2-(y[1][0]-y[0][0])*m])}o.setItemLayout(h,y)}}}}}},TP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this._updateLineDraw(i,t),o=t.get("zlevel"),a=t.get(["effect","trailLength"]),s=n.getZr(),l="svg"===s.painter.getType();l||s.painter.getLayer(o).clear(!0),null==this._lastZlevel||l||s.configLayer(this._lastZlevel,{motionBlur:!1}),this._showEffect(t)&&a>0&&(l||s.configLayer(o,{motionBlur:!0,lastFrameAlpha:Math.max(Math.min(a/10+.9,1),0)})),r.updateData(i);var u=t.get("clip",!0)&&lS(t.coordinateSystem,!1,t);u?this.group.setClipPath(u):this.group.removeClipPath(),this._lastZlevel=o,this._finished=!0},e.prototype.incrementalPrepareRender=function(t,e,n){var i=t.getData();this._updateLineDraw(i,t).incrementalPrepareUpdate(i),this._clearLayer(n),this._finished=!1},e.prototype.incrementalRender=function(t,e,n){this._lineDraw.incrementalUpdate(t,e.getData()),this._finished=t.end===e.getData().count()},e.prototype.eachRendered=function(t){this._lineDraw&&this._lineDraw.eachRendered(t)},e.prototype.updateTransform=function(t,e,n){var i=t.getData(),r=t.pipelineContext;if(!this._finished||r.large||r.progressiveRender)return{update:!0};var o=IP.reset(t,e,n);o.progress&&o.progress({start:0,end:i.count(),count:i.count()},i),this._lineDraw.updateLayout(),this._clearLayer(n)},e.prototype._updateLineDraw=function(t,e){var n=this._lineDraw,i=this._showEffect(e),r=!!e.get("polyline"),o=e.pipelineContext.large;return n&&i===this._hasEffet&&r===this._isPolyline&&o===this._isLargeDraw||(n&&n.remove(),n=this._lineDraw=o?new MP:new gA(r?i?bP:_P:i?xP:fA),this._hasEffet=i,this._isPolyline=r,this._isLargeDraw=o),this.group.add(n.group),n},e.prototype._showEffect=function(t){return!!t.get(["effect","show"])},e.prototype._clearLayer=function(t){var e=t.getZr();"svg"===e.painter.getType()||null==this._lastZlevel||e.painter.getLayer(this._lastZlevel).clear(!0)},e.prototype.remove=function(t,e){this._lineDraw&&this._lineDraw.remove(),this._lineDraw=null,this._clearLayer(e)},e.prototype.dispose=function(t,e){this.remove(t,e)},e.type="lines",e}(xg),CP="undefined"==typeof Uint32Array?Array:Uint32Array,DP="undefined"==typeof Float64Array?Array:Float64Array;function AP(t){var e=t.data;e&&e[0]&&e[0][0]&&e[0][0].coord&&(t.data=z(e,(function(t){var e={coords:[t[0].coord,t[1].coord]};return t[0].name&&(e.fromName=t[0].name),t[1].name&&(e.toName=t[1].name),D([e,t[0],t[1]])})))}var kP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.visualStyleAccessPath="lineStyle",n.visualDrawType="stroke",n}return n(e,t),e.prototype.init=function(e){e.data=e.data||[],AP(e);var n=this._processFlatCoordsArray(e.data);this._flatCoords=n.flatCoords,this._flatCoordsOffset=n.flatCoordsOffset,n.flatCoords&&(e.data=new Float32Array(n.count)),t.prototype.init.apply(this,arguments)},e.prototype.mergeOption=function(e){if(AP(e),e.data){var n=this._processFlatCoordsArray(e.data);this._flatCoords=n.flatCoords,this._flatCoordsOffset=n.flatCoordsOffset,n.flatCoords&&(e.data=new Float32Array(n.count))}t.prototype.mergeOption.apply(this,arguments)},e.prototype.appendData=function(t){var e=this._processFlatCoordsArray(t.data);e.flatCoords&&(this._flatCoords?(this._flatCoords=gt(this._flatCoords,e.flatCoords),this._flatCoordsOffset=gt(this._flatCoordsOffset,e.flatCoordsOffset)):(this._flatCoords=e.flatCoords,this._flatCoordsOffset=e.flatCoordsOffset),t.data=new Float32Array(e.count)),this.getRawData().appendData(t.data)},e.prototype._getCoordsFromItemModel=function(t){var e=this.getData().getItemModel(t),n=e.option instanceof Array?e.option:e.getShallow("coords");return n},e.prototype.getLineCoordsCount=function(t){return this._flatCoordsOffset?this._flatCoordsOffset[2*t+1]:this._getCoordsFromItemModel(t).length},e.prototype.getLineCoords=function(t,e){if(this._flatCoordsOffset){for(var n=this._flatCoordsOffset[2*t],i=this._flatCoordsOffset[2*t+1],r=0;r<i;r++)e[r]=e[r]||[],e[r][0]=this._flatCoords[n+2*r],e[r][1]=this._flatCoords[n+2*r+1];return i}var o=this._getCoordsFromItemModel(t);for(r=0;r<o.length;r++)e[r]=e[r]||[],e[r][0]=o[r][0],e[r][1]=o[r][1];return o.length},e.prototype._processFlatCoordsArray=function(t){var e=0;if(this._flatCoords&&(e=this._flatCoords.length),j(t[0])){for(var n=t.length,i=new CP(n),r=new DP(n),o=0,a=0,s=0,l=0;l<n;){s++;var u=t[l++];i[a++]=o+e,i[a++]=u;for(var h=0;h<u;h++){var c=t[l++],p=t[l++];r[o++]=c,r[o++]=p}}return{flatCoordsOffset:new Uint32Array(i.buffer,0,a),flatCoords:r,count:s}}return{flatCoordsOffset:null,flatCoords:null,count:t.length}},e.prototype.getInitialData=function(t,e){var n=new qm(["value"],this);return n.hasItemOption=!1,n.initData(t.data,[],(function(t,e,i,r){if(t instanceof Array)return NaN;n.hasItemOption=!0;var o=t.value;return null!=o?o instanceof Array?o[r]:o:void 0})),n},e.prototype.formatTooltip=function(t,e,n){var i=this.getData().getItemModel(t),r=i.get("name");if(r)return r;var o=i.get("fromName"),a=i.get("toName"),s=[];return null!=o&&s.push(o),null!=a&&s.push(a),Xf("nameValue",{name:s.join(" > ")})},e.prototype.preventIncremental=function(){return!!this.get(["effect","show"])},e.prototype.getProgressive=function(){var t=this.option.progressive;return null==t?this.option.large?1e4:this.get("progressive"):t},e.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?2e4:this.get("progressiveThreshold"):t},e.prototype.getZLevelKey=function(){var t=this.getModel("effect"),e=t.get("trailLength");return this.getData().count()>this.getProgressiveThreshold()?this.id:t.get("show")&&e>0?e+"":""},e.type="series.lines",e.dependencies=["grid","polar","geo","calendar"],e.defaultOption={coordinateSystem:"geo",z:2,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,symbol:["none","none"],symbolSize:[10,10],geoIndex:0,effect:{show:!1,period:4,constantSpeed:0,symbol:"circle",symbolSize:3,loop:!0,trailLength:.2},large:!1,largeThreshold:2e3,polyline:!1,clip:!0,label:{show:!1,position:"end"},lineStyle:{opacity:.5}},e}(sg);function LP(t){return t instanceof Array||(t=[t,t]),t}var PP={seriesType:"lines",reset:function(t){var e=LP(t.get("symbol")),n=LP(t.get("symbolSize")),i=t.getData();return i.setVisual("fromSymbol",e&&e[0]),i.setVisual("toSymbol",e&&e[1]),i.setVisual("fromSymbolSize",n&&n[0]),i.setVisual("toSymbolSize",n&&n[1]),{dataEach:i.hasItemOption?function(t,e){var n=t.getItemModel(e),i=LP(n.getShallow("symbol",!0)),r=LP(n.getShallow("symbolSize",!0));i[0]&&t.setItemVisual(e,"fromSymbol",i[0]),i[1]&&t.setItemVisual(e,"toSymbol",i[1]),r[0]&&t.setItemVisual(e,"fromSymbolSize",r[0]),r[1]&&t.setItemVisual(e,"toSymbolSize",r[1])}:null}}};var OP=function(){function t(){this.blurSize=30,this.pointSize=20,this.maxOpacity=1,this.minOpacity=0,this._gradientPixels={inRange:null,outOfRange:null};var t=h.createCanvas();this.canvas=t}return t.prototype.update=function(t,e,n,i,r,o){var a=this._getBrush(),s=this._getGradient(r,"inRange"),l=this._getGradient(r,"outOfRange"),u=this.pointSize+this.blurSize,h=this.canvas,c=h.getContext("2d"),p=t.length;h.width=e,h.height=n;for(var d=0;d<p;++d){var f=t[d],g=f[0],y=f[1],v=i(f[2]);c.globalAlpha=v,c.drawImage(a,g-u,y-u)}if(!h.width||!h.height)return h;for(var m=c.getImageData(0,0,h.width,h.height),x=m.data,_=0,b=x.length,w=this.minOpacity,S=this.maxOpacity-w;_<b;){v=x[_+3]/256;var M=4*Math.floor(255*v);if(v>0){var I=o(v)?s:l;v>0&&(v=v*S+w),x[_++]=I[M],x[_++]=I[M+1],x[_++]=I[M+2],x[_++]=I[M+3]*v*256}else _+=4}return c.putImageData(m,0,0),h},t.prototype._getBrush=function(){var t=this._brushCanvas||(this._brushCanvas=h.createCanvas()),e=this.pointSize+this.blurSize,n=2*e;t.width=n,t.height=n;var i=t.getContext("2d");return i.clearRect(0,0,n,n),i.shadowOffsetX=n,i.shadowBlur=this.blurSize,i.shadowColor="#000",i.beginPath(),i.arc(-e,e,this.pointSize,0,2*Math.PI,!0),i.closePath(),i.fill(),t},t.prototype._getGradient=function(t,e){for(var n=this._gradientPixels,i=n[e]||(n[e]=new Uint8ClampedArray(1024)),r=[0,0,0,0],o=0,a=0;a<256;a++)t[e](a/255,!0,r),i[o++]=r[0],i[o++]=r[1],i[o++]=r[2],i[o++]=r[3];return i},t}();function RP(t){var e=t.dimensions;return"lng"===e[0]&&"lat"===e[1]}var NP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i;e.eachComponent("visualMap",(function(e){e.eachTargetSeries((function(n){n===t&&(i=e)}))})),this._progressiveEls=null,this.group.removeAll();var r=t.coordinateSystem;"cartesian2d"===r.type||"calendar"===r.type?this._renderOnCartesianAndCalendar(t,n,0,t.getData().count()):RP(r)&&this._renderOnGeo(r,t,i,n)},e.prototype.incrementalPrepareRender=function(t,e,n){this.group.removeAll()},e.prototype.incrementalRender=function(t,e,n,i){var r=e.coordinateSystem;r&&(RP(r)?this.render(e,n,i):(this._progressiveEls=[],this._renderOnCartesianAndCalendar(e,i,t.start,t.end,!0)))},e.prototype.eachRendered=function(t){Vh(this._progressiveEls||this.group,t)},e.prototype._renderOnCartesianAndCalendar=function(t,e,n,i,r){var o,a,s,l,u=t.coordinateSystem,h=uS(u,"cartesian2d");if(h){var c=u.getAxis("x"),p=u.getAxis("y");0,o=c.getBandWidth()+.5,a=p.getBandWidth()+.5,s=c.scale.getExtent(),l=p.scale.getExtent()}for(var d=this.group,f=t.getData(),g=t.getModel(["emphasis","itemStyle"]).getItemStyle(),y=t.getModel(["blur","itemStyle"]).getItemStyle(),v=t.getModel(["select","itemStyle"]).getItemStyle(),m=t.get(["itemStyle","borderRadius"]),x=Yh(t),_=t.getModel("emphasis"),b=_.get("focus"),w=_.get("blurScope"),S=_.get("disabled"),M=h?[f.mapDimension("x"),f.mapDimension("y"),f.mapDimension("value")]:[f.mapDimension("time"),f.mapDimension("value")],I=n;I<i;I++){var T=void 0,C=f.getItemVisual(I,"style");if(h){var D=f.get(M[0],I),A=f.get(M[1],I);if(isNaN(f.get(M[2],I))||D<s[0]||D>s[1]||A<l[0]||A>l[1])continue;var k=u.dataToPoint([D,A]);T=new Cs({shape:{x:k[0]-o/2,y:k[1]-a/2,width:o,height:a},style:C})}else{if(isNaN(f.get(M[1],I)))continue;T=new Cs({z2:1,shape:u.dataToRect([f.get(M[0],I)]).contentShape,style:C})}if(f.hasItemOption){var L=f.getItemModel(I),P=L.getModel("emphasis");g=P.getModel("itemStyle").getItemStyle(),y=L.getModel(["blur","itemStyle"]).getItemStyle(),v=L.getModel(["select","itemStyle"]).getItemStyle(),m=L.get(["itemStyle","borderRadius"]),b=P.get("focus"),w=P.get("blurScope"),S=P.get("disabled"),x=Yh(L)}T.shape.r=m;var O=t.getRawValue(I),R="-";O&&null!=O[2]&&(R=O[2]+""),Hh(T,x,{labelFetcher:t,labelDataIndex:I,defaultOpacity:C.opacity,defaultText:R}),T.ensureState("emphasis").style=g,T.ensureState("blur").style=y,T.ensureState("select").style=v,Rl(T,b,w,S),T.incremental=r,r&&(T.states.emphasis.hoverLayer=!0),d.add(T),f.setItemGraphicEl(I,T),this._progressiveEls&&this._progressiveEls.push(T)}},e.prototype._renderOnGeo=function(t,e,n,i){var r=n.targetVisuals.inRange,o=n.targetVisuals.outOfRange,a=e.getData(),s=this._hmLayer||this._hmLayer||new OP;s.blurSize=e.get("blurSize"),s.pointSize=e.get("pointSize"),s.minOpacity=e.get("minOpacity"),s.maxOpacity=e.get("maxOpacity");var l=t.getViewRect().clone(),u=t.getRoamTransform();l.applyTransform(u);var h=Math.max(l.x,0),c=Math.max(l.y,0),p=Math.min(l.width+l.x,i.getWidth()),d=Math.min(l.height+l.y,i.getHeight()),f=p-h,g=d-c,y=[a.mapDimension("lng"),a.mapDimension("lat"),a.mapDimension("value")],v=a.mapArray(y,(function(e,n,i){var r=t.dataToPoint([e,n]);return r[0]-=h,r[1]-=c,r.push(i),r})),m=n.getExtent(),x="visualMap.continuous"===n.type?function(t,e){var n=t[1]-t[0];return e=[(e[0]-t[0])/n,(e[1]-t[0])/n],function(t){return t>=e[0]&&t<=e[1]}}(m,n.option.range):function(t,e,n){var i=t[1]-t[0],r=(e=z(e,(function(e){return{interval:[(e.interval[0]-t[0])/i,(e.interval[1]-t[0])/i]}}))).length,o=0;return function(t){var i;for(i=o;i<r;i++)if((a=e[i].interval)[0]<=t&&t<=a[1]){o=i;break}if(i===r)for(i=o-1;i>=0;i--){var a;if((a=e[i].interval)[0]<=t&&t<=a[1]){o=i;break}}return i>=0&&i<r&&n[i]}}(m,n.getPieceList(),n.option.selected);s.update(v,f,g,r.color.getNormalizer(),{inRange:r.color.getColorMapper(),outOfRange:o.color.getColorMapper()},x);var _=new _s({style:{width:f,height:g,x:h,y:c,image:s.canvas},silent:!0});this.group.add(_)},e.type="heatmap",e}(xg),EP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(t,e){return rx(null,this,{generateCoord:"value"})},e.prototype.preventIncremental=function(){var t=hd.get(this.get("coordinateSystem"));if(t&&t.dimensions)return"lng"===t.dimensions[0]&&"lat"===t.dimensions[1]},e.type="series.heatmap",e.dependencies=["grid","geo","calendar"],e.defaultOption={coordinateSystem:"cartesian2d",z:2,geoIndex:0,blurSize:30,pointSize:20,maxOpacity:1,minOpacity:0,select:{itemStyle:{borderColor:"#212121"}}},e}(sg);var zP=["itemStyle","borderWidth"],VP=[{xy:"x",wh:"width",index:0,posDesc:["left","right"]},{xy:"y",wh:"height",index:1,posDesc:["top","bottom"]}],BP=new hu,FP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=this.group,r=t.getData(),o=this._data,a=t.coordinateSystem,s=a.getBaseAxis().isHorizontal(),l=a.master.getRect(),u={ecSize:{width:n.getWidth(),height:n.getHeight()},seriesModel:t,coordSys:a,coordSysExtent:[[l.x,l.x+l.width],[l.y,l.y+l.height]],isHorizontal:s,valueDim:VP[+s],categoryDim:VP[1-+s]};return r.diff(o).add((function(t){if(r.hasValue(t)){var e=jP(r,t),n=GP(r,t,e,u),o=$P(r,u,n);r.setItemGraphicEl(t,o),i.add(o),nO(o,u,n)}})).update((function(t,e){var n=o.getItemGraphicEl(e);if(r.hasValue(t)){var a=jP(r,t),s=GP(r,t,a,u),l=QP(r,s);n&&l!==n.__pictorialShapeStr&&(i.remove(n),r.setItemGraphicEl(t,null),n=null),n?function(t,e,n){var i=n.animationModel,r=n.dataIndex;rh(t.__pictorialBundle,{x:n.bundlePosition[0],y:n.bundlePosition[1]},i,r),n.symbolRepeat?YP(t,e,n,!0):UP(t,e,n,!0);XP(t,n,!0),ZP(t,e,n,!0)}(n,u,s):n=$P(r,u,s,!0),r.setItemGraphicEl(t,n),n.__pictorialSymbolMeta=s,i.add(n),nO(n,u,s)}else i.remove(n)})).remove((function(t){var e=o.getItemGraphicEl(t);e&&JP(o,t,e.__pictorialSymbolMeta.animationModel,e)})).execute(),this._data=r,this.group},e.prototype.remove=function(t,e){var n=this.group,i=this._data;t.get("animation")?i&&i.eachItemGraphicEl((function(e){JP(i,Hs(e).dataIndex,t,e)})):n.removeAll()},e.type="pictorialBar",e}(xg);function GP(t,e,n,i){var r=t.getItemLayout(e),o=n.get("symbolRepeat"),a=n.get("symbolClip"),s=n.get("symbolPosition")||"start",l=(n.get("symbolRotate")||0)*Math.PI/180||0,u=n.get("symbolPatternSize")||2,h=n.isAnimationEnabled(),c={dataIndex:e,layout:r,itemModel:n,symbolType:t.getItemVisual(e,"symbol")||"circle",style:t.getItemVisual(e,"style"),symbolClip:a,symbolRepeat:o,symbolRepeatDirection:n.get("symbolRepeatDirection"),symbolPatternSize:u,rotation:l,animationModel:h?n:null,hoverScale:h&&n.get(["emphasis","scale"]),z2:n.getShallow("z",!0)||0};!function(t,e,n,i,r){var o,a=i.valueDim,s=t.get("symbolBoundingData"),l=i.coordSys.getOtherAxis(i.coordSys.getBaseAxis()),u=l.toGlobalCoord(l.dataToCoord(0)),h=1-+(n[a.wh]<=0);if(Y(s)){var c=[WP(l,s[0])-u,WP(l,s[1])-u];c[1]<c[0]&&c.reverse(),o=c[h]}else o=null!=s?WP(l,s)-u:e?i.coordSysExtent[a.index][h]-u:n[a.wh];r.boundingLength=o,e&&(r.repeatCutLength=n[a.wh]);r.pxSign=o>0?1:-1}(n,o,r,i,c),function(t,e,n,i,r,o,a,s,l,u){var h,c=l.valueDim,p=l.categoryDim,d=Math.abs(n[p.wh]),f=t.getItemVisual(e,"symbolSize");h=Y(f)?f.slice():null==f?["100%","100%"]:[f,f];h[p.index]=Er(h[p.index],d),h[c.index]=Er(h[c.index],i?d:Math.abs(o)),u.symbolSize=h,(u.symbolScale=[h[0]/s,h[1]/s])[c.index]*=(l.isHorizontal?-1:1)*a}(t,e,r,o,0,c.boundingLength,c.pxSign,u,i,c),function(t,e,n,i,r){var o=t.get(zP)||0;o&&(BP.attr({scaleX:e[0],scaleY:e[1],rotation:n}),BP.updateTransform(),o/=BP.getLineScale(),o*=e[i.valueDim.index]);r.valueLineWidth=o||0}(n,c.symbolScale,l,i,c);var p=c.symbolSize,d=Oy(n.get("symbolOffset"),p);return function(t,e,n,i,r,o,a,s,l,u,h,c){var p=h.categoryDim,d=h.valueDim,f=c.pxSign,g=Math.max(e[d.index]+s,0),y=g;if(i){var v=Math.abs(l),m=it(t.get("symbolMargin"),"15%")+"",x=!1;m.lastIndexOf("!")===m.length-1&&(x=!0,m=m.slice(0,m.length-1));var _=Er(m,e[d.index]),b=Math.max(g+2*_,0),w=x?0:2*_,S=eo(i),M=S?i:iO((v+w)/b);b=g+2*(_=(v-M*g)/2/(x?M:Math.max(M-1,1))),w=x?0:2*_,S||"fixed"===i||(M=u?iO((Math.abs(u)+w)/b):0),y=M*b-w,c.repeatTimes=M,c.symbolMargin=_}var I=f*(y/2),T=c.pathPosition=[];T[p.index]=n[p.wh]/2,T[d.index]="start"===a?I:"end"===a?l-I:l/2,o&&(T[0]+=o[0],T[1]+=o[1]);var C=c.bundlePosition=[];C[p.index]=n[p.xy],C[d.index]=n[d.xy];var D=c.barRectShape=A({},n);D[d.wh]=f*Math.max(Math.abs(n[d.wh]),Math.abs(T[d.index]+I)),D[p.wh]=n[p.wh];var k=c.clipShape={};k[p.xy]=-n[p.xy],k[p.wh]=h.ecSize[p.wh],k[d.xy]=0,k[d.wh]=n[d.wh]}(n,p,r,o,0,d,s,c.valueLineWidth,c.boundingLength,c.repeatCutLength,i,c),c}function WP(t,e){return t.toGlobalCoord(t.dataToCoord(t.scale.parse(e)))}function HP(t){var e=t.symbolPatternSize,n=Ly(t.symbolType,-e/2,-e/2,e,e);return n.attr({culling:!0}),"image"!==n.type&&n.setStyle({strokeNoScale:!0}),n}function YP(t,e,n,i){var r=t.__pictorialBundle,o=n.symbolSize,a=n.valueLineWidth,s=n.pathPosition,l=e.valueDim,u=n.repeatTimes||0,h=0,c=o[e.valueDim.index]+a+2*n.symbolMargin;for(tO(t,(function(t){t.__pictorialAnimationIndex=h,t.__pictorialRepeatTimes=u,h<u?eO(t,null,f(h),n,i):eO(t,null,{scaleX:0,scaleY:0},n,i,(function(){r.remove(t)})),h++}));h<u;h++){var p=HP(n);p.__pictorialAnimationIndex=h,p.__pictorialRepeatTimes=u,r.add(p);var d=f(h);eO(p,{x:d.x,y:d.y,scaleX:0,scaleY:0},{scaleX:d.scaleX,scaleY:d.scaleY,rotation:d.rotation},n,i)}function f(t){var e=s.slice(),i=n.pxSign,r=t;return("start"===n.symbolRepeatDirection?i>0:i<0)&&(r=u-1-t),e[l.index]=c*(r-u/2+.5)+s[l.index],{x:e[0],y:e[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation}}}function UP(t,e,n,i){var r=t.__pictorialBundle,o=t.__pictorialMainPath;o?eO(o,null,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation},n,i):(o=t.__pictorialMainPath=HP(n),r.add(o),eO(o,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:0,scaleY:0,rotation:n.rotation},{scaleX:n.symbolScale[0],scaleY:n.symbolScale[1]},n,i))}function XP(t,e,n){var i=A({},e.barRectShape),r=t.__pictorialBarRect;r?eO(r,null,{shape:i},e,n):((r=t.__pictorialBarRect=new Cs({z2:2,shape:i,silent:!0,style:{stroke:"transparent",fill:"transparent",lineWidth:0}})).disableMorphing=!0,t.add(r))}function ZP(t,e,n,i){if(n.symbolClip){var r=t.__pictorialClipPath,o=A({},n.clipShape),a=e.valueDim,s=n.animationModel,l=n.dataIndex;if(r)rh(r,{shape:o},s,l);else{o[a.wh]=0,r=new Cs({shape:o}),t.__pictorialBundle.setClipPath(r),t.__pictorialClipPath=r;var u={};u[a.wh]=n.clipShape[a.wh],Bh[i?"updateProps":"initProps"](r,{shape:u},s,l)}}}function jP(t,e){var n=t.getItemModel(e);return n.getAnimationDelayParams=qP,n.isAnimationEnabled=KP,n}function qP(t){return{index:t.__pictorialAnimationIndex,count:t.__pictorialRepeatTimes}}function KP(){return this.parentModel.isAnimationEnabled()&&!!this.getShallow("animation")}function $P(t,e,n,i){var r=new Cr,o=new Cr;return r.add(o),r.__pictorialBundle=o,o.x=n.bundlePosition[0],o.y=n.bundlePosition[1],n.symbolRepeat?YP(r,e,n):UP(r,0,n),XP(r,n,i),ZP(r,e,n,i),r.__pictorialShapeStr=QP(t,n),r.__pictorialSymbolMeta=n,r}function JP(t,e,n,i){var r=i.__pictorialBarRect;r&&r.removeTextContent();var o=[];tO(i,(function(t){o.push(t)})),i.__pictorialMainPath&&o.push(i.__pictorialMainPath),i.__pictorialClipPath&&(n=null),E(o,(function(t){sh(t,{scaleX:0,scaleY:0},n,e,(function(){i.parent&&i.parent.remove(i)}))})),t.setItemGraphicEl(e,null)}function QP(t,e){return[t.getItemVisual(e.dataIndex,"symbol")||"none",!!e.symbolRepeat,!!e.symbolClip].join(":")}function tO(t,e,n){E(t.__pictorialBundle.children(),(function(i){i!==t.__pictorialBarRect&&e.call(n,i)}))}function eO(t,e,n,i,r,o){e&&t.attr(e),i.symbolClip&&!r?n&&t.attr(n):n&&Bh[r?"updateProps":"initProps"](t,n,i.animationModel,i.dataIndex,o)}function nO(t,e,n){var i=n.dataIndex,r=n.itemModel,o=r.getModel("emphasis"),a=o.getModel("itemStyle").getItemStyle(),s=r.getModel(["blur","itemStyle"]).getItemStyle(),l=r.getModel(["select","itemStyle"]).getItemStyle(),u=r.getShallow("cursor"),h=o.get("focus"),c=o.get("blurScope"),p=o.get("scale");tO(t,(function(t){if(t instanceof _s){var e=t.style;t.useStyle(A({image:e.image,x:e.x,y:e.y,width:e.width,height:e.height},n.style))}else t.useStyle(n.style);var i=t.ensureState("emphasis");i.style=a,p&&(i.scaleX=1.1*t.scaleX,i.scaleY=1.1*t.scaleY),t.ensureState("blur").style=s,t.ensureState("select").style=l,u&&(t.cursor=u),t.z2=n.z2}));var d=e.valueDim.posDesc[+(n.boundingLength>0)];Hh(t.__pictorialBarRect,Yh(r),{labelFetcher:e.seriesModel,labelDataIndex:i,defaultText:Ww(e.seriesModel.getData(),i),inheritColor:n.style.fill,defaultOpacity:n.style.opacity,defaultOutsidePosition:d}),Rl(t,h,c,o.get("disabled"))}function iO(t){var e=Math.round(t);return Math.abs(t-e)<1e-4?e:Math.ceil(t)}var rO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n.defaultSymbol="roundRect",n}return n(e,t),e.prototype.getInitialData=function(e){return e.stack=null,t.prototype.getInitialData.apply(this,arguments)},e.type="series.pictorialBar",e.dependencies=["grid"],e.defaultOption=yc(IS.defaultOption,{symbol:"circle",symbolSize:null,symbolRotate:null,symbolPosition:null,symbolOffset:null,symbolMargin:null,symbolRepeat:!1,symbolRepeatDirection:"end",symbolClip:!1,symbolBoundingData:null,symbolPatternSize:400,barGap:"-100%",progressive:0,emphasis:{scale:!1},select:{itemStyle:{borderColor:"#212121"}}}),e}(IS);var oO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._layers=[],n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this,o=this.group,a=t.getLayerSeries(),s=i.getLayout("layoutInfo"),l=s.rect,u=s.boundaryGap;function h(t){return t.name}o.x=0,o.y=l.y+u[0];var c=new Im(this._layersSeries||[],a,h,h),p=[];function d(e,n,s){var l=r._layers;if("remove"!==e){for(var u,h,c=[],d=[],f=a[n].indices,g=0;g<f.length;g++){var y=i.getItemLayout(f[g]),v=y.x,m=y.y0,x=y.y;c.push(v,m),d.push(v,m+x),u=i.getItemVisual(f[g],"style")}var _=i.getItemLayout(f[0]),b=t.getModel("label").get("margin"),w=t.getModel("emphasis");if("add"===e){var S=p[n]=new Cr;h=new oS({shape:{points:c,stackedOnPoints:d,smooth:.4,stackedOnSmooth:.4,smoothConstraint:!1},z2:0}),S.add(h),o.add(S),t.isAnimationEnabled()&&h.setClipPath(function(t,e,n){var i=new Cs({shape:{x:t.x-10,y:t.y-10,width:0,height:t.height+20}});return oh(i,{shape:{x:t.x-50,width:t.width+100,height:t.height+20}},e,n),i}(h.getBoundingRect(),t,(function(){h.removeClipPath()})))}else{S=l[s];h=S.childAt(0),o.add(S),p[n]=S,rh(h,{shape:{points:c,stackedOnPoints:d}},t),hh(h)}Hh(h,Yh(t),{labelDataIndex:f[g-1],defaultText:i.getName(f[g-1]),inheritColor:u.fill},{normal:{verticalAlign:"middle"}}),h.setTextConfig({position:null,local:!0});var M=h.getTextContent();M&&(M.x=_.x-b,M.y=_.y0+_.y/2),h.useStyle(u),i.setItemGraphicEl(n,h),Vl(h,t),Rl(h,w.get("focus"),w.get("blurScope"),w.get("disabled"))}else o.remove(l[n])}c.add(W(d,this,"add")).update(W(d,this,"update")).remove(W(d,this,"remove")).execute(),this._layersSeries=a,this._layers=p},e.type="themeRiver",e}(xg);var aO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new hM(W(this.getData,this),W(this.getRawData,this))},e.prototype.fixData=function(t){var e=t.length,n={},i=Lo(t,(function(t){return n.hasOwnProperty(t[0]+"")||(n[t[0]+""]=-1),t[2]})),r=[];i.buckets.each((function(t,e){r.push({name:e,dataList:t})}));for(var o=r.length,a=0;a<o;++a){for(var s=r[a].name,l=0;l<r[a].dataList.length;++l){var u=r[a].dataList[l][0]+"";n[u]=a}for(var u in n)n.hasOwnProperty(u)&&n[u]!==a&&(n[u]=a,t[e]=[u,0,s],e++)}return t},e.prototype.getInitialData=function(t,e){for(var n=this.getReferringComponents("singleAxis",Co).models[0].get("type"),i=B(t.data,(function(t){return void 0!==t[2]})),r=this.fixData(i||[]),o=[],a=this.nameMap=ft(),s=0,l=0;l<r.length;++l)o.push(r[l][2]),a.get(r[l][2])||(a.set(r[l][2],s),s++);var u=Km(r,{coordDimensions:["single"],dimensionsDefine:[{name:"time",type:Dm(n)},{name:"value",type:"float"},{name:"name",type:"ordinal"}],encodeDefine:{single:0,value:1,itemName:2}}).dimensions,h=new qm(u,this);return h.initData(r),h},e.prototype.getLayerSeries=function(){for(var t=this.getData(),e=t.count(),n=[],i=0;i<e;++i)n[i]=i;var r=t.mapDimension("single"),o=Lo(n,(function(e){return t.get("name",e)})),a=[];return o.buckets.each((function(e,n){e.sort((function(e,n){return t.get(r,e)-t.get(r,n)})),a.push({name:n,indices:e})})),a},e.prototype.getAxisTooltipData=function(t,e,n){Y(t)||(t=t?[t]:[]);for(var i,r=this.getData(),o=this.getLayerSeries(),a=[],s=o.length,l=0;l<s;++l){for(var u=Number.MAX_VALUE,h=-1,c=o[l].indices.length,p=0;p<c;++p){var d=r.get(t[0],o[l].indices[p]),f=Math.abs(d-e);f<=u&&(i=d,u=f,h=o[l].indices[p])}a.push(h)}return{dataIndices:a,nestestValue:i}},e.prototype.formatTooltip=function(t,e,n){var i=this.getData();return Xf("nameValue",{name:i.getName(t),value:i.get(i.mapDimension("value"),t)})},e.type="series.themeRiver",e.dependencies=["singleAxis"],e.defaultOption={z:2,colorBy:"data",coordinateSystem:"singleAxis",boundaryGap:["10%","10%"],singleAxisIndex:0,animationEasing:"linear",label:{margin:4,show:!0,position:"left",fontSize:11},emphasis:{label:{show:!0}}},e}(sg);function sO(t,e){t.eachSeriesByType("themeRiver",(function(t){var e=t.getData(),n=t.coordinateSystem,i={},r=n.getRect();i.rect=r;var o=t.get("boundaryGap"),a=n.getAxis();(i.boundaryGap=o,"horizontal"===a.orient)?(o[0]=Er(o[0],r.height),o[1]=Er(o[1],r.height),lO(e,t,r.height-o[0]-o[1])):(o[0]=Er(o[0],r.width),o[1]=Er(o[1],r.width),lO(e,t,r.width-o[0]-o[1]));e.setLayout("layoutInfo",i)}))}function lO(t,e,n){if(t.count())for(var i,r=e.coordinateSystem,o=e.getLayerSeries(),a=t.mapDimension("single"),s=t.mapDimension("value"),l=z(o,(function(e){return z(e.indices,(function(e){var n=r.dataToPoint(t.get(a,e));return n[1]=t.get(s,e),n}))})),u=function(t){for(var e=t.length,n=t[0].length,i=[],r=[],o=0,a=0;a<n;++a){for(var s=0,l=0;l<e;++l)s+=t[l][a][1];s>o&&(o=s),i.push(s)}for(var u=0;u<n;++u)r[u]=(o-i[u])/2;o=0;for(var h=0;h<n;++h){var c=i[h]+r[h];c>o&&(o=c)}return{y0:r,max:o}}(l),h=u.y0,c=n/u.max,p=o.length,d=o[0].indices.length,f=0;f<d;++f){i=h[f]*c,t.setItemLayout(o[0].indices[f],{layerIndex:0,x:l[0][f][0],y0:i,y:l[0][f][1]*c});for(var g=1;g<p;++g)i+=l[g-1][f][1]*c,t.setItemLayout(o[g].indices[f],{layerIndex:g,x:l[g][f][0],y0:i,y:l[g][f][1]*c})}}var uO=function(t){function e(e,n,i,r){var o=t.call(this)||this;o.z2=2,o.textConfig={inside:!0},Hs(o).seriesIndex=n.seriesIndex;var a=new ks({z2:4,silent:e.getModel().get(["label","silent"])});return o.setTextContent(a),o.updateData(!0,e,n,i,r),o}return n(e,t),e.prototype.updateData=function(t,e,n,i,r){this.node=e,e.piece=this,n=n||this._seriesModel,i=i||this._ecModel;var o=this;Hs(o).dataIndex=e.dataIndex;var a=e.getModel(),s=a.getModel("emphasis"),l=e.getLayout(),u=A({},l);u.label=null;var h=e.getVisual("style");h.lineJoin="bevel";var c=e.getVisual("decal");c&&(h.decal=rv(c,r));var p=aM(a.getModel("itemStyle"),u,!0);A(u,p),E(qs,(function(t){var e=o.ensureState(t),n=a.getModel([t,"itemStyle"]);e.style=n.getItemStyle();var i=aM(n,u);i&&(e.shape=i)})),t?(o.setShape(u),o.shape.r=l.r0,rh(o,{shape:{r:l.r}},n,e.dataIndex)):(rh(o,{shape:u},n),hh(o)),o.useStyle(h),this._updateLabel(n);var d=a.getShallow("cursor");d&&o.attr("cursor",d),this._seriesModel=n||this._seriesModel,this._ecModel=i||this._ecModel;var f=s.get("focus");Rl(this,"ancestor"===f?e.getAncestorsIndices():"descendant"===f?e.getDescendantIndices():f,s.get("blurScope"),s.get("disabled"))},e.prototype._updateLabel=function(t){var e=this,n=this.node.getModel(),i=n.getModel("label"),r=this.node.getLayout(),o=r.endAngle-r.startAngle,a=(r.startAngle+r.endAngle)/2,s=Math.cos(a),l=Math.sin(a),u=this,h=u.getTextContent(),c=this.node.dataIndex,p=i.get("minAngle")/180*Math.PI,d=i.get("show")&&!(null!=p&&Math.abs(o)<p);function f(t,e){var n=t.get(e);return null==n?i.get(e):n}h.ignore=!d,E(Ks,(function(i){var p="normal"===i?n.getModel("label"):n.getModel([i,"label"]),d="normal"===i,g=d?h:h.ensureState(i),y=t.getFormattedLabel(c,i);d&&(y=y||e.node.name),g.style=Uh(p,{},null,"normal"!==i,!0),y&&(g.style.text=y);var v=p.get("show");null==v||d||(g.ignore=!v);var m,x=f(p,"position"),_=d?u:u.states[i],b=_.style.fill;_.textConfig={outsideFill:"inherit"===p.get("color")?b:null,inside:"outside"!==x};var w=f(p,"distance")||0,S=f(p,"align");"outside"===x?(m=r.r+w,S=a>Math.PI/2?"right":"left"):S&&"center"!==S?"left"===S?(m=r.r0+w,a>Math.PI/2&&(S="right")):"right"===S&&(m=r.r-w,a>Math.PI/2&&(S="left")):(m=o===2*Math.PI&&0===r.r0?0:(r.r+r.r0)/2,S="center"),g.style.align=S,g.style.verticalAlign=f(p,"verticalAlign")||"middle",g.x=m*s+r.cx,g.y=m*l+r.cy;var M=f(p,"rotate"),I=0;"radial"===M?(I=-a)<-Math.PI/2&&(I+=Math.PI):"tangential"===M?(I=Math.PI/2-a)>Math.PI/2?I-=Math.PI:I<-Math.PI/2&&(I+=Math.PI):j(M)&&(I=M*Math.PI/180),g.rotation=I})),h.dirtyStyle()},e}(Cu),hO="sunburstRootToNode",cO="sunburstHighlight";var pO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){var r=this;this.seriesModel=t,this.api=n,this.ecModel=e;var o=t.getData(),a=o.tree.root,s=t.getViewRoot(),l=this.group,u=t.get("renderLabelForZeroData"),h=[];s.eachNode((function(t){h.push(t)}));var c=this._oldChildren||[];!function(i,r){if(0===i.length&&0===r.length)return;function s(t){return t.getId()}function h(s,h){!function(i,r){u||!i||i.getValue()||(i=null);if(i!==a&&r!==a)if(r&&r.piece)i?(r.piece.updateData(!1,i,t,e,n),o.setItemGraphicEl(i.dataIndex,r.piece)):function(t){if(!t)return;t.piece&&(l.remove(t.piece),t.piece=null)}(r);else if(i){var s=new uO(i,t,e,n);l.add(s),o.setItemGraphicEl(i.dataIndex,s)}}(null==s?null:i[s],null==h?null:r[h])}new Im(r,i,s,s).add(h).update(h).remove(H(h,null)).execute()}(h,c),function(i,o){o.depth>0?(r.virtualPiece?r.virtualPiece.updateData(!1,i,t,e,n):(r.virtualPiece=new uO(i,t,e,n),l.add(r.virtualPiece)),o.piece.off("click"),r.virtualPiece.on("click",(function(t){r._rootToNode(o.parentNode)}))):r.virtualPiece&&(l.remove(r.virtualPiece),r.virtualPiece=null)}(a,s),this._initEvents(),this._oldChildren=h},e.prototype._initEvents=function(){var t=this;this.group.off("click"),this.group.on("click",(function(e){var n=!1;t.seriesModel.getViewRoot().eachNode((function(i){if(!n&&i.piece&&i.piece===e.target){var r=i.getModel().get("nodeClick");if("rootToNode"===r)t._rootToNode(i);else if("link"===r){var o=i.getModel(),a=o.get("link");if(a)dp(a,o.get("target",!0)||"_blank")}n=!0}}))}))},e.prototype._rootToNode=function(t){t!==this.seriesModel.getViewRoot()&&this.api.dispatchAction({type:hO,from:this.uid,seriesId:this.seriesModel.id,targetNode:t})},e.prototype.containPoint=function(t,e){var n=e.getData().getItemLayout(0);if(n){var i=t[0]-n.cx,r=t[1]-n.cy,o=Math.sqrt(i*i+r*r);return o<=n.r&&o>=n.r0}},e.type="sunburst",e}(xg),dO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.ignoreStyleOnData=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){var n={name:t.name,children:t.data};fO(n);var i=this._levelModels=z(t.levels||[],(function(t){return new dc(t,this,e)}),this),r=AC.createTree(n,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=r.getNodeByDataIndex(e),o=i[n.depth];return o&&(t.parentModel=o),t}))}));return r.data},e.prototype.optionUpdated=function(){this.resetViewRoot()},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treePathInfo=OC(i,this),n},e.prototype.getLevelModel=function(t){return this._levelModels&&this._levelModels[t.depth]},e.prototype.getViewRoot=function(){return this._viewRoot},e.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)},e.prototype.enableAriaDecal=function(){BC(this)},e.type="series.sunburst",e.defaultOption={z:2,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,stillShowZeroSum:!0,nodeClick:"rootToNode",renderLabelForZeroData:!1,label:{rotate:"radial",show:!0,opacity:1,align:"center",position:"inside",distance:5,silent:!0},itemStyle:{borderWidth:1,borderColor:"white",borderType:"solid",shadowBlur:0,shadowColor:"rgba(0, 0, 0, 0.2)",shadowOffsetX:0,shadowOffsetY:0,opacity:1},emphasis:{focus:"descendant"},blur:{itemStyle:{opacity:.2},label:{opacity:.1}},animationType:"expansion",animationDuration:1e3,animationDurationUpdate:500,data:[],sort:"desc"},e}(sg);function fO(t){var e=0;E(t.children,(function(t){fO(t);var n=t.value;Y(n)&&(n=n[0]),e+=n}));var n=t.value;Y(n)&&(n=n[0]),(null==n||isNaN(n))&&(n=e),n<0&&(n=0),Y(t.value)?t.value[0]=n:t.value=n}var gO=Math.PI/180;function yO(t,e,n){e.eachSeriesByType(t,(function(t){var e=t.get("center"),i=t.get("radius");Y(i)||(i=[0,i]),Y(e)||(e=[e,e]);var r=n.getWidth(),o=n.getHeight(),a=Math.min(r,o),s=Er(e[0],r),l=Er(e[1],o),u=Er(i[0],a/2),h=Er(i[1],a/2),c=-t.get("startAngle")*gO,p=t.get("minAngle")*gO,d=t.getData().tree.root,f=t.getViewRoot(),g=f.depth,y=t.get("sort");null!=y&&vO(f,y);var v=0;E(f.children,(function(t){!isNaN(t.getValue())&&v++}));var m=f.getValue(),x=Math.PI/(m||v)*2,_=f.depth>0,b=f.height-(_?-1:1),w=(h-u)/(b||1),S=t.get("clockwise"),M=t.get("stillShowZeroSum"),I=S?1:-1,T=function(e,n){if(e){var i=n;if(e!==d){var r=e.getValue(),o=0===m&&M?x:r*x;o<p&&(o=p),i=n+I*o;var h=e.depth-g-(_?-1:1),c=u+w*h,f=u+w*(h+1),y=t.getLevelModel(e);if(y){var v=y.get("r0",!0),b=y.get("r",!0),C=y.get("radius",!0);null!=C&&(v=C[0],b=C[1]),null!=v&&(c=Er(v,a/2)),null!=b&&(f=Er(b,a/2))}e.setLayout({angle:o,startAngle:n,endAngle:i,clockwise:S,cx:s,cy:l,r0:c,r:f})}if(e.children&&e.children.length){var D=0;E(e.children,(function(t){D+=T(t,n+D)}))}return i-n}};if(_){var C=u,D=u+w,A=2*Math.PI;d.setLayout({angle:A,startAngle:c,endAngle:c+A,clockwise:S,cx:s,cy:l,r0:C,r:D})}T(f,c)}))}function vO(t,e){var n=t.children||[];t.children=function(t,e){if(U(e)){var n=z(t,(function(t,e){var n=t.getValue();return{params:{depth:t.depth,height:t.height,dataIndex:t.dataIndex,getValue:function(){return n}},index:e}}));return n.sort((function(t,n){return e(t.params,n.params)})),z(n,(function(e){return t[e.index]}))}var i="asc"===e;return t.sort((function(t,e){var n=(t.getValue()-e.getValue())*(i?1:-1);return 0===n?(t.dataIndex-e.dataIndex)*(i?-1:1):n}))}(n,e),n.length&&E(t.children,(function(t){vO(t,e)}))}function mO(t){var e={};t.eachSeriesByType("sunburst",(function(t){var n=t.getData(),i=n.tree;i.eachNode((function(r){var o=r.getModel().getModel("itemStyle").getItemStyle();o.fill||(o.fill=function(t,n,i){for(var r=t;r&&r.depth>1;)r=r.parentNode;var o=n.getColorFromPalette(r.name||r.dataIndex+"",e);return t.depth>1&&X(o)&&(o=Sn(o,(t.depth-1)/(i-1)*.5)),o}(r,t,i.root.height)),A(n.ensureUniqueItemVisual(r.dataIndex,"style"),o)}))}))}var xO={color:"fill",borderColor:"stroke"},_O={symbol:1,symbolSize:1,symbolKeepAspect:1,legendIcon:1,visualMeta:1,liftZ:1,decal:1},bO=So(),wO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(){this.currentZLevel=this.get("zlevel",!0),this.currentZ=this.get("z",!0)},e.prototype.getInitialData=function(t,e){return rx(null,this)},e.prototype.getDataParams=function(e,n,i){var r=t.prototype.getDataParams.call(this,e,n);return i&&(r.info=bO(i).info),r},e.type="series.custom",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={coordinateSystem:"cartesian2d",z:2,legendHoverLink:!0,clip:!1},e}(sg);function SO(t,e){return e=e||[0,0],z(["x","y"],(function(n,i){var r=this.getAxis(n),o=e[i],a=t[i]/2;return"category"===r.type?r.getBandWidth():Math.abs(r.dataToCoord(o-a)-r.dataToCoord(o+a))}),this)}function MO(t,e){return e=e||[0,0],z([0,1],(function(n){var i=e[n],r=t[n]/2,o=[],a=[];return o[n]=i-r,a[n]=i+r,o[1-n]=a[1-n]=e[1-n],Math.abs(this.dataToPoint(o)[n]-this.dataToPoint(a)[n])}),this)}function IO(t,e){var n=this.getAxis(),i=e instanceof Array?e[0]:e,r=(t instanceof Array?t[0]:t)/2;return"category"===n.type?n.getBandWidth():Math.abs(n.dataToCoord(i-r)-n.dataToCoord(i+r))}function TO(t,e){return e=e||[0,0],z(["Radius","Angle"],(function(n,i){var r=this["get"+n+"Axis"](),o=e[i],a=t[i]/2,s="category"===r.type?r.getBandWidth():Math.abs(r.dataToCoord(o-a)-r.dataToCoord(o+a));return"Angle"===n&&(s=s*Math.PI/180),s}),this)}function CO(t,e,n,i){return t&&(t.legacy||!1!==t.legacy&&!n&&!i&&"tspan"!==e&&("text"===e||mt(t,"text")))}function DO(t,e,n){var i,r,o,a=t;if("text"===e)o=a;else{o={},mt(a,"text")&&(o.text=a.text),mt(a,"rich")&&(o.rich=a.rich),mt(a,"textFill")&&(o.fill=a.textFill),mt(a,"textStroke")&&(o.stroke=a.textStroke),mt(a,"fontFamily")&&(o.fontFamily=a.fontFamily),mt(a,"fontSize")&&(o.fontSize=a.fontSize),mt(a,"fontStyle")&&(o.fontStyle=a.fontStyle),mt(a,"fontWeight")&&(o.fontWeight=a.fontWeight),r={type:"text",style:o,silent:!0},i={};var s=mt(a,"textPosition");n?i.position=s?a.textPosition:"inside":s&&(i.position=a.textPosition),mt(a,"textPosition")&&(i.position=a.textPosition),mt(a,"textOffset")&&(i.offset=a.textOffset),mt(a,"textRotation")&&(i.rotation=a.textRotation),mt(a,"textDistance")&&(i.distance=a.textDistance)}return AO(o,t),E(o.rich,(function(t){AO(t,t)})),{textConfig:i,textContent:r}}function AO(t,e){e&&(e.font=e.textFont||e.font,mt(e,"textStrokeWidth")&&(t.lineWidth=e.textStrokeWidth),mt(e,"textAlign")&&(t.align=e.textAlign),mt(e,"textVerticalAlign")&&(t.verticalAlign=e.textVerticalAlign),mt(e,"textLineHeight")&&(t.lineHeight=e.textLineHeight),mt(e,"textWidth")&&(t.width=e.textWidth),mt(e,"textHeight")&&(t.height=e.textHeight),mt(e,"textBackgroundColor")&&(t.backgroundColor=e.textBackgroundColor),mt(e,"textPadding")&&(t.padding=e.textPadding),mt(e,"textBorderColor")&&(t.borderColor=e.textBorderColor),mt(e,"textBorderWidth")&&(t.borderWidth=e.textBorderWidth),mt(e,"textBorderRadius")&&(t.borderRadius=e.textBorderRadius),mt(e,"textBoxShadowColor")&&(t.shadowColor=e.textBoxShadowColor),mt(e,"textBoxShadowBlur")&&(t.shadowBlur=e.textBoxShadowBlur),mt(e,"textBoxShadowOffsetX")&&(t.shadowOffsetX=e.textBoxShadowOffsetX),mt(e,"textBoxShadowOffsetY")&&(t.shadowOffsetY=e.textBoxShadowOffsetY))}function kO(t,e,n){var i=t;i.textPosition=i.textPosition||n.position||"inside",null!=n.offset&&(i.textOffset=n.offset),null!=n.rotation&&(i.textRotation=n.rotation),null!=n.distance&&(i.textDistance=n.distance);var r=i.textPosition.indexOf("inside")>=0,o=t.fill||"#000";LO(i,e);var a=null==i.textFill;return r?a&&(i.textFill=n.insideFill||"#fff",!i.textStroke&&n.insideStroke&&(i.textStroke=n.insideStroke),!i.textStroke&&(i.textStroke=o),null==i.textStrokeWidth&&(i.textStrokeWidth=2)):(a&&(i.textFill=t.fill||n.outsideFill||"#000"),!i.textStroke&&n.outsideStroke&&(i.textStroke=n.outsideStroke)),i.text=e.text,i.rich=e.rich,E(e.rich,(function(t){LO(t,t)})),i}function LO(t,e){e&&(mt(e,"fill")&&(t.textFill=e.fill),mt(e,"stroke")&&(t.textStroke=e.fill),mt(e,"lineWidth")&&(t.textStrokeWidth=e.lineWidth),mt(e,"font")&&(t.font=e.font),mt(e,"fontStyle")&&(t.fontStyle=e.fontStyle),mt(e,"fontWeight")&&(t.fontWeight=e.fontWeight),mt(e,"fontSize")&&(t.fontSize=e.fontSize),mt(e,"fontFamily")&&(t.fontFamily=e.fontFamily),mt(e,"align")&&(t.textAlign=e.align),mt(e,"verticalAlign")&&(t.textVerticalAlign=e.verticalAlign),mt(e,"lineHeight")&&(t.textLineHeight=e.lineHeight),mt(e,"width")&&(t.textWidth=e.width),mt(e,"height")&&(t.textHeight=e.height),mt(e,"backgroundColor")&&(t.textBackgroundColor=e.backgroundColor),mt(e,"padding")&&(t.textPadding=e.padding),mt(e,"borderColor")&&(t.textBorderColor=e.borderColor),mt(e,"borderWidth")&&(t.textBorderWidth=e.borderWidth),mt(e,"borderRadius")&&(t.textBorderRadius=e.borderRadius),mt(e,"shadowColor")&&(t.textBoxShadowColor=e.shadowColor),mt(e,"shadowBlur")&&(t.textBoxShadowBlur=e.shadowBlur),mt(e,"shadowOffsetX")&&(t.textBoxShadowOffsetX=e.shadowOffsetX),mt(e,"shadowOffsetY")&&(t.textBoxShadowOffsetY=e.shadowOffsetY),mt(e,"textShadowColor")&&(t.textShadowColor=e.textShadowColor),mt(e,"textShadowBlur")&&(t.textShadowBlur=e.textShadowBlur),mt(e,"textShadowOffsetX")&&(t.textShadowOffsetX=e.textShadowOffsetX),mt(e,"textShadowOffsetY")&&(t.textShadowOffsetY=e.textShadowOffsetY))}var PO={position:["x","y"],scale:["scaleX","scaleY"],origin:["originX","originY"]},OO=G(PO),RO=(V(Ki,(function(t,e){return t[e]=1,t}),{}),Ki.join(", "),["","style","shape","extra"]),NO=So();function EO(t,e,n,i,r){var o=t+"Animation",a=nh(t,i,r)||{},s=NO(e).userDuring;return a.duration>0&&(a.during=s?W(HO,{el:e,userDuring:s}):null,a.setToFinal=!0,a.scope=t),A(a,n[o]),a}function zO(t,e,n,i){var r=(i=i||{}).dataIndex,o=i.isInit,a=i.clearStyle,s=n.isAnimationEnabled(),l=NO(t),u=e.style;l.userDuring=e.during;var h={},c={};if(function(t,e,n){for(var i=0;i<OO.length;i++){var r=OO[i],o=PO[r],a=e[r];a&&(n[o[0]]=a[0],n[o[1]]=a[1])}for(i=0;i<Ki.length;i++){var s=Ki[i];null!=e[s]&&(n[s]=e[s])}}(0,e,c),UO("shape",e,c),UO("extra",e,c),!o&&s&&(function(t,e,n){for(var i=e.transition,r=FO(i)?Ki:ho(i||[]),o=0;o<r.length;o++){var a=r[o];if("style"!==a&&"shape"!==a&&"extra"!==a){var s=t[a];0,n[a]=s}}}(t,e,h),YO("shape",t,e,h),YO("extra",t,e,h),function(t,e,n,i){if(!n)return;var r,o=t.style;if(o){var a=n.transition,s=e.transition;if(a&&!FO(a)){var l=ho(a);!r&&(r=i.style={});for(var u=0;u<l.length;u++){var h=o[f=l[u]];r[f]=h}}else if(t.getAnimationStyleProps&&(FO(s)||FO(a)||P(s,"style")>=0)){var c=t.getAnimationStyleProps(),p=c?c.style:null;if(p){!r&&(r=i.style={});var d=G(n);for(u=0;u<d.length;u++){var f;if(p[f=d[u]]){h=o[f];r[f]=h}}}}}}(t,e,u,h)),c.style=u,function(t,e,n){var i=e.style;if(!t.isGroup&&i){if(n){t.useStyle({});for(var r=t.animators,o=0;o<r.length;o++){var a=r[o];"style"===a.targetName&&a.changeTarget(t.style)}}t.setStyle(i)}e&&(e.style=null,e&&t.attr(e),e.style=i)}(t,c,a),function(t,e){mt(e,"silent")&&(t.silent=e.silent),mt(e,"ignore")&&(t.ignore=e.ignore),t instanceof da&&mt(e,"invisible")&&(t.invisible=e.invisible);t instanceof gs&&mt(e,"autoBatch")&&(t.autoBatch=e.autoBatch)}(t,e),s)if(o){var p={};E(RO,(function(t){var n=t?e[t]:e;n&&n.enterFrom&&(t&&(p[t]=p[t]||{}),A(t?p[t]:p,n.enterFrom))}));var d=EO("enter",t,e,n,r);d.duration>0&&t.animateFrom(p,d)}else!function(t,e,n,i,r){if(r){var o=EO("update",t,e,i,n);o.duration>0&&t.animateFrom(r,o)}}(t,e,r||0,n,h);VO(t,e),u?t.dirty():t.markRedraw()}function VO(t,e){for(var n=NO(t).leaveToProps,i=0;i<RO.length;i++){var r=RO[i],o=r?e[r]:e;o&&o.leaveTo&&(n||(n=NO(t).leaveToProps={}),r&&(n[r]=n[r]||{}),A(r?n[r]:n,o.leaveTo))}}function BO(t,e,n,i){if(t){var r=t.parent,o=NO(t).leaveToProps;if(o){var a=EO("update",t,e,n,0);a.done=function(){r.remove(t),i&&i()},t.animateTo(o,a)}else r.remove(t),i&&i()}}function FO(t){return"all"===t}var GO={},WO={setTransform:function(t,e){return GO.el[t]=e,this},getTransform:function(t){return GO.el[t]},setShape:function(t,e){var n=GO.el;return(n.shape||(n.shape={}))[t]=e,n.dirtyShape&&n.dirtyShape(),this},getShape:function(t){var e=GO.el.shape;if(e)return e[t]},setStyle:function(t,e){var n=GO.el,i=n.style;return i&&(i[t]=e,n.dirtyStyle&&n.dirtyStyle()),this},getStyle:function(t){var e=GO.el.style;if(e)return e[t]},setExtra:function(t,e){return(GO.el.extra||(GO.el.extra={}))[t]=e,this},getExtra:function(t){var e=GO.el.extra;if(e)return e[t]}};function HO(){var t=this,e=t.el;if(e){var n=NO(e).userDuring,i=t.userDuring;n===i?(GO.el=e,i(WO)):t.el=t.userDuring=null}}function YO(t,e,n,i){var r=n[t];if(r){var o,a=e[t];if(a){var s=n.transition,l=r.transition;if(l)if(!o&&(o=i[t]={}),FO(l))A(o,a);else for(var u=ho(l),h=0;h<u.length;h++){var c=a[d=u[h]];o[d]=c}else if(FO(s)||P(s,t)>=0){!o&&(o=i[t]={});var p=G(a);for(h=0;h<p.length;h++){var d;c=a[d=p[h]];XO(r[d],c)&&(o[d]=c)}}}}}function UO(t,e,n){var i=e[t];if(i)for(var r=n[t]={},o=G(i),a=0;a<o.length;a++){var s=o[a];r[s]=ti(i[s])}}function XO(t,e){return N(t)?t!==e:null!=t&&isFinite(t)}var ZO=So(),jO=["percent","easing","shape","style","extra"];function qO(t){t.stopAnimation("keyframe"),t.attr(ZO(t))}function KO(t,e,n){if(n.isAnimationEnabled()&&e)if(Y(e))E(e,(function(e){KO(t,e,n)}));else{var i=e.keyframes,r=e.duration;if(n&&null==r){var o=nh("enter",n,0);r=o&&o.duration}if(i&&r){var a=ZO(t);E(RO,(function(n){if(!n||t[n]){var o;i.sort((function(t,e){return t.percent-e.percent})),E(i,(function(i){var s=t.animators,l=n?i[n]:i;if(l){var u=G(l);if(n||(u=B(u,(function(t){return P(jO,t)<0}))),u.length){o||((o=t.animate(n,e.loop,!0)).scope="keyframe");for(var h=0;h<s.length;h++)s[h]!==o&&s[h].targetName===o.targetName&&s[h].stopTracks(u);n&&(a[n]=a[n]||{});var c=n?a[n]:a;E(u,(function(e){c[e]=((n?t[n]:t)||{})[e]})),o.whenWithKeys(r*i.percent,l,u,i.easing)}}})),o&&o.delay(e.delay||0).duration(r).start(e.easing)}}))}}}var $O="emphasis",JO="normal",QO="blur",tR="select",eR=[JO,$O,QO,tR],nR={normal:["itemStyle"],emphasis:[$O,"itemStyle"],blur:[QO,"itemStyle"],select:[tR,"itemStyle"]},iR={normal:["label"],emphasis:[$O,"label"],blur:[QO,"label"],select:[tR,"label"]},rR=["x","y"],oR={normal:{},emphasis:{},blur:{},select:{}},aR={cartesian2d:function(t){var e=t.master.getRect();return{coordSys:{type:"cartesian2d",x:e.x,y:e.y,width:e.width,height:e.height},api:{coord:function(e){return t.dataToPoint(e)},size:W(SO,t)}}},geo:function(t){var e=t.getBoundingRect();return{coordSys:{type:"geo",x:e.x,y:e.y,width:e.width,height:e.height,zoom:t.getZoom()},api:{coord:function(e){return t.dataToPoint(e)},size:W(MO,t)}}},single:function(t){var e=t.getRect();return{coordSys:{type:"singleAxis",x:e.x,y:e.y,width:e.width,height:e.height},api:{coord:function(e){return t.dataToPoint(e)},size:W(IO,t)}}},polar:function(t){var e=t.getRadiusAxis(),n=t.getAngleAxis(),i=e.getExtent();return i[0]>i[1]&&i.reverse(),{coordSys:{type:"polar",cx:t.cx,cy:t.cy,r:i[1],r0:i[0]},api:{coord:function(i){var r=e.dataToRadius(i[0]),o=n.dataToAngle(i[1]),a=t.coordToPoint([r,o]);return a.push(r,o*Math.PI/180),a},size:W(TO,t)}}},calendar:function(t){var e=t.getRect(),n=t.getRangeInfo();return{coordSys:{type:"calendar",x:e.x,y:e.y,width:e.width,height:e.height,cellWidth:t.getCellWidth(),cellHeight:t.getCellHeight(),rangeInfo:{start:n.start,end:n.end,weeks:n.weeks,dayCount:n.allDay}},api:{coord:function(e,n){return t.dataToPoint(e,n)}}}}};function sR(t){return t instanceof gs}function lR(t){return t instanceof da}var uR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){this._progressiveEls=null;var r=this._data,o=t.getData(),a=this.group,s=fR(t,o,e,n);r||a.removeAll(),o.diff(r).add((function(e){yR(n,null,e,s(e,i),t,a,o)})).remove((function(e){var n=r.getItemGraphicEl(e);BO(n,bO(n).option,t)})).update((function(e,l){var u=r.getItemGraphicEl(l);yR(n,u,e,s(e,i),t,a,o)})).execute();var l=t.get("clip",!0)?lS(t.coordinateSystem,!1,t):null;l?a.setClipPath(l):a.removeClipPath(),this._data=o},e.prototype.incrementalPrepareRender=function(t,e,n){this.group.removeAll(),this._data=null},e.prototype.incrementalRender=function(t,e,n,i,r){var o=e.getData(),a=fR(e,o,n,i),s=this._progressiveEls=[];function l(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}for(var u=t.start;u<t.end;u++){var h=yR(null,null,u,a(u,r),e,this.group,o);h&&(h.traverse(l),s.push(h))}},e.prototype.eachRendered=function(t){Vh(this._progressiveEls||this.group,t)},e.prototype.filterForExposedEvent=function(t,e,n,i){var r=e.element;if(null==r||n.name===r)return!0;for(;(n=n.__hostTarget||n.parent)&&n!==this.group;)if(n.name===r)return!0;return!1},e.type="custom",e}(xg);function hR(t){var e,n=t.type;if("path"===n){var i=t.shape,r=null!=i.width&&null!=i.height?{x:i.x||0,y:i.y||0,width:i.width,height:i.height}:null,o=IR(i);e=xh(o,null,r,i.layout||"center"),bO(e).customPathData=o}else if("image"===n)e=new _s({}),bO(e).customImagePath=t.style.image;else if("text"===n)e=new ks({});else if("group"===n)e=new Cr;else{if("compoundPath"===n)throw new Error('"compoundPath" is not supported yet.');var a=mh(n);if(!a){var s="";0,ao(s)}e=new a}return bO(e).customGraphicType=n,e.name=t.name,e.z2EmphasisLift=1,e.z2SelectLift=1,e}function cR(t,e,n,i,r,o,a){qO(e);var s=r&&r.normal.cfg;s&&e.setTextConfig(s),i&&null==i.transition&&(i.transition=rR);var l=i&&i.style;if(l){if("text"===e.type){var u=l;mt(u,"textFill")&&(u.fill=u.textFill),mt(u,"textStroke")&&(u.stroke=u.textStroke)}var h=void 0,c=sR(e)?l.decal:null;t&&c&&(c.dirty=!0,h=rv(c,t)),l.__decalPattern=h}lR(e)&&(l&&(h=l.__decalPattern)&&(l.decal=h));zO(e,i,o,{dataIndex:n,isInit:a,clearStyle:!0}),KO(e,i.keyframeAnimation,o)}function pR(t,e,n,i,r){var o=e.isGroup?null:e,a=r&&r[t].cfg;if(o){var s=o.ensureState(t);if(!1===i){var l=o.getState(t);l&&(l.style=null)}else s.style=i||null;a&&(s.textConfig=a),vl(o)}}function dR(t,e,n){var i=n===JO,r=i?e:_R(e,n),o=r?r.z2:null;null!=o&&((i?t:t.ensureState(n)).z2=o||0)}function fR(t,e,n,i){var r=t.get("renderItem"),o=t.coordinateSystem,a={};o&&(a=o.prepareCustoms?o.prepareCustoms(o):aR[o.type](o));for(var s,l,u=k({getWidth:i.getWidth,getHeight:i.getHeight,getZr:i.getZr,getDevicePixelRatio:i.getDevicePixelRatio,value:function(t,n){return null==n&&(n=s),e.getStore().get(e.getDimensionIndex(t||0),n)},style:function(n,i){0;null==i&&(i=s);var r=e.getItemVisual(i,"style"),o=r&&r.fill,a=r&&r.opacity,l=m(i,JO).getItemStyle();null!=o&&(l.fill=o),null!=a&&(l.opacity=a);var u={inheritColor:X(o)?o:"#000"},h=x(i,JO),c=Uh(h,null,u,!1,!0);c.text=h.getShallow("show")?rt(t.getFormattedLabel(i,JO),Ww(e,i)):null;var p=Xh(h,u,!1);return b(n,l),l=kO(l,c,p),n&&_(l,n),l.legacy=!0,l},ordinalRawValue:function(t,n){null==n&&(n=s),t=t||0;var i=e.getDimensionInfo(t);if(!i){var r=e.getDimensionIndex(t);return r>=0?e.getStore().get(r,n):void 0}var o=e.get(i.name,n),a=i&&i.ordinalMeta;return a?a.categories[o]:o},styleEmphasis:function(n,i){0;null==i&&(i=s);var r=m(i,$O).getItemStyle(),o=x(i,$O),a=Uh(o,null,null,!0,!0);a.text=o.getShallow("show")?ot(t.getFormattedLabel(i,$O),t.getFormattedLabel(i,JO),Ww(e,i)):null;var l=Xh(o,null,!0);return b(n,r),r=kO(r,a,l),n&&_(r,n),r.legacy=!0,r},visual:function(t,n){if(null==n&&(n=s),mt(xO,t)){var i=e.getItemVisual(n,"style");return i?i[xO[t]]:null}if(mt(_O,t))return e.getItemVisual(n,t)},barLayout:function(t){if("cartesian2d"===o.type){return function(t){var e=[],n=t.axis,i="axis0";if("category"===n.type){for(var r=n.getBandWidth(),o=0;o<t.count;o++)e.push(k({bandWidth:r,axisKey:i,stackId:Mx+o},t));var a=Ax(e),s=[];for(o=0;o<t.count;o++){var l=a.axis0[Mx+o];l.offsetCenter=l.offset+l.width/2,s.push(l)}return s}}(k({axis:o.getBaseAxis()},t))}},currentSeriesIndices:function(){return n.getCurrentSeriesIndices()},font:function(t){return $h(t,n)}},a.api||{}),h={context:{},seriesId:t.id,seriesName:t.name,seriesIndex:t.seriesIndex,coordSys:a.coordSys,dataInsideLength:e.count(),encode:gR(t.getData())},c={},p={},d={},f={},g=0;g<eR.length;g++){var y=eR[g];d[y]=t.getModel(nR[y]),f[y]=t.getModel(iR[y])}function v(t){return t===s?l||(l=e.getItemModel(t)):e.getItemModel(t)}function m(t,n){return e.hasItemOption?t===s?c[n]||(c[n]=v(t).getModel(nR[n])):v(t).getModel(nR[n]):d[n]}function x(t,n){return e.hasItemOption?t===s?p[n]||(p[n]=v(t).getModel(iR[n])):v(t).getModel(iR[n]):f[n]}return function(t,n){return s=t,l=null,c={},p={},r&&r(k({dataIndexInside:t,dataIndex:e.getRawIndex(t),actionType:n?n.type:null},h),u)};function _(t,e){for(var n in e)mt(e,n)&&(t[n]=e[n])}function b(t,e){t&&(t.textFill&&(e.textFill=t.textFill),t.textPosition&&(e.textPosition=t.textPosition))}}function gR(t){var e={};return E(t.dimensions,(function(n){var i=t.getDimensionInfo(n);if(!i.isExtraCoord){var r=i.coordDim;(e[r]=e[r]||[])[i.coordDimIndex]=t.getDimensionIndex(n)}})),e}function yR(t,e,n,i,r,o,a){if(i){var s=vR(t,e,n,i,r,o);return s&&a.setItemGraphicEl(n,s),s&&Rl(s,i.focus,i.blurScope,i.emphasisDisabled),s}o.remove(e)}function vR(t,e,n,i,r,o){var a=-1,s=e;e&&mR(e,i,r)&&(a=P(o.childrenRef(),e),e=null);var l,u,h=!e,c=e;c?c.clearStates():(c=hR(i),s&&(l=s,(u=c).copyTransform(l),lR(u)&&lR(l)&&(u.setStyle(l.style),u.z=l.z,u.z2=l.z2,u.zlevel=l.zlevel,u.invisible=l.invisible,u.ignore=l.ignore,sR(u)&&sR(l)&&u.setShape(l.shape)))),!1===i.morph?c.disableMorphing=!0:c.disableMorphing&&(c.disableMorphing=!1),oR.normal.cfg=oR.normal.conOpt=oR.emphasis.cfg=oR.emphasis.conOpt=oR.blur.cfg=oR.blur.conOpt=oR.select.cfg=oR.select.conOpt=null,oR.isLegacy=!1,function(t,e,n,i,r,o){if(t.isGroup)return;xR(n,null,o),xR(n,$O,o);var a=o.normal.conOpt,s=o.emphasis.conOpt,l=o.blur.conOpt,u=o.select.conOpt;if(null!=a||null!=s||null!=u||null!=l){var h=t.getTextContent();if(!1===a)h&&t.removeTextContent();else{a=o.normal.conOpt=a||{type:"text"},h?h.clearStates():(h=hR(a),t.setTextContent(h)),cR(null,h,e,a,null,i,r);for(var c=a&&a.style,p=0;p<eR.length;p++){var d=eR[p];if(d!==JO){var f=o[d].conOpt;pR(d,h,0,bR(a,f,d),null)}}c?h.dirty():h.markRedraw()}}}(c,n,i,r,h,oR),function(t,e,n,i,r){var o=n.clipPath;if(!1===o)t&&t.getClipPath()&&t.removeClipPath();else if(o){var a=t.getClipPath();a&&mR(a,o,i)&&(a=null),a||(a=hR(o),t.setClipPath(a)),cR(null,a,e,o,null,i,r)}}(c,n,i,r,h),cR(t,c,n,i,oR,r,h),mt(i,"info")&&(bO(c).info=i.info);for(var p=0;p<eR.length;p++){var d=eR[p];if(d!==JO){var f=_R(i,d);pR(d,c,0,bR(i,f,d),oR)}}return function(t,e,n){if(!t.isGroup){var i=t,r=n.currentZ,o=n.currentZLevel;i.z=r,i.zlevel=o;var a=e.z2;null!=a&&(i.z2=a||0);for(var s=0;s<eR.length;s++)dR(i,e,eR[s])}}(c,i,r),"group"===i.type&&function(t,e,n,i,r){var o=i.children,a=o?o.length:0,s=i.$mergeChildren,l="byName"===s||i.diffChildrenByName,u=!1===s;if(!a&&!l&&!u)return;if(l)return h={api:t,oldChildren:e.children()||[],newChildren:o||[],dataIndex:n,seriesModel:r,group:e},void new Im(h.oldChildren,h.newChildren,wR,wR,h).add(SR).update(SR).remove(MR).execute();var h;u&&e.removeAll();for(var c=0;c<a;c++)o[c]&&vR(t,e.childAt(c),n,o[c],r,e);for(var p=e.childCount()-1;p>=c;p--){BO(e.childAt(p),bO(e).option,r)}}(t,c,n,i,r),a>=0?o.replaceAt(c,a):o.add(c),c}function mR(t,e,n){var i,r=bO(t),o=e.type,a=e.shape,s=e.style;return n.isUniversalTransitionEnabled()||null!=o&&o!==r.customGraphicType||"path"===o&&((i=a)&&(mt(i,"pathData")||mt(i,"d")))&&IR(a)!==r.customPathData||"image"===o&&mt(s,"image")&&s.image!==r.customImagePath}function xR(t,e,n){var i=e?_R(t,e):t,r=e?bR(t,i,$O):t.style,o=t.type,a=i?i.textConfig:null,s=t.textContent,l=s?e?_R(s,e):s:null;if(r&&(n.isLegacy||CO(r,o,!!a,!!l))){n.isLegacy=!0;var u=DO(r,o,!e);!a&&u.textConfig&&(a=u.textConfig),!l&&u.textContent&&(l=u.textContent)}if(!e&&l){var h=l;!h.type&&(h.type="text")}var c=e?n[e]:n.normal;c.cfg=a,c.conOpt=l}function _R(t,e){return e?t?t[e]:null:t}function bR(t,e,n){var i=e&&e.style;return null==i&&n===$O&&t&&(i=t.styleEmphasis),i}function wR(t,e){var n=t&&t.name;return null!=n?n:"e\0\0"+e}function SR(t,e){var n=this.context,i=null!=t?n.newChildren[t]:null,r=null!=e?n.oldChildren[e]:null;vR(n.api,r,n.dataIndex,i,n.seriesModel,n.group)}function MR(t){var e=this.context,n=e.oldChildren[t];BO(n,bO(n).option,e.seriesModel)}function IR(t){return t&&(t.pathData||t.d)}var TR=So(),CR=T,DR=W,AR=function(){function t(){this._dragging=!1,this.animationThreshold=15}return t.prototype.render=function(t,e,n,i){var r=e.get("value"),o=e.get("status");if(this._axisModel=t,this._axisPointerModel=e,this._api=n,i||this._lastValue!==r||this._lastStatus!==o){this._lastValue=r,this._lastStatus=o;var a=this._group,s=this._handle;if(!o||"hide"===o)return a&&a.hide(),void(s&&s.hide());a&&a.show(),s&&s.show();var l={};this.makeElOption(l,r,t,e,n);var u=l.graphicKey;u!==this._lastGraphicKey&&this.clear(n),this._lastGraphicKey=u;var h=this._moveAnimation=this.determineAnimation(t,e);if(a){var c=H(kR,e,h);this.updatePointerEl(a,l,c),this.updateLabelEl(a,l,c,e)}else a=this._group=new Cr,this.createPointerEl(a,l,t,e),this.createLabelEl(a,l,t,e),n.getZr().add(a);RR(a,e,!0),this._renderHandle(r)}},t.prototype.remove=function(t){this.clear(t)},t.prototype.dispose=function(t){this.clear(t)},t.prototype.determineAnimation=function(t,e){var n=e.get("animation"),i=t.axis,r="category"===i.type,o=e.get("snap");if(!o&&!r)return!1;if("auto"===n||null==n){var a=this.animationThreshold;if(r&&i.getBandWidth()>a)return!0;if(o){var s=KM(t).seriesDataCount,l=i.getExtent();return Math.abs(l[0]-l[1])/s>a}return!1}return!0===n},t.prototype.makeElOption=function(t,e,n,i,r){},t.prototype.createPointerEl=function(t,e,n,i){var r=e.pointer;if(r){var o=TR(t).pointerEl=new Bh[r.type](CR(e.pointer));t.add(o)}},t.prototype.createLabelEl=function(t,e,n,i){if(e.label){var r=TR(t).labelEl=new ks(CR(e.label));t.add(r),PR(r,i)}},t.prototype.updatePointerEl=function(t,e,n){var i=TR(t).pointerEl;i&&e.pointer&&(i.setStyle(e.pointer.style),n(i,{shape:e.pointer.shape}))},t.prototype.updateLabelEl=function(t,e,n,i){var r=TR(t).labelEl;r&&(r.setStyle(e.label.style),n(r,{x:e.label.x,y:e.label.y}),PR(r,i))},t.prototype._renderHandle=function(t){if(!this._dragging&&this.updateHandleTransform){var e,n=this._axisPointerModel,i=this._api.getZr(),r=this._handle,o=n.getModel("handle"),a=n.get("status");if(!o.get("show")||!a||"hide"===a)return r&&i.remove(r),void(this._handle=null);this._handle||(e=!0,r=this._handle=Ph(o.get("icon"),{cursor:"move",draggable:!0,onmousemove:function(t){se(t.event)},onmousedown:DR(this._onHandleDragMove,this,0,0),drift:DR(this._onHandleDragMove,this),ondragend:DR(this._onHandleDragEnd,this)}),i.add(r)),RR(r,n,!1),r.setStyle(o.getItemStyle(null,["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"]));var s=o.get("size");Y(s)||(s=[s,s]),r.scaleX=s[0]/2,r.scaleY=s[1]/2,Ag(this,"_doDispatchAxisPointer",o.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,e)}},t.prototype._moveHandleToValue=function(t,e){kR(this._axisPointerModel,!e&&this._moveAnimation,this._handle,OR(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},t.prototype._onHandleDragMove=function(t,e){var n=this._handle;if(n){this._dragging=!0;var i=this.updateHandleTransform(OR(n),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=i,n.stopAnimation(),n.attr(OR(i)),TR(n).lastProp=null,this._doDispatchAxisPointer()}},t.prototype._doDispatchAxisPointer=function(){if(this._handle){var t=this._payloadInfo,e=this._axisModel;this._api.dispatchAction({type:"updateAxisPointer",x:t.cursorPoint[0],y:t.cursorPoint[1],tooltipOption:t.tooltipOption,axesInfo:[{axisDim:e.axis.dim,axisIndex:e.componentIndex}]})}},t.prototype._onHandleDragEnd=function(){if(this._dragging=!1,this._handle){var t=this._axisPointerModel.get("value");this._moveHandleToValue(t),this._api.dispatchAction({type:"hideTip"})}},t.prototype.clear=function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),n=this._group,i=this._handle;e&&n&&(this._lastGraphicKey=null,n&&e.remove(n),i&&e.remove(i),this._group=null,this._handle=null,this._payloadInfo=null),kg(this,"_doDispatchAxisPointer")},t.prototype.doClear=function(){},t.prototype.buildLabel=function(t,e,n){return{x:t[n=n||0],y:t[1-n],width:e[n],height:e[1-n]}},t}();function kR(t,e,n,i){LR(TR(n).lastProp,i)||(TR(n).lastProp=i,e?rh(n,i,t):(n.stopAnimation(),n.attr(i)))}function LR(t,e){if(q(t)&&q(e)){var n=!0;return E(e,(function(e,i){n=n&&LR(t[i],e)})),!!n}return t===e}function PR(t,e){t[e.get(["label","show"])?"show":"hide"]()}function OR(t){return{x:t.x||0,y:t.y||0,rotation:t.rotation||0}}function RR(t,e,n){var i=e.get("z"),r=e.get("zlevel");t&&t.traverse((function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=r&&(t.zlevel=r),t.silent=n)}))}function NR(t){var e,n=t.get("type"),i=t.getModel(n+"Style");return"line"===n?(e=i.getLineStyle()).fill=null:"shadow"===n&&((e=i.getAreaStyle()).stroke=null),e}function ER(t,e,n,i,r){var o=zR(n.get("value"),e.axis,e.ecModel,n.get("seriesDataIndices"),{precision:n.get(["label","precision"]),formatter:n.get(["label","formatter"])}),a=n.getModel("label"),s=ip(a.get("padding")||0),l=a.getFont(),u=cr(o,l),h=r.position,c=u.width+s[1]+s[3],p=u.height+s[0]+s[2],d=r.align;"right"===d&&(h[0]-=c),"center"===d&&(h[0]-=c/2);var f=r.verticalAlign;"bottom"===f&&(h[1]-=p),"middle"===f&&(h[1]-=p/2),function(t,e,n,i){var r=i.getWidth(),o=i.getHeight();t[0]=Math.min(t[0]+e,r)-e,t[1]=Math.min(t[1]+n,o)-n,t[0]=Math.max(t[0],0),t[1]=Math.max(t[1],0)}(h,c,p,i);var g=a.get("backgroundColor");g&&"auto"!==g||(g=e.get(["axisLine","lineStyle","color"])),t.label={x:h[0],y:h[1],style:Uh(a,{text:o,font:l,fill:a.getTextColor(),padding:s,backgroundColor:g}),z2:10}}function zR(t,e,n,i,r){t=e.scale.parse(t);var o=e.scale.getLabel({value:t},{precision:r.precision}),a=r.formatter;if(a){var s={value:s_(e,{value:t}),axisDimension:e.dim,axisIndex:e.index,seriesData:[]};E(i,(function(t){var e=n.getSeriesByIndex(t.seriesIndex),i=t.dataIndexInside,r=e&&e.getDataParams(i);r&&s.seriesData.push(r)})),X(a)?o=a.replace("{value}",o):U(a)&&(o=a(s))}return o}function VR(t,e,n){var i=[1,0,0,1,0,0];return zi(i,i,n.rotation),Ei(i,i,n.position),Th([t.dataToCoord(e),(n.labelOffset||0)+(n.labelDirection||1)*(n.labelMargin||0)],i)}function BR(t,e,n,i,r,o){var a=GM.innerTextLayout(n.rotation,0,n.labelDirection);n.labelMargin=r.get(["label","margin"]),ER(e,i,r,o,{position:VR(i.axis,t,n),align:a.textAlign,verticalAlign:a.textVerticalAlign})}function FR(t,e,n){return{x1:t[n=n||0],y1:t[1-n],x2:e[n],y2:e[1-n]}}function GR(t,e,n){return{x:t[n=n||0],y:t[1-n],width:e[n],height:e[1-n]}}function WR(t,e,n,i,r,o){return{cx:t,cy:e,r0:n,r:i,startAngle:r,endAngle:o,clockwise:!0}}var HR=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis,a=o.grid,s=i.get("type"),l=YR(a,o).getOtherAxis(o).getGlobalExtent(),u=o.toGlobalCoord(o.dataToCoord(e,!0));if(s&&"none"!==s){var h=NR(i),c=UR[s](o,u,l);c.style=h,t.graphicKey=c.type,t.pointer=c}BR(e,t,LM(a.model,n),n,i,r)},e.prototype.getHandleTransform=function(t,e,n){var i=LM(e.axis.grid.model,e,{labelInside:!1});i.labelMargin=n.get(["handle","margin"]);var r=VR(e.axis,t,i);return{x:r[0],y:r[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},e.prototype.updateHandleTransform=function(t,e,n,i){var r=n.axis,o=r.grid,a=r.getGlobalExtent(!0),s=YR(o,r).getOtherAxis(r).getGlobalExtent(),l="x"===r.dim?0:1,u=[t.x,t.y];u[l]+=e[l],u[l]=Math.min(a[1],u[l]),u[l]=Math.max(a[0],u[l]);var h=(s[1]+s[0])/2,c=[h,h];c[l]=u[l];return{x:u[0],y:u[1],rotation:t.rotation,cursorPoint:c,tooltipOption:[{verticalAlign:"middle"},{align:"center"}][l]}},e}(AR);function YR(t,e){var n={};return n[e.dim+"AxisIndex"]=e.index,t.getCartesian(n)}var UR={line:function(t,e,n){return{type:"Line",subPixelOptimize:!0,shape:FR([e,n[0]],[e,n[1]],XR(t))}},shadow:function(t,e,n){var i=Math.max(1,t.getBandWidth()),r=n[1]-n[0];return{type:"Rect",shape:GR([e-i/2,n[0]],[i,r],XR(t))}}};function XR(t){return"x"===t.dim?0:1}var ZR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="axisPointer",e.defaultOption={show:"auto",z:50,type:"line",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#B9BEC9",width:1,type:"dashed"},shadowStyle:{color:"rgba(210,219,238,0.2)"},label:{show:!0,formatter:null,precision:"auto",margin:3,color:"#fff",padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,borderRadius:3},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}},e}(Tp),jR=So(),qR=E;function KR(t,e,n){if(!r.node){var i=e.getZr();jR(i).records||(jR(i).records={}),function(t,e){if(jR(t).initialized)return;function n(n,i){t.on(n,(function(n){var r=function(t){var e={showTip:[],hideTip:[]},n=function(i){var r=e[i.type];r?r.push(i):(i.dispatchAction=n,t.dispatchAction(i))};return{dispatchAction:n,pendings:e}}(e);qR(jR(t).records,(function(t){t&&i(t,n,r.dispatchAction)})),function(t,e){var n,i=t.showTip.length,r=t.hideTip.length;i?n=t.showTip[i-1]:r&&(n=t.hideTip[r-1]);n&&(n.dispatchAction=null,e.dispatchAction(n))}(r.pendings,e)}))}jR(t).initialized=!0,n("click",H(JR,"click")),n("mousemove",H(JR,"mousemove")),n("globalout",$R)}(i,e),(jR(i).records[t]||(jR(i).records[t]={})).handler=n}}function $R(t,e,n){t.handler("leave",null,n)}function JR(t,e,n,i){e.handler(t,n,i)}function QR(t,e){if(!r.node){var n=e.getZr();(jR(n).records||{})[t]&&(jR(n).records[t]=null)}}var tN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=e.getComponent("tooltip"),r=t.get("triggerOn")||i&&i.get("triggerOn")||"mousemove|click";KR("axisPointer",n,(function(t,e,n){"none"!==r&&("leave"===t||r.indexOf(t)>=0)&&n({type:"updateAxisPointer",currTrigger:t,x:e&&e.offsetX,y:e&&e.offsetY})}))},e.prototype.remove=function(t,e){QR("axisPointer",e)},e.prototype.dispose=function(t,e){QR("axisPointer",e)},e.type="axisPointer",e}(gg);function eN(t,e){var n,i=[],r=t.seriesIndex;if(null==r||!(n=e.getSeriesByIndex(r)))return{point:[]};var o=n.getData(),a=wo(o,t);if(null==a||a<0||Y(a))return{point:[]};var s=o.getItemGraphicEl(a),l=n.coordinateSystem;if(n.getTooltipPosition)i=n.getTooltipPosition(a)||[];else if(l&&l.dataToPoint)if(t.isStacked){var u=l.getBaseAxis(),h=l.getOtherAxis(u).dim,c=u.dim,p="x"===h||"radius"===h?1:0,d=o.mapDimension(c),f=[];f[p]=o.get(d,a),f[1-p]=o.get(o.getCalculationInfo("stackResultDimension"),a),i=l.dataToPoint(f)||[]}else i=l.dataToPoint(o.getValues(z(l.dimensions,(function(t){return o.mapDimension(t)})),a))||[];else if(s){var g=s.getBoundingRect().clone();g.applyTransform(s.transform),i=[g.x+g.width/2,g.y+g.height/2]}return{point:i,el:s}}var nN=So();function iN(t,e,n){var i=t.currTrigger,r=[t.x,t.y],o=t,a=t.dispatchAction||W(n.dispatchAction,n),s=e.getComponent("axisPointer").coordSysAxesInfo;if(s){lN(r)&&(r=eN({seriesIndex:o.seriesIndex,dataIndex:o.dataIndex},e).point);var l=lN(r),u=o.axesInfo,h=s.axesInfo,c="leave"===i||lN(r),p={},d={},f={list:[],map:{}},g={showPointer:H(oN,d),showTooltip:H(aN,f)};E(s.coordSysMap,(function(t,e){var n=l||t.containPoint(r);E(s.coordSysAxesInfo[e],(function(t,e){var i=t.axis,o=function(t,e){for(var n=0;n<(t||[]).length;n++){var i=t[n];if(e.axis.dim===i.axisDim&&e.axis.model.componentIndex===i.axisIndex)return i}}(u,t);if(!c&&n&&(!u||o)){var a=o&&o.value;null!=a||l||(a=i.pointToData(r)),null!=a&&rN(t,a,g,!1,p)}}))}));var y={};return E(h,(function(t,e){var n=t.linkGroup;n&&!d[e]&&E(n.axesInfo,(function(e,i){var r=d[i];if(e!==t&&r){var o=r.value;n.mapper&&(o=t.axis.scale.parse(n.mapper(o,sN(e),sN(t)))),y[t.key]=o}}))})),E(y,(function(t,e){rN(h[e],t,g,!0,p)})),function(t,e,n){var i=n.axesInfo=[];E(e,(function(e,n){var r=e.axisPointerModel.option,o=t[n];o?(!e.useHandle&&(r.status="show"),r.value=o.value,r.seriesDataIndices=(o.payloadBatch||[]).slice()):!e.useHandle&&(r.status="hide"),"show"===r.status&&i.push({axisDim:e.axis.dim,axisIndex:e.axis.model.componentIndex,value:r.value})}))}(d,h,p),function(t,e,n,i){if(lN(e)||!t.list.length)return void i({type:"hideTip"});var r=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};i({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:n.tooltipOption,position:n.position,dataIndexInside:r.dataIndexInside,dataIndex:r.dataIndex,seriesIndex:r.seriesIndex,dataByCoordSys:t.list})}(f,r,t,a),function(t,e,n){var i=n.getZr(),r="axisPointerLastHighlights",o=nN(i)[r]||{},a=nN(i)[r]={};E(t,(function(t,e){var n=t.axisPointerModel.option;"show"===n.status&&E(n.seriesDataIndices,(function(t){var e=t.seriesIndex+" | "+t.dataIndex;a[e]=t}))}));var s=[],l=[];E(o,(function(t,e){!a[e]&&l.push(t)})),E(a,(function(t,e){!o[e]&&s.push(t)})),l.length&&n.dispatchAction({type:"downplay",escapeConnect:!0,notBlur:!0,batch:l}),s.length&&n.dispatchAction({type:"highlight",escapeConnect:!0,notBlur:!0,batch:s})}(h,0,n),p}}function rN(t,e,n,i,r){var o=t.axis;if(!o.scale.isBlank()&&o.containData(e))if(t.involveSeries){var a=function(t,e){var n=e.axis,i=n.dim,r=t,o=[],a=Number.MAX_VALUE,s=-1;return E(e.seriesModels,(function(e,l){var u,h,c=e.getData().mapDimensionsAll(i);if(e.getAxisTooltipData){var p=e.getAxisTooltipData(c,t,n);h=p.dataIndices,u=p.nestestValue}else{if(!(h=e.getData().indicesOfNearest(c[0],t,"category"===n.type?.5:null)).length)return;u=e.getData().get(c[0],h[0])}if(null!=u&&isFinite(u)){var d=t-u,f=Math.abs(d);f<=a&&((f<a||d>=0&&s<0)&&(a=f,s=d,r=u,o.length=0),E(h,(function(t){o.push({seriesIndex:e.seriesIndex,dataIndexInside:t,dataIndex:e.getData().getRawIndex(t)})})))}})),{payloadBatch:o,snapToValue:r}}(e,t),s=a.payloadBatch,l=a.snapToValue;s[0]&&null==r.seriesIndex&&A(r,s[0]),!i&&t.snap&&o.containData(l)&&null!=l&&(e=l),n.showPointer(t,e,s),n.showTooltip(t,a,l)}else n.showPointer(t,e)}function oN(t,e,n,i){t[e.key]={value:n,payloadBatch:i}}function aN(t,e,n,i){var r=n.payloadBatch,o=e.axis,a=o.model,s=e.axisPointerModel;if(e.triggerTooltip&&r.length){var l=e.coordSys.model,u=JM(l),h=t.map[u];h||(h=t.map[u]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},t.list.push(h)),h.dataByAxis.push({axisDim:o.dim,axisIndex:a.componentIndex,axisType:a.type,axisId:a.id,value:i,valueLabelOpt:{precision:s.get(["label","precision"]),formatter:s.get(["label","formatter"])},seriesDataIndices:r.slice()})}}function sN(t){var e=t.axis.model,n={},i=n.axisDim=t.axis.dim;return n.axisIndex=n[i+"AxisIndex"]=e.componentIndex,n.axisName=n[i+"AxisName"]=e.name,n.axisId=n[i+"AxisId"]=e.id,n}function lN(t){return!t||null==t[0]||isNaN(t[0])||null==t[1]||isNaN(t[1])}function uN(t){tI.registerAxisPointerClass("CartesianAxisPointer",HR),t.registerComponentModel(ZR),t.registerComponentView(tN),t.registerPreprocessor((function(t){if(t){(!t.axisPointer||0===t.axisPointer.length)&&(t.axisPointer={});var e=t.axisPointer.link;e&&!Y(e)&&(t.axisPointer.link=[e])}})),t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC,(function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=ZM(t,e)})),t.registerAction({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},iN)}var hN=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis;"angle"===o.dim&&(this.animationThreshold=Math.PI/18);var a=o.polar,s=a.getOtherAxis(o).getExtent(),l=o.dataToCoord(e),u=i.get("type");if(u&&"none"!==u){var h=NR(i),c=cN[u](o,a,l,s);c.style=h,t.graphicKey=c.type,t.pointer=c}var p=function(t,e,n,i,r){var o=e.axis,a=o.dataToCoord(t),s=i.getAngleAxis().getExtent()[0];s=s/180*Math.PI;var l,u,h,c=i.getRadiusAxis().getExtent();if("radius"===o.dim){var p=[1,0,0,1,0,0];zi(p,p,s),Ei(p,p,[i.cx,i.cy]),l=Th([a,-r],p);var d=e.getModel("axisLabel").get("rotate")||0,f=GM.innerTextLayout(s,d*Math.PI/180,-1);u=f.textAlign,h=f.textVerticalAlign}else{var g=c[1];l=i.coordToPoint([g+r,a]);var y=i.cx,v=i.cy;u=Math.abs(l[0]-y)/g<.3?"center":l[0]>y?"left":"right",h=Math.abs(l[1]-v)/g<.3?"middle":l[1]>v?"top":"bottom"}return{position:l,align:u,verticalAlign:h}}(e,n,0,a,i.get(["label","margin"]));ER(t,n,i,r,p)},e}(AR);var cN={line:function(t,e,n,i){return"angle"===t.dim?{type:"Line",shape:FR(e.coordToPoint([i[0],n]),e.coordToPoint([i[1],n]))}:{type:"Circle",shape:{cx:e.cx,cy:e.cy,r:n}}},shadow:function(t,e,n,i){var r=Math.max(1,t.getBandWidth()),o=Math.PI/180;return"angle"===t.dim?{type:"Sector",shape:WR(e.cx,e.cy,i[0],i[1],(-n-r/2)*o,(r/2-n)*o)}:{type:"Sector",shape:WR(e.cx,e.cy,n-r/2,n+r/2,0,2*Math.PI)}}},pN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.findAxisModel=function(t){var e;return this.ecModel.eachComponent(t,(function(t){t.getCoordSysModel()===this&&(e=t)}),this),e},e.type="polar",e.dependencies=["radiusAxis","angleAxis"],e.defaultOption={z:0,center:["50%","50%"],radius:"80%"},e}(Tp),dN=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getCoordSysModel=function(){return this.getReferringComponents("polar",Co).models[0]},e.type="polarAxis",e}(Tp);R(dN,p_);var fN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="angleAxis",e}(dN),gN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="radiusAxis",e}(dN),yN=function(t){function e(e,n){return t.call(this,"radius",e,n)||this}return n(e,t),e.prototype.pointToData=function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},e}(H_);yN.prototype.dataToRadius=H_.prototype.dataToCoord,yN.prototype.radiusToData=H_.prototype.coordToData;var vN=So(),mN=function(t){function e(e,n){return t.call(this,"angle",e,n||[0,360])||this}return n(e,t),e.prototype.pointToData=function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},e.prototype.calculateCategoryInterval=function(){var t=this,e=t.getLabelModel(),n=t.scale,i=n.getExtent(),r=n.count();if(i[1]-i[0]<1)return 0;var o=i[0],a=t.dataToCoord(o+1)-t.dataToCoord(o),s=Math.abs(a),l=cr(null==o?"":o+"",e.getFont(),"center","top"),u=Math.max(l.height,7)/s;isNaN(u)&&(u=1/0);var h=Math.max(0,Math.floor(u)),c=vN(t.model),p=c.lastAutoInterval,d=c.lastTickCount;return null!=p&&null!=d&&Math.abs(p-h)<=1&&Math.abs(d-r)<=1&&p>h?h=p:(c.lastTickCount=r,c.lastAutoInterval=h),h},e}(H_);mN.prototype.dataToAngle=H_.prototype.dataToCoord,mN.prototype.angleToData=H_.prototype.coordToData;var xN=["radius","angle"],_N=function(){function t(t){this.dimensions=xN,this.type="polar",this.cx=0,this.cy=0,this._radiusAxis=new yN,this._angleAxis=new mN,this.axisPointerEnabled=!0,this.name=t||"",this._radiusAxis.polar=this._angleAxis.polar=this}return t.prototype.containPoint=function(t){var e=this.pointToCoord(t);return this._radiusAxis.contain(e[0])&&this._angleAxis.contain(e[1])},t.prototype.containData=function(t){return this._radiusAxis.containData(t[0])&&this._angleAxis.containData(t[1])},t.prototype.getAxis=function(t){return this["_"+t+"Axis"]},t.prototype.getAxes=function(){return[this._radiusAxis,this._angleAxis]},t.prototype.getAxesByScale=function(t){var e=[],n=this._angleAxis,i=this._radiusAxis;return n.scale.type===t&&e.push(n),i.scale.type===t&&e.push(i),e},t.prototype.getAngleAxis=function(){return this._angleAxis},t.prototype.getRadiusAxis=function(){return this._radiusAxis},t.prototype.getOtherAxis=function(t){var e=this._angleAxis;return t===e?this._radiusAxis:e},t.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAngleAxis()},t.prototype.getTooltipAxes=function(t){var e=null!=t&&"auto"!==t?this.getAxis(t):this.getBaseAxis();return{baseAxes:[e],otherAxes:[this.getOtherAxis(e)]}},t.prototype.dataToPoint=function(t,e){return this.coordToPoint([this._radiusAxis.dataToRadius(t[0],e),this._angleAxis.dataToAngle(t[1],e)])},t.prototype.pointToData=function(t,e){var n=this.pointToCoord(t);return[this._radiusAxis.radiusToData(n[0],e),this._angleAxis.angleToData(n[1],e)]},t.prototype.pointToCoord=function(t){var e=t[0]-this.cx,n=t[1]-this.cy,i=this.getAngleAxis(),r=i.getExtent(),o=Math.min(r[0],r[1]),a=Math.max(r[0],r[1]);i.inverse?o=a-360:a=o+360;var s=Math.sqrt(e*e+n*n);e/=s,n/=s;for(var l=Math.atan2(-n,e)/Math.PI*180,u=l<o?1:-1;l<o||l>a;)l+=360*u;return[s,l]},t.prototype.coordToPoint=function(t){var e=t[0],n=t[1]/180*Math.PI;return[Math.cos(n)*e+this.cx,-Math.sin(n)*e+this.cy]},t.prototype.getArea=function(){var t=this.getAngleAxis(),e=this.getRadiusAxis().getExtent().slice();e[0]>e[1]&&e.reverse();var n=t.getExtent(),i=Math.PI/180;return{cx:this.cx,cy:this.cy,r0:e[0],r:e[1],startAngle:-n[0]*i,endAngle:-n[1]*i,clockwise:t.inverse,contain:function(t,e){var n=t-this.cx,i=e-this.cy,r=n*n+i*i-1e-4,o=this.r,a=this.r0;return r<=o*o&&r>=a*a}}},t.prototype.convertToPixel=function(t,e,n){return bN(e)===this?this.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){return bN(e)===this?this.pointToData(n):null},t}();function bN(t){var e=t.seriesModel,n=t.polarModel;return n&&n.coordinateSystem||e&&e.coordinateSystem}function wN(t,e){var n=this,i=n.getAngleAxis(),r=n.getRadiusAxis();if(i.scale.setExtent(1/0,-1/0),r.scale.setExtent(1/0,-1/0),t.eachSeries((function(t){if(t.coordinateSystem===n){var e=t.getData();E(c_(e,"radius"),(function(t){r.scale.unionExtentFromData(e,t)})),E(c_(e,"angle"),(function(t){i.scale.unionExtentFromData(e,t)}))}})),r_(i.scale,i.model),r_(r.scale,r.model),"category"===i.type&&!i.onBand){var o=i.getExtent(),a=360/i.scale.count();i.inverse?o[1]+=a:o[1]-=a,i.setExtent(o[0],o[1])}}function SN(t,e){if(t.type=e.get("type"),t.scale=o_(e),t.onBand=e.get("boundaryGap")&&"category"===t.type,t.inverse=e.get("inverse"),function(t){return"angleAxis"===t.mainType}(e)){t.inverse=t.inverse!==e.get("clockwise");var n=e.get("startAngle");t.setExtent(n,n+(t.inverse?-360:360))}e.axis=t,t.model=e}var MN={dimensions:xN,create:function(t,e){var n=[];return t.eachComponent("polar",(function(t,i){var r=new _N(i+"");r.update=wN;var o=r.getRadiusAxis(),a=r.getAngleAxis(),s=t.findAxisModel("radiusAxis"),l=t.findAxisModel("angleAxis");SN(o,s),SN(a,l),function(t,e,n){var i=e.get("center"),r=n.getWidth(),o=n.getHeight();t.cx=Er(i[0],r),t.cy=Er(i[1],o);var a=t.getRadiusAxis(),s=Math.min(r,o)/2,l=e.get("radius");null==l?l=[0,"100%"]:Y(l)||(l=[0,l]);var u=[Er(l[0],s),Er(l[1],s)];a.inverse?a.setExtent(u[1],u[0]):a.setExtent(u[0],u[1])}(r,t,e),n.push(r),t.coordinateSystem=r,r.model=t})),t.eachSeries((function(t){if("polar"===t.get("coordinateSystem")){var e=t.getReferringComponents("polar",Co).models[0];0,t.coordinateSystem=e.coordinateSystem}})),n}},IN=["axisLine","axisLabel","axisTick","minorTick","splitLine","minorSplitLine","splitArea"];function TN(t,e,n){e[1]>e[0]&&(e=e.slice().reverse());var i=t.coordToPoint([e[0],n]),r=t.coordToPoint([e[1],n]);return{x1:i[0],y1:i[1],x2:r[0],y2:r[1]}}function CN(t){return t.getRadiusAxis().inverse?0:1}function DN(t){var e=t[0],n=t[t.length-1];e&&n&&Math.abs(Math.abs(e.coord-n.coord)-360)<1e-4&&t.pop()}var AN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="PolarAxisPointer",n}return n(e,t),e.prototype.render=function(t,e){if(this.group.removeAll(),t.get("show")){var n=t.axis,i=n.polar,r=i.getRadiusAxis().getExtent(),o=n.getTicksCoords(),a=n.getMinorTicksCoords(),s=z(n.getViewLabels(),(function(t){t=T(t);var e=n.scale,i="ordinal"===e.type?e.getRawOrdinalNumber(t.tickValue):t.tickValue;return t.coord=n.dataToCoord(i),t}));DN(s),DN(o),E(IN,(function(e){!t.get([e,"show"])||n.scale.isBlank()&&"axisLine"!==e||kN[e](this.group,t,i,o,a,r,s)}),this)}},e.type="angleAxis",e}(tI),kN={axisLine:function(t,e,n,i,r,o){var a,s=e.getModel(["axisLine","lineStyle"]),l=CN(n),u=l?0:1;(a=0===o[u]?new hu({shape:{cx:n.cx,cy:n.cy,r:o[l]},style:s.getLineStyle(),z2:1,silent:!0}):new Au({shape:{cx:n.cx,cy:n.cy,r:o[l],r0:o[u]},style:s.getLineStyle(),z2:1,silent:!0})).style.fill=null,t.add(a)},axisTick:function(t,e,n,i,r,o){var a=e.getModel("axisTick"),s=(a.get("inside")?-1:1)*a.get("length"),l=o[CN(n)],u=z(i,(function(t){return new zu({shape:TN(n,[l,l+s],t.coord)})}));t.add(wh(u,{style:k(a.getModel("lineStyle").getLineStyle(),{stroke:e.get(["axisLine","lineStyle","color"])})}))},minorTick:function(t,e,n,i,r,o){if(r.length){for(var a=e.getModel("axisTick"),s=e.getModel("minorTick"),l=(a.get("inside")?-1:1)*s.get("length"),u=o[CN(n)],h=[],c=0;c<r.length;c++)for(var p=0;p<r[c].length;p++)h.push(new zu({shape:TN(n,[u,u+l],r[c][p].coord)}));t.add(wh(h,{style:k(s.getModel("lineStyle").getLineStyle(),k(a.getLineStyle(),{stroke:e.get(["axisLine","lineStyle","color"])}))}))}},axisLabel:function(t,e,n,i,r,o,a){var s=e.getCategories(!0),l=e.getModel("axisLabel"),u=l.get("margin"),h=e.get("triggerEvent");E(a,(function(i,r){var a=l,c=i.tickValue,p=o[CN(n)],d=n.coordToPoint([p+u,i.coord]),f=n.cx,g=n.cy,y=Math.abs(d[0]-f)/p<.3?"center":d[0]>f?"left":"right",v=Math.abs(d[1]-g)/p<.3?"middle":d[1]>g?"top":"bottom";if(s&&s[c]){var m=s[c];q(m)&&m.textStyle&&(a=new dc(m.textStyle,l,l.ecModel))}var x=new ks({silent:GM.isLabelSilent(e),style:Uh(a,{x:d[0],y:d[1],fill:a.getTextColor()||e.get(["axisLine","lineStyle","color"]),text:i.formattedLabel,align:y,verticalAlign:v})});if(t.add(x),h){var _=GM.makeAxisEventDataBase(e);_.targetType="axisLabel",_.value=i.rawLabel,Hs(x).eventData=_}}),this)},splitLine:function(t,e,n,i,r,o){var a=e.getModel("splitLine").getModel("lineStyle"),s=a.get("color"),l=0;s=s instanceof Array?s:[s];for(var u=[],h=0;h<i.length;h++){var c=l++%s.length;u[c]=u[c]||[],u[c].push(new zu({shape:TN(n,o,i[h].coord)}))}for(h=0;h<u.length;h++)t.add(wh(u[h],{style:k({stroke:s[h%s.length]},a.getLineStyle()),silent:!0,z:e.get("z")}))},minorSplitLine:function(t,e,n,i,r,o){if(r.length){for(var a=e.getModel("minorSplitLine").getModel("lineStyle"),s=[],l=0;l<r.length;l++)for(var u=0;u<r[l].length;u++)s.push(new zu({shape:TN(n,o,r[l][u].coord)}));t.add(wh(s,{style:a.getLineStyle(),silent:!0,z:e.get("z")}))}},splitArea:function(t,e,n,i,r,o){if(i.length){var a=e.getModel("splitArea").getModel("areaStyle"),s=a.get("color"),l=0;s=s instanceof Array?s:[s];for(var u=[],h=Math.PI/180,c=-i[0].coord*h,p=Math.min(o[0],o[1]),d=Math.max(o[0],o[1]),f=e.get("clockwise"),g=1,y=i.length;g<=y;g++){var v=g===y?i[0].coord:i[g].coord,m=l++%s.length;u[m]=u[m]||[],u[m].push(new Cu({shape:{cx:n.cx,cy:n.cy,r0:p,r:d,startAngle:c,endAngle:-v*h,clockwise:f},silent:!0})),c=-v*h}for(g=0;g<u.length;g++)t.add(wh(u[g],{style:k({fill:s[g%s.length]},a.getAreaStyle()),silent:!0}))}}},LN=["axisLine","axisTickLabel","axisName"],PN=["splitLine","splitArea","minorSplitLine"],ON=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="PolarAxisPointer",n}return n(e,t),e.prototype.render=function(t,e){if(this.group.removeAll(),t.get("show")){var n=this._axisGroup,i=this._axisGroup=new Cr;this.group.add(i);var r=t.axis,o=r.polar,a=o.getAngleAxis(),s=r.getTicksCoords(),l=r.getMinorTicksCoords(),u=a.getExtent()[0],h=r.getExtent(),c=function(t,e,n){return{position:[t.cx,t.cy],rotation:n/180*Math.PI,labelDirection:-1,tickDirection:-1,nameDirection:1,labelRotate:e.getModel("axisLabel").get("rotate"),z2:1}}(o,t,u),p=new GM(t,c);E(LN,p.add,p),i.add(p.getGroup()),Ah(n,i,t),E(PN,(function(e){t.get([e,"show"])&&!r.scale.isBlank()&&RN[e](this.group,t,o,u,h,s,l)}),this)}},e.type="radiusAxis",e}(tI),RN={splitLine:function(t,e,n,i,r,o){var a=e.getModel("splitLine").getModel("lineStyle"),s=a.get("color"),l=0;s=s instanceof Array?s:[s];for(var u=[],h=0;h<o.length;h++){var c=l++%s.length;u[c]=u[c]||[],u[c].push(new hu({shape:{cx:n.cx,cy:n.cy,r:Math.max(o[h].coord,0)}}))}for(h=0;h<u.length;h++)t.add(wh(u[h],{style:k({stroke:s[h%s.length],fill:null},a.getLineStyle()),silent:!0}))},minorSplitLine:function(t,e,n,i,r,o,a){if(a.length){for(var s=e.getModel("minorSplitLine").getModel("lineStyle"),l=[],u=0;u<a.length;u++)for(var h=0;h<a[u].length;h++)l.push(new hu({shape:{cx:n.cx,cy:n.cy,r:a[u][h].coord}}));t.add(wh(l,{style:k({fill:null},s.getLineStyle()),silent:!0}))}},splitArea:function(t,e,n,i,r,o){if(o.length){var a=e.getModel("splitArea").getModel("areaStyle"),s=a.get("color"),l=0;s=s instanceof Array?s:[s];for(var u=[],h=o[0].coord,c=1;c<o.length;c++){var p=l++%s.length;u[p]=u[p]||[],u[p].push(new Cu({shape:{cx:n.cx,cy:n.cy,r0:h,r:o[c].coord,startAngle:0,endAngle:2*Math.PI},silent:!0})),h=o[c].coord}for(c=0;c<u.length;c++)t.add(wh(u[c],{style:k({fill:s[c%s.length]},a.getAreaStyle()),silent:!0}))}}};function NN(t){return t.get("stack")||"__ec_stack_"+t.seriesIndex}function EN(t,e){return e.dim+t.model.componentIndex}function zN(t,e,n){var i={},r=function(t){var e={};E(t,(function(t,n){var i=t.getData(),r=t.coordinateSystem,o=r.getBaseAxis(),a=EN(r,o),s=o.getExtent(),l="category"===o.type?o.getBandWidth():Math.abs(s[1]-s[0])/i.count(),u=e[a]||{bandWidth:l,remainedWidth:l,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},h=u.stacks;e[a]=u;var c=NN(t);h[c]||u.autoWidthCount++,h[c]=h[c]||{width:0,maxWidth:0};var p=Er(t.get("barWidth"),l),d=Er(t.get("barMaxWidth"),l),f=t.get("barGap"),g=t.get("barCategoryGap");p&&!h[c].width&&(p=Math.min(u.remainedWidth,p),h[c].width=p,u.remainedWidth-=p),d&&(h[c].maxWidth=d),null!=f&&(u.gap=f),null!=g&&(u.categoryGap=g)}));var n={};return E(e,(function(t,e){n[e]={};var i=t.stacks,r=t.bandWidth,o=Er(t.categoryGap,r),a=Er(t.gap,1),s=t.remainedWidth,l=t.autoWidthCount,u=(s-o)/(l+(l-1)*a);u=Math.max(u,0),E(i,(function(t,e){var n=t.maxWidth;n&&n<u&&(n=Math.min(n,s),t.width&&(n=Math.min(n,t.width)),s-=n,t.width=n,l--)})),u=(s-o)/(l+(l-1)*a),u=Math.max(u,0);var h,c=0;E(i,(function(t,e){t.width||(t.width=u),h=t,c+=t.width*(1+a)})),h&&(c-=h.width*a);var p=-c/2;E(i,(function(t,i){n[e][i]=n[e][i]||{offset:p,width:t.width},p+=t.width*(1+a)}))})),n}(B(e.getSeriesByType(t),(function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&"polar"===t.coordinateSystem.type})));e.eachSeriesByType(t,(function(t){if("polar"===t.coordinateSystem.type){var e=t.getData(),n=t.coordinateSystem,o=n.getBaseAxis(),a=EN(n,o),s=NN(t),l=r[a][s],u=l.offset,h=l.width,c=n.getOtherAxis(o),p=t.coordinateSystem.cx,d=t.coordinateSystem.cy,f=t.get("barMinHeight")||0,g=t.get("barMinAngle")||0;i[s]=i[s]||[];for(var y=e.mapDimension(c.dim),v=e.mapDimension(o.dim),m=nx(e,y),x="radius"!==o.dim||!t.get("roundCap",!0),_=c.dataToCoord(0),b=0,w=e.count();b<w;b++){var S=e.get(y,b),M=e.get(v,b),I=S>=0?"p":"n",T=_;m&&(i[s][M]||(i[s][M]={p:_,n:_}),T=i[s][M][I]);var C=void 0,D=void 0,A=void 0,k=void 0;if("radius"===c.dim){var L=c.dataToCoord(S)-_,P=o.dataToCoord(M);Math.abs(L)<f&&(L=(L<0?-1:1)*f),C=T,D=T+L,k=(A=P-u)-h,m&&(i[s][M][I]=D)}else{var O=c.dataToCoord(S,x)-_,R=o.dataToCoord(M);Math.abs(O)<g&&(O=(O<0?-1:1)*g),D=(C=R+u)+h,A=T,k=T+O,m&&(i[s][M][I]=k)}e.setItemLayout(b,{cx:p,cy:d,r0:C,r:D,startAngle:-A*Math.PI/180,endAngle:-k*Math.PI/180,clockwise:A>=k})}}}))}var VN={startAngle:90,clockwise:!0,splitNumber:12,axisLabel:{rotate:0}},BN={splitNumber:5},FN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="polar",e}(gg);function GN(t,e){e=e||{};var n=t.coordinateSystem,i=t.axis,r={},o=i.position,a=i.orient,s=n.getRect(),l=[s.x,s.x+s.width,s.y,s.y+s.height],u={horizontal:{top:l[2],bottom:l[3]},vertical:{left:l[0],right:l[1]}};r.position=["vertical"===a?u.vertical[o]:l[0],"horizontal"===a?u.horizontal[o]:l[3]];r.rotation=Math.PI/2*{horizontal:0,vertical:1}[a];r.labelDirection=r.tickDirection=r.nameDirection={top:-1,bottom:1,right:1,left:-1}[o],t.get(["axisTick","inside"])&&(r.tickDirection=-r.tickDirection),it(e.labelInside,t.get(["axisLabel","inside"]))&&(r.labelDirection=-r.labelDirection);var h=e.rotate;return null==h&&(h=t.get(["axisLabel","rotate"])),r.labelRotation="top"===o?-h:h,r.z2=1,r}var WN=["axisLine","axisTickLabel","axisName"],HN=["splitArea","splitLine"],YN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="SingleAxisPointer",n}return n(e,t),e.prototype.render=function(e,n,i,r){var o=this.group;o.removeAll();var a=this._axisGroup;this._axisGroup=new Cr;var s=GN(e),l=new GM(e,s);E(WN,l.add,l),o.add(this._axisGroup),o.add(l.getGroup()),E(HN,(function(t){e.get([t,"show"])&&UN[t](this,this.group,this._axisGroup,e)}),this),Ah(a,this._axisGroup,e),t.prototype.render.call(this,e,n,i,r)},e.prototype.remove=function(){iI(this)},e.type="singleAxis",e}(tI),UN={splitLine:function(t,e,n,i){var r=i.axis;if(!r.scale.isBlank()){var o=i.getModel("splitLine"),a=o.getModel("lineStyle"),s=a.get("color");s=s instanceof Array?s:[s];for(var l=i.coordinateSystem.getRect(),u=r.isHorizontal(),h=[],c=0,p=r.getTicksCoords({tickModel:o}),d=[],f=[],g=0;g<p.length;++g){var y=r.toGlobalCoord(p[g].coord);u?(d[0]=y,d[1]=l.y,f[0]=y,f[1]=l.y+l.height):(d[0]=l.x,d[1]=y,f[0]=l.x+l.width,f[1]=y);var v=c++%s.length;h[v]=h[v]||[],h[v].push(new zu({subPixelOptimize:!0,shape:{x1:d[0],y1:d[1],x2:f[0],y2:f[1]},silent:!0}))}var m=a.getLineStyle(["color"]);for(g=0;g<h.length;++g)e.add(wh(h[g],{style:k({stroke:s[g%s.length]},m),silent:!0}))}},splitArea:function(t,e,n,i){nI(t,n,i,i)}},XN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getCoordSysModel=function(){return this},e.type="singleAxis",e.layoutMode="box",e.defaultOption={left:"5%",top:"5%",right:"5%",bottom:"5%",type:"value",position:"bottom",orient:"horizontal",axisLine:{show:!0,lineStyle:{width:1,type:"solid"}},tooltip:{show:!0},axisTick:{show:!0,length:6,lineStyle:{width:1}},axisLabel:{show:!0,interval:"auto"},splitLine:{show:!0,lineStyle:{type:"dashed",opacity:.2}}},e}(Tp);R(XN,p_.prototype);var ZN=function(t){function e(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.type=r||"value",a.position=o||"bottom",a}return n(e,t),e.prototype.isHorizontal=function(){var t=this.position;return"top"===t||"bottom"===t},e.prototype.pointToData=function(t,e){return this.coordinateSystem.pointToData(t)[0]},e}(H_),jN=["single"],qN=function(){function t(t,e,n){this.type="single",this.dimension="single",this.dimensions=jN,this.axisPointerEnabled=!0,this.model=t,this._init(t,e,n)}return t.prototype._init=function(t,e,n){var i=this.dimension,r=new ZN(i,o_(t),[0,0],t.get("type"),t.get("position")),o="category"===r.type;r.onBand=o&&t.get("boundaryGap"),r.inverse=t.get("inverse"),r.orient=t.get("orient"),t.axis=r,r.model=t,r.coordinateSystem=this,this._axis=r},t.prototype.update=function(t,e){t.eachSeries((function(t){if(t.coordinateSystem===this){var e=t.getData();E(e.mapDimensionsAll(this.dimension),(function(t){this._axis.scale.unionExtentFromData(e,t)}),this),r_(this._axis.scale,this._axis.model)}}),this)},t.prototype.resize=function(t,e){this._rect=xp({left:t.get("left"),top:t.get("top"),right:t.get("right"),bottom:t.get("bottom"),width:t.get("width"),height:t.get("height")},{width:e.getWidth(),height:e.getHeight()}),this._adjustAxis()},t.prototype.getRect=function(){return this._rect},t.prototype._adjustAxis=function(){var t=this._rect,e=this._axis,n=e.isHorizontal(),i=n?[0,t.width]:[0,t.height],r=e.reverse?1:0;e.setExtent(i[r],i[1-r]),this._updateAxisTransform(e,n?t.x:t.y)},t.prototype._updateAxisTransform=function(t,e){var n=t.getExtent(),i=n[0]+n[1],r=t.isHorizontal();t.toGlobalCoord=r?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord=r?function(t){return t-e}:function(t){return i-t+e}},t.prototype.getAxis=function(){return this._axis},t.prototype.getBaseAxis=function(){return this._axis},t.prototype.getAxes=function(){return[this._axis]},t.prototype.getTooltipAxes=function(){return{baseAxes:[this.getAxis()],otherAxes:[]}},t.prototype.containPoint=function(t){var e=this.getRect(),n=this.getAxis();return"horizontal"===n.orient?n.contain(n.toLocalCoord(t[0]))&&t[1]>=e.y&&t[1]<=e.y+e.height:n.contain(n.toLocalCoord(t[1]))&&t[0]>=e.y&&t[0]<=e.y+e.height},t.prototype.pointToData=function(t){var e=this.getAxis();return[e.coordToData(e.toLocalCoord(t["horizontal"===e.orient?0:1]))]},t.prototype.dataToPoint=function(t){var e=this.getAxis(),n=this.getRect(),i=[],r="horizontal"===e.orient?0:1;return t instanceof Array&&(t=t[0]),i[r]=e.toGlobalCoord(e.dataToCoord(+t)),i[1-r]=0===r?n.y+n.height/2:n.x+n.width/2,i},t.prototype.convertToPixel=function(t,e,n){return KN(e)===this?this.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){return KN(e)===this?this.pointToData(n):null},t}();function KN(t){var e=t.seriesModel,n=t.singleAxisModel;return n&&n.coordinateSystem||e&&e.coordinateSystem}var $N={create:function(t,e){var n=[];return t.eachComponent("singleAxis",(function(i,r){var o=new qN(i,t,e);o.name="single_"+r,o.resize(i,e),i.coordinateSystem=o,n.push(o)})),t.eachSeries((function(t){if("singleAxis"===t.get("coordinateSystem")){var e=t.getReferringComponents("singleAxis",Co).models[0];t.coordinateSystem=e&&e.coordinateSystem}})),n},dimensions:jN},JN=["x","y"],QN=["width","height"],tE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis,a=o.coordinateSystem,s=iE(a,1-nE(o)),l=a.dataToPoint(e)[0],u=i.get("type");if(u&&"none"!==u){var h=NR(i),c=eE[u](o,l,s);c.style=h,t.graphicKey=c.type,t.pointer=c}BR(e,t,GN(n),n,i,r)},e.prototype.getHandleTransform=function(t,e,n){var i=GN(e,{labelInside:!1});i.labelMargin=n.get(["handle","margin"]);var r=VR(e.axis,t,i);return{x:r[0],y:r[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},e.prototype.updateHandleTransform=function(t,e,n,i){var r=n.axis,o=r.coordinateSystem,a=nE(r),s=iE(o,a),l=[t.x,t.y];l[a]+=e[a],l[a]=Math.min(s[1],l[a]),l[a]=Math.max(s[0],l[a]);var u=iE(o,1-a),h=(u[1]+u[0])/2,c=[h,h];return c[a]=l[a],{x:l[0],y:l[1],rotation:t.rotation,cursorPoint:c,tooltipOption:{verticalAlign:"middle"}}},e}(AR),eE={line:function(t,e,n){return{type:"Line",subPixelOptimize:!0,shape:FR([e,n[0]],[e,n[1]],nE(t))}},shadow:function(t,e,n){var i=t.getBandWidth(),r=n[1]-n[0];return{type:"Rect",shape:GR([e-i/2,n[0]],[i,r],nE(t))}}};function nE(t){return t.isHorizontal()?0:1}function iE(t,e){var n=t.getRect();return[n[JN[e]],n[JN[e]]+n[QN[e]]]}var rE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="single",e}(gg);var oE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e,n,i){var r=Sp(e);t.prototype.init.apply(this,arguments),aE(e,r)},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),aE(this.option,e)},e.prototype.getCellSize=function(){return this.option.cellSize},e.type="calendar",e.defaultOption={z:2,left:80,top:60,cellSize:20,orient:"horizontal",splitLine:{show:!0,lineStyle:{color:"#000",width:1,type:"solid"}},itemStyle:{color:"#fff",borderWidth:1,borderColor:"#ccc"},dayLabel:{show:!0,firstDay:0,position:"start",margin:"50%",color:"#000"},monthLabel:{show:!0,position:"start",margin:5,align:"center",formatter:null,color:"#000"},yearLabel:{show:!0,position:null,margin:30,formatter:null,color:"#ccc",fontFamily:"sans-serif",fontWeight:"bolder",fontSize:20}},e}(Tp);function aE(t,e){var n,i=t.cellSize;1===(n=Y(i)?i:t.cellSize=[i,i]).length&&(n[1]=n[0]);var r=z([0,1],(function(t){return function(t,e){return null!=t[yp[e][0]]||null!=t[yp[e][1]]&&null!=t[yp[e][2]]}(e,t)&&(n[t]="auto"),null!=n[t]&&"auto"!==n[t]}));wp(t,e,{type:"box",ignoreSize:r})}var sE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=this.group;i.removeAll();var r=t.coordinateSystem,o=r.getRangeInfo(),a=r.getOrient(),s=e.getLocaleModel();this._renderDayRect(t,o,i),this._renderLines(t,o,a,i),this._renderYearText(t,o,a,i),this._renderMonthText(t,s,a,i),this._renderWeekText(t,s,o,a,i)},e.prototype._renderDayRect=function(t,e,n){for(var i=t.coordinateSystem,r=t.getModel("itemStyle").getItemStyle(),o=i.getCellWidth(),a=i.getCellHeight(),s=e.start.time;s<=e.end.time;s=i.getNextNDay(s,1).time){var l=i.dataToRect([s],!1).tl,u=new Cs({shape:{x:l[0],y:l[1],width:o,height:a},cursor:"default",style:r});n.add(u)}},e.prototype._renderLines=function(t,e,n,i){var r=this,o=t.coordinateSystem,a=t.getModel(["splitLine","lineStyle"]).getLineStyle(),s=t.get(["splitLine","show"]),l=a.lineWidth;this._tlpoints=[],this._blpoints=[],this._firstDayOfMonth=[],this._firstDayPoints=[];for(var u=e.start,h=0;u.time<=e.end.time;h++){p(u.formatedDate),0===h&&(u=o.getDateInfo(e.start.y+"-"+e.start.m));var c=u.date;c.setMonth(c.getMonth()+1),u=o.getDateInfo(c)}function p(e){r._firstDayOfMonth.push(o.getDateInfo(e)),r._firstDayPoints.push(o.dataToRect([e],!1).tl);var l=r._getLinePointsOfOneWeek(t,e,n);r._tlpoints.push(l[0]),r._blpoints.push(l[l.length-1]),s&&r._drawSplitline(l,a,i)}p(o.getNextNDay(e.end.time,1).formatedDate),s&&this._drawSplitline(r._getEdgesPoints(r._tlpoints,l,n),a,i),s&&this._drawSplitline(r._getEdgesPoints(r._blpoints,l,n),a,i)},e.prototype._getEdgesPoints=function(t,e,n){var i=[t[0].slice(),t[t.length-1].slice()],r="horizontal"===n?0:1;return i[0][r]=i[0][r]-e/2,i[1][r]=i[1][r]+e/2,i},e.prototype._drawSplitline=function(t,e,n){var i=new Ru({z2:20,shape:{points:t},style:e});n.add(i)},e.prototype._getLinePointsOfOneWeek=function(t,e,n){for(var i=t.coordinateSystem,r=i.getDateInfo(e),o=[],a=0;a<7;a++){var s=i.getNextNDay(r.time,a),l=i.dataToRect([s.time],!1);o[2*s.day]=l.tl,o[2*s.day+1]=l["horizontal"===n?"bl":"tr"]}return o},e.prototype._formatterLabel=function(t,e){return X(t)&&t?(n=t,E(e,(function(t,e){n=n.replace("{"+e+"}",i?ap(t):t)})),n):U(t)?t(e):e.nameMap;var n,i},e.prototype._yearTextPositionControl=function(t,e,n,i,r){var o=e[0],a=e[1],s=["center","bottom"];"bottom"===i?(a+=r,s=["center","top"]):"left"===i?o-=r:"right"===i?(o+=r,s=["center","top"]):a-=r;var l=0;return"left"!==i&&"right"!==i||(l=Math.PI/2),{rotation:l,x:o,y:a,style:{align:s[0],verticalAlign:s[1]}}},e.prototype._renderYearText=function(t,e,n,i){var r=t.getModel("yearLabel");if(r.get("show")){var o=r.get("margin"),a=r.get("position");a||(a="horizontal"!==n?"top":"left");var s=[this._tlpoints[this._tlpoints.length-1],this._blpoints[0]],l=(s[0][0]+s[1][0])/2,u=(s[0][1]+s[1][1])/2,h="horizontal"===n?0:1,c={top:[l,s[h][1]],bottom:[l,s[1-h][1]],left:[s[1-h][0],u],right:[s[h][0],u]},p=e.start.y;+e.end.y>+e.start.y&&(p=p+"-"+e.end.y);var d=r.get("formatter"),f={start:e.start.y,end:e.end.y,nameMap:p},g=this._formatterLabel(d,f),y=new ks({z2:30,style:Uh(r,{text:g})});y.attr(this._yearTextPositionControl(y,c[a],n,a,o)),i.add(y)}},e.prototype._monthTextPositionControl=function(t,e,n,i,r){var o="left",a="top",s=t[0],l=t[1];return"horizontal"===n?(l+=r,e&&(o="center"),"start"===i&&(a="bottom")):(s+=r,e&&(a="middle"),"start"===i&&(o="right")),{x:s,y:l,align:o,verticalAlign:a}},e.prototype._renderMonthText=function(t,e,n,i){var r=t.getModel("monthLabel");if(r.get("show")){var o=r.get("nameMap"),a=r.get("margin"),s=r.get("position"),l=r.get("align"),u=[this._tlpoints,this._blpoints];o&&!X(o)||(o&&(e=Mc(o)||e),o=e.get(["time","monthAbbr"])||[]);var h="start"===s?0:1,c="horizontal"===n?0:1;a="start"===s?-a:a;for(var p="center"===l,d=0;d<u[h].length-1;d++){var f=u[h][d].slice(),g=this._firstDayOfMonth[d];if(p){var y=this._firstDayPoints[d];f[c]=(y[c]+u[0][d+1][c])/2}var v=r.get("formatter"),m=o[+g.m-1],x={yyyy:g.y,yy:(g.y+"").slice(2),MM:g.m,M:+g.m,nameMap:m},_=this._formatterLabel(v,x),b=new ks({z2:30,style:A(Uh(r,{text:_}),this._monthTextPositionControl(f,p,n,s,a))});i.add(b)}}},e.prototype._weekTextPositionControl=function(t,e,n,i,r){var o="center",a="middle",s=t[0],l=t[1],u="start"===n;return"horizontal"===e?(s=s+i+(u?1:-1)*r[0]/2,o=u?"right":"left"):(l=l+i+(u?1:-1)*r[1]/2,a=u?"bottom":"top"),{x:s,y:l,align:o,verticalAlign:a}},e.prototype._renderWeekText=function(t,e,n,i,r){var o=t.getModel("dayLabel");if(o.get("show")){var a=t.coordinateSystem,s=o.get("position"),l=o.get("nameMap"),u=o.get("margin"),h=a.getFirstDayOfWeek();if(!l||X(l))l&&(e=Mc(l)||e),l=e.get(["time","dayOfWeekShort"])||z(e.get(["time","dayOfWeekAbbr"]),(function(t){return t[0]}));var c=a.getNextNDay(n.end.time,7-n.lweek).time,p=[a.getCellWidth(),a.getCellHeight()];u=Er(u,Math.min(p[1],p[0])),"start"===s&&(c=a.getNextNDay(n.start.time,-(7+n.fweek)).time,u=-u);for(var d=0;d<7;d++){var f,g=a.getNextNDay(c,d),y=a.dataToRect([g.time],!1).center;f=Math.abs((d+h)%7);var v=new ks({z2:30,style:A(Uh(o,{text:l[f]}),this._weekTextPositionControl(y,i,s,u,p))});r.add(v)}}},e.type="calendar",e}(gg),lE=864e5,uE=function(){function t(e,n,i){this.type="calendar",this.dimensions=t.dimensions,this.getDimensionsInfo=t.getDimensionsInfo,this._model=e}return t.getDimensionsInfo=function(){return[{name:"time",type:"time"},"value"]},t.prototype.getRangeInfo=function(){return this._rangeInfo},t.prototype.getModel=function(){return this._model},t.prototype.getRect=function(){return this._rect},t.prototype.getCellWidth=function(){return this._sw},t.prototype.getCellHeight=function(){return this._sh},t.prototype.getOrient=function(){return this._orient},t.prototype.getFirstDayOfWeek=function(){return this._firstDayOfWeek},t.prototype.getDateInfo=function(t){var e=(t=jr(t)).getFullYear(),n=t.getMonth()+1,i=n<10?"0"+n:""+n,r=t.getDate(),o=r<10?"0"+r:""+r,a=t.getDay();return{y:e+"",m:i,d:o,day:a=Math.abs((a+7-this.getFirstDayOfWeek())%7),time:t.getTime(),formatedDate:e+"-"+i+"-"+o,date:t}},t.prototype.getNextNDay=function(t,e){return 0===(e=e||0)||(t=new Date(this.getDateInfo(t).time)).setDate(t.getDate()+e),this.getDateInfo(t)},t.prototype.update=function(t,e){this._firstDayOfWeek=+this._model.getModel("dayLabel").get("firstDay"),this._orient=this._model.get("orient"),this._lineWidth=this._model.getModel("itemStyle").getItemStyle().lineWidth||0,this._rangeInfo=this._getRangeInfo(this._initRangeOption());var n=this._rangeInfo.weeks||1,i=["width","height"],r=this._model.getCellSize().slice(),o=this._model.getBoxLayoutParams(),a="horizontal"===this._orient?[n,7]:[7,n];E([0,1],(function(t){u(r,t)&&(o[i[t]]=r[t]*a[t])}));var s={width:e.getWidth(),height:e.getHeight()},l=this._rect=xp(o,s);function u(t,e){return null!=t[e]&&"auto"!==t[e]}E([0,1],(function(t){u(r,t)||(r[t]=l[i[t]]/a[t])})),this._sw=r[0],this._sh=r[1]},t.prototype.dataToPoint=function(t,e){Y(t)&&(t=t[0]),null==e&&(e=!0);var n=this.getDateInfo(t),i=this._rangeInfo,r=n.formatedDate;if(e&&!(n.time>=i.start.time&&n.time<i.end.time+lE))return[NaN,NaN];var o=n.day,a=this._getRangeInfo([i.start.time,r]).nthWeek;return"vertical"===this._orient?[this._rect.x+o*this._sw+this._sw/2,this._rect.y+a*this._sh+this._sh/2]:[this._rect.x+a*this._sw+this._sw/2,this._rect.y+o*this._sh+this._sh/2]},t.prototype.pointToData=function(t){var e=this.pointToDate(t);return e&&e.time},t.prototype.dataToRect=function(t,e){var n=this.dataToPoint(t,e);return{contentShape:{x:n[0]-(this._sw-this._lineWidth)/2,y:n[1]-(this._sh-this._lineWidth)/2,width:this._sw-this._lineWidth,height:this._sh-this._lineWidth},center:n,tl:[n[0]-this._sw/2,n[1]-this._sh/2],tr:[n[0]+this._sw/2,n[1]-this._sh/2],br:[n[0]+this._sw/2,n[1]+this._sh/2],bl:[n[0]-this._sw/2,n[1]+this._sh/2]}},t.prototype.pointToDate=function(t){var e=Math.floor((t[0]-this._rect.x)/this._sw)+1,n=Math.floor((t[1]-this._rect.y)/this._sh)+1,i=this._rangeInfo.range;return"vertical"===this._orient?this._getDateByWeeksAndDay(n,e-1,i):this._getDateByWeeksAndDay(e,n-1,i)},t.prototype.convertToPixel=function(t,e,n){var i=hE(e);return i===this?i.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){var i=hE(e);return i===this?i.pointToData(n):null},t.prototype.containPoint=function(t){return console.warn("Not implemented."),!1},t.prototype._initRangeOption=function(){var t,e=this._model.get("range");if(Y(e)&&1===e.length&&(e=e[0]),Y(e))t=e;else{var n=e.toString();if(/^\d{4}$/.test(n)&&(t=[n+"-01-01",n+"-12-31"]),/^\d{4}[\/|-]\d{1,2}$/.test(n)){var i=this.getDateInfo(n),r=i.date;r.setMonth(r.getMonth()+1);var o=this.getNextNDay(r,-1);t=[i.formatedDate,o.formatedDate]}/^\d{4}[\/|-]\d{1,2}[\/|-]\d{1,2}$/.test(n)&&(t=[n,n])}if(!t)return e;var a=this._getRangeInfo(t);return a.start.time>a.end.time&&t.reverse(),t},t.prototype._getRangeInfo=function(t){var e,n=[this.getDateInfo(t[0]),this.getDateInfo(t[1])];n[0].time>n[1].time&&(e=!0,n.reverse());var i=Math.floor(n[1].time/lE)-Math.floor(n[0].time/lE)+1,r=new Date(n[0].time),o=r.getDate(),a=n[1].date.getDate();r.setDate(o+i-1);var s=r.getDate();if(s!==a)for(var l=r.getTime()-n[1].time>0?1:-1;(s=r.getDate())!==a&&(r.getTime()-n[1].time)*l>0;)i-=l,r.setDate(s-l);var u=Math.floor((i+n[0].day+6)/7),h=e?1-u:u-1;return e&&n.reverse(),{range:[n[0].formatedDate,n[1].formatedDate],start:n[0],end:n[1],allDay:i,weeks:u,nthWeek:h,fweek:n[0].day,lweek:n[1].day}},t.prototype._getDateByWeeksAndDay=function(t,e,n){var i=this._getRangeInfo(n);if(t>i.weeks||0===t&&e<i.fweek||t===i.weeks&&e>i.lweek)return null;var r=7*(t-1)-i.fweek+e,o=new Date(i.start.time);return o.setDate(+i.start.d+r),this.getDateInfo(o)},t.create=function(e,n){var i=[];return e.eachComponent("calendar",(function(r){var o=new t(r,e,n);i.push(o),r.coordinateSystem=o})),e.eachSeries((function(t){"calendar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("calendarIndex")||0])})),i},t.dimensions=["time","value"],t}();function hE(t){var e=t.calendarModel,n=t.seriesModel;return e?e.coordinateSystem:n?n.coordinateSystem:null}function cE(t,e){var n;return E(e,(function(e){null!=t[e]&&"auto"!==t[e]&&(n=!0)})),n}var pE=["transition","enterFrom","leaveTo"],dE=pE.concat(["enterAnimation","updateAnimation","leaveAnimation"]);function fE(t,e,n){if(n&&(!t[n]&&e[n]&&(t[n]={}),t=t[n],e=e[n]),t&&e)for(var i=n?pE:dE,r=0;r<i.length;r++){var o=i[r];null==t[o]&&null!=e[o]&&(t[o]=e[o])}}var gE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.preventAutoZ=!0,n}return n(e,t),e.prototype.mergeOption=function(e,n){var i=this.option.elements;this.option.elements=null,t.prototype.mergeOption.call(this,e,n),this.option.elements=i},e.prototype.optionUpdated=function(t,e){var n=this.option,i=(e?n:t).elements,r=n.elements=e?[]:n.elements,o=[];this._flatten(i,o,null);var a=yo(r,o,"normalMerge"),s=this._elOptionsToUpdate=[];E(a,(function(t,e){var n=t.newOption;n&&(s.push(n),function(t,e){var n=t.existing;if(e.id=t.keyInfo.id,!e.type&&n&&(e.type=n.type),null==e.parentId){var i=e.parentOption;i?e.parentId=i.id:n&&(e.parentId=n.parentId)}e.parentOption=null}(t,n),function(t,e,n){var i=A({},n),r=t[e],o=n.$action||"merge";"merge"===o?r?(C(r,i,!0),wp(r,i,{ignoreSize:!0}),Mp(n,r),fE(n,r),fE(n,r,"shape"),fE(n,r,"style"),fE(n,r,"extra"),n.clipPath=r.clipPath):t[e]=i:"replace"===o?t[e]=i:"remove"===o&&r&&(t[e]=null)}(r,e,n),function(t,e){if(t&&(t.hv=e.hv=[cE(e,["left","right"]),cE(e,["top","bottom"])],"group"===t.type)){var n=t,i=e;null==n.width&&(n.width=i.width=0),null==n.height&&(n.height=i.height=0)}}(r[e],n))}),this),n.elements=B(r,(function(t){return t&&delete t.$action,null!=t}))},e.prototype._flatten=function(t,e,n){E(t,(function(t){if(t){n&&(t.parentOption=n),e.push(t);var i=t.children;i&&i.length&&this._flatten(i,e,t),delete t.children}}),this)},e.prototype.useElOptionsToUpdate=function(){var t=this._elOptionsToUpdate;return this._elOptionsToUpdate=null,t},e.type="graphic",e.defaultOption={elements:[]},e}(Tp),yE={path:null,compoundPath:null,group:Cr,image:_s,text:ks},vE=So(),mE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){this._elMap=ft()},e.prototype.render=function(t,e,n){t!==this._lastGraphicModel&&this._clear(),this._lastGraphicModel=t,this._updateElements(t),this._relocate(t,n)},e.prototype._updateElements=function(t){var e=t.useElOptionsToUpdate();if(e){var n=this._elMap,i=this.group,r=t.get("z"),o=t.get("zlevel");E(e,(function(e){var a=xo(e.id,null),s=null!=a?n.get(a):null,l=xo(e.parentId,null),u=null!=l?n.get(l):i,h=e.type,c=e.style;"text"===h&&c&&e.hv&&e.hv[1]&&(c.textVerticalAlign=c.textBaseline=c.verticalAlign=c.align=null);var p=e.textContent,d=e.textConfig;if(c&&CO(c,h,!!d,!!p)){var f=DO(c,h,!0);!d&&f.textConfig&&(d=e.textConfig=f.textConfig),!p&&f.textContent&&(p=f.textContent)}var g=function(t){return t=A({},t),E(["id","parentId","$action","hv","bounding","textContent","clipPath"].concat(gp),(function(e){delete t[e]})),t}(e);var y=e.$action||"merge",v="merge"===y,m="replace"===y;if(v){var x=s;(T=!s)?x=_E(a,u,e.type,n):(x&&(vE(x).isNew=!1),qO(x)),x&&(zO(x,g,t,{isInit:T}),wE(x,e,r,o))}else if(m){bE(s,e,n,t);var _=_E(a,u,e.type,n);_&&(zO(_,g,t,{isInit:!0}),wE(_,e,r,o))}else"remove"===y&&(VO(s,e),bE(s,e,n,t));var b=n.get(a);if(b&&p)if(v){var w=b.getTextContent();w?w.attr(p):b.setTextContent(new ks(p))}else m&&b.setTextContent(new ks(p));if(b){var S=e.clipPath;if(S){var M=S.type,I=void 0,T=!1;if(v){var C=b.getClipPath();I=(T=!C||vE(C).type!==M)?xE(M):C}else m&&(T=!0,I=xE(M));b.setClipPath(I),zO(I,S,t,{isInit:T}),KO(I,S.keyframeAnimation,t)}var D=vE(b);b.setTextConfig(d),D.option=e,function(t,e,n){var i=Hs(t).eventData;t.silent||t.ignore||i||(i=Hs(t).eventData={componentType:"graphic",componentIndex:e.componentIndex,name:t.name});i&&(i.info=n.info)}(b,t,e),Eh({el:b,componentModel:t,itemName:b.name,itemTooltipOption:e.tooltip}),KO(b,e.keyframeAnimation,t)}}))}},e.prototype._relocate=function(t,e){for(var n=t.option.elements,i=this.group,r=this._elMap,o=e.getWidth(),a=e.getHeight(),s=["x","y"],l=0;l<n.length;l++){if((f=null!=(d=xo((p=n[l]).id,null))?r.get(d):null)&&f.isGroup){var u=(g=f.parent)===i,h=vE(f),c=vE(g);h.width=Er(h.option.width,u?o:c.width)||0,h.height=Er(h.option.height,u?a:c.height)||0}}for(l=n.length-1;l>=0;l--){var p,d,f;if(f=null!=(d=xo((p=n[l]).id,null))?r.get(d):null){var g=f.parent,y=(c=vE(g),{}),v=_p(f,p,g===i?{width:o,height:a}:{width:c.width,height:c.height},null,{hv:p.hv,boundingMode:p.bounding},y);if(!vE(f).isNew&&v){for(var m=p.transition,x={},_=0;_<s.length;_++){var b=s[_],w=y[b];m&&(FO(m)||P(m,b)>=0)?x[b]=w:f[b]=w}rh(f,x,t,0)}else f.attr(y)}}},e.prototype._clear=function(){var t=this,e=this._elMap;e.each((function(n){bE(n,vE(n).option,e,t._lastGraphicModel)})),this._elMap=ft()},e.prototype.dispose=function(){this._clear()},e.type="graphic",e}(gg);function xE(t){var e=mt(yE,t)?yE[t]:mh(t);var n=new e({});return vE(n).type=t,n}function _E(t,e,n,i){var r=xE(n);return e.add(r),i.set(t,r),vE(r).id=t,vE(r).isNew=!0,r}function bE(t,e,n,i){t&&t.parent&&("group"===t.type&&t.traverse((function(t){bE(t,e,n,i)})),BO(t,e,i),n.removeKey(vE(t).id))}function wE(t,e,n,i){t.isGroup||E([["cursor",da.prototype.cursor],["zlevel",i||0],["z",n||0],["z2",0]],(function(n){var i=n[0];mt(e,i)?t[i]=rt(e[i],n[1]):null==t[i]&&(t[i]=n[1])})),E(G(e),(function(n){if(0===n.indexOf("on")){var i=e[n];t[n]=U(i)?i:null}})),mt(e,"draggable")&&(t.draggable=e.draggable),null!=e.name&&(t.name=e.name),null!=e.id&&(t.id=e.id)}var SE=["x","y","radius","angle","single"],ME=["cartesian2d","polar","singleAxis"];function IE(t){return t+"Axis"}function TE(t,e){var n,i=ft(),r=[],o=ft();t.eachComponent({mainType:"dataZoom",query:e},(function(t){o.get(t.uid)||s(t)}));do{n=!1,t.eachComponent("dataZoom",a)}while(n);function a(t){!o.get(t.uid)&&function(t){var e=!1;return t.eachTargetAxis((function(t,n){var r=i.get(t);r&&r[n]&&(e=!0)})),e}(t)&&(s(t),n=!0)}function s(t){o.set(t.uid,!0),r.push(t),t.eachTargetAxis((function(t,e){(i.get(t)||i.set(t,[]))[e]=!0}))}return r}function CE(t){var e=t.ecModel,n={infoList:[],infoMap:ft()};return t.eachTargetAxis((function(t,i){var r=e.getComponent(IE(t),i);if(r){var o=r.getCoordSysModel();if(o){var a=o.uid,s=n.infoMap.get(a);s||(s={model:o,axisModels:[]},n.infoList.push(s),n.infoMap.set(a,s)),s.axisModels.push(r)}}})),n}var DE=function(){function t(){this.indexList=[],this.indexMap=[]}return t.prototype.add=function(t){this.indexMap[t]||(this.indexList.push(t),this.indexMap[t]=!0)},t}(),AE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._autoThrottle=!0,n._noTarget=!0,n._rangePropMode=["percent","percent"],n}return n(e,t),e.prototype.init=function(t,e,n){var i=kE(t);this.settledOption=i,this.mergeDefaultAndTheme(t,n),this._doInit(i)},e.prototype.mergeOption=function(t){var e=kE(t);C(this.option,t,!0),C(this.settledOption,e,!0),this._doInit(e)},e.prototype._doInit=function(t){var e=this.option;this._setDefaultThrottle(t),this._updateRangeUse(t);var n=this.settledOption;E([["start","startValue"],["end","endValue"]],(function(t,i){"value"===this._rangePropMode[i]&&(e[t[0]]=n[t[0]]=null)}),this),this._resetTarget()},e.prototype._resetTarget=function(){var t=this.get("orient",!0),e=this._targetAxisInfoMap=ft();this._fillSpecifiedTargetAxis(e)?this._orient=t||this._makeAutoOrientByTargetAxis():(this._orient=t||"horizontal",this._fillAutoTargetAxisByOrient(e,this._orient)),this._noTarget=!0,e.each((function(t){t.indexList.length&&(this._noTarget=!1)}),this)},e.prototype._fillSpecifiedTargetAxis=function(t){var e=!1;return E(SE,(function(n){var i=this.getReferringComponents(IE(n),Do);if(i.specified){e=!0;var r=new DE;E(i.models,(function(t){r.add(t.componentIndex)})),t.set(n,r)}}),this),e},e.prototype._fillAutoTargetAxisByOrient=function(t,e){var n=this.ecModel,i=!0;if(i){var r="vertical"===e?"y":"x";o(n.findComponents({mainType:r+"Axis"}),r)}i&&o(n.findComponents({mainType:"singleAxis",filter:function(t){return t.get("orient",!0)===e}}),"single");function o(e,n){var r=e[0];if(r){var o=new DE;if(o.add(r.componentIndex),t.set(n,o),i=!1,"x"===n||"y"===n){var a=r.getReferringComponents("grid",Co).models[0];a&&E(e,(function(t){r.componentIndex!==t.componentIndex&&a===t.getReferringComponents("grid",Co).models[0]&&o.add(t.componentIndex)}))}}}i&&E(SE,(function(e){if(i){var r=n.findComponents({mainType:IE(e),filter:function(t){return"category"===t.get("type",!0)}});if(r[0]){var o=new DE;o.add(r[0].componentIndex),t.set(e,o),i=!1}}}),this)},e.prototype._makeAutoOrientByTargetAxis=function(){var t;return this.eachTargetAxis((function(e){!t&&(t=e)}),this),"y"===t?"vertical":"horizontal"},e.prototype._setDefaultThrottle=function(t){if(t.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle){var e=this.ecModel.option;this.option.throttle=e.animation&&e.animationDurationUpdate>0?100:20}},e.prototype._updateRangeUse=function(t){var e=this._rangePropMode,n=this.get("rangeMode");E([["start","startValue"],["end","endValue"]],(function(i,r){var o=null!=t[i[0]],a=null!=t[i[1]];o&&!a?e[r]="percent":!o&&a?e[r]="value":n?e[r]=n[r]:o&&(e[r]="percent")}))},e.prototype.noTarget=function(){return this._noTarget},e.prototype.getFirstTargetAxisModel=function(){var t;return this.eachTargetAxis((function(e,n){null==t&&(t=this.ecModel.getComponent(IE(e),n))}),this),t},e.prototype.eachTargetAxis=function(t,e){this._targetAxisInfoMap.each((function(n,i){E(n.indexList,(function(n){t.call(e,i,n)}))}))},e.prototype.getAxisProxy=function(t,e){var n=this.getAxisModel(t,e);if(n)return n.__dzAxisProxy},e.prototype.getAxisModel=function(t,e){var n=this._targetAxisInfoMap.get(t);if(n&&n.indexMap[e])return this.ecModel.getComponent(IE(t),e)},e.prototype.setRawRange=function(t){var e=this.option,n=this.settledOption;E([["start","startValue"],["end","endValue"]],(function(i){null==t[i[0]]&&null==t[i[1]]||(e[i[0]]=n[i[0]]=t[i[0]],e[i[1]]=n[i[1]]=t[i[1]])}),this),this._updateRangeUse(t)},e.prototype.setCalculatedRange=function(t){var e=this.option;E(["start","startValue","end","endValue"],(function(n){e[n]=t[n]}))},e.prototype.getPercentRange=function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},e.prototype.getValueRange=function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var n=this.findRepresentativeAxisProxy();return n?n.getDataValueWindow():void 0},e.prototype.findRepresentativeAxisProxy=function(t){if(t)return t.__dzAxisProxy;for(var e,n=this._targetAxisInfoMap.keys(),i=0;i<n.length;i++)for(var r=n[i],o=this._targetAxisInfoMap.get(r),a=0;a<o.indexList.length;a++){var s=this.getAxisProxy(r,o.indexList[a]);if(s.hostedBy(this))return s;e||(e=s)}return e},e.prototype.getRangePropMode=function(){return this._rangePropMode.slice()},e.prototype.getOrient=function(){return this._orient},e.type="dataZoom",e.dependencies=["xAxis","yAxis","radiusAxis","angleAxis","singleAxis","series","toolbox"],e.defaultOption={z:4,filterMode:"filter",start:0,end:100},e}(Tp);function kE(t){var e={};return E(["start","end","startValue","endValue","throttle"],(function(n){t.hasOwnProperty(n)&&(e[n]=t[n])})),e}var LE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.select",e}(AE),PE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){this.dataZoomModel=t,this.ecModel=e,this.api=n},e.type="dataZoom",e}(gg),OE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.select",e}(PE),RE=E,NE=Vr,EE=function(){function t(t,e,n,i){this._dimName=t,this._axisIndex=e,this.ecModel=i,this._dataZoomModel=n}return t.prototype.hostedBy=function(t){return this._dataZoomModel===t},t.prototype.getDataValueWindow=function(){return this._valueWindow.slice()},t.prototype.getDataPercentWindow=function(){return this._percentWindow.slice()},t.prototype.getTargetSeriesModels=function(){var t=[];return this.ecModel.eachSeries((function(e){if(function(t){var e=t.get("coordinateSystem");return P(ME,e)>=0}(e)){var n=IE(this._dimName),i=e.getReferringComponents(n,Co).models[0];i&&this._axisIndex===i.componentIndex&&t.push(e)}}),this),t},t.prototype.getAxisModel=function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},t.prototype.getMinMaxSpan=function(){return T(this._minMaxSpan)},t.prototype.calculateDataWindow=function(t){var e,n=this._dataExtent,i=this.getAxisModel().axis.scale,r=this._dataZoomModel.getRangePropMode(),o=[0,100],a=[],s=[];RE(["start","end"],(function(l,u){var h=t[l],c=t[l+"Value"];"percent"===r[u]?(null==h&&(h=o[u]),c=i.parse(Nr(h,o,n))):(e=!0,h=Nr(c=null==c?n[u]:i.parse(c),n,o)),s[u]=c,a[u]=h})),NE(s),NE(a);var l=this._minMaxSpan;function u(t,e,n,r,o){var a=o?"Span":"ValueSpan";lk(0,t,n,"all",l["min"+a],l["max"+a]);for(var s=0;s<2;s++)e[s]=Nr(t[s],n,r,!0),o&&(e[s]=i.parse(e[s]))}return e?u(s,a,n,o,!1):u(a,s,o,n,!0),{valueWindow:s,percentWindow:a}},t.prototype.reset=function(t){if(t===this._dataZoomModel){var e=this.getTargetSeriesModels();this._dataExtent=function(t,e,n){var i=[1/0,-1/0];RE(n,(function(t){!function(t,e,n){e&&E(c_(e,n),(function(n){var i=e.getApproximateExtent(n);i[0]<t[0]&&(t[0]=i[0]),i[1]>t[1]&&(t[1]=i[1])}))}(i,t.getData(),e)}));var r=t.getAxisModel(),o=e_(r.axis.scale,r,i).calculate();return[o.min,o.max]}(this,this._dimName,e),this._updateMinMaxSpan();var n=this.calculateDataWindow(t.settledOption);this._valueWindow=n.valueWindow,this._percentWindow=n.percentWindow,this._setAxisModel()}},t.prototype.filterData=function(t,e){if(t===this._dataZoomModel){var n=this._dimName,i=this.getTargetSeriesModels(),r=t.get("filterMode"),o=this._valueWindow;"none"!==r&&RE(i,(function(t){var e=t.getData(),i=e.mapDimensionsAll(n);if(i.length){if("weakFilter"===r){var a=e.getStore(),s=z(i,(function(t){return e.getDimensionIndex(t)}),e);e.filterSelf((function(t){for(var e,n,r,l=0;l<i.length;l++){var u=a.get(s[l],t),h=!isNaN(u),c=u<o[0],p=u>o[1];if(h&&!c&&!p)return!0;h&&(r=!0),c&&(e=!0),p&&(n=!0)}return r&&e&&n}))}else RE(i,(function(n){if("empty"===r)t.setData(e=e.map(n,(function(t){return function(t){return t>=o[0]&&t<=o[1]}(t)?t:NaN})));else{var i={};i[n]=o,e.selectRange(i)}}));RE(i,(function(t){e.setApproximateExtent(o,t)}))}}))}},t.prototype._updateMinMaxSpan=function(){var t=this._minMaxSpan={},e=this._dataZoomModel,n=this._dataExtent;RE(["min","max"],(function(i){var r=e.get(i+"Span"),o=e.get(i+"ValueSpan");null!=o&&(o=this.getAxisModel().axis.scale.parse(o)),null!=o?r=Nr(n[0]+o,n,[0,100],!0):null!=r&&(o=Nr(r,[0,100],n,!0)-n[0]),t[i+"Span"]=r,t[i+"ValueSpan"]=o}),this)},t.prototype._setAxisModel=function(){var t=this.getAxisModel(),e=this._percentWindow,n=this._valueWindow;if(e){var i=Gr(n,[0,500]);i=Math.min(i,20);var r=t.axis.scale.rawExtentInfo;0!==e[0]&&r.setDeterminedMinMax("min",+n[0].toFixed(i)),100!==e[1]&&r.setDeterminedMinMax("max",+n[1].toFixed(i)),r.freeze()}},t}();var zE={getTargetSeries:function(t){function e(e){t.eachComponent("dataZoom",(function(n){n.eachTargetAxis((function(i,r){var o=t.getComponent(IE(i),r);e(i,r,o,n)}))}))}e((function(t,e,n,i){n.__dzAxisProxy=null}));var n=[];e((function(e,i,r,o){r.__dzAxisProxy||(r.__dzAxisProxy=new EE(e,i,o,t),n.push(r.__dzAxisProxy))}));var i=ft();return E(n,(function(t){E(t.getTargetSeriesModels(),(function(t){i.set(t.uid,t)}))})),i},overallReset:function(t,e){t.eachComponent("dataZoom",(function(t){t.eachTargetAxis((function(e,n){t.getAxisProxy(e,n).reset(t)})),t.eachTargetAxis((function(n,i){t.getAxisProxy(n,i).filterData(t,e)}))})),t.eachComponent("dataZoom",(function(t){var e=t.findRepresentativeAxisProxy();if(e){var n=e.getDataPercentWindow(),i=e.getDataValueWindow();t.setCalculatedRange({start:n[0],end:n[1],startValue:i[0],endValue:i[1]})}}))}};var VE=!1;function BE(t){VE||(VE=!0,t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER,zE),function(t){t.registerAction("dataZoom",(function(t,e){E(TE(e,t),(function(e){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})}))}))}(t),t.registerSubTypeDefaulter("dataZoom",(function(){return"slider"})))}function FE(t){t.registerComponentModel(LE),t.registerComponentView(OE),BE(t)}var GE=function(){},WE={};function HE(t,e){WE[t]=e}function YE(t){return WE[t]}var UE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(){t.prototype.optionUpdated.apply(this,arguments);var e=this.ecModel;E(this.option.feature,(function(t,n){var i=YE(n);i&&(i.getDefaultOption&&(i.defaultOption=i.getDefaultOption(e)),C(t,i.defaultOption))}))},e.type="toolbox",e.layoutMode={type:"box",ignoreSize:!0},e.defaultOption={show:!0,z:6,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{borderColor:"#666",color:"none"},emphasis:{iconStyle:{borderColor:"#3E98C5"}},tooltip:{show:!1,position:"bottom"}},e}(Tp);function XE(t,e){var n=ip(e.get("padding")),i=e.getItemStyle(["color","opacity"]);return i.fill=e.get("backgroundColor"),t=new Cs({shape:{x:t.x-n[3],y:t.y-n[0],width:t.width+n[1]+n[3],height:t.height+n[0]+n[2],r:e.get("borderRadius")},style:i,silent:!0,z2:-1})}var ZE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n,i){var r=this.group;if(r.removeAll(),t.get("show")){var o=+t.get("itemSize"),a="vertical"===t.get("orient"),s=t.get("feature")||{},l=this._features||(this._features={}),u=[];E(s,(function(t,e){u.push(e)})),new Im(this._featureNames||[],u).add(h).update(h).remove(H(h,null)).execute(),this._featureNames=u,function(t,e,n){var i=e.getBoxLayoutParams(),r=e.get("padding"),o={width:n.getWidth(),height:n.getHeight()},a=xp(i,o,r);mp(e.get("orient"),t,e.get("itemGap"),a.width,a.height),_p(t,i,o,r)}(r,t,n),r.add(XE(r.getBoundingRect(),t)),a||r.eachChild((function(t){var e=t.__title,i=t.ensureState("emphasis"),a=i.textConfig||(i.textConfig={}),s=t.getTextContent(),l=s&&s.ensureState("emphasis");if(l&&!U(l)&&e){var u=l.style||(l.style={}),h=cr(e,ks.makeFont(u)),c=t.x+r.x,p=!1;t.y+r.y+o+h.height>n.getHeight()&&(a.position="top",p=!0);var d=p?-5-h.height:o+10;c+h.width/2>n.getWidth()?(a.position=["100%",d],u.align="right"):c-h.width/2<0&&(a.position=[0,d],u.align="left")}}))}function h(h,c){var p,d=u[h],f=u[c],g=s[d],y=new dc(g,t,t.ecModel);if(i&&null!=i.newTitle&&i.featureName===d&&(g.title=i.newTitle),d&&!f){if(function(t){return 0===t.indexOf("my")}(d))p={onclick:y.option.onclick,featureName:d};else{var v=YE(d);if(!v)return;p=new v}l[d]=p}else if(!(p=l[f]))return;p.uid=gc("toolbox-feature"),p.model=y,p.ecModel=e,p.api=n;var m=p instanceof GE;d||!f?!y.get("show")||m&&p.unusable?m&&p.remove&&p.remove(e,n):(!function(i,s,l){var u,h,c=i.getModel("iconStyle"),p=i.getModel(["emphasis","iconStyle"]),d=s instanceof GE&&s.getIcons?s.getIcons():i.get("icon"),f=i.get("title")||{};X(d)?(u={})[l]=d:u=d;X(f)?(h={})[l]=f:h=f;var g=i.iconPaths={};E(u,(function(l,u){var d=Ph(l,{},{x:-o/2,y:-o/2,width:o,height:o});d.setStyle(c.getItemStyle()),d.ensureState("emphasis").style=p.getItemStyle();var f=new ks({style:{text:h[u],align:p.get("textAlign"),borderRadius:p.get("textBorderRadius"),padding:p.get("textPadding"),fill:null},ignore:!0});d.setTextContent(f),Eh({el:d,componentModel:t,itemName:u,formatterParamsExtra:{title:h[u]}}),d.__title=h[u],d.on("mouseover",(function(){var e=p.getItemStyle(),i=a?null==t.get("right")&&"right"!==t.get("left")?"right":"left":null==t.get("bottom")&&"bottom"!==t.get("top")?"bottom":"top";f.setStyle({fill:p.get("textFill")||e.fill||e.stroke||"#000",backgroundColor:p.get("textBackgroundColor")}),d.setTextConfig({position:p.get("textPosition")||i}),f.ignore=!t.get("showTitle"),n.enterEmphasis(this)})).on("mouseout",(function(){"emphasis"!==i.get(["iconStatus",u])&&n.leaveEmphasis(this),f.hide()})),("emphasis"===i.get(["iconStatus",u])?_l:bl)(d),r.add(d),d.on("click",W(s.onclick,s,e,n,u)),g[u]=d}))}(y,p,d),y.setIconStatus=function(t,e){var n=this.option,i=this.iconPaths;n.iconStatus=n.iconStatus||{},n.iconStatus[t]=e,i[t]&&("emphasis"===e?_l:bl)(i[t])},p instanceof GE&&p.render&&p.render(y,e,n,i)):m&&p.dispose&&p.dispose(e,n)}},e.prototype.updateView=function(t,e,n,i){E(this._features,(function(t){t instanceof GE&&t.updateView&&t.updateView(t.model,e,n,i)}))},e.prototype.remove=function(t,e){E(this._features,(function(n){n instanceof GE&&n.remove&&n.remove(t,e)})),this.group.removeAll()},e.prototype.dispose=function(t,e){E(this._features,(function(n){n instanceof GE&&n.dispose&&n.dispose(t,e)}))},e.type="toolbox",e}(gg);var jE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.onclick=function(t,e){var n=this.model,i=n.get("name")||t.get("title.0.text")||"echarts",o="svg"===e.getZr().painter.getType(),a=o?"svg":n.get("type",!0)||"png",s=e.getConnectedDataURL({type:a,backgroundColor:n.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",connectedBackgroundColor:n.get("connectedBackgroundColor"),excludeComponents:n.get("excludeComponents"),pixelRatio:n.get("pixelRatio")}),l=r.browser;if(U(MouseEvent)&&(l.newEdge||!l.ie&&!l.edge)){var u=document.createElement("a");u.download=i+"."+a,u.target="_blank",u.href=s;var h=new MouseEvent("click",{view:document.defaultView,bubbles:!0,cancelable:!1});u.dispatchEvent(h)}else if(window.navigator.msSaveOrOpenBlob||o){var c=s.split(","),p=c[0].indexOf("base64")>-1,d=o?decodeURIComponent(c[1]):c[1];p&&(d=window.atob(d));var f=i+"."+a;if(window.navigator.msSaveOrOpenBlob){for(var g=d.length,y=new Uint8Array(g);g--;)y[g]=d.charCodeAt(g);var v=new Blob([y]);window.navigator.msSaveOrOpenBlob(v,f)}else{var m=document.createElement("iframe");document.body.appendChild(m);var x=m.contentWindow,_=x.document;_.open("image/svg+xml","replace"),_.write(d),_.close(),x.focus(),_.execCommand("SaveAs",!0,f),document.body.removeChild(m)}}else{var b=n.get("lang"),w='<body style="margin:0;"><img src="'+s+'" style="max-width:100%;" title="'+(b&&b[0]||"")+'" /></body>',S=window.open();S.document.write(w),S.document.title=i}},e.getDefaultOption=function(t){return{show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:t.getLocaleModel().get(["toolbox","saveAsImage","title"]),type:"png",connectedBackgroundColor:"#fff",name:"",excludeComponents:["toolbox"],lang:t.getLocaleModel().get(["toolbox","saveAsImage","lang"])}},e}(GE),qE="__ec_magicType_stack__",KE=[["line","bar"],["stack"]],$E=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getIcons=function(){var t=this.model,e=t.get("icon"),n={};return E(t.get("type"),(function(t){e[t]&&(n[t]=e[t])})),n},e.getDefaultOption=function(t){return{show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z"},title:t.getLocaleModel().get(["toolbox","magicType","title"]),option:{},seriesIndex:{}}},e.prototype.onclick=function(t,e,n){var i=this.model,r=i.get(["seriesIndex",n]);if(JE[n]){var o,a={series:[]};E(KE,(function(t){P(t,n)>=0&&E(t,(function(t){i.setIconStatus(t,"normal")}))})),i.setIconStatus(n,"emphasis"),t.eachComponent({mainType:"series",query:null==r?null:{seriesIndex:r}},(function(t){var e=t.subType,r=t.id,o=JE[n](e,r,t,i);o&&(k(o,t.option),a.series.push(o));var s=t.coordinateSystem;if(s&&"cartesian2d"===s.type&&("line"===n||"bar"===n)){var l=s.getAxesByScale("ordinal")[0];if(l){var u=l.dim+"Axis",h=t.getReferringComponents(u,Co).models[0].componentIndex;a[u]=a[u]||[];for(var c=0;c<=h;c++)a[u][h]=a[u][h]||{};a[u][h].boundaryGap="bar"===n}}}));var s=n;"stack"===n&&(o=C({stack:i.option.title.tiled,tiled:i.option.title.stack},i.option.title),"emphasis"!==i.get(["iconStatus",n])&&(s="tiled")),e.dispatchAction({type:"changeMagicType",currentType:s,newOption:a,newTitle:o,featureName:"magicType"})}},e}(GE),JE={line:function(t,e,n,i){if("bar"===t)return C({id:e,type:"line",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","line"])||{},!0)},bar:function(t,e,n,i){if("line"===t)return C({id:e,type:"bar",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","bar"])||{},!0)},stack:function(t,e,n,i){var r=n.get("stack")===qE;if("line"===t||"bar"===t)return i.setIconStatus("stack",r?"normal":"emphasis"),C({id:e,stack:r?"":qE},i.get(["option","stack"])||{},!0)}};cm({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},(function(t,e){e.mergeOption(t.newOption)}));var QE=new Array(60).join("-"),tz="\t";function ez(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}var nz=new RegExp("[\t]+","g");function iz(t,e){var n=t.split(new RegExp("\n*"+QE+"\n*","g")),i={series:[]};return E(n,(function(t,n){if(function(t){if(t.slice(0,t.indexOf("\n")).indexOf(tz)>=0)return!0}(t)){var r=function(t){for(var e=t.split(/\n+/g),n=[],i=z(ez(e.shift()).split(nz),(function(t){return{name:t,data:[]}})),r=0;r<e.length;r++){var o=ez(e[r]).split(nz);n.push(o.shift());for(var a=0;a<o.length;a++)i[a]&&(i[a].data[r]=o[a])}return{series:i,categories:n}}(t),o=e[n],a=o.axisDim+"Axis";o&&(i[a]=i[a]||[],i[a][o.axisIndex]={data:r.categories},i.series=i.series.concat(r.series))}else{r=function(t){for(var e=t.split(/\n+/g),n=ez(e.shift()),i=[],r=0;r<e.length;r++){var o=ez(e[r]);if(o){var a=o.split(nz),s="",l=void 0,u=!1;isNaN(a[0])?(u=!0,s=a[0],a=a.slice(1),i[r]={name:s,value:[]},l=i[r].value):l=i[r]=[];for(var h=0;h<a.length;h++)l.push(+a[h]);1===l.length&&(u?i[r].value=l[0]:i[r]=l[0])}}return{name:n,data:i}}(t);i.series.push(r)}})),i}var rz=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.onclick=function(t,e){setTimeout((function(){e.dispatchAction({type:"hideTip"})}));var n=e.getDom(),i=this.model;this._dom&&n.removeChild(this._dom);var r=document.createElement("div");r.style.cssText="position:absolute;top:0;bottom:0;left:0;right:0;padding:5px",r.style.backgroundColor=i.get("backgroundColor")||"#fff";var o=document.createElement("h4"),a=i.get("lang")||[];o.innerHTML=a[0]||i.get("title"),o.style.cssText="margin:10px 20px",o.style.color=i.get("textColor");var s=document.createElement("div"),l=document.createElement("textarea");s.style.cssText="overflow:auto";var u=i.get("optionToContent"),h=i.get("contentToOption"),c=function(t){var e,n,i,r=function(t){var e={},n=[],i=[];return t.eachRawSeries((function(t){var r=t.coordinateSystem;if(!r||"cartesian2d"!==r.type&&"polar"!==r.type)n.push(t);else{var o=r.getBaseAxis();if("category"===o.type){var a=o.dim+"_"+o.index;e[a]||(e[a]={categoryAxis:o,valueAxis:r.getOtherAxis(o),series:[]},i.push({axisDim:o.dim,axisIndex:o.index})),e[a].series.push(t)}else n.push(t)}})),{seriesGroupByCategoryAxis:e,other:n,meta:i}}(t);return{value:B([(n=r.seriesGroupByCategoryAxis,i=[],E(n,(function(t,e){var n=t.categoryAxis,r=t.valueAxis.dim,o=[" "].concat(z(t.series,(function(t){return t.name}))),a=[n.model.getCategories()];E(t.series,(function(t){var e=t.getRawData();a.push(t.getRawData().mapArray(e.mapDimension(r),(function(t){return t})))}));for(var s=[o.join(tz)],l=0;l<a[0].length;l++){for(var u=[],h=0;h<a.length;h++)u.push(a[h][l]);s.push(u.join(tz))}i.push(s.join("\n"))})),i.join("\n\n"+QE+"\n\n")),(e=r.other,z(e,(function(t){var e=t.getRawData(),n=[t.name],i=[];return e.each(e.dimensions,(function(){for(var t=arguments.length,r=arguments[t-1],o=e.getName(r),a=0;a<t-1;a++)i[a]=arguments[a];n.push((o?o+tz:"")+i.join(tz))})),n.join("\n")})).join("\n\n"+QE+"\n\n"))],(function(t){return!!t.replace(/[\n\t\s]/g,"")})).join("\n\n"+QE+"\n\n"),meta:r.meta}}(t);if(U(u)){var p=u(e.getOption());X(p)?s.innerHTML=p:J(p)&&s.appendChild(p)}else{l.readOnly=i.get("readOnly");var d=l.style;d.cssText="display:block;width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;resize:none;box-sizing:border-box;outline:none",d.color=i.get("textColor"),d.borderColor=i.get("textareaBorderColor"),d.backgroundColor=i.get("textareaColor"),l.value=c.value,s.appendChild(l)}var f=c.meta,g=document.createElement("div");g.style.cssText="position:absolute;bottom:5px;left:0;right:0";var y="float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px",v=document.createElement("div"),m=document.createElement("div");y+=";background-color:"+i.get("buttonColor"),y+=";color:"+i.get("buttonTextColor");var x=this;function _(){n.removeChild(r),x._dom=null}ae(v,"click",_),ae(m,"click",(function(){if(null==h&&null!=u||null!=h&&null==u)_();else{var t;try{t=U(h)?h(s,e.getOption()):iz(l.value,f)}catch(t){throw _(),new Error("Data view format error "+t)}t&&e.dispatchAction({type:"changeDataView",newOption:t}),_()}})),v.innerHTML=a[1],m.innerHTML=a[2],m.style.cssText=v.style.cssText=y,!i.get("readOnly")&&g.appendChild(m),g.appendChild(v),r.appendChild(o),r.appendChild(s),r.appendChild(g),s.style.height=n.clientHeight-80+"px",n.appendChild(r),this._dom=r},e.prototype.remove=function(t,e){this._dom&&e.getDom().removeChild(this._dom)},e.prototype.dispose=function(t,e){this.remove(t,e)},e.getDefaultOption=function(t){return{show:!0,readOnly:!1,optionToContent:null,contentToOption:null,icon:"M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28",title:t.getLocaleModel().get(["toolbox","dataView","title"]),lang:t.getLocaleModel().get(["toolbox","dataView","lang"]),backgroundColor:"#fff",textColor:"#000",textareaColor:"#fff",textareaBorderColor:"#333",buttonColor:"#c23531",buttonTextColor:"#fff"}},e}(GE);function oz(t,e){return z(t,(function(t,n){var i=e&&e[n];if(q(i)&&!Y(i)){q(t)&&!Y(t)||(t={value:t});var r=null!=i.name&&null==t.name;return t=k(t,i),r&&delete t.name,t}return t}))}cm({type:"changeDataView",event:"dataViewChanged",update:"prepareAndUpdate"},(function(t,e){var n=[];E(t.newOption.series,(function(t){var i=e.getSeriesByName(t.name)[0];if(i){var r=i.get("data");n.push({name:t.name,data:oz(t.data,r)})}else n.push(A({type:"scatter"},t))})),e.mergeOption(k({series:n},t.newOption))}));var az=E,sz=So();function lz(t){var e=sz(t);return e.snapshots||(e.snapshots=[{}]),e.snapshots}var uz=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.onclick=function(t,e){!function(t){sz(t).snapshots=null}(t),e.dispatchAction({type:"restore",from:this.uid})},e.getDefaultOption=function(t){return{show:!0,icon:"M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5",title:t.getLocaleModel().get(["toolbox","restore","title"])}},e}(GE);cm({type:"restore",event:"restore",update:"prepareAndUpdate"},(function(t,e){e.resetOption("recreate")}));var hz=["grid","xAxis","yAxis","geo","graph","polar","radiusAxis","angleAxis","bmap"],cz=function(){function t(t,e,n){var i=this;this._targetInfoList=[];var r=dz(e,t);E(fz,(function(t,e){(!n||!n.include||P(n.include,e)>=0)&&t(r,i._targetInfoList)}))}return t.prototype.setOutputRanges=function(t,e){return this.matchOutputRanges(t,e,(function(t,e,n){if((t.coordRanges||(t.coordRanges=[])).push(e),!t.coordRange){t.coordRange=e;var i=vz[t.brushType](0,n,e);t.__rangeOffset={offset:xz[t.brushType](i.values,t.range,[1,1]),xyMinMax:i.xyMinMax}}})),t},t.prototype.matchOutputRanges=function(t,e,n){E(t,(function(t){var i=this.findTargetInfo(t,e);i&&!0!==i&&E(i.coordSyses,(function(i){var r=vz[t.brushType](1,i,t.range,!0);n(t,r.values,i,e)}))}),this)},t.prototype.setInputRanges=function(t,e){E(t,(function(t){var n,i,r,o,a,s=this.findTargetInfo(t,e);if(t.range=t.range||[],s&&!0!==s){t.panelId=s.panelId;var l=vz[t.brushType](0,s.coordSys,t.coordRange),u=t.__rangeOffset;t.range=u?xz[t.brushType](l.values,u.offset,(n=l.xyMinMax,i=u.xyMinMax,r=bz(n),o=bz(i),a=[r[0]/o[0],r[1]/o[1]],isNaN(a[0])&&(a[0]=1),isNaN(a[1])&&(a[1]=1),a)):l.values}}),this)},t.prototype.makePanelOpts=function(t,e){return z(this._targetInfoList,(function(n){var i=n.getPanelRect();return{panelId:n.panelId,defaultBrushType:e?e(n):null,clipPath:hL(i),isTargetByCursor:pL(i,t,n.coordSysModel),getLinearBrushOtherExtent:cL(i)}}))},t.prototype.controlSeries=function(t,e,n){var i=this.findTargetInfo(t,n);return!0===i||i&&P(i.coordSyses,e.coordinateSystem)>=0},t.prototype.findTargetInfo=function(t,e){for(var n=this._targetInfoList,i=dz(e,t),r=0;r<n.length;r++){var o=n[r],a=t.panelId;if(a){if(o.panelId===a)return o}else for(var s=0;s<gz.length;s++)if(gz[s](i,o))return o}return!0},t}();function pz(t){return t[0]>t[1]&&t.reverse(),t}function dz(t,e){return Io(t,e,{includeMainTypes:hz})}var fz={grid:function(t,e){var n=t.xAxisModels,i=t.yAxisModels,r=t.gridModels,o=ft(),a={},s={};(n||i||r)&&(E(n,(function(t){var e=t.axis.grid.model;o.set(e.id,e),a[e.id]=!0})),E(i,(function(t){var e=t.axis.grid.model;o.set(e.id,e),s[e.id]=!0})),E(r,(function(t){o.set(t.id,t),a[t.id]=!0,s[t.id]=!0})),o.each((function(t){var r=t.coordinateSystem,o=[];E(r.getCartesians(),(function(t,e){(P(n,t.getAxis("x").model)>=0||P(i,t.getAxis("y").model)>=0)&&o.push(t)})),e.push({panelId:"grid--"+t.id,gridModel:t,coordSysModel:t,coordSys:o[0],coordSyses:o,getPanelRect:yz.grid,xAxisDeclared:a[t.id],yAxisDeclared:s[t.id]})})))},geo:function(t,e){E(t.geoModels,(function(t){var n=t.coordinateSystem;e.push({panelId:"geo--"+t.id,geoModel:t,coordSysModel:t,coordSys:n,coordSyses:[n],getPanelRect:yz.geo})}))}},gz=[function(t,e){var n=t.xAxisModel,i=t.yAxisModel,r=t.gridModel;return!r&&n&&(r=n.axis.grid.model),!r&&i&&(r=i.axis.grid.model),r&&r===e.gridModel},function(t,e){var n=t.geoModel;return n&&n===e.geoModel}],yz={grid:function(){return this.coordSys.master.getRect().clone()},geo:function(){var t=this.coordSys,e=t.getBoundingRect().clone();return e.applyTransform(Ih(t)),e}},vz={lineX:H(mz,0),lineY:H(mz,1),rect:function(t,e,n,i){var r=t?e.pointToData([n[0][0],n[1][0]],i):e.dataToPoint([n[0][0],n[1][0]],i),o=t?e.pointToData([n[0][1],n[1][1]],i):e.dataToPoint([n[0][1],n[1][1]],i),a=[pz([r[0],o[0]]),pz([r[1],o[1]])];return{values:a,xyMinMax:a}},polygon:function(t,e,n,i){var r=[[1/0,-1/0],[1/0,-1/0]];return{values:z(n,(function(n){var o=t?e.pointToData(n,i):e.dataToPoint(n,i);return r[0][0]=Math.min(r[0][0],o[0]),r[1][0]=Math.min(r[1][0],o[1]),r[0][1]=Math.max(r[0][1],o[0]),r[1][1]=Math.max(r[1][1],o[1]),o})),xyMinMax:r}}};function mz(t,e,n,i){var r=n.getAxis(["x","y"][t]),o=pz(z([0,1],(function(t){return e?r.coordToData(r.toLocalCoord(i[t]),!0):r.toGlobalCoord(r.dataToCoord(i[t]))}))),a=[];return a[t]=o,a[1-t]=[NaN,NaN],{values:o,xyMinMax:a}}var xz={lineX:H(_z,0),lineY:H(_z,1),rect:function(t,e,n){return[[t[0][0]-n[0]*e[0][0],t[0][1]-n[0]*e[0][1]],[t[1][0]-n[1]*e[1][0],t[1][1]-n[1]*e[1][1]]]},polygon:function(t,e,n){return z(t,(function(t,i){return[t[0]-n[0]*e[i][0],t[1]-n[1]*e[i][1]]}))}};function _z(t,e,n,i){return[e[0]-i[t]*n[0],e[1]-i[t]*n[1]]}function bz(t){return t?[t[0][1]-t[0][0],t[1][1]-t[1][0]]:[NaN,NaN]}var wz,Sz,Mz=E,Iz=uo+"toolbox-dataZoom_",Tz=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n,i){this._brushController||(this._brushController=new Ok(n.getZr()),this._brushController.on("brush",W(this._onBrush,this)).mount()),function(t,e,n,i,r){var o=n._isZoomActive;i&&"takeGlobalCursor"===i.type&&(o="dataZoomSelect"===i.key&&i.dataZoomSelectActive);n._isZoomActive=o,t.setIconStatus("zoom",o?"emphasis":"normal");var a=new cz(Dz(t),e,{include:["grid"]}).makePanelOpts(r,(function(t){return t.xAxisDeclared&&!t.yAxisDeclared?"lineX":!t.xAxisDeclared&&t.yAxisDeclared?"lineY":"rect"}));n._brushController.setPanels(a).enableBrush(!(!o||!a.length)&&{brushType:"auto",brushStyle:t.getModel("brushStyle").getItemStyle()})}(t,e,this,i,n),function(t,e){t.setIconStatus("back",function(t){return lz(t).length}(e)>1?"emphasis":"normal")}(t,e)},e.prototype.onclick=function(t,e,n){Cz[n].call(this)},e.prototype.remove=function(t,e){this._brushController&&this._brushController.unmount()},e.prototype.dispose=function(t,e){this._brushController&&this._brushController.dispose()},e.prototype._onBrush=function(t){var e=t.areas;if(t.isEnd&&e.length){var n={},i=this.ecModel;this._brushController.updateCovers([]),new cz(Dz(this.model),i,{include:["grid"]}).matchOutputRanges(e,i,(function(t,e,n){if("cartesian2d"===n.type){var i=t.brushType;"rect"===i?(r("x",n,e[0]),r("y",n,e[1])):r({lineX:"x",lineY:"y"}[i],n,e)}})),function(t,e){var n=lz(t);az(e,(function(e,i){for(var r=n.length-1;r>=0&&!n[r][i];r--);if(r<0){var o=t.queryComponents({mainType:"dataZoom",subType:"select",id:i})[0];if(o){var a=o.getPercentRange();n[0][i]={dataZoomId:i,start:a[0],end:a[1]}}}})),n.push(e)}(i,n),this._dispatchZoomAction(n)}function r(t,e,r){var o=e.getAxis(t),a=o.model,s=function(t,e,n){var i;return n.eachComponent({mainType:"dataZoom",subType:"select"},(function(n){n.getAxisModel(t,e.componentIndex)&&(i=n)})),i}(t,a,i),l=s.findRepresentativeAxisProxy(a).getMinMaxSpan();null==l.minValueSpan&&null==l.maxValueSpan||(r=lk(0,r.slice(),o.scale.getExtent(),0,l.minValueSpan,l.maxValueSpan)),s&&(n[s.id]={dataZoomId:s.id,startValue:r[0],endValue:r[1]})}},e.prototype._dispatchZoomAction=function(t){var e=[];Mz(t,(function(t,n){e.push(T(t))})),e.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:e})},e.getDefaultOption=function(t){return{show:!0,filterMode:"filter",icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:t.getLocaleModel().get(["toolbox","dataZoom","title"]),brushStyle:{borderWidth:0,color:"rgba(210,219,238,0.2)"}}},e}(GE),Cz={zoom:function(){var t=!this._isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(function(t){var e=lz(t),n=e[e.length-1];e.length>1&&e.pop();var i={};return az(n,(function(t,n){for(var r=e.length-1;r>=0;r--)if(t=e[r][n]){i[n]=t;break}})),i}(this.ecModel))}};function Dz(t){var e={xAxisIndex:t.get("xAxisIndex",!0),yAxisIndex:t.get("yAxisIndex",!0),xAxisId:t.get("xAxisId",!0),yAxisId:t.get("yAxisId",!0)};return null==e.xAxisIndex&&null==e.xAxisId&&(e.xAxisIndex="all"),null==e.yAxisIndex&&null==e.yAxisId&&(e.yAxisIndex="all"),e}wz="dataZoom",Sz=function(t){var e=t.getComponent("toolbox",0),n=["feature","dataZoom"];if(e&&null!=e.get(n)){var i=e.getModel(n),r=[],o=Io(t,Dz(i));return Mz(o.xAxisModels,(function(t){return a(t,"xAxis","xAxisIndex")})),Mz(o.yAxisModels,(function(t){return a(t,"yAxis","yAxisIndex")})),r}function a(t,e,n){var o=t.componentIndex,a={type:"select",$fromToolbox:!0,filterMode:i.get("filterMode",!0)||"filter",id:Iz+e+o};a[n]=o,r.push(a)}},lt(null==jp.get(wz)&&Sz),jp.set(wz,Sz);var Az=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="tooltip",e.dependencies=["axisPointer"],e.defaultOption={z:60,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",renderMode:"auto",confine:null,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"#fff",shadowBlur:10,shadowColor:"rgba(0, 0, 0, .2)",shadowOffsetX:1,shadowOffsetY:2,borderRadius:4,borderWidth:1,padding:null,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#666",fontSize:14}},e}(Tp);function kz(t){var e=t.get("confine");return null!=e?!!e:"richText"===t.get("renderMode")}function Lz(t){if(r.domSupported)for(var e=document.documentElement.style,n=0,i=t.length;n<i;n++)if(t[n]in e)return t[n]}var Pz=Lz(["transform","webkitTransform","OTransform","MozTransform","msTransform"]);function Oz(t,e){if(!t)return e;e=np(e,!0);var n=t.indexOf(e);return(t=-1===n?e:"-"+t.slice(0,n)+"-"+e).toLowerCase()}var Rz=Oz(Lz(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),"transition"),Nz=Oz(Pz,"transform"),Ez="position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;"+(r.transform3dSupported?"will-change:transform;":"");function zz(t,e,n){var i=t.toFixed(0)+"px",o=e.toFixed(0)+"px";if(!r.transformSupported)return n?"top:"+o+";left:"+i+";":[["top",o],["left",i]];var a=r.transform3dSupported,s="translate"+(a?"3d":"")+"("+i+","+o+(a?",0":"")+")";return n?"top:0;left:0;"+Nz+":"+s+";":[["top",0],["left",0],[Pz,s]]}function Vz(t,e,n){var i=[],o=t.get("transitionDuration"),a=t.get("backgroundColor"),s=t.get("shadowBlur"),l=t.get("shadowColor"),u=t.get("shadowOffsetX"),h=t.get("shadowOffsetY"),c=t.getModel("textStyle"),p=ng(t,"html"),d=u+"px "+h+"px "+s+"px "+l;return i.push("box-shadow:"+d),e&&o&&i.push(function(t,e){var n="cubic-bezier(0.23,1,0.32,1)",i=" "+t/2+"s "+n,o="opacity"+i+",visibility"+i;return e||(i=" "+t+"s "+n,o+=r.transformSupported?","+Nz+i:",left"+i+",top"+i),Rz+":"+o}(o,n)),a&&i.push("background-color:"+a),E(["width","color","radius"],(function(e){var n="border-"+e,r=np(n),o=t.get(r);null!=o&&i.push(n+":"+o+("color"===e?"":"px"))})),i.push(function(t){var e=[],n=t.get("fontSize"),i=t.getTextColor();i&&e.push("color:"+i),e.push("font:"+t.getFont()),n&&e.push("line-height:"+Math.round(3*n/2)+"px");var r=t.get("textShadowColor"),o=t.get("textShadowBlur")||0,a=t.get("textShadowOffsetX")||0,s=t.get("textShadowOffsetY")||0;return r&&o&&e.push("text-shadow:"+a+"px "+s+"px "+o+"px "+r),E(["decoration","align"],(function(n){var i=t.get(n);i&&e.push("text-"+n+":"+i)})),e.join(";")}(c)),null!=p&&i.push("padding:"+ip(p).join("px ")+"px"),i.join(";")+";"}function Bz(t,e,n,i,r){var o=e&&e.painter;if(n){var a=o&&o.getViewportRoot();a&&function(t,e,n,i,r){$t(Kt,e,i,r,!0)&&$t(t,n,Kt[0],Kt[1])}(t,a,document.body,i,r)}else{t[0]=i,t[1]=r;var s=o&&o.getViewportRootOffset();s&&(t[0]+=s.offsetLeft,t[1]+=s.offsetTop)}t[2]=t[0]/e.getWidth(),t[3]=t[1]/e.getHeight()}var Fz=function(){function t(t,e,n){if(this._show=!1,this._styleCoord=[0,0,0,0],this._enterable=!0,this._firstShow=!0,this._longHide=!0,r.wxa)return null;var i=document.createElement("div");i.domBelongToZr=!0,this.el=i;var o=this._zr=e.getZr(),a=this._appendToBody=n&&n.appendToBody;Bz(this._styleCoord,o,a,e.getWidth()/2,e.getHeight()/2),a?document.body.appendChild(i):t.appendChild(i),this._container=t;var s=this;i.onmouseenter=function(){s._enterable&&(clearTimeout(s._hideTimeout),s._show=!0),s._inContent=!0},i.onmousemove=function(t){if(t=t||window.event,!s._enterable){var e=o.handler;oe(o.painter.getViewportRoot(),t,!0),e.dispatch("mousemove",t)}},i.onmouseleave=function(){s._inContent=!1,s._enterable&&s._show&&s.hideLater(s._hideDelay)}}return t.prototype.update=function(t){var e,n,i,r=this._container,o=(n="position",(i=(e=r).currentStyle||document.defaultView&&document.defaultView.getComputedStyle(e))?n?i[n]:i:null),a=r.style;"absolute"!==a.position&&"absolute"!==o&&(a.position="relative"),t.get("alwaysShowContent")&&this._moveIfResized(),this.el.className=t.get("className")||""},t.prototype.show=function(t,e){clearTimeout(this._hideTimeout),clearTimeout(this._longHideTimeout);var n=this.el,i=n.style,r=this._styleCoord;n.innerHTML?i.cssText=Ez+Vz(t,!this._firstShow,this._longHide)+zz(r[0],r[1],!0)+"border-color:"+pp(e)+";"+(t.get("extraCssText")||"")+";pointer-events:"+(this._enterable?"auto":"none"):i.display="none",this._show=!0,this._firstShow=!1,this._longHide=!1},t.prototype.setContent=function(t,e,n,i,r){var o=this.el;if(null!=t){var a="";if(X(r)&&"item"===n.get("trigger")&&!kz(n)&&(a=function(t,e,n){if(!X(n)||"inside"===n)return"";var i=t.get("backgroundColor"),r=t.get("borderWidth");e=pp(e);var o,a,s="left"===(o=n)?"right":"right"===o?"left":"top"===o?"bottom":"top",l=Math.max(1.5*Math.round(r),6),u="",h=Nz+":";P(["left","right"],s)>-1?(u+="top:50%",h+="translateY(-50%) rotate("+(a="left"===s?-225:-45)+"deg)"):(u+="left:50%",h+="translateX(-50%) rotate("+(a="top"===s?225:45)+"deg)");var c=a*Math.PI/180,p=l+r,d=p*Math.abs(Math.cos(c))+p*Math.abs(Math.sin(c)),f=e+" solid "+r+"px;";return'<div style="'+["position:absolute;width:"+l+"px;height:"+l+"px;",(u+=";"+s+":-"+Math.round(100*((d-Math.SQRT2*r)/2+Math.SQRT2*r-(d-p)/2))/100+"px")+";"+h+";","border-bottom:"+f,"border-right:"+f,"background-color:"+i+";"].join("")+'"></div>'}(n,i,r)),X(t))o.innerHTML=t+a;else if(t){o.innerHTML="",Y(t)||(t=[t]);for(var s=0;s<t.length;s++)J(t[s])&&t[s].parentNode!==o&&o.appendChild(t[s]);if(a&&o.childNodes.length){var l=document.createElement("div");l.innerHTML=a,o.appendChild(l)}}}else o.innerHTML=""},t.prototype.setEnterable=function(t){this._enterable=t},t.prototype.getSize=function(){var t=this.el;return[t.offsetWidth,t.offsetHeight]},t.prototype.moveTo=function(t,e){var n=this._styleCoord;if(Bz(n,this._zr,this._appendToBody,t,e),null!=n[0]&&null!=n[1]){var i=this.el.style;E(zz(n[0],n[1]),(function(t){i[t[0]]=t[1]}))}},t.prototype._moveIfResized=function(){var t=this._styleCoord[2],e=this._styleCoord[3];this.moveTo(t*this._zr.getWidth(),e*this._zr.getHeight())},t.prototype.hide=function(){var t=this,e=this.el.style;e.visibility="hidden",e.opacity="0",r.transform3dSupported&&(e.willChange=""),this._show=!1,this._longHideTimeout=setTimeout((function(){return t._longHide=!0}),500)},t.prototype.hideLater=function(t){!this._show||this._inContent&&this._enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(W(this.hide,this),t)):this.hide())},t.prototype.isShow=function(){return this._show},t.prototype.dispose=function(){this.el.parentNode.removeChild(this.el)},t}(),Gz=function(){function t(t){this._show=!1,this._styleCoord=[0,0,0,0],this._enterable=!0,this._zr=t.getZr(),Yz(this._styleCoord,this._zr,t.getWidth()/2,t.getHeight()/2)}return t.prototype.update=function(t){t.get("alwaysShowContent")&&this._moveIfResized()},t.prototype.show=function(){this._hideTimeout&&clearTimeout(this._hideTimeout),this.el.show(),this._show=!0},t.prototype.setContent=function(t,e,n,i,r){var o=this;q(t)&&ao(""),this.el&&this._zr.remove(this.el);var a=n.getModel("textStyle");this.el=new ks({style:{rich:e.richTextStyles,text:t,lineHeight:22,borderWidth:1,borderColor:i,textShadowColor:a.get("textShadowColor"),fill:n.get(["textStyle","color"]),padding:ng(n,"richText"),verticalAlign:"top",align:"left"},z:n.get("z")}),E(["backgroundColor","borderRadius","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"],(function(t){o.el.style[t]=n.get(t)})),E(["textShadowBlur","textShadowOffsetX","textShadowOffsetY"],(function(t){o.el.style[t]=a.get(t)||0})),this._zr.add(this.el);var s=this;this.el.on("mouseover",(function(){s._enterable&&(clearTimeout(s._hideTimeout),s._show=!0),s._inContent=!0})),this.el.on("mouseout",(function(){s._enterable&&s._show&&s.hideLater(s._hideDelay),s._inContent=!1}))},t.prototype.setEnterable=function(t){this._enterable=t},t.prototype.getSize=function(){var t=this.el,e=this.el.getBoundingRect(),n=Hz(t.style);return[e.width+n.left+n.right,e.height+n.top+n.bottom]},t.prototype.moveTo=function(t,e){var n=this.el;if(n){var i=this._styleCoord;Yz(i,this._zr,t,e),t=i[0],e=i[1];var r=n.style,o=Wz(r.borderWidth||0),a=Hz(r);n.x=t+o+a.left,n.y=e+o+a.top,n.markRedraw()}},t.prototype._moveIfResized=function(){var t=this._styleCoord[2],e=this._styleCoord[3];this.moveTo(t*this._zr.getWidth(),e*this._zr.getHeight())},t.prototype.hide=function(){this.el&&this.el.hide(),this._show=!1},t.prototype.hideLater=function(t){!this._show||this._inContent&&this._enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(W(this.hide,this),t)):this.hide())},t.prototype.isShow=function(){return this._show},t.prototype.dispose=function(){this._zr.remove(this.el)},t}();function Wz(t){return Math.max(0,t)}function Hz(t){var e=Wz(t.shadowBlur||0),n=Wz(t.shadowOffsetX||0),i=Wz(t.shadowOffsetY||0);return{left:Wz(e-n),right:Wz(e+n),top:Wz(e-i),bottom:Wz(e+i)}}function Yz(t,e,n,i){t[0]=n,t[1]=i,t[2]=t[0]/e.getWidth(),t[3]=t[1]/e.getHeight()}var Uz=new Cs({shape:{x:-1,y:-1,width:2,height:2}}),Xz=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){if(!r.node&&e.getDom()){var n,i=t.getComponent("tooltip"),o=this._renderMode="auto"===(n=i.get("renderMode"))?r.domSupported?"html":"richText":n||"html";this._tooltipContent="richText"===o?new Gz(e):new Fz(e.getDom(),e,{appendToBody:i.get("appendToBody",!0)})}},e.prototype.render=function(t,e,n){if(!r.node&&n.getDom()){this.group.removeAll(),this._tooltipModel=t,this._ecModel=e,this._api=n,this._alwaysShowContent=t.get("alwaysShowContent");var i=this._tooltipContent;i.update(t),i.setEnterable(t.get("enterable")),this._initGlobalListener(),this._keepShow(),"richText"!==this._renderMode&&t.get("transitionDuration")?Ag(this,"_updatePosition",50,"fixRate"):kg(this,"_updatePosition")}},e.prototype._initGlobalListener=function(){var t=this._tooltipModel.get("triggerOn");KR("itemTooltip",this._api,W((function(e,n,i){"none"!==t&&(t.indexOf(e)>=0?this._tryShow(n,i):"leave"===e&&this._hide(i))}),this))},e.prototype._keepShow=function(){var t=this._tooltipModel,e=this._ecModel,n=this._api,i=t.get("triggerOn");if(null!=this._lastX&&null!=this._lastY&&"none"!==i&&"click"!==i){var r=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout((function(){!n.isDisposed()&&r.manuallyShowTip(t,e,n,{x:r._lastX,y:r._lastY,dataByCoordSys:r._lastDataByCoordSys})}))}},e.prototype.manuallyShowTip=function(t,e,n,i){if(i.from!==this.uid&&!r.node&&n.getDom()){var o=jz(i,n);this._ticket="";var a=i.dataByCoordSys,s=function(t,e,n){var i=To(t).queryOptionMap,r=i.keys()[0];if(!r||"series"===r)return;var o,a=Ao(e,r,i.get(r),{useDefault:!1,enableAll:!1,enableNone:!1}).models[0];if(!a)return;if(n.getViewOfComponentModel(a).group.traverse((function(e){var n=Hs(e).tooltipConfig;if(n&&n.name===t.name)return o=e,!0})),o)return{componentMainType:r,componentIndex:a.componentIndex,el:o}}(i,e,n);if(s){var l=s.el.getBoundingRect().clone();l.applyTransform(s.el.transform),this._tryShow({offsetX:l.x+l.width/2,offsetY:l.y+l.height/2,target:s.el,position:i.position,positionDefault:"bottom"},o)}else if(i.tooltip&&null!=i.x&&null!=i.y){var u=Uz;u.x=i.x,u.y=i.y,u.update(),Hs(u).tooltipConfig={name:null,option:i.tooltip},this._tryShow({offsetX:i.x,offsetY:i.y,target:u},o)}else if(a)this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,dataByCoordSys:a,tooltipOption:i.tooltipOption},o);else if(null!=i.seriesIndex){if(this._manuallyAxisShowTip(t,e,n,i))return;var h=eN(i,e),c=h.point[0],p=h.point[1];null!=c&&null!=p&&this._tryShow({offsetX:c,offsetY:p,target:h.el,position:i.position,positionDefault:"bottom"},o)}else null!=i.x&&null!=i.y&&(n.dispatchAction({type:"updateAxisPointer",x:i.x,y:i.y}),this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,target:n.getZr().findHover(i.x,i.y).target},o))}},e.prototype.manuallyHideTip=function(t,e,n,i){var r=this._tooltipContent;!this._alwaysShowContent&&this._tooltipModel&&r.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=this._lastDataByCoordSys=null,i.from!==this.uid&&this._hide(jz(i,n))},e.prototype._manuallyAxisShowTip=function(t,e,n,i){var r=i.seriesIndex,o=i.dataIndex,a=e.getComponent("axisPointer").coordSysAxesInfo;if(null!=r&&null!=o&&null!=a){var s=e.getSeriesByIndex(r);if(s)if("axis"===Zz([s.getData().getItemModel(o),s,(s.coordinateSystem||{}).model],this._tooltipModel).get("trigger"))return n.dispatchAction({type:"updateAxisPointer",seriesIndex:r,dataIndex:o,position:i.position}),!0}},e.prototype._tryShow=function(t,e){var n=t.target;if(this._tooltipModel){this._lastX=t.offsetX,this._lastY=t.offsetY;var i=t.dataByCoordSys;if(i&&i.length)this._showAxisTooltip(i,t);else if(n){var r,o;this._lastDataByCoordSys=null,xy(n,(function(t){return null!=Hs(t).dataIndex?(r=t,!0):null!=Hs(t).tooltipConfig?(o=t,!0):void 0}),!0),r?this._showSeriesItemTooltip(t,r,e):o?this._showComponentItemTooltip(t,o,e):this._hide(e)}else this._lastDataByCoordSys=null,this._hide(e)}},e.prototype._showOrMove=function(t,e){var n=t.get("showDelay");e=W(e,this),clearTimeout(this._showTimout),n>0?this._showTimout=setTimeout(e,n):e()},e.prototype._showAxisTooltip=function(t,e){var n=this._ecModel,i=this._tooltipModel,r=[e.offsetX,e.offsetY],o=Zz([e.tooltipOption],i),a=this._renderMode,s=[],l=Xf("section",{blocks:[],noHeader:!0}),u=[],h=new ig;E(t,(function(t){E(t.dataByAxis,(function(t){var e=n.getComponent(t.axisDim+"Axis",t.axisIndex),r=t.value;if(e&&null!=r){var o=zR(r,e.axis,n,t.seriesDataIndices,t.valueLabelOpt),c=Xf("section",{header:o,noHeader:!ut(o),sortBlocks:!0,blocks:[]});l.blocks.push(c),E(t.seriesDataIndices,(function(l){var p=n.getSeriesByIndex(l.seriesIndex),d=l.dataIndexInside,f=p.getDataParams(d);if(!(f.dataIndex<0)){f.axisDim=t.axisDim,f.axisIndex=t.axisIndex,f.axisType=t.axisType,f.axisId=t.axisId,f.axisValue=s_(e.axis,{value:r}),f.axisValueLabel=o,f.marker=h.makeTooltipMarker("item",pp(f.color),a);var g=uf(p.formatTooltip(d,!0,null)),y=g.frag;if(y){var v=Zz([p],i).get("valueFormatter");c.blocks.push(v?A({valueFormatter:v},y):y)}g.text&&u.push(g.text),s.push(f)}}))}}))})),l.blocks.reverse(),u.reverse();var c=e.position,p=o.get("order"),d=Jf(l,h,a,p,n.get("useUTC"),o.get("textStyle"));d&&u.unshift(d);var f="richText"===a?"\n\n":"<br/>",g=u.join(f);this._showOrMove(o,(function(){this._updateContentNotChangedOnAxis(t,s)?this._updatePosition(o,c,r[0],r[1],this._tooltipContent,s):this._showTooltipContent(o,g,s,Math.random()+"",r[0],r[1],c,null,h)}))},e.prototype._showSeriesItemTooltip=function(t,e,n){var i=this._ecModel,r=Hs(e),o=r.seriesIndex,a=i.getSeriesByIndex(o),s=r.dataModel||a,l=r.dataIndex,u=r.dataType,h=s.getData(u),c=this._renderMode,p=t.positionDefault,d=Zz([h.getItemModel(l),s,a&&(a.coordinateSystem||{}).model],this._tooltipModel,p?{position:p}:null),f=d.get("trigger");if(null==f||"item"===f){var g=s.getDataParams(l,u),y=new ig;g.marker=y.makeTooltipMarker("item",pp(g.color),c);var v=uf(s.formatTooltip(l,!1,u)),m=d.get("order"),x=d.get("valueFormatter"),_=v.frag,b=_?Jf(x?A({valueFormatter:x},_):_,y,c,m,i.get("useUTC"),d.get("textStyle")):v.text,w="item_"+s.name+"_"+l;this._showOrMove(d,(function(){this._showTooltipContent(d,b,g,w,t.offsetX,t.offsetY,t.position,t.target,y)})),n({type:"showTip",dataIndexInside:l,dataIndex:h.getRawIndex(l),seriesIndex:o,from:this.uid})}},e.prototype._showComponentItemTooltip=function(t,e,n){var i=Hs(e),r=i.tooltipConfig.option||{};if(X(r)){r={content:r,formatter:r}}var o=[r],a=this._ecModel.getComponent(i.componentMainType,i.componentIndex);a&&o.push(a),o.push({formatter:r.content});var s=t.positionDefault,l=Zz(o,this._tooltipModel,s?{position:s}:null),u=l.get("content"),h=Math.random()+"",c=new ig;this._showOrMove(l,(function(){var n=T(l.get("formatterParams")||{});this._showTooltipContent(l,u,n,h,t.offsetX,t.offsetY,t.position,e,c)})),n({type:"showTip",from:this.uid})},e.prototype._showTooltipContent=function(t,e,n,i,r,o,a,s,l){if(this._ticket="",t.get("showContent")&&t.get("show")){var u=this._tooltipContent;u.setEnterable(t.get("enterable"));var h=t.get("formatter");a=a||t.get("position");var c=e,p=this._getNearestPoint([r,o],n,t.get("trigger"),t.get("borderColor")).color;if(h)if(X(h)){var d=t.ecModel.get("useUTC"),f=Y(n)?n[0]:n;c=h,f&&f.axisType&&f.axisType.indexOf("time")>=0&&(c=Vc(f.axisValue,c,d)),c=hp(c,n,!0)}else if(U(h)){var g=W((function(e,i){e===this._ticket&&(u.setContent(i,l,t,p,a),this._updatePosition(t,a,r,o,u,n,s))}),this);this._ticket=i,c=h(n,i,g)}else c=h;u.setContent(c,l,t,p,a),u.show(t,p),this._updatePosition(t,a,r,o,u,n,s)}},e.prototype._getNearestPoint=function(t,e,n,i){return"axis"===n||Y(e)?{color:i||("html"===this._renderMode?"#fff":"none")}:Y(e)?void 0:{color:i||e.color||e.borderColor}},e.prototype._updatePosition=function(t,e,n,i,r,o,a){var s=this._api.getWidth(),l=this._api.getHeight();e=e||t.get("position");var u=r.getSize(),h=t.get("align"),c=t.get("verticalAlign"),p=a&&a.getBoundingRect().clone();if(a&&p.applyTransform(a.transform),U(e)&&(e=e([n,i],o,r.el,p,{viewSize:[s,l],contentSize:u.slice()})),Y(e))n=Er(e[0],s),i=Er(e[1],l);else if(q(e)){var d=e;d.width=u[0],d.height=u[1];var f=xp(d,{width:s,height:l});n=f.x,i=f.y,h=null,c=null}else if(X(e)&&a){var g=function(t,e,n,i){var r=n[0],o=n[1],a=Math.ceil(Math.SQRT2*i)+8,s=0,l=0,u=e.width,h=e.height;switch(t){case"inside":s=e.x+u/2-r/2,l=e.y+h/2-o/2;break;case"top":s=e.x+u/2-r/2,l=e.y-o-a;break;case"bottom":s=e.x+u/2-r/2,l=e.y+h+a;break;case"left":s=e.x-r-a,l=e.y+h/2-o/2;break;case"right":s=e.x+u+a,l=e.y+h/2-o/2}return[s,l]}(e,p,u,t.get("borderWidth"));n=g[0],i=g[1]}else{g=function(t,e,n,i,r,o,a){var s=n.getSize(),l=s[0],u=s[1];null!=o&&(t+l+o+2>i?t-=l+o:t+=o);null!=a&&(e+u+a>r?e-=u+a:e+=a);return[t,e]}(n,i,r,s,l,h?null:20,c?null:20);n=g[0],i=g[1]}if(h&&(n-=qz(h)?u[0]/2:"right"===h?u[0]:0),c&&(i-=qz(c)?u[1]/2:"bottom"===c?u[1]:0),kz(t)){g=function(t,e,n,i,r){var o=n.getSize(),a=o[0],s=o[1];return t=Math.min(t+a,i)-a,e=Math.min(e+s,r)-s,t=Math.max(t,0),e=Math.max(e,0),[t,e]}(n,i,r,s,l);n=g[0],i=g[1]}r.moveTo(n,i)},e.prototype._updateContentNotChangedOnAxis=function(t,e){var n=this._lastDataByCoordSys,i=this._cbParamsList,r=!!n&&n.length===t.length;return r&&E(n,(function(n,o){var a=n.dataByAxis||[],s=(t[o]||{}).dataByAxis||[];(r=r&&a.length===s.length)&&E(a,(function(t,n){var o=s[n]||{},a=t.seriesDataIndices||[],l=o.seriesDataIndices||[];(r=r&&t.value===o.value&&t.axisType===o.axisType&&t.axisId===o.axisId&&a.length===l.length)&&E(a,(function(t,e){var n=l[e];r=r&&t.seriesIndex===n.seriesIndex&&t.dataIndex===n.dataIndex})),i&&E(t.seriesDataIndices,(function(t){var n=t.seriesIndex,o=e[n],a=i[n];o&&a&&a.data!==o.data&&(r=!1)}))}))})),this._lastDataByCoordSys=t,this._cbParamsList=e,!!r},e.prototype._hide=function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},e.prototype.dispose=function(t,e){!r.node&&e.getDom()&&(kg(this,"_updatePosition"),this._tooltipContent.dispose(),QR("itemTooltip",e))},e.type="tooltip",e}(gg);function Zz(t,e,n){var i,r=e.ecModel;n?(i=new dc(n,r,r),i=new dc(e.option,i,r)):i=e;for(var o=t.length-1;o>=0;o--){var a=t[o];a&&(a instanceof dc&&(a=a.get("tooltip",!0)),X(a)&&(a={formatter:a}),a&&(i=new dc(a,i,r)))}return i}function jz(t,e){return t.dispatchAction||W(e.dispatchAction,e)}function qz(t){return"center"===t||"middle"===t}var Kz=["rect","polygon","keep","clear"];function $z(t,e){var n=ho(t?t.brush:[]);if(n.length){var i=[];E(n,(function(t){var e=t.hasOwnProperty("toolbox")?t.toolbox:[];e instanceof Array&&(i=i.concat(e))}));var r=t&&t.toolbox;Y(r)&&(r=r[0]),r||(r={feature:{}},t.toolbox=[r]);var o=r.feature||(r.feature={}),a=o.brush||(o.brush={}),s=a.type||(a.type=[]);s.push.apply(s,i),function(t){var e={};E(t,(function(t){e[t]=1})),t.length=0,E(e,(function(e,n){t.push(n)}))}(s),e&&!s.length&&s.push.apply(s,Kz)}}var Jz=E;function Qz(t){if(t)for(var e in t)if(t.hasOwnProperty(e))return!0}function tV(t,e,n){var i={};return Jz(e,(function(e){var r,o=i[e]=((r=function(){}).prototype.__hidden=r.prototype,new r);Jz(t[e],(function(t,i){if(iD.isValidType(i)){var r={type:i,visual:t};n&&n(r,e),o[i]=new iD(r),"opacity"===i&&((r=T(r)).type="colorAlpha",o.__hidden.__alphaForOpacity=new iD(r))}}))})),i}function eV(t,e,n){var i;E(n,(function(t){e.hasOwnProperty(t)&&Qz(e[t])&&(i=!0)})),i&&E(n,(function(n){e.hasOwnProperty(n)&&Qz(e[n])?t[n]=T(e[n]):delete t[n]}))}var nV={lineX:iV(0),lineY:iV(1),rect:{point:function(t,e,n){return t&&n.boundingRect.contain(t[0],t[1])},rect:function(t,e,n){return t&&n.boundingRect.intersect(t)}},polygon:{point:function(t,e,n){return t&&n.boundingRect.contain(t[0],t[1])&&y_(n.range,t[0],t[1])},rect:function(t,e,n){var i=n.range;if(!t||i.length<=1)return!1;var r=t.x,o=t.y,a=t.width,s=t.height,l=i[0];return!!(y_(i,r,o)||y_(i,r+a,o)||y_(i,r,o+s)||y_(i,r+a,o+s)||sr.create(t).contain(l[0],l[1])||Oh(r,o,r+a,o,i)||Oh(r,o,r,o+s,i)||Oh(r+a,o,r+a,o+s,i)||Oh(r,o+s,r+a,o+s,i))||void 0}}};function iV(t){var e=["x","y"],n=["width","height"];return{point:function(e,n,i){if(e){var r=i.range;return rV(e[t],r)}},rect:function(i,r,o){if(i){var a=o.range,s=[i[e[t]],i[e[t]]+i[n[t]]];return s[1]<s[0]&&s.reverse(),rV(s[0],a)||rV(s[1],a)||rV(a[0],s)||rV(a[1],s)}}}}function rV(t,e){return e[0]<=t&&t<=e[1]}var oV=["inBrush","outOfBrush"],aV="__ecBrushSelect",sV="__ecInBrushSelectEvent";function lV(t){t.eachComponent({mainType:"brush"},(function(e){(e.brushTargetManager=new cz(e.option,t)).setInputRanges(e.areas,t)}))}function uV(t,e,n){var i,r,o=[];t.eachComponent({mainType:"brush"},(function(t){n&&"takeGlobalCursor"===n.type&&t.setBrushOption("brush"===n.key?n.brushOption:{brushType:!1})})),lV(t),t.eachComponent({mainType:"brush"},(function(e,n){var a={brushId:e.id,brushIndex:n,brushName:e.name,areas:T(e.areas),selected:[]};o.push(a);var s=e.option,l=s.brushLink,u=[],h=[],c=[],p=!1;n||(i=s.throttleType,r=s.throttleDelay);var d=z(e.areas,(function(t){var e=pV[t.brushType],n=k({boundingRect:e?e(t):void 0},t);return n.selectors=function(t){var e=t.brushType,n={point:function(i){return nV[e].point(i,n,t)},rect:function(i){return nV[e].rect(i,n,t)}};return n}(n),n})),f=tV(e.option,oV,(function(t){t.mappingMethod="fixed"}));function g(t){return"all"===l||!!u[t]}function y(t){return!!t.length}Y(l)&&E(l,(function(t){u[t]=1})),t.eachSeries((function(n,i){var r=c[i]=[];"parallel"===n.subType?function(t,e){var n=t.coordinateSystem;p=p||n.hasAxisBrushed(),g(e)&&n.eachActiveState(t.getData(),(function(t,e){"active"===t&&(h[e]=1)}))}(n,i):function(n,i,r){if(!n.brushSelector||function(t,e){var n=t.option.seriesIndex;return null!=n&&"all"!==n&&(Y(n)?P(n,e)<0:e!==n)}(e,i))return;if(E(d,(function(i){e.brushTargetManager.controlSeries(i,n,t)&&r.push(i),p=p||y(r)})),g(i)&&y(r)){var o=n.getData();o.each((function(t){cV(n,r,o,t)&&(h[t]=1)}))}}(n,i,r)})),t.eachSeries((function(t,e){var n={seriesId:t.id,seriesIndex:e,seriesName:t.name,dataIndex:[]};a.selected.push(n);var i=c[e],r=t.getData(),o=g(e)?function(t){return h[t]?(n.dataIndex.push(r.getRawIndex(t)),"inBrush"):"outOfBrush"}:function(e){return cV(t,i,r,e)?(n.dataIndex.push(r.getRawIndex(e)),"inBrush"):"outOfBrush"};(g(e)?p:y(i))&&function(t,e,n,i,r,o){var a,s={};function l(t){return fy(n,a,t)}function u(t,e){yy(n,a,t,e)}function h(t,h){a=null==o?t:h;var c=n.getRawDataItem(a);if(!c||!1!==c.visualMap)for(var p=i.call(r,t),d=e[p],f=s[p],g=0,y=f.length;g<y;g++){var v=f[g];d[v]&&d[v].applyVisual(t,l,u)}}E(t,(function(t){var n=iD.prepareVisualTypes(e[t]);s[t]=n})),null==o?n.each(h):n.each([o],h)}(oV,f,r,o)}))})),function(t,e,n,i,r){if(!r)return;var o=t.getZr();if(o[sV])return;o.__ecBrushSelect||(o.__ecBrushSelect=hV);Ag(o,aV,n,e)(t,i)}(e,i,r,o,n)}function hV(t,e){if(!t.isDisposed()){var n=t.getZr();n[sV]=!0,t.dispatchAction({type:"brushSelect",batch:e}),n[sV]=!1}}function cV(t,e,n,i){for(var r=0,o=e.length;r<o;r++){var a=e[r];if(t.brushSelector(i,n,a.selectors,a))return!0}}var pV={rect:function(t){return dV(t.range)},polygon:function(t){for(var e,n=t.range,i=0,r=n.length;i<r;i++){e=e||[[1/0,-1/0],[1/0,-1/0]];var o=n[i];o[0]<e[0][0]&&(e[0][0]=o[0]),o[0]>e[0][1]&&(e[0][1]=o[0]),o[1]<e[1][0]&&(e[1][0]=o[1]),o[1]>e[1][1]&&(e[1][1]=o[1])}return e&&dV(e)}};function dV(t){return new sr(t[0][0],t[1][0],t[0][1]-t[0][0],t[1][1]-t[1][0])}var fV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){this.ecModel=t,this.api=e,this.model,(this._brushController=new Ok(e.getZr())).on("brush",W(this._onBrush,this)).mount()},e.prototype.render=function(t,e,n,i){this.model=t,this._updateController(t,e,n,i)},e.prototype.updateTransform=function(t,e,n,i){lV(e),this._updateController(t,e,n,i)},e.prototype.updateVisual=function(t,e,n,i){this.updateTransform(t,e,n,i)},e.prototype.updateView=function(t,e,n,i){this._updateController(t,e,n,i)},e.prototype._updateController=function(t,e,n,i){(!i||i.$from!==t.id)&&this._brushController.setPanels(t.brushTargetManager.makePanelOpts(n)).enableBrush(t.brushOption).updateCovers(t.areas.slice())},e.prototype.dispose=function(){this._brushController.dispose()},e.prototype._onBrush=function(t){var e=this.model.id,n=this.model.brushTargetManager.setOutputRanges(t.areas,this.ecModel);(!t.isEnd||t.removeOnClick)&&this.api.dispatchAction({type:"brush",brushId:e,areas:T(n),$from:e}),t.isEnd&&this.api.dispatchAction({type:"brushEnd",brushId:e,areas:T(n),$from:e})},e.type="brush",e}(gg),gV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.areas=[],n.brushOption={},n}return n(e,t),e.prototype.optionUpdated=function(t,e){var n=this.option;!e&&eV(n,t,["inBrush","outOfBrush"]);var i=n.inBrush=n.inBrush||{};n.outOfBrush=n.outOfBrush||{color:"#ddd"},i.hasOwnProperty("liftZ")||(i.liftZ=5)},e.prototype.setAreas=function(t){t&&(this.areas=z(t,(function(t){return yV(this.option,t)}),this))},e.prototype.setBrushOption=function(t){this.brushOption=yV(this.option,t),this.brushType=this.brushOption.brushType},e.type="brush",e.dependencies=["geo","grid","xAxis","yAxis","parallel","series"],e.defaultOption={seriesIndex:"all",brushType:"rect",brushMode:"single",transformable:!0,brushStyle:{borderWidth:1,color:"rgba(210,219,238,0.3)",borderColor:"#D2DBEE"},throttleType:"fixRate",throttleDelay:0,removeOnClick:!0,z:1e4},e}(Tp);function yV(t,e){return C({brushType:t.brushType,brushMode:t.brushMode,transformable:t.transformable,brushStyle:new dc(t.brushStyle).getItemStyle(),removeOnClick:t.removeOnClick,z:t.z},e,!0)}var vV=["rect","polygon","lineX","lineY","keep","clear"],mV=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n){var i,r,o;e.eachComponent({mainType:"brush"},(function(t){i=t.brushType,r=t.brushOption.brushMode||"single",o=o||!!t.areas.length})),this._brushType=i,this._brushMode=r,E(t.get("type",!0),(function(e){t.setIconStatus(e,("keep"===e?"multiple"===r:"clear"===e?o:e===i)?"emphasis":"normal")}))},e.prototype.updateView=function(t,e,n){this.render(t,e,n)},e.prototype.getIcons=function(){var t=this.model,e=t.get("icon",!0),n={};return E(t.get("type",!0),(function(t){e[t]&&(n[t]=e[t])})),n},e.prototype.onclick=function(t,e,n){var i=this._brushType,r=this._brushMode;"clear"===n?(e.dispatchAction({type:"axisAreaSelect",intervals:[]}),e.dispatchAction({type:"brush",command:"clear",areas:[]})):e.dispatchAction({type:"takeGlobalCursor",key:"brush",brushOption:{brushType:"keep"===n?i:i!==n&&n,brushMode:"keep"===n?"multiple"===r?"single":"multiple":r}})},e.getDefaultOption=function(t){return{show:!0,type:vV.slice(),icon:{rect:"M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13",polygon:"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2",lineX:"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4",lineY:"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4",keep:"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z",clear:"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2"},title:t.getLocaleModel().get(["toolbox","brush","title"])}},e}(GE);var xV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.layoutMode={type:"box",ignoreSize:!0},n}return n(e,t),e.type="title",e.defaultOption={z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bold",color:"#464646"},subtextStyle:{fontSize:12,color:"#6E7079"}},e}(Tp),_V=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){if(this.group.removeAll(),t.get("show")){var i=this.group,r=t.getModel("textStyle"),o=t.getModel("subtextStyle"),a=t.get("textAlign"),s=rt(t.get("textBaseline"),t.get("textVerticalAlign")),l=new ks({style:Uh(r,{text:t.get("text"),fill:r.getTextColor()},{disableBox:!0}),z2:10}),u=l.getBoundingRect(),h=t.get("subtext"),c=new ks({style:Uh(o,{text:h,fill:o.getTextColor(),y:u.height+t.get("itemGap"),verticalAlign:"top"},{disableBox:!0}),z2:10}),p=t.get("link"),d=t.get("sublink"),f=t.get("triggerEvent",!0);l.silent=!p&&!f,c.silent=!d&&!f,p&&l.on("click",(function(){dp(p,"_"+t.get("target"))})),d&&c.on("click",(function(){dp(d,"_"+t.get("subtarget"))})),Hs(l).eventData=Hs(c).eventData=f?{componentType:"title",componentIndex:t.componentIndex}:null,i.add(l),h&&i.add(c);var g=i.getBoundingRect(),y=t.getBoxLayoutParams();y.width=g.width,y.height=g.height;var v=xp(y,{width:n.getWidth(),height:n.getHeight()},t.get("padding"));a||("middle"===(a=t.get("left")||t.get("right"))&&(a="center"),"right"===a?v.x+=v.width:"center"===a&&(v.x+=v.width/2)),s||("center"===(s=t.get("top")||t.get("bottom"))&&(s="middle"),"bottom"===s?v.y+=v.height:"middle"===s&&(v.y+=v.height/2),s=s||"top"),i.x=v.x,i.y=v.y,i.markRedraw();var m={align:a,verticalAlign:s};l.setStyle(m),c.setStyle(m),g=i.getBoundingRect();var x=v.margin,_=t.getItemStyle(["color","opacity"]);_.fill=t.get("backgroundColor");var b=new Cs({shape:{x:g.x-x[3],y:g.y-x[0],width:g.width+x[1]+x[3],height:g.height+x[0]+x[2],r:t.get("borderRadius")},style:_,subPixelOptimize:!0,silent:!0});i.add(b)}},e.type="title",e}(gg);var bV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.layoutMode="box",n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n),this._initData()},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),this._initData()},e.prototype.setCurrentIndex=function(t){null==t&&(t=this.option.currentIndex);var e=this._data.count();this.option.loop?t=(t%e+e)%e:(t>=e&&(t=e-1),t<0&&(t=0)),this.option.currentIndex=t},e.prototype.getCurrentIndex=function(){return this.option.currentIndex},e.prototype.isIndexMax=function(){return this.getCurrentIndex()>=this._data.count()-1},e.prototype.setPlayState=function(t){this.option.autoPlay=!!t},e.prototype.getPlayState=function(){return!!this.option.autoPlay},e.prototype._initData=function(){var t,e=this.option,n=e.data||[],i=e.axisType,r=this._names=[];"category"===i?(t=[],E(n,(function(e,n){var i,o=xo(fo(e),"");q(e)?(i=T(e)).value=n:i=n,t.push(i),r.push(o)}))):t=n;var o={category:"ordinal",time:"time",value:"number"}[i]||"number";(this._data=new qm([{name:"value",type:o}],this)).initData(t,r)},e.prototype.getData=function(){return this._data},e.prototype.getCategories=function(){if("category"===this.get("axisType"))return this._names.slice()},e.type="timeline",e.defaultOption={z:4,show:!0,axisType:"time",realtime:!0,left:"20%",top:null,right:"20%",bottom:0,width:null,height:40,padding:5,controlPosition:"left",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{},label:{color:"#000"},data:[]},e}(Tp),wV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="timeline.slider",e.defaultOption=yc(bV.defaultOption,{backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,orient:"horizontal",inverse:!1,tooltip:{trigger:"item"},symbol:"circle",symbolSize:12,lineStyle:{show:!0,width:2,color:"#DAE1F5"},label:{position:"auto",show:!0,interval:"auto",rotate:0,color:"#A4B1D7"},itemStyle:{color:"#A4B1D7",borderWidth:1},checkpointStyle:{symbol:"circle",symbolSize:15,color:"#316bf3",borderColor:"#fff",borderWidth:2,shadowBlur:2,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0, 0, 0, 0.3)",animation:!0,animationDuration:300,animationEasing:"quinticInOut"},controlStyle:{show:!0,showPlayBtn:!0,showPrevBtn:!0,showNextBtn:!0,itemSize:24,itemGap:12,position:"left",playIcon:"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z",stopIcon:"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z",nextIcon:"M2,18.5A1.52,1.52,0,0,1,.92,18a1.49,1.49,0,0,1,0-2.12L7.81,9.36,1,3.11A1.5,1.5,0,1,1,3,.89l8,7.34a1.48,1.48,0,0,1,.49,1.09,1.51,1.51,0,0,1-.46,1.1L3,18.08A1.5,1.5,0,0,1,2,18.5Z",prevIcon:"M10,.5A1.52,1.52,0,0,1,11.08,1a1.49,1.49,0,0,1,0,2.12L4.19,9.64,11,15.89a1.5,1.5,0,1,1-2,2.22L1,10.77A1.48,1.48,0,0,1,.5,9.68,1.51,1.51,0,0,1,1,8.58L9,.92A1.5,1.5,0,0,1,10,.5Z",prevBtnSize:18,nextBtnSize:18,color:"#A4B1D7",borderColor:"#A4B1D7",borderWidth:1},emphasis:{label:{show:!0,color:"#6f778d"},itemStyle:{color:"#316BF3"},controlStyle:{color:"#316BF3",borderColor:"#316BF3",borderWidth:2}},progress:{lineStyle:{color:"#316BF3"},itemStyle:{color:"#316BF3"},label:{color:"#6f778d"}},data:[]}),e}(bV);R(wV,lf.prototype);var SV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="timeline",e}(gg),MV=function(t){function e(e,n,i,r){var o=t.call(this,e,n,i)||this;return o.type=r||"value",o}return n(e,t),e.prototype.getLabelModel=function(){return this.model.getModel("label")},e.prototype.isHorizontal=function(){return"horizontal"===this.model.get("orient")},e}(H_),IV=Math.PI,TV=So(),CV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){this.api=e},e.prototype.render=function(t,e,n){if(this.model=t,this.api=n,this.ecModel=e,this.group.removeAll(),t.get("show",!0)){var i=this._layout(t,n),r=this._createGroup("_mainGroup"),o=this._createGroup("_labelGroup"),a=this._axis=this._createAxis(i,t);t.formatTooltip=function(t){return Xf("nameValue",{noName:!0,value:a.scale.getLabel({value:t})})},E(["AxisLine","AxisTick","Control","CurrentPointer"],(function(e){this["_render"+e](i,r,a,t)}),this),this._renderAxisLabel(i,o,a,t),this._position(i,t)}this._doPlayStop(),this._updateTicksStatus()},e.prototype.remove=function(){this._clearTimer(),this.group.removeAll()},e.prototype.dispose=function(){this._clearTimer()},e.prototype._layout=function(t,e){var n,i,r,o,a=t.get(["label","position"]),s=t.get("orient"),l=function(t,e){return xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()},t.get("padding"))}(t,e),u={horizontal:"center",vertical:(n=null==a||"auto"===a?"horizontal"===s?l.y+l.height/2<e.getHeight()/2?"-":"+":l.x+l.width/2<e.getWidth()/2?"+":"-":X(a)?{horizontal:{top:"-",bottom:"+"},vertical:{left:"-",right:"+"}}[s][a]:a)>=0||"+"===n?"left":"right"},h={horizontal:n>=0||"+"===n?"top":"bottom",vertical:"middle"},c={horizontal:0,vertical:IV/2},p="vertical"===s?l.height:l.width,d=t.getModel("controlStyle"),f=d.get("show",!0),g=f?d.get("itemSize"):0,y=f?d.get("itemGap"):0,v=g+y,m=t.get(["label","rotate"])||0;m=m*IV/180;var x=d.get("position",!0),_=f&&d.get("showPlayBtn",!0),b=f&&d.get("showPrevBtn",!0),w=f&&d.get("showNextBtn",!0),S=0,M=p;"left"===x||"bottom"===x?(_&&(i=[0,0],S+=v),b&&(r=[S,0],S+=v),w&&(o=[M-g,0],M-=v)):(_&&(i=[M-g,0],M-=v),b&&(r=[0,0],S+=v),w&&(o=[M-g,0],M-=v));var I=[S,M];return t.get("inverse")&&I.reverse(),{viewRect:l,mainLength:p,orient:s,rotation:c[s],labelRotation:m,labelPosOpt:n,labelAlign:t.get(["label","align"])||u[s],labelBaseline:t.get(["label","verticalAlign"])||t.get(["label","baseline"])||h[s],playPosition:i,prevBtnPosition:r,nextBtnPosition:o,axisExtent:I,controlSize:g,controlGap:y}},e.prototype._position=function(t,e){var n=this._mainGroup,i=this._labelGroup,r=t.viewRect;if("vertical"===t.orient){var o=[1,0,0,1,0,0],a=r.x,s=r.y+r.height;Ei(o,o,[-a,-s]),zi(o,o,-IV/2),Ei(o,o,[a,s]),(r=r.clone()).applyTransform(o)}var l=y(r),u=y(n.getBoundingRect()),h=y(i.getBoundingRect()),c=[n.x,n.y],p=[i.x,i.y];p[0]=c[0]=l[0][0];var d,f=t.labelPosOpt;null==f||X(f)?(v(c,u,l,1,d="+"===f?0:1),v(p,h,l,1,1-d)):(v(c,u,l,1,d=f>=0?0:1),p[1]=c[1]+f);function g(t){t.originX=l[0][0]-t.x,t.originY=l[1][0]-t.y}function y(t){return[[t.x,t.x+t.width],[t.y,t.y+t.height]]}function v(t,e,n,i,r){t[i]+=n[i][r]-e[i][r]}n.setPosition(c),i.setPosition(p),n.rotation=i.rotation=t.rotation,g(n),g(i)},e.prototype._createAxis=function(t,e){var n=e.getData(),i=e.get("axisType"),r=function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new vx({ordinalMeta:t.getCategories(),extent:[1/0,-1/0]});case"time":return new Rx({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new xx}}(e,i);r.getTicks=function(){return n.mapArray(["value"],(function(t){return{value:t}}))};var o=n.getDataExtent("value");r.setExtent(o[0],o[1]),r.calcNiceTicks();var a=new MV("value",r,t.axisExtent,i);return a.model=e,a},e.prototype._createGroup=function(t){var e=this[t]=new Cr;return this.group.add(e),e},e.prototype._renderAxisLine=function(t,e,n,i){var r=n.getExtent();if(i.get(["lineStyle","show"])){var o=new zu({shape:{x1:r[0],y1:0,x2:r[1],y2:0},style:A({lineCap:"round"},i.getModel("lineStyle").getLineStyle()),silent:!0,z2:1});e.add(o);var a=this._progressLine=new zu({shape:{x1:r[0],x2:this._currentPointer?this._currentPointer.x:r[0],y1:0,y2:0},style:k({lineCap:"round",lineWidth:o.style.lineWidth},i.getModel(["progress","lineStyle"]).getLineStyle()),silent:!0,z2:1});e.add(a)}},e.prototype._renderAxisTick=function(t,e,n,i){var r=this,o=i.getData(),a=n.scale.getTicks();this._tickSymbols=[],E(a,(function(t){var a=n.dataToCoord(t.value),s=o.getItemModel(t.value),l=s.getModel("itemStyle"),u=s.getModel(["emphasis","itemStyle"]),h=s.getModel(["progress","itemStyle"]),c={x:a,y:0,onclick:W(r._changeTimeline,r,t.value)},p=DV(s,l,e,c);p.ensureState("emphasis").style=u.getItemStyle(),p.ensureState("progress").style=h.getItemStyle(),Ol(p);var d=Hs(p);s.get("tooltip")?(d.dataIndex=t.value,d.dataModel=i):d.dataIndex=d.dataModel=null,r._tickSymbols.push(p)}))},e.prototype._renderAxisLabel=function(t,e,n,i){var r=this;if(n.getLabelModel().get("show")){var o=i.getData(),a=n.getViewLabels();this._tickLabels=[],E(a,(function(i){var a=i.tickValue,s=o.getItemModel(a),l=s.getModel("label"),u=s.getModel(["emphasis","label"]),h=s.getModel(["progress","label"]),c=n.dataToCoord(i.tickValue),p=new ks({x:c,y:0,rotation:t.labelRotation-t.rotation,onclick:W(r._changeTimeline,r,a),silent:!1,style:Uh(l,{text:i.formattedLabel,align:t.labelAlign,verticalAlign:t.labelBaseline})});p.ensureState("emphasis").style=Uh(u),p.ensureState("progress").style=Uh(h),e.add(p),Ol(p),TV(p).dataIndex=a,r._tickLabels.push(p)}))}},e.prototype._renderControl=function(t,e,n,i){var r=t.controlSize,o=t.rotation,a=i.getModel("controlStyle").getItemStyle(),s=i.getModel(["emphasis","controlStyle"]).getItemStyle(),l=i.getPlayState(),u=i.get("inverse",!0);function h(t,n,l,u){if(t){var h=gr(rt(i.get(["controlStyle",n+"BtnSize"]),r),r),c=function(t,e,n,i){var r=i.style,o=Ph(t.get(["controlStyle",e]),i||{},new sr(n[0],n[1],n[2],n[3]));r&&o.setStyle(r);return o}(i,n+"Icon",[0,-h/2,h,h],{x:t[0],y:t[1],originX:r/2,originY:0,rotation:u?-o:0,rectHover:!0,style:a,onclick:l});c.ensureState("emphasis").style=s,e.add(c),Ol(c)}}h(t.nextBtnPosition,"next",W(this._changeTimeline,this,u?"-":"+")),h(t.prevBtnPosition,"prev",W(this._changeTimeline,this,u?"+":"-")),h(t.playPosition,l?"stop":"play",W(this._handlePlayClick,this,!l),!0)},e.prototype._renderCurrentPointer=function(t,e,n,i){var r=i.getData(),o=i.getCurrentIndex(),a=r.getItemModel(o).getModel("checkpointStyle"),s=this,l={onCreate:function(t){t.draggable=!0,t.drift=W(s._handlePointerDrag,s),t.ondragend=W(s._handlePointerDragend,s),AV(t,s._progressLine,o,n,i,!0)},onUpdate:function(t){AV(t,s._progressLine,o,n,i)}};this._currentPointer=DV(a,a,this._mainGroup,{},this._currentPointer,l)},e.prototype._handlePlayClick=function(t){this._clearTimer(),this.api.dispatchAction({type:"timelinePlayChange",playState:t,from:this.uid})},e.prototype._handlePointerDrag=function(t,e,n){this._clearTimer(),this._pointerChangeTimeline([n.offsetX,n.offsetY])},e.prototype._handlePointerDragend=function(t){this._pointerChangeTimeline([t.offsetX,t.offsetY],!0)},e.prototype._pointerChangeTimeline=function(t,e){var n=this._toAxisCoord(t)[0],i=Vr(this._axis.getExtent().slice());n>i[1]&&(n=i[1]),n<i[0]&&(n=i[0]),this._currentPointer.x=n,this._currentPointer.markRedraw(),this._progressLine.shape.x2=n,this._progressLine.dirty();var r=this._findNearestTick(n),o=this.model;(e||r!==o.getCurrentIndex()&&o.get("realtime"))&&this._changeTimeline(r)},e.prototype._doPlayStop=function(){var t=this;this._clearTimer(),this.model.getPlayState()&&(this._timer=setTimeout((function(){var e=t.model;t._changeTimeline(e.getCurrentIndex()+(e.get("rewind",!0)?-1:1))}),this.model.get("playInterval")))},e.prototype._toAxisCoord=function(t){return Th(t,this._mainGroup.getLocalTransform(),!0)},e.prototype._findNearestTick=function(t){var e,n=this.model.getData(),i=1/0,r=this._axis;return n.each(["value"],(function(n,o){var a=r.dataToCoord(n),s=Math.abs(a-t);s<i&&(i=s,e=o)})),e},e.prototype._clearTimer=function(){this._timer&&(clearTimeout(this._timer),this._timer=null)},e.prototype._changeTimeline=function(t){var e=this.model.getCurrentIndex();"+"===t?t=e+1:"-"===t&&(t=e-1),this.api.dispatchAction({type:"timelineChange",currentIndex:t,from:this.uid})},e.prototype._updateTicksStatus=function(){var t=this.model.getCurrentIndex(),e=this._tickSymbols,n=this._tickLabels;if(e)for(var i=0;i<e.length;i++)e&&e[i]&&e[i].toggleState("progress",i<t);if(n)for(i=0;i<n.length;i++)n&&n[i]&&n[i].toggleState("progress",TV(n[i]).dataIndex<=t)},e.type="timeline.slider",e}(SV);function DV(t,e,n,i,r,o){var a=e.get("color");r?(r.setColor(a),n.add(r),o&&o.onUpdate(r)):((r=Ly(t.get("symbol"),-1,-1,2,2,a)).setStyle("strokeNoScale",!0),n.add(r),o&&o.onCreate(r));var s=e.getItemStyle(["color"]);r.setStyle(s),i=C({rectHover:!0,z2:100},i,!0);var l=Py(t.get("symbolSize"));i.scaleX=l[0]/2,i.scaleY=l[1]/2;var u=Oy(t.get("symbolOffset"),l);u&&(i.x=(i.x||0)+u[0],i.y=(i.y||0)+u[1]);var h=t.get("symbolRotate");return i.rotation=(h||0)*Math.PI/180||0,r.attr(i),r.updateTransform(),r}function AV(t,e,n,i,r,o){if(!t.dragging){var a=r.getModel("checkpointStyle"),s=i.dataToCoord(r.getData().get("value",n));if(o||!a.get("animation",!0))t.attr({x:s,y:0}),e&&e.attr({shape:{x2:s}});else{var l={duration:a.get("animationDuration",!0),easing:a.get("animationEasing",!0)};t.stopAnimation(null,!0),t.animateTo({x:s,y:0},l),e&&e.animateTo({shape:{x2:s}},l)}}}function kV(t){var e=t&&t.timeline;Y(e)||(e=e?[e]:[]),E(e,(function(t){t&&function(t){var e=t.type,n={number:"value",time:"time"};n[e]&&(t.axisType=n[e],delete t.type);if(LV(t),PV(t,"controlPosition")){var i=t.controlStyle||(t.controlStyle={});PV(i,"position")||(i.position=t.controlPosition),"none"!==i.position||PV(i,"show")||(i.show=!1,delete i.position),delete t.controlPosition}E(t.data||[],(function(t){q(t)&&!Y(t)&&(!PV(t,"value")&&PV(t,"name")&&(t.value=t.name),LV(t))}))}(t)}))}function LV(t){var e=t.itemStyle||(t.itemStyle={}),n=e.emphasis||(e.emphasis={}),i=t.label||t.label||{},r=i.normal||(i.normal={}),o={normal:1,emphasis:1};E(i,(function(t,e){o[e]||PV(r,e)||(r[e]=t)})),n.label&&!PV(i,"emphasis")&&(i.emphasis=n.label,delete n.label)}function PV(t,e){return t.hasOwnProperty(e)}function OV(t,e){if(!t)return!1;for(var n=Y(t)?t:[t],i=0;i<n.length;i++)if(n[i]&&n[i][e])return!0;return!1}function RV(t){co(t,"label",["show"])}var NV=So(),EV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.createdBySelf=!1,n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n),this._mergeOption(t,n,!1,!0)},e.prototype.isAnimationEnabled=function(){if(r.node)return!1;var t=this.__hostSeries;return this.getShallow("animation")&&t&&t.isAnimationEnabled()},e.prototype.mergeOption=function(t,e){this._mergeOption(t,e,!1,!1)},e.prototype._mergeOption=function(t,e,n,i){var r=this.mainType;n||e.eachSeries((function(t){var n=t.get(this.mainType,!0),o=NV(t)[r];n&&n.data?(o?o._mergeOption(n,e,!0):(i&&RV(n),E(n.data,(function(t){t instanceof Array?(RV(t[0]),RV(t[1])):RV(t)})),A(o=this.createMarkerModelFromSeries(n,this,e),{mainType:this.mainType,seriesIndex:t.seriesIndex,name:t.name,createdBySelf:!0}),o.__hostSeries=t),NV(t)[r]=o):NV(t)[r]=null}),this)},e.prototype.formatTooltip=function(t,e,n){var i=this.getData(),r=this.getRawValue(t),o=i.getName(t);return Xf("section",{header:this.name,blocks:[Xf("nameValue",{name:o,value:r,noName:!o,noValue:null==r})]})},e.prototype.getData=function(){return this._data},e.prototype.setData=function(t){this._data=t},e.getMarkerModelFromSeries=function(t,e){return NV(t)[e]},e.type="marker",e.dependencies=["series","grid","polar","geo"],e}(Tp);R(EV,lf.prototype);var zV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.createMarkerModelFromSeries=function(t,n,i){return new e(t,n,i)},e.type="markPoint",e.defaultOption={z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{show:!0,position:"inside"},itemStyle:{borderWidth:2},emphasis:{label:{show:!0}}},e}(EV);function VV(t){return!(isNaN(parseFloat(t.x))&&isNaN(parseFloat(t.y)))}function BV(t,e,n,i,r,o){var a=[],s=nx(e,i)?e.getCalculationInfo("stackResultDimension"):i,l=UV(e,s,t),u=e.indicesOfNearest(s,l)[0];a[r]=e.get(n,u),a[o]=e.get(s,u);var h=e.get(i,u),c=Br(e.get(i,u));return(c=Math.min(c,20))>=0&&(a[o]=+a[o].toFixed(c)),[a,h]}var FV={min:H(BV,"min"),max:H(BV,"max"),average:H(BV,"average"),median:H(BV,"median")};function GV(t,e){var n=t.getData(),i=t.coordinateSystem;if(e&&!function(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}(e)&&!Y(e.coord)&&i){var r=i.dimensions,o=WV(e,n,i,t);if((e=T(e)).type&&FV[e.type]&&o.baseAxis&&o.valueAxis){var a=P(r,o.baseAxis.dim),s=P(r,o.valueAxis.dim),l=FV[e.type](n,o.baseDataDim,o.valueDataDim,a,s);e.coord=l[0],e.value=l[1]}else{for(var u=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],h=0;h<2;h++)FV[u[h]]&&(u[h]=UV(n,n.mapDimension(r[h]),u[h]));e.coord=u}}return e}function WV(t,e,n,i){var r={};return null!=t.valueIndex||null!=t.valueDim?(r.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,r.valueAxis=n.getAxis(function(t,e){var n=t.getData().getDimensionInfo(e);return n&&n.coordDim}(i,r.valueDataDim)),r.baseAxis=n.getOtherAxis(r.valueAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim)):(r.baseAxis=i.getBaseAxis(),r.valueAxis=n.getOtherAxis(r.baseAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim),r.valueDataDim=e.mapDimension(r.valueAxis.dim)),r}function HV(t,e){return!(t&&t.containData&&e.coord&&!VV(e))||t.containData(e.coord)}function YV(t,e){return t?function(t,n,i,r){return df(r<2?t.coord&&t.coord[r]:t.value,e[r])}:function(t,n,i,r){return df(t.value,e[r])}}function UV(t,e,n){if("average"===n){var i=0,r=0;return t.each(e,(function(t,e){isNaN(t)||(i+=t,r++)})),i/r}return"median"===n?t.getMedian(e):t.getDataExtent(e)["max"===n?1:0]}var XV=So(),ZV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){this.markerGroupMap=ft()},e.prototype.render=function(t,e,n){var i=this,r=this.markerGroupMap;r.each((function(t){XV(t).keep=!1})),e.eachSeries((function(t){var r=EV.getMarkerModelFromSeries(t,i.type);r&&i.renderSeries(t,r,e,n)})),r.each((function(t){!XV(t).keep&&i.group.remove(t.group)}))},e.prototype.markKeep=function(t){XV(t).keep=!0},e.prototype.toggleBlurSeries=function(t,e){var n=this;E(t,(function(t){var i=EV.getMarkerModelFromSeries(t,n.type);i&&i.getData().eachItemGraphicEl((function(t){t&&(e?wl(t):Sl(t))}))}))},e.type="marker",e}(gg);function jV(t,e,n){var i=e.coordinateSystem;t.each((function(r){var o,a=t.getItemModel(r),s=Er(a.get("x"),n.getWidth()),l=Er(a.get("y"),n.getHeight());if(isNaN(s)||isNaN(l)){if(e.getMarkerPosition)o=e.getMarkerPosition(t.getValues(t.dimensions,r));else if(i){var u=t.get(i.dimensions[0],r),h=t.get(i.dimensions[1],r);o=i.dataToPoint([u,h])}}else o=[s,l];isNaN(s)||(o[0]=s),isNaN(l)||(o[1]=l),t.setItemLayout(r,o)}))}var qV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=EV.getMarkerModelFromSeries(t,"markPoint");e&&(jV(e.getData(),t,n),this.markerGroupMap.get(t.id).updateLayout())}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new qw),u=function(t,e,n){var i;i=t?z(t&&t.dimensions,(function(t){return A(A({},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{}),{name:t,ordinalMeta:null})})):[{name:"value",type:"float"}];var r=new qm(i,n),o=z(n.get("data"),H(GV,e));t&&(o=B(o,H(HV,t)));var a=YV(!!t,i);return r.initData(o,null,a),r}(r,t,e);e.setData(u),jV(e.getData(),t,i),u.each((function(t){var n=u.getItemModel(t),i=n.getShallow("symbol"),r=n.getShallow("symbolSize"),o=n.getShallow("symbolRotate"),s=n.getShallow("symbolOffset"),l=n.getShallow("symbolKeepAspect");if(U(i)||U(r)||U(o)||U(s)){var h=e.getRawValue(t),c=e.getDataParams(t);U(i)&&(i=i(h,c)),U(r)&&(r=r(h,c)),U(o)&&(o=o(h,c)),U(s)&&(s=s(h,c))}var p=n.getModel("itemStyle").getItemStyle(),d=gy(a,"color");p.fill||(p.fill=d),u.setItemVisual(t,{symbol:i,symbolSize:r,symbolRotate:o,symbolOffset:s,symbolKeepAspect:l,style:p})})),l.updateData(u),this.group.add(l.group),u.eachItemGraphicEl((function(t){t.traverse((function(t){Hs(t).dataModel=e}))})),this.markKeep(l),l.group.silent=e.get("silent")||t.get("silent")},e.type="markPoint",e}(ZV);var KV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.createMarkerModelFromSeries=function(t,n,i){return new e(t,n,i)},e.type="markLine",e.defaultOption={z:5,symbol:["circle","arrow"],symbolSize:[8,16],symbolOffset:0,precision:2,tooltip:{trigger:"item"},label:{show:!0,position:"end",distance:5},lineStyle:{type:"dashed"},emphasis:{label:{show:!0},lineStyle:{width:3}},animationEasing:"linear"},e}(EV),$V=So(),JV=function(t,e,n,i){var r,o=t.getData();if(Y(i))r=i;else{var a=i.type;if("min"===a||"max"===a||"average"===a||"median"===a||null!=i.xAxis||null!=i.yAxis){var s=void 0,l=void 0;if(null!=i.yAxis||null!=i.xAxis)s=e.getAxis(null!=i.yAxis?"y":"x"),l=it(i.yAxis,i.xAxis);else{var u=WV(i,o,e,t);s=u.valueAxis,l=UV(o,ix(o,u.valueDataDim),a)}var h="x"===s.dim?0:1,c=1-h,p=T(i),d={coord:[]};p.type=null,p.coord=[],p.coord[c]=-1/0,d.coord[c]=1/0;var f=n.get("precision");f>=0&&j(l)&&(l=+l.toFixed(Math.min(f,20))),p.coord[h]=d.coord[h]=l,r=[p,d,{type:a,valueIndex:i.valueIndex,value:l}]}else r=[]}var g=[GV(t,r[0]),GV(t,r[1]),A({},r[2])];return g[2].type=g[2].type||null,C(g[2],g[0]),C(g[2],g[1]),g};function QV(t){return!isNaN(t)&&!isFinite(t)}function tB(t,e,n,i){var r=1-t,o=i.dimensions[t];return QV(e[r])&&QV(n[r])&&e[t]===n[t]&&i.getAxis(o).containData(e[t])}function eB(t,e){if("cartesian2d"===t.type){var n=e[0].coord,i=e[1].coord;if(n&&i&&(tB(1,n,i,t)||tB(0,n,i,t)))return!0}return HV(t,e[0])&&HV(t,e[1])}function nB(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=Er(s.get("x"),r.getWidth()),u=Er(s.get("y"),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition)o=i.getMarkerPosition(t.getValues(t.dimensions,e));else{var h=a.dimensions,c=t.get(h[0],e),p=t.get(h[1],e);o=a.dataToPoint([c,p])}if(uS(a,"cartesian2d")){var d=a.getAxis("x"),f=a.getAxis("y");h=a.dimensions;QV(t.get(h[0],e))?o[0]=d.toGlobalCoord(d.getExtent()[n?0:1]):QV(t.get(h[1],e))&&(o[1]=f.toGlobalCoord(f.getExtent()[n?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];t.setItemLayout(e,o)}var iB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=EV.getMarkerModelFromSeries(t,"markLine");if(e){var i=e.getData(),r=$V(e).from,o=$V(e).to;r.each((function(e){nB(r,e,!0,t,n),nB(o,e,!1,t,n)})),i.each((function(t){i.setItemLayout(t,[r.getItemLayout(t),o.getItemLayout(t)])})),this.markerGroupMap.get(t.id).updateLayout()}}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new gA);this.group.add(l.group);var u=function(t,e,n){var i;i=t?z(t&&t.dimensions,(function(t){return A(A({},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{}),{name:t,ordinalMeta:null})})):[{name:"value",type:"float"}];var r=new qm(i,n),o=new qm(i,n),a=new qm([],n),s=z(n.get("data"),H(JV,e,t,n));t&&(s=B(s,H(eB,t)));var l=YV(!!t,i);return r.initData(z(s,(function(t){return t[0]})),null,l),o.initData(z(s,(function(t){return t[1]})),null,l),a.initData(z(s,(function(t){return t[2]}))),a.hasItemOption=!0,{from:r,to:o,line:a}}(r,t,e),h=u.from,c=u.to,p=u.line;$V(e).from=h,$V(e).to=c,e.setData(p);var d=e.get("symbol"),f=e.get("symbolSize"),g=e.get("symbolRotate"),y=e.get("symbolOffset");function v(e,n,r){var o=e.getItemModel(n);nB(e,n,r,t,i);var s=o.getModel("itemStyle").getItemStyle();null==s.fill&&(s.fill=gy(a,"color")),e.setItemVisual(n,{symbolKeepAspect:o.get("symbolKeepAspect"),symbolOffset:rt(o.get("symbolOffset",!0),y[r?0:1]),symbolRotate:rt(o.get("symbolRotate",!0),g[r?0:1]),symbolSize:rt(o.get("symbolSize"),f[r?0:1]),symbol:rt(o.get("symbol",!0),d[r?0:1]),style:s})}Y(d)||(d=[d,d]),Y(f)||(f=[f,f]),Y(g)||(g=[g,g]),Y(y)||(y=[y,y]),u.from.each((function(t){v(h,t,!0),v(c,t,!1)})),p.each((function(t){var e=p.getItemModel(t).getModel("lineStyle").getLineStyle();p.setItemLayout(t,[h.getItemLayout(t),c.getItemLayout(t)]),null==e.stroke&&(e.stroke=h.getItemVisual(t,"style").fill),p.setItemVisual(t,{fromSymbolKeepAspect:h.getItemVisual(t,"symbolKeepAspect"),fromSymbolOffset:h.getItemVisual(t,"symbolOffset"),fromSymbolRotate:h.getItemVisual(t,"symbolRotate"),fromSymbolSize:h.getItemVisual(t,"symbolSize"),fromSymbol:h.getItemVisual(t,"symbol"),toSymbolKeepAspect:c.getItemVisual(t,"symbolKeepAspect"),toSymbolOffset:c.getItemVisual(t,"symbolOffset"),toSymbolRotate:c.getItemVisual(t,"symbolRotate"),toSymbolSize:c.getItemVisual(t,"symbolSize"),toSymbol:c.getItemVisual(t,"symbol"),style:e})})),l.updateData(p),u.line.eachItemGraphicEl((function(t){Hs(t).dataModel=e,t.traverse((function(t){Hs(t).dataModel=e}))})),this.markKeep(l),l.group.silent=e.get("silent")||t.get("silent")},e.type="markLine",e}(ZV);var rB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.createMarkerModelFromSeries=function(t,n,i){return new e(t,n,i)},e.type="markArea",e.defaultOption={z:1,tooltip:{trigger:"item"},animation:!1,label:{show:!0,position:"top"},itemStyle:{borderWidth:0},emphasis:{label:{show:!0,position:"top"}}},e}(EV),oB=So(),aB=function(t,e,n,i){var r=GV(t,i[0]),o=GV(t,i[1]),a=r.coord,s=o.coord;a[0]=it(a[0],-1/0),a[1]=it(a[1],-1/0),s[0]=it(s[0],1/0),s[1]=it(s[1],1/0);var l=D([{},r,o]);return l.coord=[r.coord,o.coord],l.x0=r.x,l.y0=r.y,l.x1=o.x,l.y1=o.y,l};function sB(t){return!isNaN(t)&&!isFinite(t)}function lB(t,e,n,i){var r=1-t;return sB(e[r])&&sB(n[r])}function uB(t,e){var n=e.coord[0],i=e.coord[1],r={coord:n,x:e.x0,y:e.y0},o={coord:i,x:e.x1,y:e.y1};return uS(t,"cartesian2d")?!(!n||!i||!lB(1,n,i)&&!lB(0,n,i))||function(t,e,n){return!(t&&t.containZone&&e.coord&&n.coord&&!VV(e)&&!VV(n))||t.containZone(e.coord,n.coord)}(t,r,o):HV(t,r)||HV(t,o)}function hB(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=Er(s.get(n[0]),r.getWidth()),u=Er(s.get(n[1]),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition)o=i.getMarkerPosition(t.getValues(n,e));else{var h=[d=t.get(n[0],e),f=t.get(n[1],e)];a.clampData&&a.clampData(h,h),o=a.dataToPoint(h,!0)}if(uS(a,"cartesian2d")){var c=a.getAxis("x"),p=a.getAxis("y"),d=t.get(n[0],e),f=t.get(n[1],e);sB(d)?o[0]=c.toGlobalCoord(c.getExtent()["x0"===n[0]?0:1]):sB(f)&&(o[1]=p.toGlobalCoord(p.getExtent()["y0"===n[1]?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];return o}var cB=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]],pB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=EV.getMarkerModelFromSeries(t,"markArea");if(e){var i=e.getData();i.each((function(e){var r=z(cB,(function(r){return hB(i,e,r,t,n)}));i.setItemLayout(e,r),i.getItemGraphicEl(e).setShape("points",r)}))}}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,{group:new Cr});this.group.add(l.group),this.markKeep(l);var u=function(t,e,n){var i,r,o=["x0","y0","x1","y1"];if(t){var a=z(t&&t.dimensions,(function(t){var n=e.getData();return A(A({},n.getDimensionInfo(n.mapDimension(t))||{}),{name:t,ordinalMeta:null})}));r=z(o,(function(t,e){return{name:t,type:a[e%2].type}})),i=new qm(r,n)}else i=new qm(r=[{name:"value",type:"float"}],n);var s=z(n.get("data"),H(aB,e,t,n));t&&(s=B(s,H(uB,t)));var l=t?function(t,e,n,i){return df(t.coord[Math.floor(i/2)][i%2],r[i])}:function(t,e,n,i){return df(t.value,r[i])};return i.initData(s,null,l),i.hasItemOption=!0,i}(r,t,e);e.setData(u),u.each((function(e){var n=z(cB,(function(n){return hB(u,e,n,t,i)})),o=r.getAxis("x").scale,s=r.getAxis("y").scale,l=o.getExtent(),h=s.getExtent(),c=[o.parse(u.get("x0",e)),o.parse(u.get("x1",e))],p=[s.parse(u.get("y0",e)),s.parse(u.get("y1",e))];Vr(c),Vr(p);var d=!!(l[0]>c[1]||l[1]<c[0]||h[0]>p[1]||h[1]<p[0]);u.setItemLayout(e,{points:n,allClipped:d});var f=u.getItemModel(e).getModel("itemStyle").getItemStyle(),g=gy(a,"color");f.fill||(f.fill=g,X(f.fill)&&(f.fill=An(f.fill,.4))),f.stroke||(f.stroke=g),u.setItemVisual(e,"style",f)})),u.diff(oB(l).data).add((function(t){var e=u.getItemLayout(t);if(!e.allClipped){var n=new Pu({shape:{points:e.points}});u.setItemGraphicEl(t,n),l.group.add(n)}})).update((function(t,n){var i=oB(l).data.getItemGraphicEl(n),r=u.getItemLayout(t);r.allClipped?i&&l.group.remove(i):(i?rh(i,{shape:{points:r.points}},e,t):i=new Pu({shape:{points:r.points}}),u.setItemGraphicEl(t,i),l.group.add(i))})).remove((function(t){var e=oB(l).data.getItemGraphicEl(t);l.group.remove(e)})).execute(),u.eachItemGraphicEl((function(t,n){var i=u.getItemModel(n),r=u.getItemVisual(n,"style");t.useStyle(u.getItemVisual(n,"style")),Hh(t,Yh(i),{labelFetcher:e,labelDataIndex:n,defaultText:u.getName(n)||"",inheritColor:X(r.fill)?An(r.fill,1):"#000"}),Vl(t,i),Rl(t,null,null,i.get(["emphasis","disabled"])),Hs(t).dataModel=e})),oB(l).data=u,l.group.silent=e.get("silent")||t.get("silent")},e.type="markArea",e}(ZV);var dB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.layoutMode={type:"box",ignoreSize:!0},n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n),t.selected=t.selected||{},this._updateSelector(t)},e.prototype.mergeOption=function(e,n){t.prototype.mergeOption.call(this,e,n),this._updateSelector(e)},e.prototype._updateSelector=function(t){var e=t.selector,n=this.ecModel;!0===e&&(e=t.selector=["all","inverse"]),Y(e)&&E(e,(function(t,i){X(t)&&(t={type:t}),e[i]=C(t,function(t,e){return"all"===e?{type:"all",title:t.getLocaleModel().get(["legend","selector","all"])}:"inverse"===e?{type:"inverse",title:t.getLocaleModel().get(["legend","selector","inverse"])}:void 0}(n,t.type))}))},e.prototype.optionUpdated=function(){this._updateData(this.ecModel);var t=this._data;if(t[0]&&"single"===this.get("selectedMode")){for(var e=!1,n=0;n<t.length;n++){var i=t[n].get("name");if(this.isSelected(i)){this.select(i),e=!0;break}}!e&&this.select(t[0].get("name"))}},e.prototype._updateData=function(t){var e=[],n=[];t.eachRawSeries((function(i){var r,o=i.name;if(n.push(o),i.legendVisualProvider){var a=i.legendVisualProvider.getAllNames();t.isSeriesFiltered(i)||(n=n.concat(a)),a.length?e=e.concat(a):r=!0}else r=!0;r&&_o(i)&&e.push(i.name)})),this._availableNames=n;var i=z(this.get("data")||e,(function(t){return(X(t)||j(t))&&(t={name:t}),new dc(t,this,this.ecModel)}),this);this._data=i},e.prototype.getData=function(){return this._data},e.prototype.select=function(t){var e=this.option.selected;"single"===this.get("selectedMode")&&E(this._data,(function(t){e[t.get("name")]=!1}));e[t]=!0},e.prototype.unSelect=function(t){"single"!==this.get("selectedMode")&&(this.option.selected[t]=!1)},e.prototype.toggleSelected=function(t){var e=this.option.selected;e.hasOwnProperty(t)||(e[t]=!0),this[e[t]?"unSelect":"select"](t)},e.prototype.allSelect=function(){var t=this._data,e=this.option.selected;E(t,(function(t){e[t.get("name",!0)]=!0}))},e.prototype.inverseSelect=function(){var t=this._data,e=this.option.selected;E(t,(function(t){var n=t.get("name",!0);e.hasOwnProperty(n)||(e[n]=!0),e[n]=!e[n]}))},e.prototype.isSelected=function(t){var e=this.option.selected;return!(e.hasOwnProperty(t)&&!e[t])&&P(this._availableNames,t)>=0},e.prototype.getOrient=function(){return"vertical"===this.get("orient")?{index:1,name:"vertical"}:{index:0,name:"horizontal"}},e.type="legend.plain",e.dependencies=["series"],e.defaultOption={z:4,show:!0,orient:"horizontal",left:"center",top:0,align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,symbolRotate:"inherit",symbolKeepAspect:!0,inactiveColor:"#ccc",inactiveBorderColor:"#ccc",inactiveBorderWidth:"auto",itemStyle:{color:"inherit",opacity:"inherit",borderColor:"inherit",borderWidth:"auto",borderCap:"inherit",borderJoin:"inherit",borderDashOffset:"inherit",borderMiterLimit:"inherit"},lineStyle:{width:"auto",color:"inherit",inactiveColor:"#ccc",inactiveWidth:2,opacity:"inherit",type:"inherit",cap:"inherit",join:"inherit",dashOffset:"inherit",miterLimit:"inherit"},textStyle:{color:"#333"},selectedMode:!0,selector:!1,selectorLabel:{show:!0,borderRadius:10,padding:[3,5,3,5],fontSize:12,fontFamily:"sans-serif",color:"#666",borderWidth:1,borderColor:"#666"},emphasis:{selectorLabel:{show:!0,color:"#eee",backgroundColor:"#666"}},selectorPosition:"auto",selectorItemGap:7,selectorButtonGap:10,tooltip:{show:!1}},e}(Tp),fB=H,gB=E,yB=Cr,vB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.newlineDisabled=!1,n}return n(e,t),e.prototype.init=function(){this.group.add(this._contentGroup=new yB),this.group.add(this._selectorGroup=new yB),this._isFirstRender=!0},e.prototype.getContentGroup=function(){return this._contentGroup},e.prototype.getSelectorGroup=function(){return this._selectorGroup},e.prototype.render=function(t,e,n){var i=this._isFirstRender;if(this._isFirstRender=!1,this.resetInner(),t.get("show",!0)){var r=t.get("align"),o=t.get("orient");r&&"auto"!==r||(r="right"===t.get("left")&&"vertical"===o?"right":"left");var a=t.get("selector",!0),s=t.get("selectorPosition",!0);!a||s&&"auto"!==s||(s="horizontal"===o?"end":"start"),this.renderInner(r,t,e,n,a,o,s);var l=t.getBoxLayoutParams(),u={width:n.getWidth(),height:n.getHeight()},h=t.get("padding"),c=xp(l,u,h),p=this.layoutInner(t,r,c,i,a,s),d=xp(k({width:p.width,height:p.height},l),u,h);this.group.x=d.x-p.x,this.group.y=d.y-p.y,this.group.markRedraw(),this.group.add(this._backgroundEl=XE(p,t))}},e.prototype.resetInner=function(){this.getContentGroup().removeAll(),this._backgroundEl&&this.group.remove(this._backgroundEl),this.getSelectorGroup().removeAll()},e.prototype.renderInner=function(t,e,n,i,r,o,a){var s=this.getContentGroup(),l=ft(),u=e.get("selectedMode"),h=[];n.eachRawSeries((function(t){!t.get("legendHoverLink")&&h.push(t.id)})),gB(e.getData(),(function(r,o){var a=r.get("name");if(!this.newlineDisabled&&(""===a||"\n"===a)){var c=new yB;return c.newline=!0,void s.add(c)}var p=n.getSeriesByName(a)[0];if(!l.get(a)){if(p){var d=p.getData(),f=d.getVisual("legendLineStyle")||{},g=d.getVisual("legendIcon"),y=d.getVisual("style");this._createItem(p,a,o,r,e,t,f,y,g,u,i).on("click",fB(mB,a,null,i,h)).on("mouseover",fB(_B,p.name,null,i,h)).on("mouseout",fB(bB,p.name,null,i,h)),l.set(a,!0)}else n.eachRawSeries((function(n){if(!l.get(a)&&n.legendVisualProvider){var s=n.legendVisualProvider;if(!s.containName(a))return;var c=s.indexOfName(a),p=s.getItemVisual(c,"style"),d=s.getItemVisual(c,"legendIcon"),f=bn(p.fill);f&&0===f[3]&&(f[3]=.2,p=A(A({},p),{fill:kn(f,"rgba")})),this._createItem(n,a,o,r,e,t,{},p,d,u,i).on("click",fB(mB,null,a,i,h)).on("mouseover",fB(_B,null,a,i,h)).on("mouseout",fB(bB,null,a,i,h)),l.set(a,!0)}}),this);0}}),this),r&&this._createSelector(r,e,i,o,a)},e.prototype._createSelector=function(t,e,n,i,r){var o=this.getSelectorGroup();gB(t,(function(t){var i=t.type,r=new ks({style:{x:0,y:0,align:"center",verticalAlign:"middle"},onclick:function(){n.dispatchAction({type:"all"===i?"legendAllSelect":"legendInverseSelect"})}});o.add(r),Hh(r,{normal:e.getModel("selectorLabel"),emphasis:e.getModel(["emphasis","selectorLabel"])},{defaultText:t.title}),Ol(r)}))},e.prototype._createItem=function(t,e,n,i,r,o,a,s,l,u,h){var c=t.visualDrawType,p=r.get("itemWidth"),d=r.get("itemHeight"),f=r.isSelected(e),g=i.get("symbolRotate"),y=i.get("symbolKeepAspect"),v=i.get("icon"),m=function(t,e,n,i,r,o,a){function s(t,e){"auto"===t.lineWidth&&(t.lineWidth=e.lineWidth>0?2:0),gB(t,(function(n,i){"inherit"===t[i]&&(t[i]=e[i])}))}var l=e.getModel("itemStyle"),u=l.getItemStyle(),h=0===t.lastIndexOf("empty",0)?"fill":"stroke",c=l.getShallow("decal");u.decal=c&&"inherit"!==c?rv(c,a):i.decal,"inherit"===u.fill&&(u.fill=i[r]);"inherit"===u.stroke&&(u.stroke=i[h]);"inherit"===u.opacity&&(u.opacity=("fill"===r?i:n).opacity);s(u,i);var p=e.getModel("lineStyle"),d=p.getLineStyle();if(s(d,n),"auto"===u.fill&&(u.fill=i.fill),"auto"===u.stroke&&(u.stroke=i.fill),"auto"===d.stroke&&(d.stroke=i.fill),!o){var f=e.get("inactiveBorderWidth"),g=u[h];u.lineWidth="auto"===f?i.lineWidth>0&&g?2:0:u.lineWidth,u.fill=e.get("inactiveColor"),u.stroke=e.get("inactiveBorderColor"),d.stroke=p.get("inactiveColor"),d.lineWidth=p.get("inactiveWidth")}return{itemStyle:u,lineStyle:d}}(l=v||l||"roundRect",i,a,s,c,f,h),x=new yB,_=i.getModel("textStyle");if(!U(t.getLegendIcon)||v&&"inherit"!==v){var b="inherit"===v&&t.getData().getVisual("symbol")?"inherit"===g?t.getData().getVisual("symbolRotate"):g:0;x.add(function(t){var e=t.icon||"roundRect",n=Ly(e,0,0,t.itemWidth,t.itemHeight,t.itemStyle.fill,t.symbolKeepAspect);n.setStyle(t.itemStyle),n.rotation=(t.iconRotate||0)*Math.PI/180,n.setOrigin([t.itemWidth/2,t.itemHeight/2]),e.indexOf("empty")>-1&&(n.style.stroke=n.style.fill,n.style.fill="#fff",n.style.lineWidth=2);return n}({itemWidth:p,itemHeight:d,icon:l,iconRotate:b,itemStyle:m.itemStyle,lineStyle:m.lineStyle,symbolKeepAspect:y}))}else x.add(t.getLegendIcon({itemWidth:p,itemHeight:d,icon:l,iconRotate:g,itemStyle:m.itemStyle,lineStyle:m.lineStyle,symbolKeepAspect:y}));var w="left"===o?p+5:-5,S=o,M=r.get("formatter"),I=e;X(M)&&M?I=M.replace("{name}",null!=e?e:""):U(M)&&(I=M(e));var T=i.get("inactiveColor");x.add(new ks({style:Uh(_,{text:I,x:w,y:d/2,fill:f?_.getTextColor():T,align:S,verticalAlign:"middle"})}));var C=new Cs({shape:x.getBoundingRect(),invisible:!0}),D=i.getModel("tooltip");return D.get("show")&&Eh({el:C,componentModel:r,itemName:e,itemTooltipOption:D.option}),x.add(C),x.eachChild((function(t){t.silent=!0})),C.silent=!u,this.getContentGroup().add(x),Ol(x),x.__legendDataIndex=n,x},e.prototype.layoutInner=function(t,e,n,i,r,o){var a=this.getContentGroup(),s=this.getSelectorGroup();mp(t.get("orient"),a,t.get("itemGap"),n.width,n.height);var l=a.getBoundingRect(),u=[-l.x,-l.y];if(s.markRedraw(),a.markRedraw(),r){mp("horizontal",s,t.get("selectorItemGap",!0));var h=s.getBoundingRect(),c=[-h.x,-h.y],p=t.get("selectorButtonGap",!0),d=t.getOrient().index,f=0===d?"width":"height",g=0===d?"height":"width",y=0===d?"y":"x";"end"===o?c[d]+=l[f]+p:u[d]+=h[f]+p,c[1-d]+=l[g]/2-h[g]/2,s.x=c[0],s.y=c[1],a.x=u[0],a.y=u[1];var v={x:0,y:0};return v[f]=l[f]+p+h[f],v[g]=Math.max(l[g],h[g]),v[y]=Math.min(0,h[y]+c[1-d]),v}return a.x=u[0],a.y=u[1],this.group.getBoundingRect()},e.prototype.remove=function(){this.getContentGroup().removeAll(),this._isFirstRender=!0},e.type="legend.plain",e}(gg);function mB(t,e,n,i){bB(t,e,n,i),n.dispatchAction({type:"legendToggleSelect",name:null!=t?t:e}),_B(t,e,n,i)}function xB(t){for(var e,n=t.getZr().storage.getDisplayList(),i=0,r=n.length;i<r&&!(e=n[i].states.emphasis);)i++;return e&&e.hoverLayer}function _B(t,e,n,i){xB(n)||n.dispatchAction({type:"highlight",seriesName:t,name:e,excludeSeriesId:i})}function bB(t,e,n,i){xB(n)||n.dispatchAction({type:"downplay",seriesName:t,name:e,excludeSeriesId:i})}function wB(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.filterSeries((function(t){for(var n=0;n<e.length;n++)if(!e[n].isSelected(t.name))return!1;return!0}))}function SB(t,e,n){var i,r={},o="toggleSelected"===t;return n.eachComponent("legend",(function(n){o&&null!=i?n[i?"select":"unSelect"](e.name):"allSelect"===t||"inverseSelect"===t?n[t]():(n[t](e.name),i=n.isSelected(e.name)),E(n.getData(),(function(t){var e=t.get("name");if("\n"!==e&&""!==e){var i=n.isSelected(e);r.hasOwnProperty(e)?r[e]=r[e]&&i:r[e]=i}}))})),"allSelect"===t||"inverseSelect"===t?{selected:r}:{name:e.name,selected:r}}function MB(t){t.registerComponentModel(dB),t.registerComponentView(vB),t.registerProcessor(t.PRIORITY.PROCESSOR.SERIES_FILTER,wB),t.registerSubTypeDefaulter("legend",(function(){return"plain"})),function(t){t.registerAction("legendToggleSelect","legendselectchanged",H(SB,"toggleSelected")),t.registerAction("legendAllSelect","legendselectall",H(SB,"allSelect")),t.registerAction("legendInverseSelect","legendinverseselect",H(SB,"inverseSelect")),t.registerAction("legendSelect","legendselected",H(SB,"select")),t.registerAction("legendUnSelect","legendunselected",H(SB,"unSelect"))}(t)}var IB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.setScrollDataIndex=function(t){this.option.scrollDataIndex=t},e.prototype.init=function(e,n,i){var r=Sp(e);t.prototype.init.call(this,e,n,i),TB(this,e,r)},e.prototype.mergeOption=function(e,n){t.prototype.mergeOption.call(this,e,n),TB(this,this.option,e)},e.type="legend.scroll",e.defaultOption=yc(dB.defaultOption,{scrollDataIndex:0,pageButtonItemGap:5,pageButtonGap:null,pageButtonPosition:"end",pageFormatter:"{current}/{total}",pageIcons:{horizontal:["M0,0L12,-10L12,10z","M0,0L-12,-10L-12,10z"],vertical:["M0,0L20,0L10,-20z","M0,0L20,0L10,20z"]},pageIconColor:"#2f4554",pageIconInactiveColor:"#aaa",pageIconSize:15,pageTextStyle:{color:"#333"},animationDurationUpdate:800}),e}(dB);function TB(t,e,n){var i=[1,1];i[t.getOrient().index]=0,wp(e,n,{type:"box",ignoreSize:!!i})}var CB=Cr,DB=["width","height"],AB=["x","y"],kB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.newlineDisabled=!0,n._currentIndex=0,n}return n(e,t),e.prototype.init=function(){t.prototype.init.call(this),this.group.add(this._containerGroup=new CB),this._containerGroup.add(this.getContentGroup()),this.group.add(this._controllerGroup=new CB)},e.prototype.resetInner=function(){t.prototype.resetInner.call(this),this._controllerGroup.removeAll(),this._containerGroup.removeClipPath(),this._containerGroup.__rectSize=null},e.prototype.renderInner=function(e,n,i,r,o,a,s){var l=this;t.prototype.renderInner.call(this,e,n,i,r,o,a,s);var u=this._controllerGroup,h=n.get("pageIconSize",!0),c=Y(h)?h:[h,h];d("pagePrev",0);var p=n.getModel("pageTextStyle");function d(t,e){var i=t+"DataIndex",o=Ph(n.get("pageIcons",!0)[n.getOrient().name][e],{onclick:W(l._pageGo,l,i,n,r)},{x:-c[0]/2,y:-c[1]/2,width:c[0],height:c[1]});o.name=t,u.add(o)}u.add(new ks({name:"pageText",style:{text:"xx/xx",fill:p.getTextColor(),font:p.getFont(),verticalAlign:"middle",align:"center"},silent:!0})),d("pageNext",1)},e.prototype.layoutInner=function(t,e,n,i,r,o){var a=this.getSelectorGroup(),s=t.getOrient().index,l=DB[s],u=AB[s],h=DB[1-s],c=AB[1-s];r&&mp("horizontal",a,t.get("selectorItemGap",!0));var p=t.get("selectorButtonGap",!0),d=a.getBoundingRect(),f=[-d.x,-d.y],g=T(n);r&&(g[l]=n[l]-d[l]-p);var y=this._layoutContentAndController(t,i,g,s,l,h,c,u);if(r){if("end"===o)f[s]+=y[l]+p;else{var v=d[l]+p;f[s]-=v,y[u]-=v}y[l]+=d[l]+p,f[1-s]+=y[c]+y[h]/2-d[h]/2,y[h]=Math.max(y[h],d[h]),y[c]=Math.min(y[c],d[c]+f[1-s]),a.x=f[0],a.y=f[1],a.markRedraw()}return y},e.prototype._layoutContentAndController=function(t,e,n,i,r,o,a,s){var l=this.getContentGroup(),u=this._containerGroup,h=this._controllerGroup;mp(t.get("orient"),l,t.get("itemGap"),i?n.width:null,i?null:n.height),mp("horizontal",h,t.get("pageButtonItemGap",!0));var c=l.getBoundingRect(),p=h.getBoundingRect(),d=this._showController=c[r]>n[r],f=[-c.x,-c.y];e||(f[i]=l[s]);var g=[0,0],y=[-p.x,-p.y],v=rt(t.get("pageButtonGap",!0),t.get("itemGap",!0));d&&("end"===t.get("pageButtonPosition",!0)?y[i]+=n[r]-p[r]:g[i]+=p[r]+v);y[1-i]+=c[o]/2-p[o]/2,l.setPosition(f),u.setPosition(g),h.setPosition(y);var m={x:0,y:0};if(m[r]=d?n[r]:c[r],m[o]=Math.max(c[o],p[o]),m[a]=Math.min(0,p[a]+y[1-i]),u.__rectSize=n[r],d){var x={x:0,y:0};x[r]=Math.max(n[r]-p[r]-v,0),x[o]=m[o],u.setClipPath(new Cs({shape:x})),u.__rectSize=x[r]}else h.eachChild((function(t){t.attr({invisible:!0,silent:!0})}));var _=this._getPageInfo(t);return null!=_.pageIndex&&rh(l,{x:_.contentPosition[0],y:_.contentPosition[1]},d?t:null),this._updatePageInfoView(t,_),m},e.prototype._pageGo=function(t,e,n){var i=this._getPageInfo(e)[t];null!=i&&n.dispatchAction({type:"legendScroll",scrollDataIndex:i,legendId:e.id})},e.prototype._updatePageInfoView=function(t,e){var n=this._controllerGroup;E(["pagePrev","pageNext"],(function(i){var r=null!=e[i+"DataIndex"],o=n.childOfName(i);o&&(o.setStyle("fill",r?t.get("pageIconColor",!0):t.get("pageIconInactiveColor",!0)),o.cursor=r?"pointer":"default")}));var i=n.childOfName("pageText"),r=t.get("pageFormatter"),o=e.pageIndex,a=null!=o?o+1:0,s=e.pageCount;i&&r&&i.setStyle("text",X(r)?r.replace("{current}",null==a?"":a+"").replace("{total}",null==s?"":s+""):r({current:a,total:s}))},e.prototype._getPageInfo=function(t){var e=t.get("scrollDataIndex",!0),n=this.getContentGroup(),i=this._containerGroup.__rectSize,r=t.getOrient().index,o=DB[r],a=AB[r],s=this._findTargetItemIndex(e),l=n.children(),u=l[s],h=l.length,c=h?1:0,p={contentPosition:[n.x,n.y],pageCount:c,pageIndex:c-1,pagePrevDataIndex:null,pageNextDataIndex:null};if(!u)return p;var d=m(u);p.contentPosition[r]=-d.s;for(var f=s+1,g=d,y=d,v=null;f<=h;++f)(!(v=m(l[f]))&&y.e>g.s+i||v&&!x(v,g.s))&&(g=y.i>g.i?y:v)&&(null==p.pageNextDataIndex&&(p.pageNextDataIndex=g.i),++p.pageCount),y=v;for(f=s-1,g=d,y=d,v=null;f>=-1;--f)(v=m(l[f]))&&x(y,v.s)||!(g.i<y.i)||(y=g,null==p.pagePrevDataIndex&&(p.pagePrevDataIndex=g.i),++p.pageCount,++p.pageIndex),g=v;return p;function m(t){if(t){var e=t.getBoundingRect(),n=e[a]+t[a];return{s:n,e:n+e[o],i:t.__legendDataIndex}}}function x(t,e){return t.e>=e&&t.s<=e+i}},e.prototype._findTargetItemIndex=function(t){return this._showController?(this.getContentGroup().eachChild((function(i,r){var o=i.__legendDataIndex;null==n&&null!=o&&(n=r),o===t&&(e=r)})),null!=e?e:n):0;var e,n},e.type="legend.scroll",e}(vB);function LB(t){wm(MB),t.registerComponentModel(IB),t.registerComponentView(kB),function(t){t.registerAction("legendScroll","legendscroll",(function(t,e){var n=t.scrollDataIndex;null!=n&&e.eachComponent({mainType:"legend",subType:"scroll",query:t},(function(t){t.setScrollDataIndex(n)}))}))}(t)}var PB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.inside",e.defaultOption=yc(AE.defaultOption,{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),e}(AE),OB=So();function RB(t,e,n){OB(t).coordSysRecordMap.each((function(t){var i=t.dataZoomInfoMap.get(e.uid);i&&(i.getRange=n)}))}function NB(t,e){if(e){t.removeKey(e.model.uid);var n=e.controller;n&&n.dispose()}}function EB(t,e){t.isDisposed()||t.dispatchAction({type:"dataZoom",animation:{easing:"cubicOut",duration:100},batch:e})}function zB(t,e,n,i){return t.coordinateSystem.containPoint([n,i])}function VB(t){t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER,(function(t,e){var n=OB(e),i=n.coordSysRecordMap||(n.coordSysRecordMap=ft());i.each((function(t){t.dataZoomInfoMap=null})),t.eachComponent({mainType:"dataZoom",subType:"inside"},(function(t){E(CE(t).infoList,(function(n){var r=n.model.uid,o=i.get(r)||i.set(r,function(t,e){var n={model:e,containsPoint:H(zB,e),dispatchAction:H(EB,t),dataZoomInfoMap:null,controller:null},i=n.controller=new kI(t.getZr());return E(["pan","zoom","scrollMove"],(function(t){i.on(t,(function(e){var i=[];n.dataZoomInfoMap.each((function(r){if(e.isAvailableBehavior(r.model.option)){var o=(r.getRange||{})[t],a=o&&o(r.dzReferCoordSysInfo,n.model.mainType,n.controller,e);!r.model.get("disabled",!0)&&a&&i.push({dataZoomId:r.model.id,start:a[0],end:a[1]})}})),i.length&&n.dispatchAction(i)}))})),n}(e,n.model));(o.dataZoomInfoMap||(o.dataZoomInfoMap=ft())).set(t.uid,{dzReferCoordSysInfo:n,model:t,getRange:null})}))})),i.each((function(t){var e,n=t.controller,r=t.dataZoomInfoMap;if(r){var o=r.keys()[0];null!=o&&(e=r.get(o))}if(e){var a=function(t){var e,n="type_",i={type_true:2,type_move:1,type_false:0,type_undefined:-1},r=!0;return t.each((function(t){var o=t.model,a=!o.get("disabled",!0)&&(!o.get("zoomLock",!0)||"move");i[n+a]>i[n+e]&&(e=a),r=r&&o.get("preventDefaultMouseMove",!0)})),{controlType:e,opt:{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!0,preventDefaultMouseMove:!!r}}}(r);n.enable(a.controlType,a.opt),n.setPointerChecker(t.containsPoint),Ag(t,"dispatchAction",e.model.get("throttle",!0),"fixRate")}else NB(i,t)}))}))}var BB=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="dataZoom.inside",e}return n(e,t),e.prototype.render=function(e,n,i){t.prototype.render.apply(this,arguments),e.noTarget()?this._clear():(this.range=e.getPercentRange(),RB(i,e,{pan:W(FB.pan,this),zoom:W(FB.zoom,this),scrollMove:W(FB.scrollMove,this)}))},e.prototype.dispose=function(){this._clear(),t.prototype.dispose.apply(this,arguments)},e.prototype._clear=function(){!function(t,e){for(var n=OB(t).coordSysRecordMap,i=n.keys(),r=0;r<i.length;r++){var o=i[r],a=n.get(o),s=a.dataZoomInfoMap;if(s){var l=e.uid;s.get(l)&&(s.removeKey(l),s.keys().length||NB(n,a))}}}(this.api,this.dataZoomModel),this.range=null},e.type="dataZoom.inside",e}(PE),FB={zoom:function(t,e,n,i){var r=this.range,o=r.slice(),a=t.axisModels[0];if(a){var s=WB[e](null,[i.originX,i.originY],a,n,t),l=(s.signal>0?s.pixelStart+s.pixelLength-s.pixel:s.pixel-s.pixelStart)/s.pixelLength*(o[1]-o[0])+o[0],u=Math.max(1/i.scale,0);o[0]=(o[0]-l)*u+l,o[1]=(o[1]-l)*u+l;var h=this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();return lk(0,o,[0,100],0,h.minSpan,h.maxSpan),this.range=o,r[0]!==o[0]||r[1]!==o[1]?o:void 0}},pan:GB((function(t,e,n,i,r,o){var a=WB[i]([o.oldX,o.oldY],[o.newX,o.newY],e,r,n);return a.signal*(t[1]-t[0])*a.pixel/a.pixelLength})),scrollMove:GB((function(t,e,n,i,r,o){return WB[i]([0,0],[o.scrollDelta,o.scrollDelta],e,r,n).signal*(t[1]-t[0])*o.scrollDelta}))};function GB(t){return function(e,n,i,r){var o=this.range,a=o.slice(),s=e.axisModels[0];if(s)return lk(t(a,s,e,n,i,r),a,[0,100],"all"),this.range=a,o[0]!==a[0]||o[1]!==a[1]?a:void 0}}var WB={grid:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem.getRect();return t=t||[0,0],"x"===o.dim?(a.pixel=e[0]-t[0],a.pixelLength=s.width,a.pixelStart=s.x,a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=s.height,a.pixelStart=s.y,a.signal=o.inverse?-1:1),a},polar:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),u=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===n.mainType?(a.pixel=e[0]-t[0],a.pixelLength=l[1]-l[0],a.pixelStart=l[0],a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=u[1]-u[0],a.pixelStart=u[0],a.signal=o.inverse?-1:1),a},singleAxis:function(t,e,n,i,r){var o=n.axis,a=r.model.coordinateSystem.getRect(),s={};return t=t||[0,0],"horizontal"===o.orient?(s.pixel=e[0]-t[0],s.pixelLength=a.width,s.pixelStart=a.x,s.signal=o.inverse?1:-1):(s.pixel=e[1]-t[1],s.pixelLength=a.height,s.pixelStart=a.y,s.signal=o.inverse?-1:1),s}};function HB(t){BE(t),t.registerComponentModel(PB),t.registerComponentView(BB),VB(t)}var YB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.slider",e.layoutMode="box",e.defaultOption=yc(AE.defaultOption,{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,borderColor:"#d2dbee",borderRadius:3,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#d2dbee",width:.5},areaStyle:{color:"#d2dbee",opacity:.2}},selectedDataBackground:{lineStyle:{color:"#8fb0f7",width:.5},areaStyle:{color:"#8fb0f7",opacity:.2}},fillerColor:"rgba(135,175,274,0.2)",handleIcon:"path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z",handleSize:"100%",handleStyle:{color:"#fff",borderColor:"#ACB8D1"},moveHandleSize:7,moveHandleIcon:"path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z",moveHandleStyle:{color:"#D2DBEE",opacity:.7},showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#6E7079"},brushSelect:!0,brushStyle:{color:"rgba(135,175,274,0.15)"},emphasis:{handleStyle:{borderColor:"#8FB0F7"},moveHandleStyle:{color:"#8FB0F7"}}}),e}(AE),UB=Cs,XB="horizontal",ZB="vertical",jB=["line","bar","candlestick","scatter"],qB={easing:"cubicOut",duration:100,delay:0},KB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._displayables={},n}return n(e,t),e.prototype.init=function(t,e){this.api=e,this._onBrush=W(this._onBrush,this),this._onBrushEnd=W(this._onBrushEnd,this)},e.prototype.render=function(e,n,i,r){if(t.prototype.render.apply(this,arguments),Ag(this,"_dispatchZoomAction",e.get("throttle"),"fixRate"),this._orient=e.getOrient(),!1!==e.get("show")){if(e.noTarget())return this._clear(),void this.group.removeAll();r&&"dataZoom"===r.type&&r.from===this.uid||this._buildView(),this._updateView()}else this.group.removeAll()},e.prototype.dispose=function(){this._clear(),t.prototype.dispose.apply(this,arguments)},e.prototype._clear=function(){kg(this,"_dispatchZoomAction");var t=this.api.getZr();t.off("mousemove",this._onBrush),t.off("mouseup",this._onBrushEnd)},e.prototype._buildView=function(){var t=this.group;t.removeAll(),this._brushing=!1,this._displayables.brushRect=null,this._resetLocation(),this._resetInterval();var e=this._displayables.sliderGroup=new Cr;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},e.prototype._resetLocation=function(){var t=this.dataZoomModel,e=this.api,n=t.get("brushSelect")?7:0,i=this._findCoordRect(),r={width:e.getWidth(),height:e.getHeight()},o=this._orient===XB?{right:r.width-i.x-i.width,top:r.height-30-7-n,width:i.width,height:30}:{right:7,top:i.y,width:30,height:i.height},a=Sp(t.option);E(["right","top","width","height"],(function(t){"ph"===a[t]&&(a[t]=o[t])}));var s=xp(a,r);this._location={x:s.x,y:s.y},this._size=[s.width,s.height],this._orient===ZB&&this._size.reverse()},e.prototype._positionGroup=function(){var t=this.group,e=this._location,n=this._orient,i=this.dataZoomModel.getFirstTargetAxisModel(),r=i&&i.get("inverse"),o=this._displayables.sliderGroup,a=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(n!==XB||r?n===XB&&r?{scaleY:a?1:-1,scaleX:-1}:n!==ZB||r?{scaleY:a?-1:1,scaleX:-1,rotation:Math.PI/2}:{scaleY:a?-1:1,scaleX:1,rotation:Math.PI/2}:{scaleY:a?1:-1,scaleX:1});var s=t.getBoundingRect([o]);t.x=e.x-s.x,t.y=e.y-s.y,t.markRedraw()},e.prototype._getViewExtent=function(){return[0,this._size[0]]},e.prototype._renderBackground=function(){var t=this.dataZoomModel,e=this._size,n=this._displayables.sliderGroup,i=t.get("brushSelect");n.add(new UB({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40}));var r=new UB({shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:"transparent"},z2:0,onclick:W(this._onClickPanel,this)}),o=this.api.getZr();i?(r.on("mousedown",this._onBrushStart,this),r.cursor="crosshair",o.on("mousemove",this._onBrush),o.on("mouseup",this._onBrushEnd)):(o.off("mousemove",this._onBrush),o.off("mouseup",this._onBrushEnd)),n.add(r)},e.prototype._renderDataShadow=function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(this._displayables.dataShadowSegs=[],t){var e=this._size,n=this._shadowSize||[],i=t.series,r=i.getRawData(),o=i.getShadowDim?i.getShadowDim():t.otherDim;if(null!=o){var a=this._shadowPolygonPts,s=this._shadowPolylinePts;if(r!==this._shadowData||o!==this._shadowDim||e[0]!==n[0]||e[1]!==n[1]){var l=r.getDataExtent(o),u=.3*(l[1]-l[0]);l=[l[0]-u,l[1]+u];var h,c=[0,e[1]],p=[0,e[0]],d=[[e[0],0],[0,0]],f=[],g=p[1]/(r.count()-1),y=0,v=Math.round(r.count()/e[0]);r.each([o],(function(t,e){if(v>0&&e%v)y+=g;else{var n=null==t||isNaN(t)||""===t,i=n?0:Nr(t,l,c,!0);n&&!h&&e?(d.push([d[d.length-1][0],0]),f.push([f[f.length-1][0],0])):!n&&h&&(d.push([y,0]),f.push([y,0])),d.push([y,i]),f.push([y,i]),y+=g,h=n}})),a=this._shadowPolygonPts=d,s=this._shadowPolylinePts=f}this._shadowData=r,this._shadowDim=o,this._shadowSize=[e[0],e[1]];for(var m=this.dataZoomModel,x=0;x<3;x++){var _=b(1===x);this._displayables.sliderGroup.add(_),this._displayables.dataShadowSegs.push(_)}}}function b(t){var e=m.getModel(t?"selectedDataBackground":"dataBackground"),n=new Cr,i=new Pu({shape:{points:a},segmentIgnoreThreshold:1,style:e.getModel("areaStyle").getAreaStyle(),silent:!0,z2:-20}),r=new Ru({shape:{points:s},segmentIgnoreThreshold:1,style:e.getModel("lineStyle").getLineStyle(),silent:!0,z2:-19});return n.add(i),n.add(r),n}},e.prototype._prepareDataShadowInfo=function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(!1!==e){var n,i=this.ecModel;return t.eachTargetAxis((function(r,o){E(t.getAxisProxy(r,o).getTargetSeriesModels(),(function(t){if(!(n||!0!==e&&P(jB,t.get("type"))<0)){var a,s=i.getComponent(IE(r),o).axis,l={x:"y",y:"x",radius:"angle",angle:"radius"}[r],u=t.coordinateSystem;null!=l&&u.getOtherAxis&&(a=u.getOtherAxis(s).inverse),l=t.getData().mapDimension(l),n={thisAxis:s,series:t,thisDim:r,otherDim:l,otherAxisInverse:a}}}),this)}),this),n}},e.prototype._renderHandle=function(){var t=this.group,e=this._displayables,n=e.handles=[null,null],i=e.handleLabels=[null,null],r=this._displayables.sliderGroup,o=this._size,a=this.dataZoomModel,s=this.api,l=a.get("borderRadius")||0,u=a.get("brushSelect"),h=e.filler=new UB({silent:u,style:{fill:a.get("fillerColor")},textConfig:{position:"inside"}});r.add(h),r.add(new UB({silent:!0,subPixelOptimize:!0,shape:{x:0,y:0,width:o[0],height:o[1],r:l},style:{stroke:a.get("dataBackgroundColor")||a.get("borderColor"),lineWidth:1,fill:"rgba(0,0,0,0)"}})),E([0,1],(function(e){var o=a.get("handleIcon");!Dy[o]&&o.indexOf("path://")<0&&o.indexOf("image://")<0&&(o="path://"+o);var s=Ly(o,-1,0,2,2,null,!0);s.attr({cursor:$B(this._orient),draggable:!0,drift:W(this._onDragMove,this,e),ondragend:W(this._onDragEnd,this),onmouseover:W(this._showDataInfo,this,!0),onmouseout:W(this._showDataInfo,this,!1),z2:5});var l=s.getBoundingRect(),u=a.get("handleSize");this._handleHeight=Er(u,this._size[1]),this._handleWidth=l.width/l.height*this._handleHeight,s.setStyle(a.getModel("handleStyle").getItemStyle()),s.style.strokeNoScale=!0,s.rectHover=!0,s.ensureState("emphasis").style=a.getModel(["emphasis","handleStyle"]).getItemStyle(),Ol(s);var h=a.get("handleColor");null!=h&&(s.style.fill=h),r.add(n[e]=s);var c=a.getModel("textStyle");t.add(i[e]=new ks({silent:!0,invisible:!0,style:Uh(c,{x:0,y:0,text:"",verticalAlign:"middle",align:"center",fill:c.getTextColor(),font:c.getFont()}),z2:10}))}),this);var c=h;if(u){var p=Er(a.get("moveHandleSize"),o[1]),d=e.moveHandle=new Cs({style:a.getModel("moveHandleStyle").getItemStyle(),silent:!0,shape:{r:[0,0,2,2],y:o[1]-.5,height:p}}),f=.8*p,g=e.moveHandleIcon=Ly(a.get("moveHandleIcon"),-f/2,-f/2,f,f,"#fff",!0);g.silent=!0,g.y=o[1]+p/2-.5,d.ensureState("emphasis").style=a.getModel(["emphasis","moveHandleStyle"]).getItemStyle();var y=Math.min(o[1]/2,Math.max(p,10));(c=e.moveZone=new Cs({invisible:!0,shape:{y:o[1]-y,height:p+y}})).on("mouseover",(function(){s.enterEmphasis(d)})).on("mouseout",(function(){s.leaveEmphasis(d)})),r.add(d),r.add(g),r.add(c)}c.attr({draggable:!0,cursor:$B(this._orient),drift:W(this._onDragMove,this,"all"),ondragstart:W(this._showDataInfo,this,!0),ondragend:W(this._onDragEnd,this),onmouseover:W(this._showDataInfo,this,!0),onmouseout:W(this._showDataInfo,this,!1)})},e.prototype._resetInterval=function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[Nr(t[0],[0,100],e,!0),Nr(t[1],[0,100],e,!0)]},e.prototype._updateInterval=function(t,e){var n=this.dataZoomModel,i=this._handleEnds,r=this._getViewExtent(),o=n.findRepresentativeAxisProxy().getMinMaxSpan(),a=[0,100];lk(e,i,r,n.get("zoomLock")?"all":t,null!=o.minSpan?Nr(o.minSpan,a,r,!0):null,null!=o.maxSpan?Nr(o.maxSpan,a,r,!0):null);var s=this._range,l=this._range=Vr([Nr(i[0],r,a,!0),Nr(i[1],r,a,!0)]);return!s||s[0]!==l[0]||s[1]!==l[1]},e.prototype._updateView=function(t){var e=this._displayables,n=this._handleEnds,i=Vr(n.slice()),r=this._size;E([0,1],(function(t){var i=e.handles[t],o=this._handleHeight;i.attr({scaleX:o/2,scaleY:o/2,x:n[t]+(t?-1:1),y:r[1]/2-o/2})}),this),e.filler.setShape({x:i[0],y:0,width:i[1]-i[0],height:r[1]});var o={x:i[0],width:i[1]-i[0]};e.moveHandle&&(e.moveHandle.setShape(o),e.moveZone.setShape(o),e.moveZone.getBoundingRect(),e.moveHandleIcon&&e.moveHandleIcon.attr("x",o.x+o.width/2));for(var a=e.dataShadowSegs,s=[0,i[0],i[1],r[0]],l=0;l<a.length;l++){var u=a[l],h=u.getClipPath();h||(h=new Cs,u.setClipPath(h)),h.setShape({x:s[l],y:0,width:s[l+1]-s[l],height:r[1]})}this._updateDataInfo(t)},e.prototype._updateDataInfo=function(t){var e=this.dataZoomModel,n=this._displayables,i=n.handleLabels,r=this._orient,o=["",""];if(e.get("showDetail")){var a=e.findRepresentativeAxisProxy();if(a){var s=a.getAxisModel().axis,l=this._range,u=t?a.calculateDataWindow({start:l[0],end:l[1]}).valueWindow:a.getDataValueWindow();o=[this._formatLabel(u[0],s),this._formatLabel(u[1],s)]}}var h=Vr(this._handleEnds.slice());function c(t){var e=Ih(n.handles[t].parent,this.group),a=Ch(0===t?"right":"left",e),s=this._handleWidth/2+5,l=Th([h[t]+(0===t?-s:s),this._size[1]/2],e);i[t].setStyle({x:l[0],y:l[1],verticalAlign:r===XB?"middle":a,align:r===XB?a:"center",text:o[t]})}c.call(this,0),c.call(this,1)},e.prototype._formatLabel=function(t,e){var n=this.dataZoomModel,i=n.get("labelFormatter"),r=n.get("labelPrecision");null!=r&&"auto"!==r||(r=e.getPixelPrecision());var o=null==t||isNaN(t)?"":"category"===e.type||"time"===e.type?e.scale.getLabel({value:Math.round(t)}):t.toFixed(Math.min(r,20));return U(i)?i(t,o):X(i)?i.replace("{value}",o):o},e.prototype._showDataInfo=function(t){t=this._dragging||t;var e=this._displayables,n=e.handleLabels;n[0].attr("invisible",!t),n[1].attr("invisible",!t),e.moveHandle&&this.api[t?"enterEmphasis":"leaveEmphasis"](e.moveHandle,1)},e.prototype._onDragMove=function(t,e,n,i){this._dragging=!0,se(i.event);var r=Th([e,n],this._displayables.sliderGroup.getLocalTransform(),!0),o=this._updateInterval(t,r[0]),a=this.dataZoomModel.get("realtime");this._updateView(!a),o&&a&&this._dispatchZoomAction(!0)},e.prototype._onDragEnd=function(){this._dragging=!1,this._showDataInfo(!1),!this.dataZoomModel.get("realtime")&&this._dispatchZoomAction(!1)},e.prototype._onClickPanel=function(t){var e=this._size,n=this._displayables.sliderGroup.transformCoordToLocal(t.offsetX,t.offsetY);if(!(n[0]<0||n[0]>e[0]||n[1]<0||n[1]>e[1])){var i=this._handleEnds,r=(i[0]+i[1])/2,o=this._updateInterval("all",n[0]-r);this._updateView(),o&&this._dispatchZoomAction(!1)}},e.prototype._onBrushStart=function(t){var e=t.offsetX,n=t.offsetY;this._brushStart=new Ji(e,n),this._brushing=!0,this._brushStartTime=+new Date},e.prototype._onBrushEnd=function(t){if(this._brushing){var e=this._displayables.brushRect;if(this._brushing=!1,e){e.attr("ignore",!0);var n=e.shape;if(!(+new Date-this._brushStartTime<200&&Math.abs(n.width)<5)){var i=this._getViewExtent(),r=[0,100];this._range=Vr([Nr(n.x,i,r,!0),Nr(n.x+n.width,i,r,!0)]),this._handleEnds=[n.x,n.x+n.width],this._updateView(),this._dispatchZoomAction(!1)}}}},e.prototype._onBrush=function(t){this._brushing&&(se(t.event),this._updateBrushRect(t.offsetX,t.offsetY))},e.prototype._updateBrushRect=function(t,e){var n=this._displayables,i=this.dataZoomModel,r=n.brushRect;r||(r=n.brushRect=new UB({silent:!0,style:i.getModel("brushStyle").getItemStyle()}),n.sliderGroup.add(r)),r.attr("ignore",!1);var o=this._brushStart,a=this._displayables.sliderGroup,s=a.transformCoordToLocal(t,e),l=a.transformCoordToLocal(o.x,o.y),u=this._size;s[0]=Math.max(Math.min(u[0],s[0]),0),r.setShape({x:l[0],y:0,width:s[0]-l[0],height:u[1]})},e.prototype._dispatchZoomAction=function(t){var e=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,animation:t?qB:null,start:e[0],end:e[1]})},e.prototype._findCoordRect=function(){var t,e=CE(this.dataZoomModel).infoList;if(!t&&e.length){var n=e[0].model.coordinateSystem;t=n.getRect&&n.getRect()}if(!t){var i=this.api.getWidth(),r=this.api.getHeight();t={x:.2*i,y:.2*r,width:.6*i,height:.6*r}}return t},e.type="dataZoom.slider",e}(PE);function $B(t){return"vertical"===t?"ns-resize":"ew-resize"}function JB(t){t.registerComponentModel(YB),t.registerComponentView(KB),BE(t)}var QB=function(t,e,n){var i=T((tF[t]||{})[e]);return n&&Y(i)?i[i.length-1]:i},tF={color:{active:["#006edd","#e0ffff"],inactive:["rgba(0,0,0,0)"]},colorHue:{active:[0,360],inactive:[0,0]},colorSaturation:{active:[.3,1],inactive:[0,0]},colorLightness:{active:[.9,.5],inactive:[0,0]},colorAlpha:{active:[.3,1],inactive:[0,0]},opacity:{active:[.3,1],inactive:[0,0]},symbol:{active:["circle","roundRect","diamond"],inactive:["none"]},symbolSize:{active:[10,50],inactive:[0,0]}},eF=iD.mapVisual,nF=iD.eachVisual,iF=Y,rF=E,oF=Vr,aF=Nr,sF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.stateList=["inRange","outOfRange"],n.replacableOptionKeys=["inRange","outOfRange","target","controller","color"],n.layoutMode={type:"box",ignoreSize:!0},n.dataBound=[-1/0,1/0],n.targetVisuals={},n.controllerVisuals={},n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n)},e.prototype.optionUpdated=function(t,e){var n=this.option;!e&&eV(n,t,this.replacableOptionKeys),this.textStyleModel=this.getModel("textStyle"),this.resetItemSize(),this.completeVisualOption()},e.prototype.resetVisual=function(t){var e=this.stateList;t=W(t,this),this.controllerVisuals=tV(this.option.controller,e,t),this.targetVisuals=tV(this.option.target,e,t)},e.prototype.getItemSymbol=function(){return null},e.prototype.getTargetSeriesIndices=function(){var t=this.option.seriesIndex,e=[];return null==t||"all"===t?this.ecModel.eachSeries((function(t,n){e.push(n)})):e=ho(t),e},e.prototype.eachTargetSeries=function(t,e){E(this.getTargetSeriesIndices(),(function(n){var i=this.ecModel.getSeriesByIndex(n);i&&t.call(e,i)}),this)},e.prototype.isTargetSeries=function(t){var e=!1;return this.eachTargetSeries((function(n){n===t&&(e=!0)})),e},e.prototype.formatValueText=function(t,e,n){var i,r=this.option,o=r.precision,a=this.dataBound,s=r.formatter;n=n||["<",">"],Y(t)&&(t=t.slice(),i=!0);var l=e?t:i?[u(t[0]),u(t[1])]:u(t);return X(s)?s.replace("{value}",i?l[0]:l).replace("{value2}",i?l[1]:l):U(s)?i?s(t[0],t[1]):s(t):i?t[0]===a[0]?n[0]+" "+l[1]:t[1]===a[1]?n[1]+" "+l[0]:l[0]+" - "+l[1]:l;function u(t){return t===a[0]?"min":t===a[1]?"max":(+t).toFixed(Math.min(o,20))}},e.prototype.resetExtent=function(){var t=this.option,e=oF([t.min,t.max]);this._dataExtent=e},e.prototype.getDataDimensionIndex=function(t){var e=this.option.dimension;if(null!=e)return t.getDimensionIndex(e);for(var n=t.dimensions,i=n.length-1;i>=0;i--){var r=n[i],o=t.getDimensionInfo(r);if(!o.isCalculationCoord)return o.storeDimIndex}},e.prototype.getExtent=function(){return this._dataExtent.slice()},e.prototype.completeVisualOption=function(){var t=this.ecModel,e=this.option,n={inRange:e.inRange,outOfRange:e.outOfRange},i=e.target||(e.target={}),r=e.controller||(e.controller={});C(i,n),C(r,n);var o=this.isCategory();function a(n){iF(e.color)&&!n.inRange&&(n.inRange={color:e.color.slice().reverse()}),n.inRange=n.inRange||{color:t.get("gradientColor")}}a.call(this,i),a.call(this,r),function(t,e,n){var i=t[e],r=t[n];i&&!r&&(r=t[n]={},rF(i,(function(t,e){if(iD.isValidType(e)){var n=QB(e,"inactive",o);null!=n&&(r[e]=n,"color"!==e||r.hasOwnProperty("opacity")||r.hasOwnProperty("colorAlpha")||(r.opacity=[0,0]))}})))}.call(this,i,"inRange","outOfRange"),function(t){var e=(t.inRange||{}).symbol||(t.outOfRange||{}).symbol,n=(t.inRange||{}).symbolSize||(t.outOfRange||{}).symbolSize,i=this.get("inactiveColor"),r=this.getItemSymbol()||"roundRect";rF(this.stateList,(function(a){var s=this.itemSize,l=t[a];l||(l=t[a]={color:o?i:[i]}),null==l.symbol&&(l.symbol=e&&T(e)||(o?r:[r])),null==l.symbolSize&&(l.symbolSize=n&&T(n)||(o?s[0]:[s[0],s[0]])),l.symbol=eF(l.symbol,(function(t){return"none"===t?r:t}));var u=l.symbolSize;if(null!=u){var h=-1/0;nF(u,(function(t){t>h&&(h=t)})),l.symbolSize=eF(u,(function(t){return aF(t,[0,h],[0,s[0]],!0)}))}}),this)}.call(this,r)},e.prototype.resetItemSize=function(){this.itemSize=[parseFloat(this.get("itemWidth")),parseFloat(this.get("itemHeight"))]},e.prototype.isCategory=function(){return!!this.option.categories},e.prototype.setSelected=function(t){},e.prototype.getSelected=function(){return null},e.prototype.getValueState=function(t){return null},e.prototype.getVisualMeta=function(t){return null},e.type="visualMap",e.dependencies=["series"],e.defaultOption={show:!0,z:4,seriesIndex:"all",min:0,max:200,left:0,right:null,top:null,bottom:0,itemWidth:null,itemHeight:null,inverse:!1,orient:"vertical",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",contentColor:"#5793f3",inactiveColor:"#aaa",borderWidth:0,padding:5,textGap:10,precision:0,textStyle:{color:"#333"}},e}(Tp),lF=[20,140],uF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(e,n){t.prototype.optionUpdated.apply(this,arguments),this.resetExtent(),this.resetVisual((function(t){t.mappingMethod="linear",t.dataExtent=this.getExtent()})),this._resetRange()},e.prototype.resetItemSize=function(){t.prototype.resetItemSize.apply(this,arguments);var e=this.itemSize;(null==e[0]||isNaN(e[0]))&&(e[0]=lF[0]),(null==e[1]||isNaN(e[1]))&&(e[1]=lF[1])},e.prototype._resetRange=function(){var t=this.getExtent(),e=this.option.range;!e||e.auto?(t.auto=1,this.option.range=t):Y(e)&&(e[0]>e[1]&&e.reverse(),e[0]=Math.max(e[0],t[0]),e[1]=Math.min(e[1],t[1]))},e.prototype.completeVisualOption=function(){t.prototype.completeVisualOption.apply(this,arguments),E(this.stateList,(function(t){var e=this.option.controller[t].symbolSize;e&&e[0]!==e[1]&&(e[0]=e[1]/3)}),this)},e.prototype.setSelected=function(t){this.option.range=t.slice(),this._resetRange()},e.prototype.getSelected=function(){var t=this.getExtent(),e=Vr((this.get("range")||[]).slice());return e[0]>t[1]&&(e[0]=t[1]),e[1]>t[1]&&(e[1]=t[1]),e[0]<t[0]&&(e[0]=t[0]),e[1]<t[0]&&(e[1]=t[0]),e},e.prototype.getValueState=function(t){var e=this.option.range,n=this.getExtent();return(e[0]<=n[0]||e[0]<=t)&&(e[1]>=n[1]||t<=e[1])?"inRange":"outOfRange"},e.prototype.findTargetDataIndices=function(t){var e=[];return this.eachTargetSeries((function(n){var i=[],r=n.getData();r.each(this.getDataDimensionIndex(r),(function(e,n){t[0]<=e&&e<=t[1]&&i.push(n)}),this),e.push({seriesId:n.id,dataIndex:i})}),this),e},e.prototype.getVisualMeta=function(t){var e=hF(this,"outOfRange",this.getExtent()),n=hF(this,"inRange",this.option.range.slice()),i=[];function r(e,n){i.push({value:e,color:t(e,n)})}for(var o=0,a=0,s=n.length,l=e.length;a<l&&(!n.length||e[a]<=n[0]);a++)e[a]<n[o]&&r(e[a],"outOfRange");for(var u=1;o<s;o++,u=0)u&&i.length&&r(n[o],"outOfRange"),r(n[o],"inRange");for(u=1;a<l;a++)(!n.length||n[n.length-1]<e[a])&&(u&&(i.length&&r(i[i.length-1].value,"outOfRange"),u=0),r(e[a],"outOfRange"));var h=i.length;return{stops:i,outerColors:[h?i[0].color:"transparent",h?i[h-1].color:"transparent"]}},e.type="visualMap.continuous",e.defaultOption=yc(sF.defaultOption,{align:"auto",calculable:!1,hoverLink:!0,realtime:!0,handleIcon:"path://M-11.39,9.77h0a3.5,3.5,0,0,1-3.5,3.5h-22a3.5,3.5,0,0,1-3.5-3.5h0a3.5,3.5,0,0,1,3.5-3.5h22A3.5,3.5,0,0,1-11.39,9.77Z",handleSize:"120%",handleStyle:{borderColor:"#fff",borderWidth:1},indicatorIcon:"circle",indicatorSize:"50%",indicatorStyle:{borderColor:"#fff",borderWidth:2,shadowBlur:2,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0,0,0,0.2)"}}),e}(sF);function hF(t,e,n){if(n[0]===n[1])return n.slice();for(var i=(n[1]-n[0])/200,r=n[0],o=[],a=0;a<=200&&r<n[1];a++)o.push(r),r+=i;return o.push(n[1]),o}var cF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.autoPositionValues={left:1,right:1,top:1,bottom:1},n}return n(e,t),e.prototype.init=function(t,e){this.ecModel=t,this.api=e},e.prototype.render=function(t,e,n,i){this.visualMapModel=t,!1!==t.get("show")?this.doRender(t,e,n,i):this.group.removeAll()},e.prototype.renderBackground=function(t){var e=this.visualMapModel,n=ip(e.get("padding")||0),i=t.getBoundingRect();t.add(new Cs({z2:-1,silent:!0,shape:{x:i.x-n[3],y:i.y-n[0],width:i.width+n[3]+n[1],height:i.height+n[0]+n[2]},style:{fill:e.get("backgroundColor"),stroke:e.get("borderColor"),lineWidth:e.get("borderWidth")}}))},e.prototype.getControllerVisual=function(t,e,n){var i=(n=n||{}).forceState,r=this.visualMapModel,o={};if("color"===e){var a=r.get("contentColor");o.color=a}function s(t){return o[t]}function l(t,e){o[t]=e}var u=r.controllerVisuals[i||r.getValueState(t)];return E(iD.prepareVisualTypes(u),(function(i){var r=u[i];n.convertOpacityToAlpha&&"opacity"===i&&(i="colorAlpha",r=u.__alphaForOpacity),iD.dependsOn(i,e)&&r&&r.applyVisual(t,s,l)})),o[e]},e.prototype.positionGroup=function(t){var e=this.visualMapModel,n=this.api;_p(t,e.getBoxLayoutParams(),{width:n.getWidth(),height:n.getHeight()})},e.prototype.doRender=function(t,e,n,i){},e.type="visualMap",e}(gg),pF=[["left","right","width"],["top","bottom","height"]];function dF(t,e,n){var i=t.option,r=i.align;if(null!=r&&"auto"!==r)return r;for(var o={width:e.getWidth(),height:e.getHeight()},a="horizontal"===i.orient?1:0,s=pF[a],l=[0,null,10],u={},h=0;h<3;h++)u[pF[1-a][h]]=l[h],u[s[h]]=2===h?n[0]:i[s[h]];var c=[["x","width",3],["y","height",0]][a],p=xp(u,o,i.padding);return s[(p.margin[c[2]]||0)+p[c[0]]+.5*p[c[1]]<.5*o[c[1]]?0:1]}function fF(t,e){return E(t||[],(function(t){null!=t.dataIndex&&(t.dataIndexInside=t.dataIndex,t.dataIndex=null),t.highlightKey="visualMap"+(e?e.componentIndex:"")})),t}var gF=Nr,yF=E,vF=Math.min,mF=Math.max,xF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._shapes={},n._dataInterval=[],n._handleEnds=[],n._hoverLinkDataIndices=[],n}return n(e,t),e.prototype.doRender=function(t,e,n,i){this._api=n,i&&"selectDataRange"===i.type&&i.from===this.uid||this._buildView()},e.prototype._buildView=function(){this.group.removeAll();var t=this.visualMapModel,e=this.group;this._orient=t.get("orient"),this._useHandle=t.get("calculable"),this._resetInterval(),this._renderBar(e);var n=t.get("text");this._renderEndsText(e,n,0),this._renderEndsText(e,n,1),this._updateView(!0),this.renderBackground(e),this._updateView(),this._enableHoverLinkToSeries(),this._enableHoverLinkFromSeries(),this.positionGroup(e)},e.prototype._renderEndsText=function(t,e,n){if(e){var i=e[1-n];i=null!=i?i+"":"";var r=this.visualMapModel,o=r.get("textGap"),a=r.itemSize,s=this._shapes.mainGroup,l=this._applyTransform([a[0]/2,0===n?-o:a[1]+o],s),u=this._applyTransform(0===n?"bottom":"top",s),h=this._orient,c=this.visualMapModel.textStyleModel;this.group.add(new ks({style:Uh(c,{x:l[0],y:l[1],verticalAlign:"horizontal"===h?"middle":u,align:"horizontal"===h?u:"center",text:i})}))}},e.prototype._renderBar=function(t){var e=this.visualMapModel,n=this._shapes,i=e.itemSize,r=this._orient,o=this._useHandle,a=dF(e,this.api,i),s=n.mainGroup=this._createBarGroup(a),l=new Cr;s.add(l),l.add(n.outOfRange=_F()),l.add(n.inRange=_F(null,o?wF(this._orient):null,W(this._dragHandle,this,"all",!1),W(this._dragHandle,this,"all",!0))),l.setClipPath(new Cs({shape:{x:0,y:0,width:i[0],height:i[1],r:3}}));var u=e.textStyleModel.getTextRect("国"),h=mF(u.width,u.height);o&&(n.handleThumbs=[],n.handleLabels=[],n.handleLabelPoints=[],this._createHandle(e,s,0,i,h,r),this._createHandle(e,s,1,i,h,r)),this._createIndicator(e,s,i,h,r),t.add(s)},e.prototype._createHandle=function(t,e,n,i,r,o){var a=W(this._dragHandle,this,n,!1),s=W(this._dragHandle,this,n,!0),l=gr(t.get("handleSize"),i[0]),u=Ly(t.get("handleIcon"),-l/2,-l/2,l,l,null,!0),h=wF(this._orient);u.attr({cursor:h,draggable:!0,drift:a,ondragend:s,onmousemove:function(t){se(t.event)}}),u.x=i[0]/2,u.useStyle(t.getModel("handleStyle").getItemStyle()),u.setStyle({strokeNoScale:!0,strokeFirst:!0}),u.style.lineWidth*=2,u.ensureState("emphasis").style=t.getModel(["emphasis","handleStyle"]).getItemStyle(),Bl(u,!0),e.add(u);var c=this.visualMapModel.textStyleModel,p=new ks({cursor:h,draggable:!0,drift:a,onmousemove:function(t){se(t.event)},ondragend:s,style:Uh(c,{x:0,y:0,text:""})});p.ensureState("blur").style={opacity:.1},p.stateTransition={duration:200},this.group.add(p);var d=[l,0],f=this._shapes;f.handleThumbs[n]=u,f.handleLabelPoints[n]=d,f.handleLabels[n]=p},e.prototype._createIndicator=function(t,e,n,i,r){var o=gr(t.get("indicatorSize"),n[0]),a=Ly(t.get("indicatorIcon"),-o/2,-o/2,o,o,null,!0);a.attr({cursor:"move",invisible:!0,silent:!0,x:n[0]/2});var s=t.getModel("indicatorStyle").getItemStyle();if(a instanceof _s){var l=a.style;a.useStyle(A({image:l.image,x:l.x,y:l.y,width:l.width,height:l.height},s))}else a.useStyle(s);e.add(a);var u=this.visualMapModel.textStyleModel,h=new ks({silent:!0,invisible:!0,style:Uh(u,{x:0,y:0,text:""})});this.group.add(h);var c=[("horizontal"===r?i/2:6)+n[0]/2,0],p=this._shapes;p.indicator=a,p.indicatorLabel=h,p.indicatorLabelPoint=c,this._firstShowIndicator=!0},e.prototype._dragHandle=function(t,e,n,i){if(this._useHandle){if(this._dragging=!e,!e){var r=this._applyTransform([n,i],this._shapes.mainGroup,!0);this._updateInterval(t,r[1]),this._hideIndicator(),this._updateView()}e===!this.visualMapModel.get("realtime")&&this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:this._dataInterval.slice()}),e?!this._hovering&&this._clearHoverLinkToSeries():bF(this.visualMapModel)&&this._doHoverLinkToSeries(this._handleEnds[t],!1)}},e.prototype._resetInterval=function(){var t=this.visualMapModel,e=this._dataInterval=t.getSelected(),n=t.getExtent(),i=[0,t.itemSize[1]];this._handleEnds=[gF(e[0],n,i,!0),gF(e[1],n,i,!0)]},e.prototype._updateInterval=function(t,e){e=e||0;var n=this.visualMapModel,i=this._handleEnds,r=[0,n.itemSize[1]];lk(e,i,r,t,0);var o=n.getExtent();this._dataInterval=[gF(i[0],r,o,!0),gF(i[1],r,o,!0)]},e.prototype._updateView=function(t){var e=this.visualMapModel,n=e.getExtent(),i=this._shapes,r=[0,e.itemSize[1]],o=t?r:this._handleEnds,a=this._createBarVisual(this._dataInterval,n,o,"inRange"),s=this._createBarVisual(n,n,r,"outOfRange");i.inRange.setStyle({fill:a.barColor}).setShape("points",a.barPoints),i.outOfRange.setStyle({fill:s.barColor}).setShape("points",s.barPoints),this._updateHandle(o,a)},e.prototype._createBarVisual=function(t,e,n,i){var r={forceState:i,convertOpacityToAlpha:!0},o=this._makeColorGradient(t,r),a=[this.getControllerVisual(t[0],"symbolSize",r),this.getControllerVisual(t[1],"symbolSize",r)],s=this._createBarPoints(n,a);return{barColor:new Xu(0,0,0,1,o),barPoints:s,handlesColor:[o[0].color,o[o.length-1].color]}},e.prototype._makeColorGradient=function(t,e){var n=[],i=(t[1]-t[0])/100;n.push({color:this.getControllerVisual(t[0],"color",e),offset:0});for(var r=1;r<100;r++){var o=t[0]+i*r;if(o>t[1])break;n.push({color:this.getControllerVisual(o,"color",e),offset:r/100})}return n.push({color:this.getControllerVisual(t[1],"color",e),offset:1}),n},e.prototype._createBarPoints=function(t,e){var n=this.visualMapModel.itemSize;return[[n[0]-e[0],t[0]],[n[0],t[0]],[n[0],t[1]],[n[0]-e[1],t[1]]]},e.prototype._createBarGroup=function(t){var e=this._orient,n=this.visualMapModel.get("inverse");return new Cr("horizontal"!==e||n?"horizontal"===e&&n?{scaleX:"bottom"===t?-1:1,rotation:-Math.PI/2}:"vertical"!==e||n?{scaleX:"left"===t?1:-1}:{scaleX:"left"===t?1:-1,scaleY:-1}:{scaleX:"bottom"===t?1:-1,rotation:Math.PI/2})},e.prototype._updateHandle=function(t,e){if(this._useHandle){var n=this._shapes,i=this.visualMapModel,r=n.handleThumbs,o=n.handleLabels,a=i.itemSize,s=i.getExtent();yF([0,1],(function(l){var u=r[l];u.setStyle("fill",e.handlesColor[l]),u.y=t[l];var h=gF(t[l],[0,a[1]],s,!0),c=this.getControllerVisual(h,"symbolSize");u.scaleX=u.scaleY=c/a[0],u.x=a[0]-c/2;var p=Th(n.handleLabelPoints[l],Ih(u,this.group));o[l].setStyle({x:p[0],y:p[1],text:i.formatValueText(this._dataInterval[l]),verticalAlign:"middle",align:"vertical"===this._orient?this._applyTransform("left",n.mainGroup):"center"})}),this)}},e.prototype._showIndicator=function(t,e,n,i){var r=this.visualMapModel,o=r.getExtent(),a=r.itemSize,s=[0,a[1]],l=this._shapes,u=l.indicator;if(u){u.attr("invisible",!1);var h=this.getControllerVisual(t,"color",{convertOpacityToAlpha:!0}),c=this.getControllerVisual(t,"symbolSize"),p=gF(t,o,s,!0),d=a[0]-c/2,f={x:u.x,y:u.y};u.y=p,u.x=d;var g=Th(l.indicatorLabelPoint,Ih(u,this.group)),y=l.indicatorLabel;y.attr("invisible",!1);var v=this._applyTransform("left",l.mainGroup),m="horizontal"===this._orient;y.setStyle({text:(n||"")+r.formatValueText(e),verticalAlign:m?v:"middle",align:m?"center":v});var x={x:d,y:p,style:{fill:h}},_={style:{x:g[0],y:g[1]}};if(r.ecModel.isAnimationEnabled()&&!this._firstShowIndicator){var b={duration:100,easing:"cubicInOut",additive:!0};u.x=f.x,u.y=f.y,u.animateTo(x,b),y.animateTo(_,b)}else u.attr(x),y.attr(_);this._firstShowIndicator=!1;var w=this._shapes.handleLabels;if(w)for(var S=0;S<w.length;S++)this._api.enterBlur(w[S])}},e.prototype._enableHoverLinkToSeries=function(){var t=this;this._shapes.mainGroup.on("mousemove",(function(e){if(t._hovering=!0,!t._dragging){var n=t.visualMapModel.itemSize,i=t._applyTransform([e.offsetX,e.offsetY],t._shapes.mainGroup,!0,!0);i[1]=vF(mF(0,i[1]),n[1]),t._doHoverLinkToSeries(i[1],0<=i[0]&&i[0]<=n[0])}})).on("mouseout",(function(){t._hovering=!1,!t._dragging&&t._clearHoverLinkToSeries()}))},e.prototype._enableHoverLinkFromSeries=function(){var t=this.api.getZr();this.visualMapModel.option.hoverLink?(t.on("mouseover",this._hoverLinkFromSeriesMouseOver,this),t.on("mouseout",this._hideIndicator,this)):this._clearHoverLinkFromSeries()},e.prototype._doHoverLinkToSeries=function(t,e){var n=this.visualMapModel,i=n.itemSize;if(n.option.hoverLink){var r=[0,i[1]],o=n.getExtent();t=vF(mF(r[0],t),r[1]);var a=function(t,e,n){var i=6,r=t.get("hoverLinkDataSize");r&&(i=gF(r,e,n,!0)/2);return i}(n,o,r),s=[t-a,t+a],l=gF(t,r,o,!0),u=[gF(s[0],r,o,!0),gF(s[1],r,o,!0)];s[0]<r[0]&&(u[0]=-1/0),s[1]>r[1]&&(u[1]=1/0),e&&(u[0]===-1/0?this._showIndicator(l,u[1],"< ",a):u[1]===1/0?this._showIndicator(l,u[0],"> ",a):this._showIndicator(l,l,"≈ ",a));var h=this._hoverLinkDataIndices,c=[];(e||bF(n))&&(c=this._hoverLinkDataIndices=n.findTargetDataIndices(u));var p=function(t,e){var n={},i={};return r(t||[],n),r(e||[],i,n),[o(n),o(i)];function r(t,e,n){for(var i=0,r=t.length;i<r;i++){var o=xo(t[i].seriesId,null);if(null==o)return;for(var a=ho(t[i].dataIndex),s=n&&n[o],l=0,u=a.length;l<u;l++){var h=a[l];s&&s[h]?s[h]=null:(e[o]||(e[o]={}))[h]=1}}}function o(t,e){var n=[];for(var i in t)if(t.hasOwnProperty(i)&&null!=t[i])if(e)n.push(+i);else{var r=o(t[i],!0);r.length&&n.push({seriesId:i,dataIndex:r})}return n}}(h,c);this._dispatchHighDown("downplay",fF(p[0],n)),this._dispatchHighDown("highlight",fF(p[1],n))}},e.prototype._hoverLinkFromSeriesMouseOver=function(t){var e=t.target,n=this.visualMapModel;if(e&&null!=Hs(e).dataIndex){var i=Hs(e),r=this.ecModel.getSeriesByIndex(i.seriesIndex);if(n.isTargetSeries(r)){var o=r.getData(i.dataType),a=o.getStore().get(n.getDataDimensionIndex(o),i.dataIndex);isNaN(a)||this._showIndicator(a,a)}}},e.prototype._hideIndicator=function(){var t=this._shapes;t.indicator&&t.indicator.attr("invisible",!0),t.indicatorLabel&&t.indicatorLabel.attr("invisible",!0);var e=this._shapes.handleLabels;if(e)for(var n=0;n<e.length;n++)this._api.leaveBlur(e[n])},e.prototype._clearHoverLinkToSeries=function(){this._hideIndicator();var t=this._hoverLinkDataIndices;this._dispatchHighDown("downplay",fF(t,this.visualMapModel)),t.length=0},e.prototype._clearHoverLinkFromSeries=function(){this._hideIndicator();var t=this.api.getZr();t.off("mouseover",this._hoverLinkFromSeriesMouseOver),t.off("mouseout",this._hideIndicator)},e.prototype._applyTransform=function(t,e,n,i){var r=Ih(e,i?null:this.group);return Y(t)?Th(t,r,n):Ch(t,r,n)},e.prototype._dispatchHighDown=function(t,e){e&&e.length&&this.api.dispatchAction({type:t,batch:e})},e.prototype.dispose=function(){this._clearHoverLinkFromSeries(),this._clearHoverLinkToSeries()},e.prototype.remove=function(){this._clearHoverLinkFromSeries(),this._clearHoverLinkToSeries()},e.type="visualMap.continuous",e}(cF);function _F(t,e,n,i){return new Pu({shape:{points:t},draggable:!!n,cursor:e,drift:n,onmousemove:function(t){se(t.event)},ondragend:i})}function bF(t){var e=t.get("hoverLinkOnHandle");return!!(null==e?t.get("realtime"):e)}function wF(t){return"vertical"===t?"ns-resize":"ew-resize"}var SF={type:"selectDataRange",event:"dataRangeSelected",update:"update"},MF=function(t,e){e.eachComponent({mainType:"visualMap",query:t},(function(e){e.setSelected(t.selected)}))},IF=[{createOnAllSeries:!0,reset:function(t,e){var n=[];return e.eachComponent("visualMap",(function(e){var i,r,o,a,s,l=t.pipelineContext;!e.isTargetSeries(t)||l&&l.large||n.push((i=e.stateList,r=e.targetVisuals,o=W(e.getValueState,e),a=e.getDataDimensionIndex(t.getData()),s={},E(i,(function(t){var e=iD.prepareVisualTypes(r[t]);s[t]=e})),{progress:function(t,e){var n,i;function l(t){return fy(e,i,t)}function u(t,n){yy(e,i,t,n)}null!=a&&(n=e.getDimensionIndex(a));for(var h=e.getStore();null!=(i=t.next());){var c=e.getRawDataItem(i);if(!c||!1!==c.visualMap)for(var p=null!=a?h.get(n,i):i,d=o(p),f=r[d],g=s[d],y=0,v=g.length;y<v;y++){var m=g[y];f[m]&&f[m].applyVisual(p,l,u)}}}}))})),n}},{createOnAllSeries:!0,reset:function(t,e){var n=t.getData(),i=[];e.eachComponent("visualMap",(function(e){if(e.isTargetSeries(t)){var r=e.getVisualMeta(W(TF,null,t,e))||{stops:[],outerColors:[]},o=e.getDataDimensionIndex(n);o>=0&&(r.dimension=o,i.push(r))}})),t.getData().setVisual("visualMeta",i)}}];function TF(t,e,n,i){for(var r=e.targetVisuals[i],o=iD.prepareVisualTypes(r),a={color:gy(t.getData(),"color")},s=0,l=o.length;s<l;s++){var u=o[s],h=r["opacity"===u?"__alphaForOpacity":u];h&&h.applyVisual(n,c,p)}return a.color;function c(t){return a[t]}function p(t,e){a[t]=e}}var CF=E;function DF(t){var e=t&&t.visualMap;Y(e)||(e=e?[e]:[]),CF(e,(function(t){if(t){AF(t,"splitList")&&!AF(t,"pieces")&&(t.pieces=t.splitList,delete t.splitList);var e=t.pieces;e&&Y(e)&&CF(e,(function(t){q(t)&&(AF(t,"start")&&!AF(t,"min")&&(t.min=t.start),AF(t,"end")&&!AF(t,"max")&&(t.max=t.end))}))}}))}function AF(t,e){return t&&t.hasOwnProperty&&t.hasOwnProperty(e)}var kF=!1;function LF(t){kF||(kF=!0,t.registerSubTypeDefaulter("visualMap",(function(t){return t.categories||(t.pieces?t.pieces.length>0:t.splitNumber>0)&&!t.calculable?"piecewise":"continuous"})),t.registerAction(SF,MF),E(IF,(function(e){t.registerVisual(t.PRIORITY.VISUAL.COMPONENT,e)})),t.registerPreprocessor(DF))}function PF(t){t.registerComponentModel(uF),t.registerComponentView(xF),LF(t)}var OF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._pieceList=[],n}return n(e,t),e.prototype.optionUpdated=function(e,n){t.prototype.optionUpdated.apply(this,arguments),this.resetExtent();var i=this._mode=this._determineMode();this._pieceList=[],RF[this._mode].call(this,this._pieceList),this._resetSelected(e,n);var r=this.option.categories;this.resetVisual((function(t,e){"categories"===i?(t.mappingMethod="category",t.categories=T(r)):(t.dataExtent=this.getExtent(),t.mappingMethod="piecewise",t.pieceList=z(this._pieceList,(function(t){return t=T(t),"inRange"!==e&&(t.visual=null),t})))}))},e.prototype.completeVisualOption=function(){var e=this.option,n={},i=iD.listVisualTypes(),r=this.isCategory();function o(t,e,n){return t&&t[e]&&t[e].hasOwnProperty(n)}E(e.pieces,(function(t){E(i,(function(e){t.hasOwnProperty(e)&&(n[e]=1)}))})),E(n,(function(t,n){var i=!1;E(this.stateList,(function(t){i=i||o(e,t,n)||o(e.target,t,n)}),this),!i&&E(this.stateList,(function(t){(e[t]||(e[t]={}))[n]=QB(n,"inRange"===t?"active":"inactive",r)}))}),this),t.prototype.completeVisualOption.apply(this,arguments)},e.prototype._resetSelected=function(t,e){var n=this.option,i=this._pieceList,r=(e?n:t).selected||{};if(n.selected=r,E(i,(function(t,e){var n=this.getSelectedMapKey(t);r.hasOwnProperty(n)||(r[n]=!0)}),this),"single"===n.selectedMode){var o=!1;E(i,(function(t,e){var n=this.getSelectedMapKey(t);r[n]&&(o?r[n]=!1:o=!0)}),this)}},e.prototype.getItemSymbol=function(){return this.get("itemSymbol")},e.prototype.getSelectedMapKey=function(t){return"categories"===this._mode?t.value+"":t.index+""},e.prototype.getPieceList=function(){return this._pieceList},e.prototype._determineMode=function(){var t=this.option;return t.pieces&&t.pieces.length>0?"pieces":this.option.categories?"categories":"splitNumber"},e.prototype.setSelected=function(t){this.option.selected=T(t)},e.prototype.getValueState=function(t){var e=iD.findPieceIndex(t,this._pieceList);return null!=e&&this.option.selected[this.getSelectedMapKey(this._pieceList[e])]?"inRange":"outOfRange"},e.prototype.findTargetDataIndices=function(t){var e=[],n=this._pieceList;return this.eachTargetSeries((function(i){var r=[],o=i.getData();o.each(this.getDataDimensionIndex(o),(function(e,i){iD.findPieceIndex(e,n)===t&&r.push(i)}),this),e.push({seriesId:i.id,dataIndex:r})}),this),e},e.prototype.getRepresentValue=function(t){var e;if(this.isCategory())e=t.value;else if(null!=t.value)e=t.value;else{var n=t.interval||[];e=n[0]===-1/0&&n[1]===1/0?0:(n[0]+n[1])/2}return e},e.prototype.getVisualMeta=function(t){if(!this.isCategory()){var e=[],n=["",""],i=this,r=this._pieceList.slice();if(r.length){var o=r[0].interval[0];o!==-1/0&&r.unshift({interval:[-1/0,o]}),(o=r[r.length-1].interval[1])!==1/0&&r.push({interval:[o,1/0]})}else r.push({interval:[-1/0,1/0]});var a=-1/0;return E(r,(function(t){var e=t.interval;e&&(e[0]>a&&s([a,e[0]],"outOfRange"),s(e.slice()),a=e[1])}),this),{stops:e,outerColors:n}}function s(r,o){var a=i.getRepresentValue({interval:r});o||(o=i.getValueState(a));var s=t(a,o);r[0]===-1/0?n[0]=s:r[1]===1/0?n[1]=s:e.push({value:r[0],color:s},{value:r[1],color:s})}},e.type="visualMap.piecewise",e.defaultOption=yc(sF.defaultOption,{selected:null,minOpen:!1,maxOpen:!1,align:"auto",itemWidth:20,itemHeight:14,itemSymbol:"roundRect",pieces:null,categories:null,splitNumber:5,selectedMode:"multiple",itemGap:10,hoverLink:!0}),e}(sF),RF={splitNumber:function(t){var e=this.option,n=Math.min(e.precision,20),i=this.getExtent(),r=e.splitNumber;r=Math.max(parseInt(r,10),1),e.splitNumber=r;for(var o=(i[1]-i[0])/r;+o.toFixed(n)!==o&&n<5;)n++;e.precision=n,o=+o.toFixed(n),e.minOpen&&t.push({interval:[-1/0,i[0]],close:[0,0]});for(var a=0,s=i[0];a<r;s+=o,a++){var l=a===r-1?i[1]:s+o;t.push({interval:[s,l],close:[1,1]})}e.maxOpen&&t.push({interval:[i[1],1/0],close:[0,0]}),Qr(t),E(t,(function(t,e){t.index=e,t.text=this.formatValueText(t.interval)}),this)},categories:function(t){var e=this.option;E(e.categories,(function(e){t.push({text:this.formatValueText(e,!0),value:e})}),this),NF(e,t)},pieces:function(t){var e=this.option;E(e.pieces,(function(e,n){q(e)||(e={value:e});var i={text:"",index:n};if(null!=e.label&&(i.text=e.label),e.hasOwnProperty("value")){var r=i.value=e.value;i.interval=[r,r],i.close=[1,1]}else{for(var o=i.interval=[],a=i.close=[0,0],s=[1,0,1],l=[-1/0,1/0],u=[],h=0;h<2;h++){for(var c=[["gte","gt","min"],["lte","lt","max"]][h],p=0;p<3&&null==o[h];p++)o[h]=e[c[p]],a[h]=s[p],u[h]=2===p;null==o[h]&&(o[h]=l[h])}u[0]&&o[1]===1/0&&(a[0]=0),u[1]&&o[0]===-1/0&&(a[1]=0),o[0]===o[1]&&a[0]&&a[1]&&(i.value=o[0])}i.visual=iD.retrieveVisuals(e),t.push(i)}),this),NF(e,t),Qr(t),E(t,(function(t){var e=t.close,n=[["<","≤"][e[1]],[">","≥"][e[0]]];t.text=t.text||this.formatValueText(null!=t.value?t.value:t.interval,!1,n)}),this)}};function NF(t,e){var n=t.inverse;("vertical"===t.orient?!n:n)&&e.reverse()}var EF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.doRender=function(){var t=this.group;t.removeAll();var e=this.visualMapModel,n=e.get("textGap"),i=e.textStyleModel,r=i.getFont(),o=i.getTextColor(),a=this._getItemAlign(),s=e.itemSize,l=this._getViewData(),u=l.endsText,h=it(e.get("showLabel",!0),!u);u&&this._renderEndsText(t,u[0],s,h,a),E(l.viewPieceList,(function(i){var l=i.piece,u=new Cr;u.onclick=W(this._onItemClick,this,l),this._enableHoverLink(u,i.indexInModelPieceList);var c=e.getRepresentValue(l);if(this._createItemSymbol(u,c,[0,0,s[0],s[1]]),h){var p=this.visualMapModel.getValueState(c);u.add(new ks({style:{x:"right"===a?-n:s[0]+n,y:s[1]/2,text:l.text,verticalAlign:"middle",align:a,font:r,fill:o,opacity:"outOfRange"===p?.5:1}}))}t.add(u)}),this),u&&this._renderEndsText(t,u[1],s,h,a),mp(e.get("orient"),t,e.get("itemGap")),this.renderBackground(t),this.positionGroup(t)},e.prototype._enableHoverLink=function(t,e){var n=this;t.on("mouseover",(function(){return i("highlight")})).on("mouseout",(function(){return i("downplay")}));var i=function(t){var i=n.visualMapModel;i.option.hoverLink&&n.api.dispatchAction({type:t,batch:fF(i.findTargetDataIndices(e),i)})}},e.prototype._getItemAlign=function(){var t=this.visualMapModel,e=t.option;if("vertical"===e.orient)return dF(t,this.api,t.itemSize);var n=e.align;return n&&"auto"!==n||(n="left"),n},e.prototype._renderEndsText=function(t,e,n,i,r){if(e){var o=new Cr,a=this.visualMapModel.textStyleModel;o.add(new ks({style:Uh(a,{x:i?"right"===r?n[0]:0:n[0]/2,y:n[1]/2,verticalAlign:"middle",align:i?r:"center",text:e})})),t.add(o)}},e.prototype._getViewData=function(){var t=this.visualMapModel,e=z(t.getPieceList(),(function(t,e){return{piece:t,indexInModelPieceList:e}})),n=t.get("text"),i=t.get("orient"),r=t.get("inverse");return("horizontal"===i?r:!r)?e.reverse():n&&(n=n.slice().reverse()),{viewPieceList:e,endsText:n}},e.prototype._createItemSymbol=function(t,e,n){t.add(Ly(this.getControllerVisual(e,"symbol"),n[0],n[1],n[2],n[3],this.getControllerVisual(e,"color")))},e.prototype._onItemClick=function(t){var e=this.visualMapModel,n=e.option,i=n.selectedMode;if(i){var r=T(n.selected),o=e.getSelectedMapKey(t);"single"===i||!0===i?(r[o]=!0,E(r,(function(t,e){r[e]=e===o}))):r[o]=!r[o],this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:r})}},e.type="visualMap.piecewise",e}(cF);function zF(t){t.registerComponentModel(OF),t.registerComponentView(EF),LF(t)}var VF={label:{enabled:!0},decal:{show:!1}},BF=So(),FF={};function GF(t,e){var n=t.getModel("aria");if(n.get("enabled")){var i=T(VF);C(i.label,t.getLocaleModel().get("aria"),!1),C(n.option,i,!1),function(){if(n.getModel("decal").get("show")){var e=ft();t.eachSeries((function(t){if(!t.isColorBySeries()){var n=e.get(t.type);n||(n={},e.set(t.type,n)),BF(t).scope=n}})),t.eachRawSeries((function(e){if(!t.isSeriesFiltered(e))if(U(e.enableAriaDecal))e.enableAriaDecal();else{var n=e.getData();if(e.isColorBySeries()){var i=ed(e.ecModel,e.name,FF,t.getSeriesCount()),r=n.getVisual("decal");n.setVisual("decal",u(r,i))}else{var o=e.getRawData(),a={},s=BF(e).scope;n.each((function(t){var e=n.getRawIndex(t);a[e]=t}));var l=o.count();o.each((function(t){var i=a[t],r=o.getName(t)||t+"",h=ed(e.ecModel,r,s,l),c=n.getItemVisual(i,"decal");n.setItemVisual(i,"decal",u(c,h))}))}}function u(t,e){var n=t?A(A({},e),t):e;return n.dirty=!0,n}}))}}(),function(){var i=t.getLocaleModel().get("aria"),o=n.getModel("label");if(o.option=k(o.option,i),!o.get("enabled"))return;var a=e.getZr().dom;if(o.get("description"))return void a.setAttribute("aria-label",o.get("description"));var s,l=t.getSeriesCount(),u=o.get(["data","maxCount"])||10,h=o.get(["series","maxCount"])||10,c=Math.min(l,h);if(l<1)return;var p=function(){var e=t.get("title");e&&e.length&&(e=e[0]);return e&&e.text}();if(p){var d=o.get(["general","withTitle"]);s=r(d,{title:p})}else s=o.get(["general","withoutTitle"]);var f=[],g=l>1?o.get(["series","multiple","prefix"]):o.get(["series","single","prefix"]);s+=r(g,{seriesCount:l}),t.eachSeries((function(e,n){if(n<c){var i=void 0,a=e.get("name")?"withName":"withoutName";i=r(i=l>1?o.get(["series","multiple",a]):o.get(["series","single",a]),{seriesId:e.seriesIndex,seriesName:e.get("name"),seriesType:(x=e.subType,t.getLocaleModel().get(["series","typeNames"])[x]||"自定义图")});var s=e.getData();if(s.count()>u)i+=r(o.get(["data","partialData"]),{displayCnt:u});else i+=o.get(["data","allData"]);for(var h=o.get(["data","separator","middle"]),p=o.get(["data","separator","end"]),d=[],g=0;g<s.count();g++)if(g<u){var y=s.getName(g),v=s.getValues(g),m=o.get(["data",y?"withName":"withoutName"]);d.push(r(m,{name:y,value:v.join(h)}))}i+=d.join(h)+p,f.push(i)}var x}));var y=o.getModel(["series","multiple","separator"]),v=y.get("middle"),m=y.get("end");s+=f.join(v)+m,a.setAttribute("aria-label",s)}()}function r(t,e){if(!X(t))return t;var n=t;return E(e,(function(t,e){n=n.replace(new RegExp("\\{\\s*"+e+"\\s*\\}","g"),t)})),n}}function WF(t){if(t&&t.aria){var e=t.aria;null!=e.show&&(e.enabled=e.show),e.label=e.label||{},E(["description","general","series","data"],(function(t){null!=e[t]&&(e.label[t]=e[t])}))}}var HF={value:"eq","<":"lt","<=":"lte",">":"gt",">=":"gte","=":"eq","!=":"ne","<>":"ne"},YF=function(){function t(t){if(null==(this._condVal=X(t)?new RegExp(t):et(t)?t:null)){var e="";0,ao(e)}}return t.prototype.evaluate=function(t){var e=typeof t;return X(e)?this._condVal.test(t):!!j(e)&&this._condVal.test(t+"")},t}(),UF=function(){function t(){}return t.prototype.evaluate=function(){return this.value},t}(),XF=function(){function t(){}return t.prototype.evaluate=function(){for(var t=this.children,e=0;e<t.length;e++)if(!t[e].evaluate())return!1;return!0},t}(),ZF=function(){function t(){}return t.prototype.evaluate=function(){for(var t=this.children,e=0;e<t.length;e++)if(t[e].evaluate())return!0;return!1},t}(),jF=function(){function t(){}return t.prototype.evaluate=function(){return!this.child.evaluate()},t}(),qF=function(){function t(){}return t.prototype.evaluate=function(){for(var t=!!this.valueParser,e=(0,this.getValue)(this.valueGetterParam),n=t?this.valueParser(e):null,i=0;i<this.subCondList.length;i++)if(!this.subCondList[i].evaluate(t?n:e))return!1;return!0},t}();function KF(t,e){if(!0===t||!1===t){var n=new UF;return n.value=t,n}var i="";return JF(t)||ao(i),t.and?$F("and",t,e):t.or?$F("or",t,e):t.not?function(t,e){var n=t.not,i="";0;JF(n)||ao(i);var r=new jF;r.child=KF(n,e),r.child||ao(i);return r}(t,e):function(t,e){for(var n="",i=e.prepareGetValue(t),r=[],o=G(t),a=t.parser,s=a?gf(a):null,l=0;l<o.length;l++){var u=o[l];if("parser"!==u&&!e.valueGetterAttrMap.get(u)){var h=mt(HF,u)?HF[u]:u,c=t[u],p=s?s(c):c,d=_f(h,p)||"reg"===h&&new YF(p);d||ao(n),r.push(d)}}r.length||ao(n);var f=new qF;return f.valueGetterParam=i,f.valueParser=s,f.getValue=e.getValue,f.subCondList=r,f}(t,e)}function $F(t,e,n){var i=e[t],r="";Y(i)||ao(r),i.length||ao(r);var o="and"===t?new XF:new ZF;return o.children=z(i,(function(t){return KF(t,n)})),o.children.length||ao(r),o}function JF(t){return q(t)&&!N(t)}var QF=function(){function t(t,e){this._cond=KF(t,e)}return t.prototype.evaluate=function(){return this._cond.evaluate()},t}();var tG={type:"echarts:filter",transform:function(t){for(var e,n,i,r=t.upstream,o=(n=t.config,i={valueGetterAttrMap:ft({dimension:!0}),prepareGetValue:function(t){var e="",n=t.dimension;mt(t,"dimension")||ao(e);var i=r.getDimensionInfo(n);return i||ao(e),{dimIdx:i.index}},getValue:function(t){return r.retrieveValueFromItem(e,t.dimIdx)}},new QF(n,i)),a=[],s=0,l=r.count();s<l;s++)e=r.getRawDataItem(s),o.evaluate()&&a.push(e);return{data:a}}};var eG={type:"echarts:sort",transform:function(t){var e=t.upstream,n=t.config,i="",r=ho(n);r.length||ao(i);var o=[];E(r,(function(t){var n=t.dimension,r=t.order,a=t.parser,s=t.incomparable;if(null==n&&ao(i),"asc"!==r&&"desc"!==r&&ao(i),s&&"min"!==s&&"max"!==s){var l="";0,ao(l)}if("asc"!==r&&"desc"!==r){var u="";0,ao(u)}var h=e.getDimensionInfo(n);h||ao(i);var c=a?gf(a):null;a&&!c&&ao(i),o.push({dimIdx:h.index,parser:c,comparator:new mf(r,s)})}));var a=e.sourceFormat;a!==Pp&&a!==Op&&ao(i);for(var s=[],l=0,u=e.count();l<u;l++)s.push(e.getRawDataItem(l));return s.sort((function(t,n){for(var i=0;i<o.length;i++){var r=o[i],a=e.retrieveValueFromItem(t,r.dimIdx),s=e.retrieveValueFromItem(n,r.dimIdx);r.parser&&(a=r.parser(a),s=r.parser(s));var l=r.comparator.evaluate(a,s);if(0!==l)return l}return 0})),{data:s}}};var nG=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="dataset",e}return n(e,t),e.prototype.init=function(e,n,i){t.prototype.init.call(this,e,n,i),this._sourceManager=new Bf(this),Ff(this)},e.prototype.mergeOption=function(e,n){t.prototype.mergeOption.call(this,e,n),Ff(this)},e.prototype.optionUpdated=function(){this._sourceManager.dirty()},e.prototype.getSourceManager=function(){return this._sourceManager},e.type="dataset",e.defaultOption={seriesLayoutBy:zp},e}(Tp),iG=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="dataset",e}return n(e,t),e.type="dataset",e}(gg);var rG=qa.CMD;function oG(t,e){return Math.abs(t-e)<1e-5}function aG(t){var e,n,i,r,o,a=t.data,s=t.len(),l=[],u=0,h=0,c=0,p=0;function d(t,n){e&&e.length>2&&l.push(e),e=[t,n]}function f(t,n,i,r){oG(t,i)&&oG(n,r)||e.push(t,n,i,r,i,r)}function g(t,n,i,r,o,a){var s=Math.abs(n-t),l=4*Math.tan(s/4)/3,u=n<t?-1:1,h=Math.cos(t),c=Math.sin(t),p=Math.cos(n),d=Math.sin(n),f=h*o+i,g=c*a+r,y=p*o+i,v=d*a+r,m=o*l*u,x=a*l*u;e.push(f-m*c,g+x*h,y+m*d,v-x*p,y,v)}for(var y=0;y<s;){var v=a[y++],m=1===y;switch(m&&(c=u=a[y],p=h=a[y+1],v!==rG.L&&v!==rG.C&&v!==rG.Q||(e=[c,p])),v){case rG.M:u=c=a[y++],h=p=a[y++],d(c,p);break;case rG.L:f(u,h,n=a[y++],i=a[y++]),u=n,h=i;break;case rG.C:e.push(a[y++],a[y++],a[y++],a[y++],u=a[y++],h=a[y++]);break;case rG.Q:n=a[y++],i=a[y++],r=a[y++],o=a[y++],e.push(u+2/3*(n-u),h+2/3*(i-h),r+2/3*(n-r),o+2/3*(i-o),r,o),u=r,h=o;break;case rG.A:var x=a[y++],_=a[y++],b=a[y++],w=a[y++],S=a[y++],M=a[y++]+S;y+=1;var I=!a[y++];n=Math.cos(S)*b+x,i=Math.sin(S)*w+_,m?d(c=n,p=i):f(u,h,n,i),u=Math.cos(M)*b+x,h=Math.sin(M)*w+_;for(var T=(I?-1:1)*Math.PI/2,C=S;I?C>M:C<M;C+=T){g(C,I?Math.max(C+T,M):Math.min(C+T,M),x,_,b,w)}break;case rG.R:c=u=a[y++],p=h=a[y++],n=c+a[y++],i=p+a[y++],d(n,p),f(n,p,n,i),f(n,i,c,i),f(c,i,c,p),f(c,p,n,p);break;case rG.Z:e&&f(u,h,c,p),u=c,h=p}}return e&&e.length>2&&l.push(e),l}function sG(t,e,n,i,r,o,a,s,l,u){if(oG(t,n)&&oG(e,i)&&oG(r,a)&&oG(o,s))l.push(a,s);else{var h=2/u,c=h*h,p=a-t,d=s-e,f=Math.sqrt(p*p+d*d);p/=f,d/=f;var g=n-t,y=i-e,v=r-a,m=o-s,x=g*g+y*y,_=v*v+m*m;if(x<c&&_<c)l.push(a,s);else{var b=p*g+d*y,w=-p*v-d*m;if(x-b*b<c&&b>=0&&_-w*w<c&&w>=0)l.push(a,s);else{var S=[],M=[];Ze(t,n,r,a,.5,S),Ze(e,i,o,s,.5,M),sG(S[0],M[0],S[1],M[1],S[2],M[2],S[3],M[3],l,u),sG(S[4],M[4],S[5],M[5],S[6],M[6],S[7],M[7],l,u)}}}}function lG(t,e,n){var i=t[e],r=t[1-e],o=Math.abs(i/r),a=Math.ceil(Math.sqrt(o*n)),s=Math.floor(n/a);0===s&&(s=1,a=n);for(var l=[],u=0;u<a;u++)l.push(s);var h=n-a*s;if(h>0)for(u=0;u<h;u++)l[u%a]+=1;return l}function uG(t,e,n){for(var i=t.r0,r=t.r,o=t.startAngle,a=t.endAngle,s=Math.abs(a-o),l=s*r,u=r-i,h=l>Math.abs(u),c=lG([l,u],h?0:1,e),p=(h?s:u)/c.length,d=0;d<c.length;d++)for(var f=(h?u:s)/c[d],g=0;g<c[d];g++){var y={};h?(y.startAngle=o+p*d,y.endAngle=o+p*(d+1),y.r0=i+f*g,y.r=i+f*(g+1)):(y.startAngle=o+f*g,y.endAngle=o+f*(g+1),y.r0=i+p*d,y.r=i+p*(d+1)),y.clockwise=t.clockwise,y.cx=t.cx,y.cy=t.cy,n.push(y)}}function hG(t,e,n,i){return t*i-n*e}function cG(t,e,n,i,r,o,a,s){var l=n-t,u=i-e,h=a-r,c=s-o,p=hG(h,c,l,u);if(Math.abs(p)<1e-6)return null;var d=hG(t-r,e-o,h,c)/p;return d<0||d>1?null:new Ji(d*l+t,d*u+e)}function pG(t,e,n){var i=new Ji;Ji.sub(i,n,e),i.normalize();var r=new Ji;return Ji.sub(r,t,e),r.dot(i)}function dG(t,e){var n=t[t.length-1];n&&n[0]===e[0]&&n[1]===e[1]||t.push(e)}function fG(t){var e=t.points,n=[],i=[];Ma(e,n,i);var r=new sr(n[0],n[1],i[0]-n[0],i[1]-n[1]),o=r.width,a=r.height,s=r.x,l=r.y,u=new Ji,h=new Ji;return o>a?(u.x=h.x=s+o/2,u.y=l,h.y=l+a):(u.y=h.y=l+a/2,u.x=s,h.x=s+o),function(t,e,n){for(var i=t.length,r=[],o=0;o<i;o++){var a=t[o],s=t[(o+1)%i],l=cG(a[0],a[1],s[0],s[1],e.x,e.y,n.x,n.y);l&&r.push({projPt:pG(l,e,n),pt:l,idx:o})}if(r.length<2)return[{points:t},{points:t}];r.sort((function(t,e){return t.projPt-e.projPt}));var u=r[0],h=r[r.length-1];if(h.idx<u.idx){var c=u;u=h,h=c}var p=[u.pt.x,u.pt.y],d=[h.pt.x,h.pt.y],f=[p],g=[d];for(o=u.idx+1;o<=h.idx;o++)dG(f,t[o].slice());for(dG(f,d),dG(f,p),o=h.idx+1;o<=u.idx+i;o++)dG(g,t[o%i].slice());return dG(g,p),dG(g,d),[{points:f},{points:g}]}(e,u,h)}function gG(t,e,n,i){if(1===n)i.push(e);else{var r=Math.floor(n/2),o=t(e);gG(t,o[0],r,i),gG(t,o[1],n-r,i)}return i}function yG(t,e){e.setStyle(t.style),e.z=t.z,e.z2=t.z2,e.zlevel=t.zlevel}function vG(t,e){var n,i=[],r=t.shape;switch(t.type){case"rect":!function(t,e,n){for(var i=t.width,r=t.height,o=i>r,a=lG([i,r],o?0:1,e),s=o?"width":"height",l=o?"height":"width",u=o?"x":"y",h=o?"y":"x",c=t[s]/a.length,p=0;p<a.length;p++)for(var d=t[l]/a[p],f=0;f<a[p];f++){var g={};g[u]=p*c,g[h]=f*d,g[s]=c,g[l]=d,g.x+=t.x,g.y+=t.y,n.push(g)}}(r,e,i),n=Cs;break;case"sector":uG(r,e,i),n=Cu;break;case"circle":uG({r0:0,r:r.r,startAngle:0,endAngle:2*Math.PI,cx:r.cx,cy:r.cy},e,i),n=Cu;break;default:var o=t.getComputedTransform(),a=o?Math.sqrt(Math.max(o[0]*o[0]+o[1]*o[1],o[2]*o[2]+o[3]*o[3])):1,s=z(function(t,e){var n=aG(t),i=[];e=e||1;for(var r=0;r<n.length;r++){var o=n[r],a=[],s=o[0],l=o[1];a.push(s,l);for(var u=2;u<o.length;){var h=o[u++],c=o[u++],p=o[u++],d=o[u++],f=o[u++],g=o[u++];sG(s,l,h,c,p,d,f,g,a,e),s=f,l=g}i.push(a)}return i}(t.getUpdatedPathProxy(),a),(function(t){return function(t){for(var e=[],n=0;n<t.length;)e.push([t[n++],t[n++]]);return e}(t)})),l=s.length;if(0===l)gG(fG,{points:s[0]},e,i);else if(l===e)for(var u=0;u<l;u++)i.push({points:s[u]});else{var h=0,c=z(s,(function(t){var e=[],n=[];Ma(t,e,n);var i=(n[1]-e[1])*(n[0]-e[0]);return h+=i,{poly:t,area:i}}));c.sort((function(t,e){return e.area-t.area}));var p=e;for(u=0;u<l;u++){var d=c[u];if(p<=0)break;var f=u===l-1?p:Math.ceil(d.area/h*e);f<0||(gG(fG,{points:d.poly},f,i),p-=f)}}n=Pu}if(!n)return function(t,e){for(var n=[],i=0;i<e;i++)n.push(lu(t));return n}(t,e);var g=[];for(u=0;u<i.length;u++){var y=new n;y.setShape(i[u]),yG(t,y),g.push(y)}return g}function mG(t,e){var n=t.length,i=e.length;if(n===i)return[t,e];for(var r=[],o=[],a=n<i?t:e,s=Math.min(n,i),l=Math.abs(i-n)/6,u=(s-2)/6,h=Math.ceil(l/u)+1,c=[a[0],a[1]],p=l,d=2;d<s;){var f=a[d-2],g=a[d-1],y=a[d++],v=a[d++],m=a[d++],x=a[d++],_=a[d++],b=a[d++];if(p<=0)c.push(y,v,m,x,_,b);else{for(var w=Math.min(p,h-1)+1,S=1;S<=w;S++){var M=S/w;Ze(f,y,m,_,M,r),Ze(g,v,x,b,M,o),f=r[3],g=o[3],c.push(r[1],o[1],r[2],o[2],f,g),y=r[5],v=o[5],m=r[6],x=o[6]}p-=w-1}}return a===t?[c,e]:[t,c]}function xG(t,e){for(var n=t.length,i=t[n-2],r=t[n-1],o=[],a=0;a<e.length;)o[a++]=i,o[a++]=r;return o}function _G(t){for(var e=0,n=0,i=0,r=t.length,o=0,a=r-2;o<r;a=o,o+=2){var s=t[a],l=t[a+1],u=t[o],h=t[o+1],c=s*h-u*l;e+=c,n+=(s+u)*c,i+=(l+h)*c}return 0===e?[t[0]||0,t[1]||0]:[n/e/3,i/e/3,e]}function bG(t,e,n,i){for(var r=(t.length-2)/6,o=1/0,a=0,s=t.length,l=s-2,u=0;u<r;u++){for(var h=6*u,c=0,p=0;p<s;p+=2){var d=0===p?h:(h+p-2)%l+2,f=t[d]-n[0],g=t[d+1]-n[1],y=e[p]-i[0]-f,v=e[p+1]-i[1]-g;c+=y*y+v*v}c<o&&(o=c,a=u)}return a}function wG(t){for(var e=[],n=t.length,i=0;i<n;i+=2)e[i]=t[n-i-2],e[i+1]=t[n-i-1];return e}function SG(t){return t.__isCombineMorphing}var MG="__mOriginal_";function IG(t,e,n){var i=MG+e,r=t[i]||t[e];t[i]||(t[i]=t[e]);var o=n.replace,a=n.after,s=n.before;t[e]=function(){var t,e=arguments;return s&&s.apply(this,e),t=o?o.apply(this,e):r.apply(this,e),a&&a.apply(this,e),t}}function TG(t,e){var n=MG+e;t[n]&&(t[e]=t[n],t[n]=null)}function CG(t,e){for(var n=0;n<t.length;n++)for(var i=t[n],r=0;r<i.length;){var o=i[r],a=i[r+1];i[r++]=e[0]*o+e[2]*a+e[4],i[r++]=e[1]*o+e[3]*a+e[5]}}function DG(t,e){var n=t.getUpdatedPathProxy(),i=e.getUpdatedPathProxy(),r=function(t,e){for(var n,i,r,o=[],a=[],s=0;s<Math.max(t.length,e.length);s++){var l=t[s],u=e[s],h=void 0,c=void 0;l?u?(i=h=(n=mG(l,u))[0],r=c=n[1]):(c=xG(r||l,l),h=l):(h=xG(i||u,u),c=u),o.push(h),a.push(c)}return[o,a]}(aG(n),aG(i)),o=r[0],a=r[1],s=t.getComputedTransform(),l=e.getComputedTransform();s&&CG(o,s),l&&CG(a,l),IG(e,"updateTransform",{replace:function(){this.transform=null}}),e.transform=null;var u=function(t,e,n,i){for(var r,o=[],a=0;a<t.length;a++){var s=t[a],l=e[a],u=_G(s),h=_G(l);null==r&&(r=u[2]<0!=h[2]<0);var c=[],p=[],d=0,f=1/0,g=[],y=s.length;r&&(s=wG(s));for(var v=6*bG(s,l,u,h),m=y-2,x=0;x<m;x+=2){var _=(v+x)%m+2;c[x+2]=s[_]-u[0],c[x+3]=s[_+1]-u[1]}if(c[0]=s[v]-u[0],c[1]=s[v+1]-u[1],n>0)for(var b=i/n,w=-i/2;w<=i/2;w+=b){var S=Math.sin(w),M=Math.cos(w),I=0;for(x=0;x<s.length;x+=2){var T=c[x],C=c[x+1],D=l[x]-h[0],A=l[x+1]-h[1],k=D*M-A*S,L=D*S+A*M;g[x]=k,g[x+1]=L;var P=k-T,O=L-C;I+=P*P+O*O}if(I<f){f=I,d=w;for(var R=0;R<g.length;R++)p[R]=g[R]}}else for(var N=0;N<y;N+=2)p[N]=l[N]-h[0],p[N+1]=l[N+1]-h[1];o.push({from:c,to:p,fromCp:u,toCp:h,rotation:-d})}return o}(o,a,10,Math.PI),h=[];IG(e,"buildPath",{replace:function(t){for(var n=e.__morphT,i=1-n,r=[],o=0;o<u.length;o++){var a=u[o],s=a.from,l=a.to,c=a.rotation*n,p=a.fromCp,d=a.toCp,f=Math.sin(c),g=Math.cos(c);Bt(r,p,d,n);for(var y=0;y<s.length;y+=2){var v=s[y],m=s[y+1],x=v*i+(S=l[y])*n,_=m*i+(M=l[y+1])*n;h[y]=x*g-_*f+r[0],h[y+1]=x*f+_*g+r[1]}var b=h[0],w=h[1];t.moveTo(b,w);for(y=2;y<s.length;){var S=h[y++],M=h[y++],I=h[y++],T=h[y++],C=h[y++],D=h[y++];b===S&&w===M&&I===C&&T===D?t.lineTo(C,D):t.bezierCurveTo(S,M,I,T,C,D),b=C,w=D}}}})}function AG(t,e,n){if(!t||!e)return e;var i=n.done,r=n.during;return DG(t,e),e.__morphT=0,e.animateTo({__morphT:1},k({during:function(t){e.dirtyShape(),r&&r(t)},done:function(){TG(e,"buildPath"),TG(e,"updateTransform"),e.__morphT=-1,e.createPathProxy(),e.dirtyShape(),i&&i()}},n)),e}function kG(t,e,n,i,r,o){t=r===n?0:Math.round(32767*(t-n)/(r-n)),e=o===i?0:Math.round(32767*(e-i)/(o-i));for(var a,s=0,l=32768;l>0;l/=2){var u=0,h=0;(t&l)>0&&(u=1),(e&l)>0&&(h=1),s+=l*l*(3*u^h),0===h&&(1===u&&(t=l-1-t,e=l-1-e),a=t,t=e,e=a)}return s}function LG(t){var e=1/0,n=1/0,i=-1/0,r=-1/0,o=z(t,(function(t){var o=t.getBoundingRect(),a=t.getComputedTransform(),s=o.x+o.width/2+(a?a[4]:0),l=o.y+o.height/2+(a?a[5]:0);return e=Math.min(s,e),n=Math.min(l,n),i=Math.max(s,i),r=Math.max(l,r),[s,l]}));return z(o,(function(o,a){return{cp:o,z:kG(o[0],o[1],e,n,i,r),path:t[a]}})).sort((function(t,e){return t.z-e.z})).map((function(t){return t.path}))}function PG(t){return vG(t.path,t.count)}function OG(t){return Y(t[0])}function RG(t,e){for(var n=[],i=t.length,r=0;r<i;r++)n.push({one:t[r],many:[]});for(r=0;r<e.length;r++){var o=e[r].length,a=void 0;for(a=0;a<o;a++)n[a%i].many.push(e[r][a])}var s=0;for(r=i-1;r>=0;r--)if(!n[r].many.length){var l=n[s].many;if(l.length<=1){if(!s)return n;s=0}o=l.length;var u=Math.ceil(o/2);n[r].many=l.slice(u,o),n[s].many=l.slice(0,u),s++}return n}var NG={clone:function(t){for(var e=[],n=1-Math.pow(1-t.path.style.opacity,1/t.count),i=0;i<t.count;i++){var r=lu(t.path);r.setStyle("opacity",n),e.push(r)}return e},split:null};function EG(t,e,n,i,r,o){if(t.length&&e.length){var a=nh("update",i,r);if(a&&a.duration>0){var s,l,u=i.getModel("universalTransition").get("delay"),h=Object.assign({setToFinal:!0},a);OG(t)&&(s=t,l=e),OG(e)&&(s=e,l=t);for(var c=s?s===t:t.length>e.length,p=s?RG(l,s):RG(c?e:t,[c?t:e]),d=0,f=0;f<p.length;f++)d+=p[f].many.length;var g=0;for(f=0;f<p.length;f++)y(p[f],c,g,d),g+=p[f].many.length}}function y(t,e,i,r,a){var s=t.many,l=t.one;if(1!==s.length||a)for(var c=k({dividePath:NG[n],individualDelay:u&&function(t,e,n,o){return u(t+i,r)}},h),p=e?function(t,e,n){var i=[];!function t(e){for(var n=0;n<e.length;n++){var r=e[n];SG(r)?t(r.childrenRef()):r instanceof gs&&i.push(r)}}(t);var r=i.length;if(!r)return{fromIndividuals:[],toIndividuals:[],count:0};var o=(n.dividePath||PG)({path:e,count:r});if(o.length!==r)return console.error("Invalid morphing: unmatched splitted path"),{fromIndividuals:[],toIndividuals:[],count:0};i=LG(i),o=LG(o);for(var a=n.done,s=n.during,l=n.individualDelay,u=new qi,h=0;h<r;h++){var c=i[h],p=o[h];p.parent=e,p.copyTransform(u),l||DG(c,p)}function d(t){for(var e=0;e<o.length;e++)o[e].addSelfToZr(t)}function f(){e.__isCombineMorphing=!1,e.__morphT=-1,e.childrenRef=null,TG(e,"addSelfToZr"),TG(e,"removeSelfFromZr")}e.__isCombineMorphing=!0,e.childrenRef=function(){return o},IG(e,"addSelfToZr",{after:function(t){d(t)}}),IG(e,"removeSelfFromZr",{after:function(t){for(var e=0;e<o.length;e++)o[e].removeSelfFromZr(t)}});var g=o.length;if(l){var y=g,v=function(){0==--y&&(f(),a&&a())};for(h=0;h<g;h++){var m=l?k({delay:(n.delay||0)+l(h,g,i[h],o[h]),done:v},n):n;AG(i[h],o[h],m)}}else e.__morphT=0,e.animateTo({__morphT:1},k({during:function(t){for(var n=0;n<g;n++){var i=o[n];i.__morphT=e.__morphT,i.dirtyShape()}s&&s(t)},done:function(){f();for(var e=0;e<t.length;e++)TG(t[e],"updateTransform");a&&a()}},n));return e.__zr&&d(e.__zr),{fromIndividuals:i,toIndividuals:o,count:g}}(s,l,c):function(t,e,n){var i=e.length,r=[],o=n.dividePath||PG;if(SG(t)){!function t(e){for(var n=0;n<e.length;n++){var i=e[n];SG(i)?t(i.childrenRef()):i instanceof gs&&r.push(i)}}(t.childrenRef());var a=r.length;if(a<i)for(var s=0,l=a;l<i;l++)r.push(lu(r[s++%a]));r.length=i}else{r=o({path:t,count:i});var u=t.getComputedTransform();for(l=0;l<r.length;l++)r[l].setLocalTransform(u);if(r.length!==i)return console.error("Invalid morphing: unmatched splitted path"),{fromIndividuals:[],toIndividuals:[],count:0}}r=LG(r),e=LG(e);var h=n.individualDelay;for(l=0;l<i;l++){var c=h?k({delay:(n.delay||0)+h(l,i,r[l],e[l])},n):n;AG(r[l],e[l],c)}return{fromIndividuals:r,toIndividuals:e,count:e.length}}(l,s,c),d=p.fromIndividuals,f=p.toIndividuals,g=d.length,v=0;v<g;v++){m=u?k({delay:u(v,g)},h):h;o(d[v],f[v],e?s[v]:t.one,e?t.one:s[v],m)}else{var m,x=e?s[0]:l,_=e?l:s[0];if(SG(x))y({many:[x],one:_},!0,i,r,!0);else AG(x,_,m=u?k({delay:u(i,r)},h):h),o(x,_,x,_,m)}}}function zG(t){if(!t)return[];if(Y(t)){for(var e=[],n=0;n<t.length;n++)e.push(zG(t[n]));return e}var i=[];return t.traverse((function(t){t instanceof gs&&!t.disableMorphing&&!t.invisible&&!t.ignore&&i.push(t)})),i}var VG=So();function BG(t){var e=[];return E(t,(function(t){var n=t.data;if(!(n.count()>1e4))for(var i=n.getIndices(),r=function(t){for(var e=t.dimensions,n=0;n<e.length;n++){var i=t.getDimensionInfo(e[n]);if(i&&0===i.otherDims.itemGroupId)return e[n]}}(n),o=0;o<i.length;o++)e.push({data:n,dim:t.dim||r,divide:t.divide,dataIndex:o})})),e}function FG(t,e,n){t.traverse((function(t){t instanceof gs&&oh(t,{style:{opacity:0}},e,{dataIndex:n,isFrom:!0})}))}function GG(t){if(t.parent){var e=t.getComputedTransform();t.setLocalTransform(e),t.parent.remove(t)}}function WG(t){t.stopAnimation(),t.isGroup&&t.traverse((function(t){t.stopAnimation()}))}function HG(t,e,n){var i=nh("update",n,e);i&&t.traverse((function(t){if(t instanceof da){var e=function(t){return eh(t).oldStyle}(t);e&&t.animateFrom({style:e},i)}}))}function YG(t,e,n){var i=BG(t),r=BG(e);function o(t,e,n,i,r){(n||t)&&e.animateFrom({style:n&&n!==t?A(A({},n.style),t.style):t.style},r)}function a(t){for(var e=0;e<t.length;e++)if(t[e].dim)return t[e].dim}var s=a(i),l=a(r),u=!1;function h(t,e){return function(n){var i=n.data,r=n.dataIndex;if(e)return i.getId(r);var o=i.hostModel&&i.hostModel.get("dataGroupId"),a=t?s||l:l||s,u=a&&i.getDimensionInfo(a),h=u&&u.ordinalMeta;if(u){var c=i.get(u.name,r);return h&&h.categories[c]||c+""}var p=i.getRawDataItem(r);return p&&p.groupId?p.groupId+"":o||i.getId(r)}}var c=function(t,e){var n=t.length;if(n!==e.length)return!1;for(var i=0;i<n;i++){var r=t[i],o=e[i];if(r.data.getId(r.dataIndex)!==o.data.getId(o.dataIndex))return!1}return!0}(i,r),p={};if(!c)for(var d=0;d<r.length;d++){var f=r[d],g=f.data.getItemGraphicEl(f.dataIndex);g&&(p[g.id]=!0)}function y(t,e){var n=i[e],a=r[t],s=a.data.hostModel,l=n.data.getItemGraphicEl(n.dataIndex),h=a.data.getItemGraphicEl(a.dataIndex);l!==h?l&&p[l.id]||h&&(WG(h),l?(WG(l),GG(l),u=!0,EG(zG(l),zG(h),a.divide,s,t,o)):FG(h,s,t)):h&&HG(h,a.dataIndex,s)}new Im(i,r,h(!0,c),h(!1,c),null,"multiple").update(y).updateManyToOne((function(t,e){var n=r[t],a=n.data,s=a.hostModel,l=a.getItemGraphicEl(n.dataIndex),h=B(z(e,(function(t){return i[t].data.getItemGraphicEl(i[t].dataIndex)})),(function(t){return t&&t!==l&&!p[t.id]}));l&&(WG(l),h.length?(E(h,(function(t){WG(t),GG(t)})),u=!0,EG(zG(h),zG(l),n.divide,s,t,o)):FG(l,s,n.dataIndex))})).updateOneToMany((function(t,e){var n=i[e],a=n.data.getItemGraphicEl(n.dataIndex);if(!a||!p[a.id]){var s=B(z(t,(function(t){return r[t].data.getItemGraphicEl(r[t].dataIndex)})),(function(t){return t&&t!==a})),l=r[t[0]].data.hostModel;s.length&&(E(s,(function(t){return WG(t)})),a?(WG(a),GG(a),u=!0,EG(zG(a),zG(s),n.divide,l,t[0],o)):E(s,(function(e){return FG(e,l,t[0])})))}})).updateManyToMany((function(t,e){new Im(e,t,(function(t){return i[t].data.getId(i[t].dataIndex)}),(function(t){return r[t].data.getId(r[t].dataIndex)})).update((function(n,i){y(t[n],e[i])})).execute()})).execute(),u&&E(e,(function(t){var e=t.data.hostModel,i=e&&n.getViewOfSeriesModel(e),r=nh("update",e,0);i&&e.isAnimationEnabled()&&r&&r.duration>0&&i.group.traverse((function(t){t instanceof gs&&!t.animators.length&&t.animateFrom({style:{opacity:0}},r)}))}))}function UG(t){var e=t.getModel("universalTransition").get("seriesKey");return e||t.id}function XG(t){return Y(t)?t.sort().join(","):t}function ZG(t){if(t.hostModel)return t.hostModel.getModel("universalTransition").get("divideShape")}function jG(t,e){for(var n=0;n<t.length;n++){if(null!=e.seriesIndex&&e.seriesIndex===t[n].seriesIndex||null!=e.seriesId&&e.seriesId===t[n].id)return n}}wm([function(t){t.registerPainter("canvas",Fw)}]),wm([function(t){t.registerPainter("svg",Ow)}]),wm([function(t){t.registerChartView(_S),t.registerSeriesModel(Gw),t.registerLayout(bS("line",!0)),t.registerVisual({seriesType:"line",reset:function(t){var e=t.getData(),n=t.getModel("lineStyle").getLineStyle();n&&!n.stroke&&(n.stroke=e.getVisual("style").fill),e.setVisual("legendLineStyle",n)}}),t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC,MS("line"))},function(t){t.registerChartView(OS),t.registerSeriesModel(TS),t.registerLayout(t.PRIORITY.VISUAL.LAYOUT,H(kx,"bar")),t.registerLayout(t.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT,Lx("bar")),t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC,MS("bar")),t.registerAction({type:"changeAxisOrder",event:"changeAxisOrder",update:"update"},(function(t,e){var n=t.componentType||"series";e.eachComponent({mainType:n,query:t},(function(e){t.sortInfo&&e.axis.setCategorySortInfo(t.sortInfo)}))}))},function(t){t.registerChartView(lM),t.registerSeriesModel(cM),vy("pie",t.registerAction),t.registerLayout(H(QS,"pie")),t.registerProcessor(tM("pie")),t.registerProcessor(function(t){return{seriesType:t,reset:function(t,e){var n=t.getData();n.filterSelf((function(t){var e=n.mapDimension("value"),i=n.get(e,t);return!(j(i)&&!isNaN(i)&&i<0)}))}}}("pie"))},function(t){wm(pI),t.registerSeriesModel(pM),t.registerChartView(yM),t.registerLayout(bS("scatter"))},function(t){wm(TI),t.registerChartView(vI),t.registerSeriesModel(mI),t.registerLayout(dI),t.registerProcessor(tM("radar")),t.registerPreprocessor(yI)},function(t){wm(tC),t.registerChartView(ET),t.registerSeriesModel(zT),t.registerLayout(BT),t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC,VT),vy("map",t.registerAction)},function(t){t.registerChartView(pC),t.registerSeriesModel(RC),t.registerLayout(EC),t.registerVisual(zC),function(t){t.registerAction({type:"treeExpandAndCollapse",event:"treeExpandAndCollapse",update:"update"},(function(t,e){e.eachComponent({mainType:"series",subType:"tree",query:t},(function(e){var n=t.dataIndex,i=e.getData().tree.getNodeByDataIndex(n);i.isExpand=!i.isExpand}))})),t.registerAction({type:"treeRoam",event:"treeRoam",update:"none"},(function(t,e,n){e.eachComponent({mainType:"series",subType:"tree",query:t},(function(e){var i=$T(e.coordinateSystem,t,void 0,n);e.setCenter&&e.setCenter(i.center),e.setZoom&&e.setZoom(i.zoom)}))}))}(t)},function(t){t.registerSeriesModel(FC),t.registerChartView(QC),t.registerVisual(yD),t.registerLayout(AD),function(t){for(var e=0;e<VC.length;e++)t.registerAction({type:VC[e],update:"updateView"},xt);t.registerAction({type:"treemapRootToNode",update:"updateView"},(function(t,e){e.eachComponent({mainType:"series",subType:"treemap",query:t},(function(e,n){var i=kC(t,["treemapZoomToNode","treemapRootToNode"],e);if(i){var r=e.getViewRoot();r&&(t.direction=PC(r,i.node)?"rollUp":"drillDown"),e.resetViewRoot(i.node)}}))}))}(t)},function(t){t.registerChartView(DA),t.registerSeriesModel(NA),t.registerProcessor(ND),t.registerVisual(ED),t.registerVisual(VD),t.registerLayout(jD),t.registerLayout(t.PRIORITY.VISUAL.POST_CHART_LAYOUT,eA),t.registerLayout(iA),t.registerCoordinateSystem("graphView",{dimensions:GT.dimensions,create:rA}),t.registerAction({type:"focusNodeAdjacency",event:"focusNodeAdjacency",update:"series:focusNodeAdjacency"},xt),t.registerAction({type:"unfocusNodeAdjacency",event:"unfocusNodeAdjacency",update:"series:unfocusNodeAdjacency"},xt),t.registerAction(EA,(function(t,e,n){e.eachComponent({mainType:"series",query:t},(function(e){var i=$T(e.coordinateSystem,t,void 0,n);e.setCenter&&e.setCenter(i.center),e.setZoom&&e.setZoom(i.zoom)}))}))},function(t){t.registerChartView(FA),t.registerSeriesModel(GA)},function(t){t.registerChartView(YA),t.registerSeriesModel(UA),t.registerLayout(XA),t.registerProcessor(tM("funnel"))},function(t){wm(mL),t.registerChartView(ZA),t.registerSeriesModel(JA),t.registerVisual(t.PRIORITY.VISUAL.BRUSH,ek)},function(t){t.registerChartView(bL),t.registerSeriesModel(wL),t.registerLayout(SL),t.registerVisual(NL),t.registerAction({type:"dragNode",event:"dragnode",update:"update"},(function(t,e){e.eachComponent({mainType:"series",subType:"sankey",query:t},(function(e){e.setNodePosition(t.dataIndex,[t.localX,t.localY])}))}))},function(t){t.registerSeriesModel(zL),t.registerChartView(VL),t.registerVisual(YL),t.registerLayout(XL),t.registerTransform(ZL)},function(t){t.registerChartView(qL),t.registerSeriesModel(aP),t.registerPreprocessor(sP),t.registerVisual(pP),t.registerLayout(dP)},function(t){t.registerChartView(vP),t.registerSeriesModel(mP),t.registerLayout(bS("effectScatter"))},function(t){t.registerChartView(TP),t.registerSeriesModel(kP),t.registerLayout(IP),t.registerVisual(PP)},function(t){t.registerChartView(NP),t.registerSeriesModel(EP)},function(t){t.registerChartView(FP),t.registerSeriesModel(rO),t.registerLayout(t.PRIORITY.VISUAL.LAYOUT,H(kx,"pictorialBar")),t.registerLayout(t.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT,Lx("pictorialBar"))},function(t){t.registerChartView(oO),t.registerSeriesModel(aO),t.registerLayout(sO),t.registerProcessor(tM("themeRiver"))},function(t){t.registerChartView(pO),t.registerSeriesModel(dO),t.registerLayout(H(yO,"sunburst")),t.registerProcessor(H(tM,"sunburst")),t.registerVisual(mO),function(t){t.registerAction({type:hO,update:"updateView"},(function(t,e){e.eachComponent({mainType:"series",subType:"sunburst",query:t},(function(e,n){var i=kC(t,[hO],e);if(i){var r=e.getViewRoot();r&&(t.direction=PC(r,i.node)?"rollUp":"drillDown"),e.resetViewRoot(i.node)}}))})),t.registerAction({type:cO,update:"none"},(function(t,e,n){t=A({},t),e.eachComponent({mainType:"series",subType:"sunburst",query:t},(function(e){var n=kC(t,[cO],e);n&&(t.dataIndex=n.node.dataIndex)})),n.dispatchAction(A(t,{type:"highlight"}))})),t.registerAction({type:"sunburstUnhighlight",update:"updateView"},(function(t,e,n){t=A({},t),n.dispatchAction(A(t,{type:"downplay"}))}))}(t)},function(t){t.registerChartView(uR),t.registerSeriesModel(wO)}]),wm((function(t){wm(pI),wm(uN)})),wm((function(t){wm(uN),tI.registerAxisPointerClass("PolarAxisPointer",hN),t.registerCoordinateSystem("polar",MN),t.registerComponentModel(pN),t.registerComponentView(FN),MM(t,"angle",fN,VN),MM(t,"radius",gN,BN),t.registerComponentView(AN),t.registerComponentView(ON),t.registerLayout(H(zN,"bar"))})),wm(tC),wm((function(t){wm(uN),tI.registerAxisPointerClass("SingleAxisPointer",tE),t.registerComponentView(rE),t.registerComponentView(YN),t.registerComponentModel(XN),MM(t,"single",XN,XN.defaultOption),t.registerCoordinateSystem("single",$N)})),wm(mL),wm((function(t){t.registerComponentModel(oE),t.registerComponentView(sE),t.registerCoordinateSystem("calendar",uE)})),wm((function(t){t.registerComponentModel(gE),t.registerComponentView(mE),t.registerPreprocessor((function(t){var e=t.graphic;Y(e)?e[0]&&e[0].elements?t.graphic=[t.graphic[0]]:t.graphic=[{elements:e}]:e&&!e.elements&&(t.graphic=[{elements:[e]}])}))})),wm((function(t){t.registerComponentModel(UE),t.registerComponentView(ZE),HE("saveAsImage",jE),HE("magicType",$E),HE("dataView",rz),HE("dataZoom",Tz),HE("restore",uz),wm(FE)})),wm((function(t){wm(uN),t.registerComponentModel(Az),t.registerComponentView(Xz),t.registerAction({type:"showTip",event:"showTip",update:"tooltip:manuallyShowTip"},xt),t.registerAction({type:"hideTip",event:"hideTip",update:"tooltip:manuallyHideTip"},xt)})),wm(uN),wm((function(t){t.registerComponentView(fV),t.registerComponentModel(gV),t.registerPreprocessor($z),t.registerVisual(t.PRIORITY.VISUAL.BRUSH,uV),t.registerAction({type:"brush",event:"brush",update:"updateVisual"},(function(t,e){e.eachComponent({mainType:"brush",query:t},(function(e){e.setAreas(t.areas)}))})),t.registerAction({type:"brushSelect",event:"brushSelected",update:"none"},xt),t.registerAction({type:"brushEnd",event:"brushEnd",update:"none"},xt),HE("brush",mV)})),wm((function(t){t.registerComponentModel(xV),t.registerComponentView(_V)})),wm((function(t){t.registerComponentModel(wV),t.registerComponentView(CV),t.registerSubTypeDefaulter("timeline",(function(){return"slider"})),function(t){t.registerAction({type:"timelineChange",event:"timelineChanged",update:"prepareAndUpdate"},(function(t,e,n){var i=e.getComponent("timeline");return i&&null!=t.currentIndex&&(i.setCurrentIndex(t.currentIndex),!i.get("loop",!0)&&i.isIndexMax()&&i.getPlayState()&&(i.setPlayState(!1),n.dispatchAction({type:"timelinePlayChange",playState:!1,from:t.from}))),e.resetOption("timeline",{replaceMerge:i.get("replaceMerge",!0)}),k({currentIndex:i.option.currentIndex},t)})),t.registerAction({type:"timelinePlayChange",event:"timelinePlayChanged",update:"update"},(function(t,e){var n=e.getComponent("timeline");n&&null!=t.playState&&n.setPlayState(t.playState)}))}(t),t.registerPreprocessor(kV)})),wm((function(t){t.registerComponentModel(zV),t.registerComponentView(qV),t.registerPreprocessor((function(t){OV(t.series,"markPoint")&&(t.markPoint=t.markPoint||{})}))})),wm((function(t){t.registerComponentModel(KV),t.registerComponentView(iB),t.registerPreprocessor((function(t){OV(t.series,"markLine")&&(t.markLine=t.markLine||{})}))})),wm((function(t){t.registerComponentModel(rB),t.registerComponentView(pB),t.registerPreprocessor((function(t){OV(t.series,"markArea")&&(t.markArea=t.markArea||{})}))})),wm((function(t){wm(MB),wm(LB)})),wm((function(t){wm(HB),wm(JB)})),wm(HB),wm(JB),wm((function(t){wm(PF),wm(zF)})),wm(PF),wm(zF),wm((function(t){t.registerPreprocessor(WF),t.registerVisual(t.PRIORITY.VISUAL.ARIA,GF)})),wm((function(t){t.registerTransform(tG),t.registerTransform(eG)})),wm((function(t){t.registerComponentModel(nG),t.registerComponentView(iG)})),wm((function(t){t.registerUpdateLifecycle("series:beforeupdate",(function(t,e,n){E(ho(n.seriesTransition),(function(t){E(ho(t.to),(function(t){for(var e=n.updatedSeries,i=0;i<e.length;i++)(null!=t.seriesIndex&&t.seriesIndex===e[i].seriesIndex||null!=t.seriesId&&t.seriesId===e[i].id)&&(e[i].__universalTransitionEnabled=!0)}))}))})),t.registerUpdateLifecycle("series:transition",(function(t,e,n){var i=VG(e);if(i.oldSeries&&n.updatedSeries&&n.optionChanged){var r=n.seriesTransition;if(r)E(ho(r),(function(t){!function(t,e,n,i){var r=[],o=[];E(ho(t.from),(function(t){var n=jG(e.oldSeries,t);n>=0&&r.push({data:e.oldData[n],divide:ZG(e.oldData[n]),dim:t.dimension})})),E(ho(t.to),(function(t){var e=jG(n.updatedSeries,t);if(e>=0){var i=n.updatedSeries[e].getData();o.push({data:i,divide:ZG(i),dim:t.dimension})}})),r.length>0&&o.length>0&&YG(r,o,i)}(t,i,n,e)}));else{var o=function(t,e){var n=ft(),i=ft(),r=ft();return E(t.oldSeries,(function(e,n){var o=t.oldData[n],a=UG(e),s=XG(a);i.set(s,o),Y(a)&&E(a,(function(t){r.set(t,{data:o,key:s})}))})),E(e.updatedSeries,(function(t){if(t.isUniversalTransitionEnabled()&&t.isAnimationEnabled()){var e=t.getData(),o=UG(t),a=XG(o),s=i.get(a);if(s)n.set(a,{oldSeries:[{divide:ZG(s),data:s}],newSeries:[{divide:ZG(e),data:e}]});else if(Y(o)){var l=[];E(o,(function(t){var e=i.get(t);e&&l.push({divide:ZG(e),data:e})})),l.length&&n.set(a,{oldSeries:l,newSeries:[{data:e,divide:ZG(e)}]})}else{var u=r.get(o);if(u){var h=n.get(u.key);h||(h={oldSeries:[{data:u.data,divide:ZG(u.data)}],newSeries:[]},n.set(u.key,h)),h.newSeries.push({data:e,divide:ZG(e)})}}}})),n}(i,n);E(o.keys(),(function(t){var n=o.get(t);YG(n.oldSeries,n.newSeries,e)}))}E(n.updatedSeries,(function(t){t.__universalTransitionEnabled&&(t.__universalTransitionEnabled=!1)}))}for(var a=t.getSeries(),s=i.oldSeries=[],l=i.oldData=[],u=0;u<a.length;u++){var h=a[u].getData();h.count()<1e4&&(s.push(a[u]),l.push(h))}}))})),wm((function(t){t.registerUpdateLifecycle("series:beforeupdate",(function(t,e,n){var i=Db(e).labelManager;i||(i=Db(e).labelManager=new Cb),i.clearLabels()})),t.registerUpdateLifecycle("series:layoutlabels",(function(t,e,n){var i=Db(e).labelManager;n.updatedSeries.forEach((function(t){i.addLabelsOfSeries(e.getViewOfSeriesModel(t))})),i.updateLayoutConfig(e),i.layout(e),i.processLabelsOverall()}))})),t.Axis=H_,t.ChartView=xg,t.ComponentModel=Tp,t.ComponentView=gg,t.List=qm,t.Model=dc,t.PRIORITY=fv,t.SeriesModel=sg,t.color=Pn,t.connect=function(t){if(Y(t)){var e=t;t=null,E(e,(function(e){null!=e.group&&(t=e.group)})),t=t||"g_"+tm++,E(e,(function(e){e.group=t}))}return Jv[t]=!0,t},t.dataTool={},t.dependencies={zrender:"5.3.2"},t.disConnect=nm,t.disconnect=im,t.dispose=function(t){X(t)?t=$v[t]:t instanceof Fv||(t=rm(t)),t instanceof Fv&&!t.isDisposed()&&t.dispose()},t.env=r,t.extendChartView=function(t){var e=xg.extend(t);return xg.registerClass(e),e},t.extendComponentModel=function(t){var e=Tp.extend(t);return Tp.registerClass(e),e},t.extendComponentView=function(t){var e=gg.extend(t);return gg.registerClass(e),e},t.extendSeriesModel=function(t){var e=sg.extend(t);return sg.registerClass(e),e},t.format=L_,t.getCoordinateSystemDimensions=function(t){var e=hd.get(t);if(e)return e.getDimensionsInfo?e.getDimensionsInfo():e.dimensions.slice()},t.getInstanceByDom=rm,t.getInstanceById=function(t){return $v[t]},t.getMap=function(t){var e=hv("getMap");return e&&e(t)},t.graphic=k_,t.helper=f_,t.init=function(t,e,n){var i=!(n&&n.ssr);if(i){0;var r=rm(t);if(r)return r;0}var o=new Fv(t,e,n);return o.id="ec_"+Qv++,$v[o.id]=o,i&&ko(t,em,o.id),Nv(o),lv.trigger("afterinit",o),o},t.innerDrawElementOnCanvas=Qy,t.matrix=Gi,t.number=D_,t.parseGeoJSON=C_,t.parseGeoJson=C_,t.registerAction=cm,t.registerCoordinateSystem=pm,t.registerLayout=dm,t.registerLoading=vm,t.registerLocale=Sc,t.registerMap=mm,t.registerPostInit=lm,t.registerPostUpdate=um,t.registerPreprocessor=am,t.registerProcessor=sm,t.registerTheme=om,t.registerTransform=xm,t.registerUpdateLifecycle=hm,t.registerVisual=fm,t.setCanvasCreator=function(t){c({createCanvas:t})},t.setPlatformAPI=c,t.throttle=Dg,t.time=A_,t.use=wm,t.util=P_,t.vector=Ht,t.version="5.3.3",t.zrUtil=bt,t.zrender=Or,Object.defineProperty(t,"__esModule",{value:!0})})); diff --git a/view/templates/tpl/home.html b/view/templates/tpl/home.html index 12b4ed6..df6222f 100644 --- a/view/templates/tpl/home.html +++ b/view/templates/tpl/home.html @@ -16,6 +16,77 @@ <![endif]--> {literal} <style> + .admin-index-top-item-header{ + width: 100%; + height: 46px; + line-height: 46px; + padding-left: 12px; + padding-right: 12px; + color: rgba(0, 0, 0, 0.65); + font-size: 16px; + font-family: PingFangSC-Regular; + text-align: left; + white-space: nowrap; + box-sizing: border-box; + } + .admin-index-top-item-header-line{ + width: 100%; + height: 1px; + background-color: rgba(232, 232, 232, 1); + } + .admin-index-top-item-header-left{ + display: block; + float: left; + height: 100%; + width: auto; + } + .admin-index-top-item-header-left li{ + display: inline-block; + float: left; + font-size: 16px; + font-family: PingFangSC-Regular; + color: rgba(0,0,0,0.65); + margin-right: 64px; + cursor: pointer; + } + .admin-index-top-item-header-left li.active{ + font-family: PingFangSC-Medium !important; + color: #1890FF !important; + position: relative; + } + .admin-index-top-item-header-left li.active::after{ + content: ''; + width: 100%; + height: 2px; + border-radius: 1px; + background: #1890FF; + display: block; + } + .admin-index-top-item-header-right{ + display: block; + float: right; + height: 100%; + width: auto; + } + .admin-index-top-item-header-right li{ + display: inline-block; + float: left; + margin-left: 24px; + line-height: 55px; + font-size: 14px; + font-family: PingFangSC-Regular; + color: #595959; + cursor: pointer; + } + .admin-index-top-item-header-right li.active{ + color: #1890FF !important; + } + #admin-map-container{ + width: 100%; + box-sizing: border-box; + height: 325px; + overflow: hidden; + } </style> {/literal} </head> @@ -77,8 +148,23 @@ </div> </div> - <div class="layui-col-lg9 admin-layui-col-top-right"> - <div class="admin-index-top-item">2</div> + <div class="layui-col-lg7 admin-layui-col-top-right"> + <div class="admin-index-top-item"> + <div class="admin-index-top-item-header"> + <ul class="admin-index-top-item-header-left"> + <li class="active">销售额</li> + <li>退货订单数</li> + </ul> + + <ul class="admin-index-top-item-header-right"> + <li>本周</li> + <li>本月</li> + <li class="active">全年</li> + </ul> + </div> + <div class="admin-index-top-item-header-line"></div> + <div id="admin-map-container"></div> + </div> </div> </div> @@ -139,6 +225,7 @@ </div> --> </div> <script src="/js/layui.js"></script> +<script src="/js/echarts_5.5.3.min.js"></script> {literal} <script> layui.use(['element', 'layer', 'util'], function(){ @@ -165,6 +252,83 @@ layui.use(['element', 'layer', 'util'], function(){ } }); }); + +// width: 70px; +// height: 22px; +// font-size: 14px; +// font-family: PingFangSC-Medium, PingFang SC; +// font-weight: 500; +// line-height: 22px; + +var myChart = echarts.init(document.getElementById('admin-map-container')); +var monthList = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']; +var option = { + title: { + text: ' 销售额趋势', + textStyle:{ + color: 'rgba(0,0,0,0.85)', + fontFamily:'PingFangSC-Medium', + fontSize: 14, + lineHeight:55, + }, + }, + grid:{ + left:55, + top:74, + width:'90%', + height:226, + }, + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'shadow' + } + }, + xAxis: { + data: monthList, + axisLabel:{ + show:true, + color:'rgba(0,0,0,0.65)', + fontSize:12, + fontFamily: 'HelveticaNeue' + }, + axisLine:{ + show:true, + lineStyle:{ + color:'#D9D9D9', + } + }, + axisTick:{ + show:true, + alignWithLabel:true, + length:5, + } + }, + yAxis: { + splitLine:{ + show:true, + lineStyle:{ + color:['rgba(232, 232, 232, 1)'], + type:'dashed' + } + } + }, + series: [ + { + name: '销量', + type: 'bar', + data: [100, 1000, 256, 488, 588, 189, 110, 100, 556, 188, 888, 289], + itemStyle:{ + color:'rgba(24, 144, 255)', + opacity:0.85 + } + } + ] +}; + +// 使用刚指定的配置项和数据显示图表。 +myChart.setOption(option); + </script> {/literal} </body> From a401406dba9d93f38d3b23b585eb1ce24e780995 Mon Sep 17 00:00:00 2001 From: Jason <1432334894@qq.com> Date: Mon, 1 Aug 2022 17:43:26 +0800 Subject: [PATCH 08/12] =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view/css/admin_style.css | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/view/css/admin_style.css b/view/css/admin_style.css index c016bc0..8033e7e 100644 --- a/view/css/admin_style.css +++ b/view/css/admin_style.css @@ -308,7 +308,6 @@ body{ font-size: 15px !important; } @media screen and (min-width:1270px) and (max-width:1440px){ - .admin-layui-col-top-right{ min-width: 788px; } @@ -344,7 +343,7 @@ body{ padding: 12px 12px 12px 0px; } .admin-layui-col-bottom-list{ - min-width: 217px; + min-width: 208px; } .admin-layui-col-bottom-list-last{ padding-right: 0px !important; @@ -387,7 +386,7 @@ body{ padding: 12px 12px 12px 0px; } .admin-layui-col-bottom-list{ - min-width: 217px; + min-width: 208px; } .admin-layui-col-bottom-list-last{ padding-right: 0px !important; From 7867dfdfff304e907ecdbd278fc2a16d1aced8f2 Mon Sep 17 00:00:00 2001 From: Jason <1432334894@qq.com> Date: Tue, 2 Aug 2022 17:14:57 +0800 Subject: [PATCH 09/12] =?UTF-8?q?=E7=94=B5=E5=95=86=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E9=9D=99=E6=80=81=E9=A1=B5=E9=9D=A2=E5=8F=8A=E4=BA=A4=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- control/tpl.php | 36 ++++ view/css/admin_style.css | 71 +++++++ view/css/common.css | 22 ++- view/font/icomoon.eot | Bin 9856 -> 10448 bytes view/font/icomoon.svg | 4 +- view/font/icomoon.ttf | Bin 9692 -> 10284 bytes view/font/icomoon.woff | Bin 9768 -> 10360 bytes view/js/clipboard.min.js | 7 + view/js/demo3.json | 68 +++++++ view/templates/include/admin_leftmenu.html | 8 +- view/templates/tpl/deliver_remind.html | 306 +++++++++++++++++++++++++++++ view/templates/tpl/home.html | 78 -------- 12 files changed, 510 insertions(+), 90 deletions(-) create mode 100644 view/js/clipboard.min.js create mode 100644 view/js/demo3.json create mode 100644 view/templates/tpl/deliver_remind.html diff --git a/control/tpl.php b/control/tpl.php index e6d7ee9..a89a5e7 100644 --- a/control/tpl.php +++ b/control/tpl.php @@ -12,5 +12,41 @@ class tpl extends publicBase { * @return void */ public function home() { + $this->view['menu_page'] = 'home'; + } + + /** + * 发货提醒 + */ + public function deliver_remind() { + $this->view['menu_page'] = 'deliver_remind'; + } + + public function ajax_get_order_list() { + $data = array(); + $page = $this->get('page')+0; + $limit = $this->get('limit')+0; + for($i=0;$i < 10;$i++){ + $vals = array( + "goods_name" => "万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系", + "tid" => "43565765786867898".$i, + "count_down" => "倒计时:10:09:23", + 'sale_date' => date('Y-m-d H:i:s', time()+($i*8)), + 'remained_time' => date('Y-m-d H:i:s', time()+($i*88)), + "income" => "999.09", + "status" => "1" + ); + if($i % 2 == 0) { + $vals['count_down'] = date('Y-m-d H:i:s', time()+$i); + $vals['status'] = 0; + } + + $data[] = $vals; + } + + $reture_data['data'] = $data; + $reture_data['total'] = 300; + + $this->ajax_json(true, '', $reture_data); } } diff --git a/view/css/admin_style.css b/view/css/admin_style.css index 8033e7e..f83ede9 100644 --- a/view/css/admin_style.css +++ b/view/css/admin_style.css @@ -392,4 +392,75 @@ body{ padding-right: 0px !important; min-width: 207px !important; } + } + .admin-index-top-item-header{ + width: 100%; + height: 46px; + line-height: 46px; + padding-left: 12px; + padding-right: 12px; + color: rgba(0, 0, 0, 0.65); + font-size: 16px; + font-family: PingFangSC-Regular; + text-align: left; + white-space: nowrap; + box-sizing: border-box; + } + .admin-index-top-item-header-line{ + width: 100%; + height: 1px; + background-color: rgba(232, 232, 232, 1); + } + .admin-index-top-item-header-left{ + display: block; + float: left; + height: 100%; + width: auto; + } + .admin-index-top-item-header-left li{ + display: inline-block; + float: left; + font-size: 16px; + font-family: PingFangSC-Regular; + color: rgba(0,0,0,0.65); + margin-right: 64px; + cursor: pointer; + } + .admin-index-top-item-header-left li.active{ + font-family: PingFangSC-Medium !important; + color: #1890FF !important; + position: relative; + } + .admin-index-top-item-header-left li.active::after{ + content: ''; + width: 100%; + height: 2px; + border-radius: 1px; + background: #1890FF; + display: block; + } + .admin-index-top-item-header-right{ + display: block; + float: right; + height: 100%; + width: auto; + } + .admin-index-top-item-header-right li{ + display: inline-block; + float: left; + margin-left: 24px; + line-height: 55px; + font-size: 14px; + font-family: PingFangSC-Regular; + color: #595959; + cursor: pointer; + } + .admin-index-top-item-header-right li.active{ + color: #1890FF !important; + } + #admin-map-container{ + width: 100%; + box-sizing: border-box; + height: 325px; + overflow: hidden; } \ No newline at end of file diff --git a/view/css/common.css b/view/css/common.css index 62d9ac9..511546a 100644 --- a/view/css/common.css +++ b/view/css/common.css @@ -1,10 +1,10 @@ @font-face { font-family: 'icomoon'; - src: url('/font/icomoon.eot?myxkk3'); - src: url('/font/icomoon.eot?myxkk3#iefix') format('embedded-opentype'), - url('/font/icomoon.ttf?myxkk3') format('truetype'), - url('/font/icomoon.woff?myxkk3') format('woff'), - url('/font/icomoon.svg?myxkk3#icomoon') format('svg'); + src: url('/font/icomoon.eot?j9lv8n'); + src: url('/font/icomoon.eot?j9lv8n#iefix') format('embedded-opentype'), + url('/font/icomoon.ttf?j9lv8n') format('truetype'), + url('/font/icomoon.woff?j9lv8n') format('woff'), + url('/font/icomoon.svg?j9lv8n#icomoon') format('svg'); font-weight: normal; font-style: normal; font-display: block; @@ -34,7 +34,7 @@ color: #1890ff; } .icon--8:before { - content: "\e90e"; + content: "\e912"; color: #fff; } .icon-1-2:before { @@ -69,6 +69,14 @@ content: "\e911"; color: #fff; } +.icon-uniE90E:before { + content: "\e90e"; + color: #1890ff; +} +.icon--3:before { + content: "\e913"; + color: #f21019; +} .icon-uniE9001:before { content: "\e907"; color: #c4c7cc; @@ -96,4 +104,4 @@ .icon-uniE900:before { content: "\e901"; color: #c4c7cc; -} \ No newline at end of file +} diff --git a/view/font/icomoon.eot b/view/font/icomoon.eot index 282cb778cc2b62cf73e7e9cbbb1741065a745fdb..60b6d6416a4da23e82eacecf55cc0ff01c6a416d 100644 GIT binary patch delta 618 zcmW+y&1(}u6n~Q)H`DI6ncYoxlc;ERlQg9w+a_5*>K9%t6~Xin5Gfj(#vF_d7-&!= zp@;}x46BFc;K_?1cnE?PQSj7L3H}3m5fnWrC=^;#-(+Ck`+dDPFzrkIg51vl9LaQK zj~3cnYn^ke+D`y@hxhtYtyH&)pSqpR1Ffg24<P{31aNk%%cb)4RQ4-Cs)0GLih|WM zHj%$Xo~+gy&B|5jJMzBRb8}^>bftOO21vWeXKJNp9nt|0c^UcPTcz6a`uxZa^85J4 zgZj$t21w{YMio9tl)UoG<Sa4#=j0+WdcVlqXiI`cu%yS*Jj7uNPUCA%BrH1#JDt~Z z-Ym)Iyli5|jA$qlTgGl8_s~o`iIga|e2@$iS(K$S3$8tg*sg0MAU_27*ELMjAnT$I zZUic#8Ya15yOYLIbE6<KBDo;IAe@*cU5r$8)6@x$-qkHjpG4=4rT4n~XPN&Z{wF9w zaj!2u^0(QO);$_vG^DCgmB%@c381Qs?xQ3|7!3sIC=KrJun|frGl#CmhDTG?7!M~n zW1K5#BRs)FoKOW7en?ex#)25r72L-xWpE-$={RE{N@aNn7!97pfUk_+aftY7fVHi5 z;acd_Ur^|fe;!|bEr96$wsVX`eK$E5MRSoJ2SW2ejNbs#x4k{oivGjogz;?b{MZ-1 Rq2;szPKw3R-uvW7@*neVfVcnv delta 287 zcmcZ**x<|7pvJ&(M|C2b8B6sd>rE3K$_4*0Ffi-^;)LYf!~*fKOEV^(kf|5f(+y`} zV60$ZP~4G`nwVm!;qT4BplkqCXO;mJ5Z^3(49L#_@>Mc&ODf``nazOw9w0v=CqFsS zeV@G%kpBe8*UL?;C}2=w0?Mn10Qm}eiMgpWy*PgZ`6fU++6wZEOBk4eG7PF9cPKD0 zvoIc<oWf|&C^&fuqc@}A<`0ZJB_>Z){<1kz+JZxw5u}uXVUzWu>Ue&euMFHQVE%nx zR*-WTK=foAHFHL>$t7wY0?aS||7WpaU}Q06U=;qyz%coWnmYdh-V{D2fjdCeAj8Bq J^Qj+V1OO2RM=k&W diff --git a/view/font/icomoon.svg b/view/font/icomoon.svg index d00d82a..7d863b8 100644 --- a/view/font/icomoon.svg +++ b/view/font/icomoon.svg @@ -21,8 +21,10 @@ <glyph unicode="" glyph-name="1" d="M876.8 12.16h-774.4c-28.691 0.071-54.562 12.080-72.922 31.32l-0.038 0.040c-18.204 18.474-29.446 43.853-29.446 71.857 0 0.388 0.002 0.775 0.006 1.162l-0.001-0.059v366.080c0.669 48.557 23.674 91.607 59.183 119.426l0.337 0.254 168.96 128v46.080c-0.015 0.806-0.024 1.757-0.024 2.71 0 41.041 16.369 78.259 42.934 105.481l-0.030-0.030c26.481 26.872 63.275 43.52 103.957 43.52 0.128 0 0.256 0 0.383 0h501.1c0.157 0.001 0.344 0.001 0.53 0.001 40.429 0 76.966-16.661 103.121-43.491l0.029-0.030c26.889-26.873 43.521-64.006 43.521-105.024 0-0.203 0-0.405-0.001-0.608v0.031-617.6c0.014-0.762 0.022-1.661 0.022-2.561 0-80.943-65.617-146.56-146.56-146.56-0.233 0-0.466 0.001-0.698 0.002h0.036zM375.68 848.64c-19.215-0.246-36.569-8.016-49.292-20.491l0.012 0.011c-13.056-13.363-21.113-31.66-21.12-51.839v-83.841l-199.040-151.68c-17.933-13.188-29.441-34.206-29.441-57.913 0-0.115 0-0.23 0.001-0.345v0.018-366.080c0.026-6.723 2.706-12.814 7.046-17.286l-0.006 0.006c4.877-4.54 11.359-7.412 18.508-7.678l0.052-0.002h774.4c1.323-0.092 2.868-0.144 4.424-0.144 18.147 0 34.629 7.125 46.803 18.73l-0.027-0.026c13.022 13.145 21.080 31.228 21.12 51.192v615.048c-0.040 19.972-8.098 38.055-21.126 51.206l0.006-0.006c-12.446 12.983-29.914 21.067-49.27 21.12h-0.010zM304.64 162.56c24.914-0.185 47.463-10.159 64.022-26.261l-0.022 0.021c16.233-15.727 26.308-37.727 26.308-62.080s-10.076-46.353-26.285-62.058l-0.023-0.022c-16.224-16.712-38.901-27.082-64-27.082-49.243 0-89.162 39.919-89.162 89.162 0 24.144 9.597 46.047 25.183 62.102l-0.021-0.022c16.537 16.081 39.086 26.055 63.964 26.24h0.036zM304.64-52.48c-0.22-0.001-0.48-0.002-0.74-0.002-35.163 0-67.014 14.179-90.148 37.13l0.008-0.008c-22.625 23.069-36.59 54.704-36.59 89.6s13.964 66.531 36.61 89.621l-0.020-0.021c23.564 22.308 55.46 36.024 90.56 36.024s66.996-13.716 90.621-36.081l-0.061 0.057c21.897-22.928 35.374-54.061 35.374-88.342 0-69.853-55.955-126.638-125.488-127.976l-0.125-0.002zM304.64 124.16c-0.087 0.001-0.19 0.001-0.292 0.001-14.084 0-26.856-5.616-36.198-14.731l0.011 0.010c-9.085-8.846-14.721-21.196-14.721-34.862 0-0.119 0-0.238 0.001-0.356v0.018c-0.002-0.18-0.004-0.393-0.004-0.607 0-13.582 5.641-25.847 14.709-34.579l0.015-0.014c9.493-8.984 22.342-14.507 36.48-14.507s26.987 5.524 36.505 14.53l-0.025-0.023c8.883 9.101 14.448 21.475 14.719 35.148l0.001 0.052c-0.897 13.113-6.603 24.743-15.349 33.27l-0.011 0.010c-9.346 8.724-21.933 14.080-35.771 14.080-0.024 0-0.048 0-0.072 0h0.004zM720 162.56c0.113 0.001 0.247 0.001 0.381 0.001 24.825 0 47.308-10.024 63.623-26.245l-0.004 0.004c16.233-15.727 26.308-37.727 26.308-62.080s-10.076-46.353-26.285-62.058l-0.023-0.022c-16.276-16.602-38.936-26.893-64-26.893s-47.724 10.291-63.986 26.878l-0.014 0.015c-16.233 15.727-26.308 37.727-26.308 62.080s10.076 46.353 26.285 62.058l0.023 0.022c16.537 16.081 39.086 26.055 63.964 26.24h0.036zM720-52.48c-69.658 1.34-125.614 58.124-125.614 127.978 0 34.281 13.476 65.415 35.42 88.392l-0.047-0.049c23.355 24.454 56.215 39.658 92.626 39.658 70.692 0 128-57.308 128-128s-57.308-128-128-128c-0.839 0-1.676 0.008-2.512 0.024l0.125-0.002zM720 124.16c-0.087 0.001-0.19 0.001-0.292 0.001-14.084 0-26.856-5.616-36.198-14.731l0.011 0.010c-9.085-8.846-14.721-21.196-14.721-34.862 0-0.119 0-0.238 0.001-0.356v0.018c-0.002-0.18-0.004-0.393-0.004-0.607 0-13.582 5.641-25.847 14.709-34.579l0.015-0.014c9.493-8.984 22.342-14.507 36.48-14.507s26.987 5.524 36.505 14.53l-0.025-0.023c9.082 8.746 14.724 21.011 14.724 34.593 0 0.213-0.001 0.426-0.004 0.639v-0.032c0.001 0.1 0.001 0.219 0.001 0.338 0 13.666-5.636 26.016-14.71 34.852l-0.011 0.010c-9.332 9.105-22.104 14.721-36.188 14.721-0.103 0-0.205 0-0.308-0.001h0.016zM389.12 624v0c-23.175-2.639-41.013-22.137-41.013-45.801 0-0.774 0.019-1.543 0.057-2.307l-0.004 0.108v-128c-0.080-1.004-0.126-2.174-0.126-3.354 0-23.435 17.994-42.667 40.919-44.634l0.166-0.012c23.092 1.979 41.086 21.211 41.086 44.646 0 1.18-0.046 2.35-0.135 3.508l0.010-0.153v128c0.033 0.657 0.053 1.426 0.053 2.199 0 23.664-17.838 43.162-40.801 45.781l-0.212 0.020z" /> <glyph unicode="" glyph-name="2" horiz-adv-x="1034" d="M250.67-63.354c-41.535 0.073-79.394 15.75-108.041 41.48l0.15-0.132c-26.21 26.456-43.228 62.058-45.845 101.597l-0.025 0.48v382.466l47.162-10.337c13.512-2.129 29.366-3.526 45.48-3.87l0.39-0.007h69.128l217.721-44.578c13.205-2.936 28.372-4.618 43.932-4.618s30.727 1.682 45.329 4.875l-1.397-0.256 212.553 44.578h58.791c21.036 0.833 40.842 2.916 60.241 6.198l-2.742-0.383 46.516 10.337v-371.483c-0.089-41.139-16.32-78.469-42.693-106.009l0.053 0.056c-26.221-27.542-62.076-45.702-102.141-49.061l-0.582-0.039zM171.205 370.15v-287.495c2.284-18.863 11.275-35.287 24.478-47.099l0.072-0.063c13.874-13.203 32.689-21.325 53.402-21.325 0.305 0 0.609 0.002 0.913 0.005h541.996c39.756 4.042 70.584 37.11 71.066 77.478v278.499h-78.819l-203.508-41.994c-17.963-3.992-38.594-6.28-59.76-6.28s-41.797 2.287-61.661 6.628l1.9-0.348-209.322 43.286h-60.729zM520.076 326.218c-0.968-0.019-2.109-0.030-3.253-0.030-14.196 0-28.005 1.659-41.244 4.794l1.211-0.242-215.783 44.578h-64.606c-2.189-0.083-4.759-0.13-7.34-0.13-60.777 0-115.447 26.144-153.379 67.8l-0.149 0.166c-21.925 25.894-35.255 59.674-35.255 96.568 0 11.57 1.311 22.834 3.792 33.651l-0.194-1.007 56.853 253.254c9.648 40.078 32.737 73.68 64.131 96.579l0.475 0.33c33.221 23.057 74.398 36.835 118.792 36.835 0.71 0 1.42-0.004 2.129-0.011l-0.108 0.001h541.396c0.836 0.012 1.823 0.019 2.811 0.019 44.135 0 85.050-13.787 118.673-37.289l-0.671 0.444c31.996-23.111 55.13-56.764 64.382-95.79l0.224-1.119 56.853-252.608c1.945-9.213 3.058-19.799 3.058-30.645 0-37.556-13.353-71.994-35.569-98.825l0.208 0.259c-36.362-42.435-90.012-69.154-149.903-69.154-1.129 0-2.257 0.010-3.381 0.028l0.169-0.002h-64.606l-215.137-43.932c-13.393-2.856-28.787-4.501-44.562-4.522h-0.016zM267.468 455.43l225.474-47.162c8.341-2.139 17.918-3.367 27.78-3.367s19.439 1.228 28.584 3.539l-0.803-0.172 224.182 45.87 73.65-5.815c36.387 0.317 68.808 17.022 90.286 43.083l0.162 0.202c11.295 13.461 18.157 30.975 18.157 50.091 0 5.133-0.495 10.151-1.439 15.008l0.080-0.493-55.561 253.254c-4.976 21.151-17.536 38.767-34.589 50.204l-0.298 0.188c-20.434 14.17-45.757 22.637-73.058 22.637-0.89 0-1.778-0.009-2.663-0.027l0.132 0.002h-541.396c-0.565 0.009-1.232 0.014-1.901 0.014-27.294 0-52.611-8.463-73.471-22.907l0.429 0.281c-17.351-11.626-29.911-29.242-34.775-49.831l-0.112-0.561-56.853-253.9c-1.373-5.245-2.161-11.266-2.161-17.471 0-18.083 6.693-34.603 17.737-47.217l-0.071 0.083c23.75-26.332 57.988-42.811 96.076-42.811 2.338 0 4.662 0.062 6.97 0.185l-0.322-0.014zM349.517 713.206v0c15.404-2.962 26.883-16.333 26.883-32.386 0-1.795-0.144-3.557-0.42-5.274l0.025 0.189-15.505-85.926c-2.297-15.057-15.154-26.458-30.675-26.458-2.177 0-4.301 0.224-6.352 0.651l0.201-0.035c-15.409 2.309-27.091 15.453-27.091 31.326 0 2.175 0.219 4.298 0.637 6.349l-0.035-0.204 14.859 85.279c2.962 15.404 16.333 26.883 32.386 26.883 1.795 0 3.557-0.144 5.274-0.42l-0.189 0.025zM684.174 713.206v0c-15.404-2.962-26.883-16.333-26.883-32.386 0-1.795 0.144-3.557 0.42-5.274l-0.025 0.189 15.505-85.926c2.297-15.057 15.154-26.458 30.675-26.458 2.177 0 4.301 0.224 6.352 0.651l-0.201-0.035c15.409 2.309 27.091 15.453 27.091 31.326 0 2.175-0.219 4.298-0.637 6.349l0.035-0.204-14.859 85.279c-2.962 15.404-16.333 26.883-32.386 26.883-1.795 0-3.557-0.144-5.274-0.42l0.189 0.025zM516.845 710.622v0c-17.84 0-32.303-14.462-32.303-32.303v0-87.218c0-17.84 14.462-32.303 32.303-32.303v0 0c17.84 0 32.303 14.462 32.303 32.303v0 87.218c0 17.84-14.462 32.303-32.303 32.303v0z" /> <glyph unicode="" glyph-name="3" horiz-adv-x="1034" d="M250.987-64.647c-41.541 0.392-79.358 16.019-108.203 41.552l0.175-0.152c-26.102 26.578-43.1 62.173-45.899 101.691l-0.029 0.515v382.949l47.222-10.35c15.525 0 30.403-3.234 45.928-3.881h69.215l217.996-44.634c13.224-2.776 28.42-4.365 43.987-4.365s30.763 1.589 45.434 4.614l-1.447-0.249 212.821 44.634h58.865c19.406 0 38.812 3.234 57.572 5.822l46.575 10.35v-371.952c0-0.134 0.001-0.293 0.001-0.452 0-41.472-16.261-79.146-42.756-106.994l0.061 0.065c-26.255-27.576-62.155-45.76-102.27-49.123l-0.583-0.039zM171.421 369.405v-287.858c2.286-18.887 11.289-35.331 24.509-47.158l0.072-0.063c14.255-13.144 33.341-21.239 54.315-21.347h542.748c39.669 4.332 70.373 37.274 71.155 77.546l0.001 0.078v278.802h-78.919l-203.765-42.047c-17.99-3.701-38.665-5.82-59.836-5.82s-41.846 2.119-61.826 6.156l1.991-0.336-209.587 45.281h-60.806zM520.733 325.418c-0.485-0.004-1.058-0.007-1.632-0.007-14.78 0-29.173 1.652-43.007 4.782l1.299-0.247-216.056 42.694h-64.687c-1.177-0.024-2.565-0.037-3.956-0.037-62.264 0-118.245 26.902-156.953 69.716l-0.163 0.183c-21.983 25.854-35.354 59.625-35.354 96.518 0 11.647 1.333 22.983 3.854 33.864l-0.197-1.008 56.925 253.574c9.488 40.195 32.651 73.891 64.204 96.698l0.483 0.333c32.926 23.087 73.827 36.894 117.953 36.894 1.059 0 2.117-0.008 3.173-0.024l-0.16 0.002h542.080c0.896 0.014 1.953 0.022 3.013 0.022 44.126 0 85.027-13.807 118.619-37.336l-0.666 0.442c32.21-22.977 55.437-56.745 64.475-95.938l0.212-1.093 56.925-252.927c1.887-9.121 2.968-19.602 2.968-30.336 0-37.701-13.328-72.29-35.528-99.311l0.217 0.272c-36.666-43.248-91.035-70.515-151.772-70.515-0.54 0-1.080 0.002-1.62 0.006l0.083-0.001h-64.687l-215.409-43.987c-13.304-1.932-28.77-3.104-44.484-3.233l-0.15-0.001zM267.805 454.792l225.759-47.222c8.361-1.848 17.965-2.907 27.816-2.907s19.455 1.059 28.703 3.068l-0.888-0.162 224.465 45.928 73.744-5.822c36.392 0.506 68.79 17.18 90.405 43.147l0.157 0.194c11.31 13.478 18.18 31.014 18.18 50.154 0 5.14-0.495 10.164-1.441 15.027l0.080-0.493-55.631 253.574c-4.917 21.204-17.512 38.862-34.63 50.268l-0.301 0.189c-20.058 14.198-45.027 22.695-71.98 22.695-1.303 0-2.6-0.020-3.893-0.059l0.189 0.005h-542.080c-0.976 0.027-2.125 0.043-3.278 0.043-26.879 0-51.774-8.494-72.147-22.944l0.387 0.261c-17.419-11.594-30.014-29.252-34.822-49.901l-0.109-0.555-56.925-254.221c-1.374-5.251-2.164-11.28-2.164-17.493 0-18.106 6.702-34.647 17.76-47.277l-0.071 0.083c23.78-26.365 58.062-42.865 96.197-42.865 2.341 0 4.668 0.062 6.978 0.185l-0.323-0.014zM349.958 712.895v0c15.424-2.966 26.917-16.354 26.917-32.427 0-1.798-0.144-3.561-0.42-5.281l0.025 0.189-15.525-86.034c-1.378-8.616-6.133-15.918-12.839-20.634l-0.099-0.066c-5.337-3.476-11.867-5.542-18.881-5.542-1.783 0-3.535 0.134-5.246 0.391l0.193-0.024c-8.856 1.663-16.334 6.602-21.278 13.484l-0.069 0.1c-3.673 4.82-5.884 10.926-5.884 17.548 0 2.264 0.258 4.467 0.747 6.582l-0.038-0.196 14.878 85.387c2.648 15.424 15.921 27.013 31.901 27.013 1.985 0 3.928-0.179 5.815-0.521l-0.197 0.030zM685.039 712.895v0c-15.424-2.966-26.917-16.354-26.917-32.427 0-1.798 0.144-3.561 0.42-5.281l-0.025 0.189 15.525-86.034c1.378-8.616 6.133-15.918 12.839-20.634l0.099-0.066c5.337-3.476 11.867-5.542 18.881-5.542 1.783 0 3.535 0.134 5.246 0.391l-0.193-0.024c8.856 1.663 16.334 6.602 21.278 13.484l0.069 0.1c3.673 4.82 5.884 10.926 5.884 17.548 0 2.264-0.258 4.467-0.747 6.582l0.038-0.196-14.878 85.387c-2.648 15.424-15.921 27.013-31.901 27.013-1.985 0-3.928-0.179-5.815-0.521l0.197 0.030zM517.498 710.307v0c-17.863 0-32.344-14.481-32.344-32.344v0-87.328c0-17.863 14.481-32.344 32.344-32.344v0 0c17.863 0 32.344 14.481 32.344 32.344v0 87.328c0 17.863-14.481 32.344-32.344 32.344v0z" /> -<glyph unicode="" glyph-name="-8" horiz-adv-x="1000" d="M744.795 720.468l242.526-234.292c3.567-3.235 6.372-7.243 8.16-11.764l0.074-0.213c2.538-4.858 4.027-10.61 4.027-16.71 0-10.139-4.114-19.317-10.764-25.956v0l-244.772-254.503c-6.864-6.661-16.239-10.767-26.573-10.767s-19.709 4.106-26.583 10.776l0.010-0.009c-6.838 6.784-11.071 16.184-11.071 26.573s4.233 19.79 11.068 26.571l0.002 0.002 173.661 180.398h-604.070c-20.503 0.411-37.016 16.924-37.426 37.388l-0.001 0.039c0 20.67 16.757 37.427 37.427 37.427v0h619.789l-187.135 181.146c-8.336 6.915-13.606 17.276-13.606 28.868 0 20.67 16.757 37.427 37.427 37.427 11.032 0 20.949-4.773 27.799-12.367l0.029-0.033zM486.55 960c20.67 0 37.427-16.757 37.427-37.427v0c-0.411-20.503-16.924-37.016-37.388-37.426l-0.039-0.001h-411.696v-873.544h411.696c20.503-0.411 37.016-16.924 37.426-37.388l0.001-0.039c0-20.67-16.757-37.427-37.427-37.427v0h-449.123c-20.67 0-37.427 16.757-37.427 37.427v0c-0.501 2.25-0.788 4.834-0.788 7.485s0.287 5.235 0.832 7.723l-0.044-0.238c-0.574 2.134-0.903 4.584-0.903 7.111s0.33 4.977 0.948 7.31l-0.045-0.198v919.205c0 20.67 16.757 37.427 37.427 37.427v0z" /> +<glyph unicode="" glyph-name="uniE90E" d="M830.2 186.438h-81.92v-81.92c0-45.056-36.864-81.92-81.92-81.92h-491.52c-45.056 0-81.92 36.864-81.92 81.92v491.52c0 45.056 36.864 81.92 81.92 81.92h81.92v81.92c0 45.056 36.864 81.92 81.92 81.92h491.52c45.056 0 81.92-36.864 81.92-81.92v-491.52c0-45.056-36.864-81.92-81.92-81.92zM215.8 596.038c-24.576 0-40.96-16.384-40.96-40.96v-409.6c0-24.576 16.384-40.96 40.96-40.96h409.6c24.576 0 40.96 16.384 40.96 40.96v409.6c0 24.576-16.384 40.96-40.96 40.96h-409.6zM830.2 718.918c0 24.576-16.384 40.96-40.96 40.96h-409.6c-24.576 0-40.96-16.384-40.96-40.96v-40.96h327.68c45.056 0 81.92-36.864 81.92-81.92v-327.68h40.96c24.576 0 40.96 16.384 40.96 40.96v409.6z" /> <glyph unicode="" glyph-name="dingd" horiz-adv-x="1080" d="M946.373-63.325h-810.020c-74.56 0-135.003 60.443-135.003 135.003v0 693.917c0.349 36.634 15.236 69.724 39.16 93.836l-0.009-0.009c24.26 24.068 57.623 38.991 94.472 39.151h810.051c36.88-0.16 70.243-15.083 94.511-39.16l-0.009 0.009c24.411-23.929 39.767-57.016 40.499-93.691l0.002-0.137v-696.617c0-74.56-60.443-135.003-135.003-135.003v0zM136.353 814.196c-14.451-0.428-27.461-6.265-37.146-15.544l0.020 0.019c-9.508-9.258-15.434-22.154-15.525-36.434v-693.259c0-0.049 0-0.107 0-0.166 0-14.051 5.963-26.71 15.496-35.583l0.030-0.027c9.49-9.542 22.611-15.466 37.115-15.525h810.031c14.515 0.059 27.636 5.983 37.124 15.523l0.002 0.002c9.563 8.901 15.526 21.559 15.526 35.61 0 0.058 0 0.116 0 0.175v-0.009 696.617c-0.092 14.297-6.018 27.193-15.514 36.44l-0.011 0.011c-9.665 9.261-22.675 15.097-37.043 15.523l-0.082 0.002zM669.616 960h-259.206c-77.627 0-140.403-39.151-140.403-86.402s62.777-87.752 140.403-87.752h259.206c77.627 0 140.403 38.476 140.403 86.402s-62.777 87.752-140.403 87.752zM296.766 482.075l9.207 9.874c12.712 13.632 34.069 14.378 47.702 1.666l159.951-149.157c13.632-12.712 14.378-34.069 1.666-47.702l-9.207-9.874c-12.712-13.632-34.069-14.378-47.702-1.666l-159.951 149.157c-13.632 12.712-14.378 34.069-1.666 47.702zM454.015 338.741l277.446 258.722c13.632 12.712 34.989 11.967 47.702-1.666l9.207-9.874c12.712-13.632 11.967-34.989-1.666-47.702l-277.446-258.722c-13.632-12.712-34.989-11.967-47.702 1.666l-9.207 9.874c-12.712 13.632-11.967 34.989 1.666 47.702z" /> <glyph unicode="" glyph-name="dingd1" horiz-adv-x="1077" d="M943.832-61.305h-808.421c-74.413 0-134.737 60.324-134.737 134.737v0 692.547c0 74.413 60.324 134.737 134.737 134.737v0h808.421c74.413 0 134.737-60.324 134.737-134.737v0-695.242c0-74.413-60.324-134.737-134.737-134.737v0zM135.411 814.484c-14.366-0.748-27.261-6.501-37.096-15.534l0.043 0.039c-9.37-9.316-15.246-22.138-15.494-36.332l-0.001-0.047v-691.874c0-0.049 0-0.107 0-0.165 0-14.023 5.951-26.657 15.466-35.513l0.029-0.027c9.472-9.523 22.566-15.436 37.041-15.495h808.432c0.19-0.003 0.414-0.004 0.639-0.004 14.297 0 27.207 5.938 36.399 15.483l0.015 0.016c9.544 8.883 15.495 21.516 15.495 35.54 0 0.058 0 0.116 0 0.174v-0.009 695.242c0 0.076 0.001 0.166 0.001 0.256 0 14.205-5.941 27.023-15.475 36.104l-0.020 0.019c-9.707 9.139-22.653 14.934-36.944 15.491l-0.108 0.003zM666.947 960h-258.695c-77.474 0-138.105-39.074-138.105-86.232s62.653-87.579 140.126-87.579h258.695c72.758 0 140.126 38.4 140.126 86.232s-67.368 87.579-142.147 87.579zM294.667 483.591l9.189 9.854c12.687 13.606 34.002 14.35 47.608 1.662l159.635-148.862c13.606-12.687 14.35-34.002 1.662-47.608l-9.189-9.854c-12.687-13.606-34.002-14.35-47.608-1.662l-159.635 148.862c-13.606 12.687-14.35 34.002-1.662 47.608zM452.162 339.713l276.898 258.212c13.606 12.687 34.92 11.943 47.608-1.662l9.189-9.854c12.687-13.606 11.943-34.92-1.662-47.608l-276.898-258.212c-13.606-12.687-34.92-11.943-47.608 1.662l-9.189 9.854c-12.687 13.606-11.943 34.92 1.662 47.608z" /> <glyph unicode="" glyph-name="LOGO" horiz-adv-x="5105" d="M592.688 701.799c-39.121-5.868-78.243-13.692-119.32-22.495l-57.704 123.232c51.159 16.587 111.477 29.654 173.606 36.757l4.395 0.408c0 33.253 0 68.462 0 105.628h203.431v-89.979c29.349 3.47 63.345 5.45 97.803 5.45s68.453-1.98 101.879-5.832l-4.076 0.382c46.946-8.802 75.309-30.319 83.133-65.528 5.352-20.453 8.424-43.933 8.424-68.132 0-10.452-0.573-20.77-1.69-30.925l0.112 1.253c-5.868-45.968-10.758-86.067-17.605-120.298s-12.714-67.484-21.517-97.803h69.44l-29.341-138.881h-308.080c-13.072-84.79-38.036-161.132-73.416-231.324l2.019 4.42c-35.106-71.656-89.124-129.446-155.603-168.198l-1.86-1.002-134.968 59.66c46.038 52.102 84.766 112.14 113.664 177.495l1.744 4.419c15.105 39.439 29.264 87.571 39.865 137.023l1.212 6.748h-143.771l-31.297 138.881h195.606c0 43.033 0 108.562 6.846 195.606-2.934 14.67-2.934 29.341-2.934 43.033zM797.096 725.272c0-120.298 0-207.343-6.846-262.113h228.86l-139.859 24.451c7.95 24.239 14.46 53.016 18.32 82.626l0.262 2.462c0 29.341 7.824 61.616 11.736 97.803 0.257 1.786 0.403 3.849 0.403 5.946 0 16.17-8.72 30.303-21.714 37.953l-0.206 0.112c-14.198 7.575-31.051 12.023-48.943 12.023-2.739 0-5.453-0.104-8.14-0.309l0.357 0.022zM374.586 564.875v-615.182h-195.606v988.791h195.606v-373.608zM130.078-15.098h-130.078v880.229l130.078 37.165zM1086.594 74.881c-0.082-34.673-14.701-65.915-38.083-87.967l-0.060-0.056c-24.696-22.928-57.895-36.997-94.38-36.997s-69.684 14.069-94.468 37.078l0.088-0.081c-23.713 22.033-38.644 53.239-39.12 87.936l-0.001 0.087c1.5 32.641 16.694 61.459 39.93 81.038l0.17 0.139c23.105 21.988 54.438 35.514 88.93 35.514 3.122 0 6.219-0.111 9.285-0.329l-0.412 0.024c1.254 0.040 2.729 0.062 4.208 0.062 35.94 0 68.757-13.369 93.75-35.405l-0.155 0.134c18.87-19.218 30.518-45.583 30.518-74.669 0-2.29-0.072-4.562-0.214-6.816l0.016 0.308zM1789.799 522.819v172.134h195.606v-166.266h445.005l-38.143-139.859h-405.883v-293.41c-1.16-30.184-8.984-58.29-22.030-83.232l0.513 1.078c-15.153-25.931-42.854-43.076-74.561-43.076-0.951 0-1.898 0.015-2.841 0.046l0.137-0.004c-36.187 0-82.155 0-195.606 0l-65.528 127.144c69.44 0 115.408 0 139.859 0 8.79 0.465 16.203 5.91 19.505 13.547l0.056 0.146c4.519 10.245 7.15 22.19 7.15 34.75 0 2.571-0.11 5.117-0.326 7.632l0.023-0.327c0 13.692 0 89.979 0 230.816h-332.531c-35.015 0.217-68.622 5.925-100.105 16.306l2.302-0.657c-29.341 9.78-44.989 38.143-45.968 85.089v391.213l195.606 46.946v-38.143l293.41 5.868c166.266 0 270.915 23.473 313.948 63.572h240.596c-22.237-76.992-80.472-136.84-154.81-160.907l-1.675-0.469c-59.579-15.924-130.811-28.696-203.715-35.75l-5.584-0.437c-51.836 0-125.188-6.846-220.057-7.824s-169.2 0-224.947 0l-28.363 84.111v-310.036zM2296.42 327.213c10.692-63.196 25.979-119.090 46.105-172.615l-2.094 6.35c22.917-59.784 56.125-110.907 97.885-153.635l-0.082 0.084-170.178-25.429c-53.839 31.695-96.206 77.836-122.442 133.118l-0.79 1.851c-25.624 61.68-44.858 133.345-54.337 208.054l-0.433 4.179zM1437.708 327.213h218.101c-17.049-82.601-45.489-155.916-84.055-222.644l1.901 3.565c-28.158-54.612-70.704-98.416-122.67-127.336l-1.54-0.787-169.2 30.319c32.488 38.562 62.864 81.399 89.546 126.673l2.389 4.383c26.989 53.053 49.522 114.724 64.45 179.306l1.079 5.542zM3640.237 670.502h44.989c40.099 0 60.638-30.319 61.616-77.265v-82.155c0-50.858-18.583-79.221-57.704-87.045-32.407-7.019-70.093-11.595-108.649-12.694l-0.891-0.020h-144.749v-31.297h-145.727v-16.627c28.382 2.562 61.391 4.022 94.742 4.022 97.675 0 192.423-12.527 282.727-36.061l-7.773 1.72c28.892-9.172 52.081-29.175 65.241-55.123l0.287-0.624c6.89-19.564 10.871-42.122 10.871-65.611 0-2.379-0.041-4.748-0.122-7.107l0.009 0.343v-104.649c0.392-3.957 0.616-8.552 0.616-13.2 0-31.873-10.515-61.29-28.265-84.972l0.264 0.368c-21.609-20.211-50.733-32.623-82.756-32.623-3.231 0-6.432 0.126-9.598 0.374l0.419-0.026-127.144 4.89-55.748 133.012h55.748c2.922-0.543 6.284-0.854 9.719-0.854 11.71 0 22.576 3.61 31.547 9.779l-0.189-0.123c6.167 8.74 9.856 19.612 9.856 31.345 0 1.015-0.028 2.024-0.082 3.025l0.006-0.139c0.317 4.243 0.497 9.191 0.497 14.181s-0.181 9.938-0.535 14.838l0.038-0.656c0 6.846-9.78 13.692-26.407 20.539-40.143 6.877-86.38 10.808-133.534 10.808-31.86 0-63.3-1.794-94.226-5.287l3.791 0.348v-254.288h-195.606v246.464c-82.114-7.762-155.197-19.156-226.796-34.546l12.607 2.271-27.385 68.462v-252.332h-195.606v357.96h195.606v-26.407c66.76 15.199 149.15 28.316 232.988 36.488l8.586 0.677v64.55h146.705v514.445h195.606v-61.616c16.627 0 35.209 36.187 55.748 40.099 36.228 7.493 77.863 11.783 120.499 11.783 2.68 0 5.357-0.017 8.029-0.051l-0.406 0.004c32.635-1.033 63.412-7.763 91.771-19.222l-1.792 0.64c19.915-10.482 33.262-31.034 33.262-54.704 0-0.367-0.003-0.733-0.010-1.098l0.001 0.055v-83.133c0-43.033-13.692-68.462-39.121-78.243-18.654-7.017-40.265-11.887-62.751-13.641l-0.822-0.052zM3432.894 812.317v-88.023h71.396c28.363 0 43.033 5.868 44.011 19.561v30.319c-0.522 10.385-9.069 18.608-19.537 18.608-0.352 0-0.702-0.009-1.050-0.028l0.049 0.002c-6.231 0.652-13.462 1.024-20.78 1.024-17.617 0-34.731-2.157-51.092-6.22l1.453 0.305h-10.758zM3432.894 629.425v-104.649h75.309c28.363 0 42.055 7.824 42.055 24.451v28.363c0.32 3.225 0.503 6.97 0.503 10.758s-0.183 7.534-0.539 11.228l0.037-0.47c-5.825 5.726-13.698 9.384-22.421 9.778l-0.074 0.003h-78.243s-9.78 6.846-16.627 20.539zM3013.318 897.406h195.606l-27.385-120.298h-172.134c0-5.868 0-15.649 0-28.363h189.738l-26.407-97.803h-173.112c0.101-1.898 0.159-4.121 0.159-6.357s-0.058-4.459-0.172-6.666l0.013 0.309-4.89-22.495h225.926l-32.275-116.386h-242.552c-6.886-13.116-14.023-24.317-21.977-34.868l0.46 0.637c-37.194-49.54-85.133-89.020-140.511-115.407l-2.282-0.979-147.683 91.935c34.231 30.319 69.44 22.495 97.803 56.726h-97.803l-22.495 117.364h172.134c3.117 9.379 6.164 21.211 8.495 33.299l0.307 1.911h-136.925l-23.473 97.803h175.068q0 8.802 0 26.407v0h-156.485l-16.627 123.232h186.804c0 13.692 0 27.385 0 41.077h195.606zM4641.742 737.987v-103.671h458.697l-30.319-141.815h-428.378v-131.056h463.587l-26.407-138.881h-437.181v-125.188c0.3-3.397 0.47-7.349 0.47-11.34 0-36.567-14.334-69.786-37.69-94.345l0.055 0.058c-29.351-21.646-66.235-34.644-106.155-34.644-4.288 0-8.541 0.15-12.755 0.445l0.567-0.032h-262.113l-33.253 134.968h186.804c1.871-0.092 4.063-0.145 6.267-0.145 17.438 0 34.108 3.283 49.428 9.265l-0.925-0.318c10.758 5.868 16.627 23.473 17.605 51.836v69.44h-456.741l-56.726 138.881h513.467v131.056h-456.741l-50.858 141.815h507.599v103.671h-133.012c-156.485 0-236.684 0-293.41 0l-60.638 137.903h676.798c6.173-0.463 13.372-0.726 20.632-0.726 33.568 0 65.82 5.637 95.86 16.016l-2.062-0.62c29.921 14.47 53.421 38.285 67.121 67.597l0.363 0.865h207.343c-21.742-74.788-68.254-136.539-129.878-177.27l-1.178-0.732c-56.15-27.395-122.169-43.411-191.929-43.411-6.453 0-12.874 0.137-19.26 0.408l0.912-0.031z" /> +<glyph unicode="" glyph-name="-8" horiz-adv-x="1000" d="M744.795 720.468l242.526-234.292c3.567-3.235 6.372-7.243 8.16-11.764l0.074-0.213c2.538-4.858 4.027-10.61 4.027-16.71 0-10.139-4.114-19.317-10.764-25.956v0l-244.772-254.503c-6.864-6.661-16.239-10.767-26.573-10.767s-19.709 4.106-26.583 10.776l0.010-0.009c-6.838 6.784-11.071 16.184-11.071 26.573s4.233 19.79 11.068 26.571l0.002 0.002 173.661 180.398h-604.070c-20.503 0.411-37.016 16.924-37.426 37.388l-0.001 0.039c0 20.67 16.757 37.427 37.427 37.427v0h619.789l-187.135 181.146c-8.336 6.915-13.606 17.276-13.606 28.868 0 20.67 16.757 37.427 37.427 37.427 11.032 0 20.949-4.773 27.799-12.367l0.029-0.033zM486.55 960c20.67 0 37.427-16.757 37.427-37.427v0c-0.411-20.503-16.924-37.016-37.388-37.426l-0.039-0.001h-411.696v-873.544h411.696c20.503-0.411 37.016-16.924 37.426-37.388l0.001-0.039c0-20.67-16.757-37.427-37.427-37.427v0h-449.123c-20.67 0-37.427 16.757-37.427 37.427v0c-0.501 2.25-0.788 4.834-0.788 7.485s0.287 5.235 0.832 7.723l-0.044-0.238c-0.574 2.134-0.903 4.584-0.903 7.111s0.33 4.977 0.948 7.31l-0.045-0.198v919.205c0 20.67 16.757 37.427 37.427 37.427v0z" /> +<glyph unicode="" glyph-name="-3" d="M636.682 58.083c5.295 0 5.295-5.295-5.295-15.886-5.295-10.591-15.886-21.182-31.772-37.068-15.886-10.591-31.772-26.477-47.659-37.068-21.182-10.591-37.068-15.886-58.25-15.886s-37.068 5.295-52.954 15.886c-15.886 10.591-31.772 21.182-47.659 37.068-15.886 10.591-21.182 26.477-31.772 37.068-5.295 10.591-10.591 15.886-5.295 15.886h280.657zM901.453 148.105c5.295-5.295 5.295-10.591 5.295-21.182 0-5.295 0-10.591-5.295-15.886l-10.591-10.591c-5.295 0-10.591-5.295-10.591-5.295h-773.13c-10.591 0-15.886 5.295-21.182 10.591-5.295 15.886-5.295 26.477 0 37.068 10.591 21.182 26.477 42.363 42.363 68.84s31.772 52.954 47.659 84.727c15.886 31.772 26.477 63.545 37.068 95.317s15.886 68.84 15.886 105.908c0 37.068 5.295 68.84 15.886 95.317s21.182 52.954 37.068 74.136c15.886 21.182 31.772 37.068 52.954 52.954 26.477 15.886 47.659 26.477 68.84 37.068-10.591 15.886-15.886 37.068-15.886 58.25 0 26.477 10.591 52.954 31.772 74.136 15.886 15.886 42.363 26.477 68.84 26.477s52.954-10.591 74.136-31.772c21.182-21.182 31.772-42.363 31.772-74.136 0-10.591 0-21.182-5.295-31.772l-10.591-21.182c26.477-5.295 47.659-21.182 68.84-31.772 21.182-15.886 42.363-31.772 58.25-52.954s26.477-47.659 37.068-74.136c10.591-26.477 15.886-58.25 15.886-95.317s5.295-68.84 15.886-105.908c10.591-31.772 21.182-68.84 37.068-95.317 15.886-31.772 31.772-58.25 47.659-84.727 10.591-26.477 26.477-52.954 42.363-68.84zM446.048 815.326c0-10.591 5.295-21.182 10.591-26.477 5.295-10.591 15.886-10.591 26.477-10.591s21.182 5.295 26.477 10.591c5.295 5.295 10.591 15.886 10.591 26.477s-5.295 21.182-10.591 31.772c0 5.295-10.591 5.295-21.182 5.295s-21.182-5.295-31.772-10.591c-5.295-5.295-10.591-15.886-10.591-26.477v0z" /> </font></defs></svg> \ No newline at end of file diff --git a/view/font/icomoon.ttf b/view/font/icomoon.ttf index 7fa868102ede363a6d510df5d509b199683df814..9a8b334af8b96a037440d6ff5f6f35f566af2546 100644 GIT binary patch delta 617 zcmW-e&ubG=5Xa|bpPLtV+x?a7u0hf4HmRkc+x$|gKhTTP3br)_M2lJ4COI@V(0~z< zRuM0HP*)Gl!M~v3AqZLo#giu~o&`N9D2gDcm)4E*GO#oA`F>~iJ$N4`*QZv10DuIm zAb@x7{K2fEi$73#iC<-|;Ww@F`wjrvja;hv%T25*GOw(*c&++4{YpV@1GwAu1%G~Q zH1`D{-9o=uN5SeEZ;{uLhw6=1yLwUhhP;VfSzMYs>0fA1IRF_Cg>1ubHz5-#BF`i5 zyW%$%)+S<G$hYy3JI$r#7G4x%zs!9Q=+g(UPY~lFnIuN{EO}wC2rvtla9@~!B#go_ zJj+eQMK|SS3R=E6P73*AE|oPC8j8dbv6{$5G&620&66YUA^nLQ%EIv(&j}Nb=Q-Gr z@4WffF-+4SYdnXwNR?;9B&Qv3#5iDXO!FB&Im4SUo*E+^9I5K2sS{kiu3MHqg3fbG z@BU4WvtUQ^cT|9KZ&SD%l-MKj28}SP1V5R1iP1=e?xfM}Ef%AcGE<gqS=LxTG+ExI z##1U|sw!oS_^_&|gi5HWdu2&yEQ({ggd5C~!Xr^i2N_c+6~%rNRAM(>{{9%Z-mOkw zR*wDwiT3&9;MHfm;Wa3^hlm~AbI;gl&eFp`XaR`v3qbhV>!DT-KD)!llYvtMpVSR4 PuZ6hDe{6S?LvP4`RIh$P delta 310 zcmZ1zaL2ozfsuiMft#U$ftkU;KUm+0Ux@7wP-G7fCnV=47Kn#kn!&)pC<Ek&q$d^^ z0BHdrA4GGc=TxSN>*<CA`4tQdiaRn=6H^Q|{Jj|%lnsFLW*I;M@y)`=fcy*~UnL{A zq#`bw*$l|<0rDeq@{=7C-S^oW0R^4_1@v+gD+(A?n1BjYM1XvSyu{qpnO>Z~fqWC7 zC2a-y#U((80)Z;XfeH-FEC(kZuxAvU#OTc^xY>tsr^Mv9N?$f_m9pSa26+q!Hd!yK zj_0@e%D~M6=HKUK1v!QRL{FZfYR)J&`GTs40P~Cg|5+>;7+Fji7==GFFibX3Q|CXx Uo5IH=a0jRwWSH3IEVV<70Kr*CzyJUM diff --git a/view/font/icomoon.woff b/view/font/icomoon.woff index 0d6317d9a9fcc0656b9cc3d08061a81c2abbe427..c256706e570a0e6a0dd38e077bebbb0e756ecb70 100644 GIT binary patch delta 698 zcmX|9OK1~O6uocenY=iYW`3DTqD3>)Of3;fn~$IRfi9}lqD_&YNYPN6WYO3{3ynV_ z3U1seqhPa;ZUlD<LC_-T!i6g-uH5NHP;?_G6j~GS8`KBq-gD1A@4orG$K&f0#?r~r zQ6PY8R|6zJ@Ag#Jx|=qd->2*4c>q#F`4op$df%#+7r6EkYxWmPb@oyPwKo9HCdd8M zt4M98d;uW!8a)M$!F2X>4Mo(}vF_ur+WOmCeX#-HZpZpON9C;eb#`tVeJ9+jC=79& zX-wGlasv-`pJKh!hbt5=mg_U9t>NLfIF`pk8}oAui}*ID|NBH_B7Ne?<OtEdadMpK z?FZyVtSQ12SmGUV3=)urL-=G))Cf39+s&)F!Z69_3fbh48C6jvb^x=9bpe~MlT7ho z2YQL`$f7JBp3K;tsGZ5!NXR!%ez$bf)X6fBovKjbQ8&p^J2Rl~F;|P+!=00ybd2O6 zX`!W}nWjc?>lMwiv;piqx3u=iwqfQK6F-9@l)7u;ZEuC$YhI%QqY+t-$x1>|;+)7b zqgyD66GjDrZl%G^4Hlx5GSly>%wMW3#}y-~Fs3Mys~i1FL?Ki{McE-s8e>7UX%fz3 zmekoFq_l^z2&I95PZ$jzK!eu~U3UEI190Qr_2Rk6!CxRz{Nex~dzPO4%ifB!m&Cje z&aoIar|3Q)G!I1ofxqTUw~JcI%k=g4J`9h9KPjtfPVL}UJ~$@iAk4>rfcH{w-|Txt F{s6t_h8zF@ delta 367 zcmewnu);^A+~3WOfsp|S)HE2lLA2_f$%z``6SYO^|0L%o7BDa{W&lM)Kv+EN(v0-P zVvyJ#AfE$@1=4dW(|}?}7#I|HfUvlpZg@s&VhRI;at%<883-F{_<Lsn1%YB)fP57Y z7T+v<EF-t10w{I^$d3TwxM*gxocv^<IzJTypnx6-yYI6%%1x{QTC9=)<ST%&3X@r0 zVs0u>tO00w8wk(z;{08ZUt9w84aji{V9X38nOP1_=3%sF6rAkC=*=j&c?RQ7iOH7A zUp6yJTW}~d0#yLPChJAj@%%Pl8Ms-%{QJDDAg?ok=*dr1%^Afe%cyw>Fu(Z!pT&ZK vk;RmOQTQVR!{iz@b;$#~DSS)<cYvxvhKVtmFz|x3GB5!HQ+V@bwWW*zVi!!T diff --git a/view/js/clipboard.min.js b/view/js/clipboard.min.js new file mode 100644 index 0000000..1103f81 --- /dev/null +++ b/view/js/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{container:document.body},n="";return"string"==typeof t?n=o(t,e):t instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(null==t?void 0:t.type)?n=o(t.value,e):(n=r()(t),c("copy")),n};function l(t){return(l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var s=function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},e=t.action,n=void 0===e?"copy":e,o=t.container,e=t.target,t=t.text;if("copy"!==n&&"cut"!==n)throw new Error('Invalid "action" value, use either "copy" or "cut"');if(void 0!==e){if(!e||"object"!==l(e)||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===n&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===n&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes')}return t?f(t,{container:o}):e?"cut"===n?a(e):f(e,{container:o}):void 0};function p(t){return(p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function d(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}function y(t,e){return(y=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function h(n){var o=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}();return function(){var t,e=v(n);return t=o?(t=v(this).constructor,Reflect.construct(e,arguments,t)):e.apply(this,arguments),e=this,!(t=t)||"object"!==p(t)&&"function"!=typeof t?function(t){if(void 0!==t)return t;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e):t}}function v(t){return(v=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function m(t,e){t="data-clipboard-".concat(t);if(e.hasAttribute(t))return e.getAttribute(t)}var b=function(){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&y(t,e)}(r,i());var t,e,n,o=h(r);function r(t,e){var n;return function(t){if(!(t instanceof r))throw new TypeError("Cannot call a class as a function")}(this),(n=o.call(this)).resolveOptions(e),n.listenClick(t),n}return t=r,n=[{key:"copy",value:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{container:document.body};return f(t,e)}},{key:"cut",value:function(t){return a(t)}},{key:"isSupported",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof t?[t]:t,e=!!document.queryCommandSupported;return t.forEach(function(t){e=e&&!!document.queryCommandSupported(t)}),e}}],(e=[{key:"resolveOptions",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===p(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=u()(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget,n=this.action(e)||"copy",t=s({action:n,container:this.container,target:this.target(e),text:this.text(e)});this.emit(t?"success":"error",{action:n,text:t,trigger:e,clearSelection:function(){e&&e.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(t){return m("action",t)}},{key:"defaultTarget",value:function(t){t=m("target",t);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(t){return m("text",t)}},{key:"destroy",value:function(){this.listener.destroy()}}])&&d(t.prototype,e),n&&d(t,n),r}()},828:function(t){var e;"undefined"==typeof Element||Element.prototype.matches||((e=Element.prototype).matches=e.matchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector),t.exports=function(t,e){for(;t&&9!==t.nodeType;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}},438:function(t,e,n){var u=n(828);function i(t,e,n,o,r){var i=function(e,n,t,o){return function(t){t.delegateTarget=u(t.target,n),t.delegateTarget&&o.call(e,t)}}.apply(this,arguments);return t.addEventListener(n,i,r),{destroy:function(){t.removeEventListener(n,i,r)}}}t.exports=function(t,e,n,o,r){return"function"==typeof t.addEventListener?i.apply(null,arguments):"function"==typeof n?i.bind(null,document).apply(null,arguments):("string"==typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,function(t){return i(t,e,n,o,r)}))}},879:function(t,n){n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===e||"[object HTMLCollection]"===e)&&"length"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return"string"==typeof t||t instanceof String},n.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},370:function(t,e,n){var f=n(879),l=n(438);t.exports=function(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!f.string(e))throw new TypeError("Second argument must be a String");if(!f.fn(n))throw new TypeError("Third argument must be a Function");if(f.node(t))return c=e,a=n,(u=t).addEventListener(c,a),{destroy:function(){u.removeEventListener(c,a)}};if(f.nodeList(t))return o=t,r=e,i=n,Array.prototype.forEach.call(o,function(t){t.addEventListener(r,i)}),{destroy:function(){Array.prototype.forEach.call(o,function(t){t.removeEventListener(r,i)})}};if(f.string(t))return t=t,e=e,n=n,l(document.body,t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList");var o,r,i,u,c,a}},817:function(t){t.exports=function(t){var e,n="SELECT"===t.nodeName?(t.focus(),t.value):"INPUT"===t.nodeName||"TEXTAREA"===t.nodeName?((e=t.hasAttribute("readonly"))||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),e||t.removeAttribute("readonly"),t.value):(t.hasAttribute("contenteditable")&&t.focus(),n=window.getSelection(),(e=document.createRange()).selectNodeContents(t),n.removeAllRanges(),n.addRange(e),n.toString());return n}},279:function(t){function e(){}e.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var o=this;function r(){o.off(t,r),e.apply(n,arguments)}return r._=e,this.on(t,r,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;o<r;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],r=[];if(o&&e)for(var i=0,u=o.length;i<u;i++)o[i].fn!==e&&o[i].fn._!==e&&r.push(o[i]);return r.length?n[t]=r:delete n[t],this}},t.exports=e,t.exports.TinyEmitter=e}},r={},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,{a:e}),e},o.d=function(t,e){for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o(686).default;function o(t){if(r[t])return r[t].exports;var e=r[t]={exports:{}};return n[t](e,e.exports,o),e.exports}var n,r}); \ No newline at end of file diff --git a/view/js/demo3.json b/view/js/demo3.json new file mode 100644 index 0000000..05e1fc5 --- /dev/null +++ b/view/js/demo3.json @@ -0,0 +1,68 @@ +{ + "status": 200 + ,"info": "请求成功哈哈" + ,"total": 10 + ,"data": { + "item": [{ + "goods_name": "万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系" + ,"tid": "435657657868678989" + ,"count_down": "倒计时:10:09:23" + ,"income": "999.09" + ,"status": "1" + }, { + "goods_name": "万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系" + ,"tid": "435657657868678989" + ,"count_down": "倒计时:10:09:23" + ,"income": "999.09" + ,"status": "0" + }, { + "goods_name": "万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系" + ,"tid": "435657657868678989" + ,"count_down": "2022-10-31 23:12:00" + ,"income": "999.09" + ,"status": "1" + }, { + "goods_name": "万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系" + ,"tid": "435657657868678989" + ,"count_down": "倒计时:10:09:23" + ,"income": "999.09" + ,"status": "1" + }, { + "goods_name": "万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系" + ,"tid": "435657657868678989" + ,"count_down": "倒计时:10:09:23" + ,"income": "999.09" + ,"status": "1" + }, { + "goods_name": "万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系" + ,"tid": "435657657868678989" + ,"count_down": "2022-10-31 23:12:00" + ,"income": "999.09" + ,"status": "0" + }, { + "goods_name": "万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系" + ,"tid": "435657657868678989" + ,"count_down": "2022-10-31 23:12:00" + ,"income": "999.09" + ,"status": "0" + }, { + "goods_name": "万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系" + ,"tid": "435657657868678989" + ,"count_down": "倒计时:10:09:23" + ,"income": "999.09" + ,"status": "0" + }, { + "goods_name": "万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系" + ,"tid": "435657657868678989" + ,"count_down": "倒计时:10:09:23" + ,"income": "999.09" + ,"status": "1" + }, { + "goods_name": "万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系" + ,"tid": "435657657868678989" + ,"count_down": "倒计时:10:09:23" + ,"income": "999.09" + ,"status": "1" + }] + } +} \ No newline at end of file diff --git a/view/templates/include/admin_leftmenu.html b/view/templates/include/admin_leftmenu.html index e6888b1..b938b81 100644 --- a/view/templates/include/admin_leftmenu.html +++ b/view/templates/include/admin_leftmenu.html @@ -6,8 +6,8 @@ <span>首页</span> </a> <dl class="layui-nav-child admin-layui-nav-child"> - <dd class="layui-this"> - <a href="javascript:;" class="admin-layui-nav-item-a admin-layui-nav-item-a-child"> + <dd class="{if $menu_page == 'home' || !$menu_page}layui-this{/if}"> + <a href="{if $menu_page != 'home' || !$menu_page}/tpl{else}javascript:;{/if}" class="admin-layui-nav-item-a admin-layui-nav-item-a-child"> <span class="icon-2 admin-no-select menu-left-icon-img menu-left-icon-img-15"></span> <span class="icon-3 admin-select menu-left-icon-img menu-left-icon-img-15"></span> 首页 @@ -25,8 +25,8 @@ <span>常用功能</span> </a> <dl class="layui-nav-child admin-layui-nav-child"> - <dd> - <a href="javascript:;" class="admin-layui-nav-item-a admin-layui-nav-item-a-child"> + <dd class="{if $menu_page == 'deliver_remind'}layui-this{/if}"> + <a href="{if $menu_page != 'deliver_remind'}/tpl/deliver_remind{else}javascript:;{/if}" class="admin-layui-nav-item-a admin-layui-nav-item-a-child"> <span class="icon-uniE90A admin-no-select menu-left-icon-img menu-left-icon-img-15"></span> <span class="icon-1 admin-select menu-left-icon-img menu-left-icon-img-15"></span> 发货提醒 diff --git a/view/templates/tpl/deliver_remind.html b/view/templates/tpl/deliver_remind.html new file mode 100644 index 0000000..0f59b39 --- /dev/null +++ b/view/templates/tpl/deliver_remind.html @@ -0,0 +1,306 @@ + +<!DOCTYPE html> +<html> +<head> + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> + <link href="/images/pdd_icon.png" rel="icon"> + <title>首页</title> + <link rel="stylesheet" href="/css/layui.css"/> + <link rel="stylesheet" href="/css/admin_style.css"/> + <link rel="stylesheet" href="/css/common.css"/> + <script type="text/javascript" src="/js/jquery-1.8.1.min.js"></script> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + {literal} + <style> + .admin-container-outer .layui-table{ + width: 100% !important; + } + .deliver_remind_table .layui-table-main tr,.deliver_remind_table .layui-table th{ + height: 53px !important; + } + .deliver_remind_table .layui-table-main tr{ + font-size: 14px; + font-family: PingFangSC-Regular; + color: rgba(0,0,0,0.65); + } + .deliver_remind_table .layui-table tbody tr:hover{ + background-color: #FAFAFA; + } + .deliver-remind-body-right{ + padding: 0px 11px 11px 11px; + background-color: #FFFFFF; + } + + .deliver_remind_table .layui-table-view{ + margin-top:0px !important; + } + .deliver_remind_table .layui-table-header{ + border-radius: 4px 4px 0px 0px !important; + } + .deliver_remind_table .layui-table-header th{ + border: none !important; + font-size: 14px !important; + font-family: PingFangSC-Medium; + color: rgba(0,0,0) !important; + } + .deliver_remind_table .layui-table-view{ + border-radius: 4px 4px 0px 0px !important; + border-top: none !important; + border-left: none !important; + border-right: none !important; + } + .admin-table-list-header{ + width: 100%; + height: 52px; + overflow: hidden; + box-sizing: border-box; + padding-left: 19px; + padding-right: 10px; + } + .admin-table-list-header div{ + display: inline-block; + height: 100%; + line-height: 52px; + } + .admin-table-body{ + border-radius: 8px 8px 0px 0px; + } + .admin-table-list-header div:first-child span{ + font-size: 12px; + font-family: PingFangSC-Regular; + color: rgba(0,0,0, 0.65); + } + .admin-table-list-header div:nth-child(2) span{ + font-size: 16px; + font-family: PingFangSC-Medium; + color: rgba(0,0,0); + } + .admin-table-list-header div:nth-child(3){ + width: auto; + height: 32px; + padding: 0px 13px; + background: #1890FF; + border-radius: 2px; + line-height: 32px; + float: right; + margin-top:10px; + cursor: pointer; + } + .admin-table-list-header div:nth-child(3) span{ + font-size: 14px; + font-family: PingFangSC-Regular; + color: #FFFFFF; + } + .admin-table-td-outter{ + display: inline-block; + width: 100%; + height: 100%; + box-sizing: border-box; + position: absolute; + left: 0px; + top: 0px; + line-height: 53px; + padding-left: 15px; + cursor: pointer; + } + .deliver_remind_table .layui-table-cell{ + position: relative !important; + } + div[lay-id=deliver_remind_list] .layui-table-main tr td:nth-child(2) .layui-table-cell{ + padding: 0px !important; + height: 53px !important; + } + .deliver_remind_list_table_class .layui-table-main tr:hover > td:nth-child(-n+2){ + color:#1890FF !important; + } + .count_down_wait{ + color: #F21019; + position: relative; + cursor: pointer; + } + .count-down-class .layui-layer-content{ + width: 123px !important; + height: 34px !important; + font-size: 12px !important; + font-family: PingFangSC-Regular !important; + color: rgba(0,0,0,0.33) !important; + line-height: 17px !important; + text-align: center !important; + } + .remained_status{ + font-size: 14px; + font-family: PingFangSC-Regular; + color: #FC5057; + width: 100%; + height: 100%; + display: inline-block; + cursor: pointer; + } + .remained_status_wait{ + color: rgba(89, 89, 89, 1); + } + .admin-table-td-outter-font{ + display: none; + } + .deliver_remind_list_table_class .layui-table-main tr:hover .admin-table-td-outter-font{ + display: inline; + } + </style> + {/literal} +</head> +<body> +<div class="layui-layout layui-layout-admin admin-container-outer deliver_remind_table"> + {include file="include/admin_header.html"} + {include file="include/admin_leftmenu.html"} + <div class="layui-body admin-layui-body layui-anim layui-anim-fadein"> + <div class="layui-row"> + <div class="layui-col-md12 deliver-remind-body-right admin-table-body"> + <div class="admin-table-list-header"> + <div><span>发货提醒/</span></div> + <div><span>发货列表</span></div> + <div><span>导出列表</span></div> + </div> + <table class="layui-hide" id="deliver_remind_list" lay-filter="deliver-remind-table"></table> + </div> + </div> + + </div> +</div> +<script src="/js/layui.js"></script> +<script src="/js/clipboard.min.js"></script> +{literal} +<script> +layui.use(['element', 'layer', 'util', 'table'], function(){ + var element = layui.element + ,layer = layui.layer + ,util = layui.util + ,table = layui.table + ,$ = layui.$; + + util.event('lay-header-event', { + menuLeft: function(othis){ + layer.msg('展开左侧菜单的操作', {icon: 0}); + } + ,menuRight: function(){ + layer.open({ + type: 1 + ,title: '更多' + ,content: '<div style="padding: 15px;">处理右侧面板的操作</div>' + ,area: ['260px', '100%'] + ,offset: 'rt' + ,anim: 5 + ,shadeClose: true + ,scrollbar: false + }); + } + }); + + var showTips = null; + table.render({ + elem: '#deliver_remind_list' + ,url:'/tpl/ajax_get_order_list' + ,toolbar: false + ,title: '用户数据表' + ,totalRow: false + ,className:'deliver_remind_list_table_class' + ,cols: [[ + {field:'goods_name', title:'商品名称'} + ,{field:'tid', title:'订单号' + ,templet: function(d){ + return '<span data-clipboard-text="'+d.tid+'" title="点击复制" class="admin-table-td-outter admin-table-td-outter-'+d.tid+'">'+ d.tid +' <span class="icon-uniE90E admin-table-td-outter-font admin-table-td-outter-font-'+d.tid+'"></span></span>'; + }} + ,{field:'count_down', title:'销售时间/倒计时' + ,templet: function(d){ + if(d.count_down.indexOf('倒计时') > -1) return '<label id="count_down_wait_'+d.tid+'" content="'+d.sale_date+'" class="count_down_wait">'+d.count_down+'</label>'; + return '<span>'+d.count_down+'</span>'; + }} + ,{field:'income', title:'收入'} + ,{field:'status', title:'顾客催发' + ,templet: function(d){ + if(d.status == 1) return '<span class="remained_status" content="'+d.remained_time+'" id="remind_time_'+d.tid+'"><span class="icon--3"></span> 已催</span>'; + return '<span class="icon--"></span> <span class="remained_status_wait">未催</span>'; + }} + ]] + ,page: true + ,response: { + statusCode: 200 //重新规定成功的状态码为 200,table 组件默认为 0 + } + ,parseData: function(res){ //将原始数据解析成 table 组件所规定的数据 + return { + "code": 200, //解析接口状态 + "msg": res.info, //解析提示文本 + "count": res.data.total, //解析数据长度 + "data": res.data.data //解析数据列表 + }; + }, + done: function(res, curr, count){ + var data = res.data; + for(var i=0; i<data.length; i++){ + + var tid = data[i].tid; + var clipboard = new ClipboardJS('.admin-table-td-outter-'+tid); + clipboard.on('success', function(e) { + layer.msg('复制成功', {time:1500}); + clipboard.destroy(); + e.clearSelection(); + }); + + if(data[i].count_down.indexOf('倒计时') > -1){ + $('#count_down_wait_'+data[i].tid).hover(function(){ + var hid = $(this).attr('id'); + var hcontent = $(this).attr('content'); + showTips = layer.tips('销售时间<br>'+hcontent, '#'+hid, { + area: ['131px', '42px'], + tips:[3,'#FAF8EB'],//显示方向以及背景颜色(1.上 2右 3下 4左) + time:3000,//4秒后销毁 + skin:'count-down-class' + }); + },function(){ + layer.close(showTips); + }); + } + + + if(data[i].status == 1){ + $('#remind_time_'+data[i].tid).hover(function(){ + var hcontent = $(this).attr('content'); + var hid = $(this).attr('id'); + showTips = layer.tips('催促时间<br>'+hcontent, '#'+hid, { + area: ['131px', '42px'], + tips:[3,'#FAF8EB'],//显示方向以及背景颜色(1.上 2右 3下 4左) + time:3000,//4秒后销毁 + skin:'count-down-class' + }); + },function(){ + layer.close(showTips); + }); + } + + } + } + }); + + table.on('tool(deliver-remind-table)', function(obj){ + // if(obj.event == 'copyTid'){ + // $(".admin-table-td-outter").attr("data-clipboard-text",obj.data.tid); + // var clipboard = new ClipboardJS('.admin-table-td-outter'); + // clipboard.on('success', function(e) { + // layer.msg('复制成功'); + // clipboard.destroy(); + // e.clearSelection(); + // }); + // } + // console.log(obj.event) + }); +}); + + +</script> +{/literal} +</body> +</html> diff --git a/view/templates/tpl/home.html b/view/templates/tpl/home.html index df6222f..45988ff 100644 --- a/view/templates/tpl/home.html +++ b/view/templates/tpl/home.html @@ -16,77 +16,6 @@ <![endif]--> {literal} <style> - .admin-index-top-item-header{ - width: 100%; - height: 46px; - line-height: 46px; - padding-left: 12px; - padding-right: 12px; - color: rgba(0, 0, 0, 0.65); - font-size: 16px; - font-family: PingFangSC-Regular; - text-align: left; - white-space: nowrap; - box-sizing: border-box; - } - .admin-index-top-item-header-line{ - width: 100%; - height: 1px; - background-color: rgba(232, 232, 232, 1); - } - .admin-index-top-item-header-left{ - display: block; - float: left; - height: 100%; - width: auto; - } - .admin-index-top-item-header-left li{ - display: inline-block; - float: left; - font-size: 16px; - font-family: PingFangSC-Regular; - color: rgba(0,0,0,0.65); - margin-right: 64px; - cursor: pointer; - } - .admin-index-top-item-header-left li.active{ - font-family: PingFangSC-Medium !important; - color: #1890FF !important; - position: relative; - } - .admin-index-top-item-header-left li.active::after{ - content: ''; - width: 100%; - height: 2px; - border-radius: 1px; - background: #1890FF; - display: block; - } - .admin-index-top-item-header-right{ - display: block; - float: right; - height: 100%; - width: auto; - } - .admin-index-top-item-header-right li{ - display: inline-block; - float: left; - margin-left: 24px; - line-height: 55px; - font-size: 14px; - font-family: PingFangSC-Regular; - color: #595959; - cursor: pointer; - } - .admin-index-top-item-header-right li.active{ - color: #1890FF !important; - } - #admin-map-container{ - width: 100%; - box-sizing: border-box; - height: 325px; - overflow: hidden; - } </style> {/literal} </head> @@ -253,13 +182,6 @@ layui.use(['element', 'layer', 'util'], function(){ }); }); -// width: 70px; -// height: 22px; -// font-size: 14px; -// font-family: PingFangSC-Medium, PingFang SC; -// font-weight: 500; -// line-height: 22px; - var myChart = echarts.init(document.getElementById('admin-map-container')); var monthList = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']; var option = { From 91be9c2f135ff404940551c869021760f4acaf66 Mon Sep 17 00:00:00 2001 From: Jason <1432334894@qq.com> Date: Tue, 2 Aug 2022 18:54:21 +0800 Subject: [PATCH 10/12] =?UTF-8?q?=E5=94=AE=E5=90=8E=E7=9B=91=E6=8E=A7?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- control/tpl.php | 81 +++++++++- view/css/admin_style.css | 248 +++++++++++++++++++++++++++++ view/templates/include/admin_leftmenu.html | 8 +- view/templates/tpl/deliver_remind.html | 148 +---------------- view/templates/tpl/order_list.html | 133 ++++++++++++++++ view/templates/tpl/sale_monitor.html | 141 ++++++++++++++++ 6 files changed, 606 insertions(+), 153 deletions(-) create mode 100644 view/templates/tpl/order_list.html create mode 100644 view/templates/tpl/sale_monitor.html diff --git a/control/tpl.php b/control/tpl.php index a89a5e7..9d3026e 100644 --- a/control/tpl.php +++ b/control/tpl.php @@ -22,7 +22,7 @@ class tpl extends publicBase { $this->view['menu_page'] = 'deliver_remind'; } - public function ajax_get_order_list() { + public function ajax_get_deliver_remind_list() { $data = array(); $page = $this->get('page')+0; $limit = $this->get('limit')+0; @@ -45,8 +45,85 @@ class tpl extends publicBase { } $reture_data['data'] = $data; - $reture_data['total'] = 300; + $reture_data['total'] = 300000; + + $this->ajax_json(true, '', $reture_data); + } + + /** + * 订单列表 + */ + public function order_list() { + $this->view['menu_page'] = 'order_list'; + } + + public function ajax_get_order_list() { + $data = array(); + $page = $this->get('page')+0; + $limit = $this->get('limit')+0; + for($i=0;$i < 10;$i++){ + $vals = array( + "goods_name" => "万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系", + "tid" => "43565765786867898".$i, + "sale_date" => date('Y-m-d H:i:s', time()+($i*8)), + "income" => "999.09", + "order_status" => 0, + "sale_status" => 0, + ); + if($i % 2 == 0) { + $vals['order_status'] = 1; + $vals['sale_status'] = 1; + } + + if($i % 3 == 0) { + $vals['order_status'] = 0; + $vals['sale_status'] = 2; + } + $data[] = $vals; + } + + $reture_data['data'] = $data; + $reture_data['total'] = 300000; $this->ajax_json(true, '', $reture_data); } + + /** + * 售后监控 + */ + public function sale_monitor() { + $this->view['menu_page'] = 'sale_monitor'; + } + + public function ajax_sale_monitor_list() { + $data = array(); + $page = $this->get('page')+0; + $limit = $this->get('limit')+0; + for($i=0;$i < 10;$i++){ + $vals = array( + "goods_name" => "万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系万方查重毕业论文检测大学生文章专科本科系", + "tid" => "43565765786867898".$i, + "sale_date" => date('Y-m-d H:i:s', time()+($i*8)), + "income" => "999.09", + "order_status" => 0, + "status" => 0, + ); + if($i % 3 == 0) { + $vals['order_status'] = 1; + } + if($i % 5 == 0) { + $vals['order_status'] = 2; + } + $vals['status'] = $i % 5; + $data[] = $vals; + } + + $reture_data['data'] = $data; + $reture_data['total'] = 300000; + + $this->ajax_json(true, '', $reture_data); + } + + + } diff --git a/view/css/admin_style.css b/view/css/admin_style.css index f83ede9..f1d5d6f 100644 --- a/view/css/admin_style.css +++ b/view/css/admin_style.css @@ -463,4 +463,252 @@ body{ box-sizing: border-box; height: 325px; overflow: hidden; + } + .admin-container-outer .layui-table{ + width: 100% !important; + } + .deliver_remind_table .layui-table-main tr,.deliver_remind_table .layui-table th{ + height: 53px !important; + } + .deliver_remind_table .layui-table-main tr{ + font-size: 14px; + font-family: PingFangSC-Regular; + color: rgba(0,0,0,0.65); + } + .deliver_remind_table .layui-table tbody tr:hover{ + background-color: #FAFAFA; + } + .deliver-remind-body-right{ + padding: 0px 11px 11px 11px; + background-color: #FFFFFF; + } + + .deliver_remind_table .layui-table-view{ + margin-top:0px !important; + } + .deliver_remind_table .layui-table-header{ + border-radius: 4px 4px 0px 0px !important; + } + .deliver_remind_table .layui-table-header th{ + border: none !important; + font-size: 14px !important; + font-family: PingFangSC-Medium; + color: rgba(0,0,0) !important; + } + .deliver_remind_table .layui-table-view{ + border-radius: 4px 4px 0px 0px !important; + border: none !important; + } + .admin-table-list-header{ + width: 100%; + height: 52px; + overflow: hidden; + box-sizing: border-box; + padding-left: 19px; + padding-right: 10px; + } + .admin-table-list-header div{ + display: inline-block; + height: 100%; + line-height: 52px; + } + .admin-table-body{ + border-radius: 8px 8px 0px 0px; + } + .admin-table-list-header div:first-child span{ + font-size: 12px; + font-family: PingFangSC-Regular; + color: rgba(0,0,0, 0.65); + } + .admin-table-list-header div:nth-child(2) span{ + font-size: 16px; + font-family: PingFangSC-Medium; + color: rgba(0,0,0); + } + .admin-table-list-header div:nth-child(3){ + width: auto; + height: 32px; + padding: 0px 13px; + background: #1890FF; + border-radius: 2px; + line-height: 32px; + float: right; + margin-top:10px; + cursor: pointer; + } + .admin-table-list-header div:nth-child(3) span{ + font-size: 14px; + font-family: PingFangSC-Regular; + color: #FFFFFF; + } + .admin-table-td-outter{ + display: inline-block; + width: 100%; + height: 100%; + box-sizing: border-box; + position: absolute; + left: 0px; + top: 0px; + line-height: 53px; + padding-left: 15px; + cursor: pointer; + } + .deliver_remind_table .layui-table-cell{ + position: relative !important; + } + div[lay-id=deliver_remind_list] .layui-table-main tr td:nth-child(2) .layui-table-cell{ + padding: 0px !important; + height: 53px !important; + } + .deliver_remind_list_table_class .layui-table-main tr:hover > td:nth-child(-n+2){ + color:#1890FF !important; + } + .count_down_wait{ + color: #F21019; + position: relative; + cursor: pointer; + } + .count-down-class .layui-layer-content{ + width: 123px !important; + height: 34px !important; + font-size: 12px !important; + font-family: PingFangSC-Regular !important; + color: rgba(0,0,0,0.33) !important; + line-height: 17px !important; + text-align: center !important; + } + .remained_status{ + font-size: 14px; + font-family: PingFangSC-Regular; + color: #FC5057; + width: 100%; + height: 100%; + display: inline-block; + cursor: pointer; + } + .remained_status_wait{ + color: rgba(89, 89, 89, 1); + } + .admin-table-td-outter-font{ + display: none; + } + .deliver_remind_list_table_class .layui-table-main tr:hover .admin-table-td-outter-font{ + display: inline; + } + .admin-container-outer .layui-laypage-prev{ + min-width: 8px !important; + height: 32px !important; + background: #FFFFFF !important; + border-radius: 2px !important; + border: 1px solid #D9D9D9 !important; + position: relative; + margin-right: 8px; + padding: 0px 12px !important; + font-size: 14px !important; + } + .admin-container-outer .layui-table-pageview{ + float: right; + margin-top: 16px !important; + } + .admin-container-outer .layui-laypage-spr{ + margin-right: 8px !important; + } + .admin-container-outer .layui-laypage-curr{ + min-width: 8px !important; + height: 32px !important; + background: #1890FF !important; + border-radius: 2px !important; + margin-right: 8px !important; + line-height: 32px !important; + font-size: 14px !important; + } + .admin-container-outer .layui-table-pageview a{ + display: inline-block; + min-width: 8px !important; + height: 32px !important; + line-height: 32px !important; + background: #FFFFFF !important; + border-radius: 2px !important; + border: 1px solid #D9D9D9 !important; + margin-right: 8px !important; + font-size: 14px !important; + font-family: PingFangSC-Regular !important; + color: rgba(0,0,0,0.65) !important; + padding: 0px !important; + text-align: center; + padding: 0px 12px !important; + } + .admin-container-outer .layui-laypage-prev .layui-icon{ + position: absolute; + left: 8px; + top: 1px; + } + .admin-container-outer .layui-laypage-limits{ + width: 82px !important; + height: 32px !important; + background: #FFFFFF !important; + border-radius: 2px !important; + border: 1px solid #D9D9D9 !important; + box-sizing: border-box !important; + } + .admin-container-outer .layui-laypage-limits select{ + height: 100% !important; + width: 100% !important; + box-sizing: border-box; + pointer-events: none; + appearance:none; + width: 82px !important; + box-sizing: border-box !important; + padding-left: 12px !important; + } + .admin-container-outer .layui-laypage-skip{ + height: 32px !important; + box-sizing: border-box; + line-height: 32px !important; + font-size: 14px !important; + } + .admin-container-outer .layui-laypage-skip *{ + font-size: 14px !important; + font-family: PingFangSC-Regular !important; + color: rgba(0,0,0,0.65) !important; + } + .admin-container-outer .layui-laypage-skip .layui-input{ + height: 32px !important; + } + .admin-container-outer .layui-laypage-btn{ + height: 32px !important; + box-sizing: border-box; + line-height: 32px !important; + } + .admin-container-outer .layui-laypage-count{ + height: 32px !important; + box-sizing: border-box; + line-height: 32px !important; + font-size: 14px !important; + } + .admin-container-outer .layui-table-page{ + padding-right: 27px !important; + } + .list_status_grey01{ + color: rgba(0, 0, 0, 0.65); + font-size: 14px; + } + .list_status_yellow01{ + color: rgba(251, 131, 4, 1); + font-size: 14px; + } + .list_status_red01{ + color: rgba(249, 40, 39, 1); + font-size: 14px; + } + .list_status_green01{ + color: rgba(49, 185, 39, 1); + font-size: 14px; + } + .list_status_grey02{ + color: rgba(89, 89, 89, 1); + font-size: 14px; + } + .admin-container-outer .layui-laypage .layui-laypage-curr .layui-laypage-em{ + background-color: rgba(24, 144, 255, 1) !important; } \ No newline at end of file diff --git a/view/templates/include/admin_leftmenu.html b/view/templates/include/admin_leftmenu.html index b938b81..4e0801d 100644 --- a/view/templates/include/admin_leftmenu.html +++ b/view/templates/include/admin_leftmenu.html @@ -32,15 +32,15 @@ 发货提醒 </a> </dd> - <dd> - <a href="javascript:;" class="admin-layui-nav-item-a admin-layui-nav-item-a-child"> + <dd class="{if $menu_page == 'sale_monitor'}layui-this{/if}"> + <a href="{if $menu_page == 'sale_monitor'}javascript:;{else}/tpl/sale_monitor{/if}" class="admin-layui-nav-item-a admin-layui-nav-item-a-child"> <span class="icon--6 admin-no-select menu-left-icon-img menu-left-icon-img-16"></span> <span class="icon--6-2 admin-select menu-left-icon-img menu-left-icon-img-16"></span> 售后监控 </a> </dd> - <dd> - <a href="javascript:;" class="admin-layui-nav-item-a admin-layui-nav-item-a-child"> + <dd class="{if $menu_page == 'order_list'}layui-this{/if}"> + <a href="{if $menu_page == 'order_list'}javascript:;{else}/tpl/order_list{/if}" class="admin-layui-nav-item-a admin-layui-nav-item-a-child"> <span class="icon-dingd admin-no-select menu-left-icon-img"></span> <span class="icon-dingd1 admin-select menu-left-icon-img"></span> 订单列表 diff --git a/view/templates/tpl/deliver_remind.html b/view/templates/tpl/deliver_remind.html index 0f59b39..c725e00 100644 --- a/view/templates/tpl/deliver_remind.html +++ b/view/templates/tpl/deliver_remind.html @@ -17,139 +17,6 @@ <![endif]--> {literal} <style> - .admin-container-outer .layui-table{ - width: 100% !important; - } - .deliver_remind_table .layui-table-main tr,.deliver_remind_table .layui-table th{ - height: 53px !important; - } - .deliver_remind_table .layui-table-main tr{ - font-size: 14px; - font-family: PingFangSC-Regular; - color: rgba(0,0,0,0.65); - } - .deliver_remind_table .layui-table tbody tr:hover{ - background-color: #FAFAFA; - } - .deliver-remind-body-right{ - padding: 0px 11px 11px 11px; - background-color: #FFFFFF; - } - - .deliver_remind_table .layui-table-view{ - margin-top:0px !important; - } - .deliver_remind_table .layui-table-header{ - border-radius: 4px 4px 0px 0px !important; - } - .deliver_remind_table .layui-table-header th{ - border: none !important; - font-size: 14px !important; - font-family: PingFangSC-Medium; - color: rgba(0,0,0) !important; - } - .deliver_remind_table .layui-table-view{ - border-radius: 4px 4px 0px 0px !important; - border-top: none !important; - border-left: none !important; - border-right: none !important; - } - .admin-table-list-header{ - width: 100%; - height: 52px; - overflow: hidden; - box-sizing: border-box; - padding-left: 19px; - padding-right: 10px; - } - .admin-table-list-header div{ - display: inline-block; - height: 100%; - line-height: 52px; - } - .admin-table-body{ - border-radius: 8px 8px 0px 0px; - } - .admin-table-list-header div:first-child span{ - font-size: 12px; - font-family: PingFangSC-Regular; - color: rgba(0,0,0, 0.65); - } - .admin-table-list-header div:nth-child(2) span{ - font-size: 16px; - font-family: PingFangSC-Medium; - color: rgba(0,0,0); - } - .admin-table-list-header div:nth-child(3){ - width: auto; - height: 32px; - padding: 0px 13px; - background: #1890FF; - border-radius: 2px; - line-height: 32px; - float: right; - margin-top:10px; - cursor: pointer; - } - .admin-table-list-header div:nth-child(3) span{ - font-size: 14px; - font-family: PingFangSC-Regular; - color: #FFFFFF; - } - .admin-table-td-outter{ - display: inline-block; - width: 100%; - height: 100%; - box-sizing: border-box; - position: absolute; - left: 0px; - top: 0px; - line-height: 53px; - padding-left: 15px; - cursor: pointer; - } - .deliver_remind_table .layui-table-cell{ - position: relative !important; - } - div[lay-id=deliver_remind_list] .layui-table-main tr td:nth-child(2) .layui-table-cell{ - padding: 0px !important; - height: 53px !important; - } - .deliver_remind_list_table_class .layui-table-main tr:hover > td:nth-child(-n+2){ - color:#1890FF !important; - } - .count_down_wait{ - color: #F21019; - position: relative; - cursor: pointer; - } - .count-down-class .layui-layer-content{ - width: 123px !important; - height: 34px !important; - font-size: 12px !important; - font-family: PingFangSC-Regular !important; - color: rgba(0,0,0,0.33) !important; - line-height: 17px !important; - text-align: center !important; - } - .remained_status{ - font-size: 14px; - font-family: PingFangSC-Regular; - color: #FC5057; - width: 100%; - height: 100%; - display: inline-block; - cursor: pointer; - } - .remained_status_wait{ - color: rgba(89, 89, 89, 1); - } - .admin-table-td-outter-font{ - display: none; - } - .deliver_remind_list_table_class .layui-table-main tr:hover .admin-table-td-outter-font{ - display: inline; - } </style> {/literal} </head> @@ -203,7 +70,7 @@ layui.use(['element', 'layer', 'util', 'table'], function(){ var showTips = null; table.render({ elem: '#deliver_remind_list' - ,url:'/tpl/ajax_get_order_list' + ,url:'/tpl/ajax_get_deliver_remind_list' ,toolbar: false ,title: '用户数据表' ,totalRow: false @@ -284,19 +151,6 @@ layui.use(['element', 'layer', 'util', 'table'], function(){ } } }); - - table.on('tool(deliver-remind-table)', function(obj){ - // if(obj.event == 'copyTid'){ - // $(".admin-table-td-outter").attr("data-clipboard-text",obj.data.tid); - // var clipboard = new ClipboardJS('.admin-table-td-outter'); - // clipboard.on('success', function(e) { - // layer.msg('复制成功'); - // clipboard.destroy(); - // e.clearSelection(); - // }); - // } - // console.log(obj.event) - }); }); diff --git a/view/templates/tpl/order_list.html b/view/templates/tpl/order_list.html new file mode 100644 index 0000000..c4544a9 --- /dev/null +++ b/view/templates/tpl/order_list.html @@ -0,0 +1,133 @@ + +<!DOCTYPE html> +<html> +<head> + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> + <link href="/images/pdd_icon.png" rel="icon"> + <title>首页</title> + <link rel="stylesheet" href="/css/layui.css"/> + <link rel="stylesheet" href="/css/admin_style.css"/> + <link rel="stylesheet" href="/css/common.css"/> + <script type="text/javascript" src="/js/jquery-1.8.1.min.js"></script> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + {literal} + <style> + </style> + {/literal} +</head> +<body> +<div class="layui-layout layui-layout-admin admin-container-outer deliver_remind_table"> + {include file="include/admin_header.html"} + {include file="include/admin_leftmenu.html"} + <div class="layui-body admin-layui-body layui-anim layui-anim-fadein"> + <div class="layui-row"> + <div class="layui-col-md12 deliver-remind-body-right admin-table-body"> + <div class="admin-table-list-header"> + <div><span>订单列表/</span></div> + <div><span>订单列表</span></div> + <div><span>导出列表</span></div> + </div> + <table class="layui-hide" id="deliver_remind_list" lay-filter="deliver-remind-table"></table> + </div> + </div> + + </div> +</div> +<script src="/js/layui.js"></script> +<script src="/js/clipboard.min.js"></script> +{literal} +<script> +layui.use(['element', 'layer', 'util', 'table'], function(){ + var element = layui.element + ,layer = layui.layer + ,util = layui.util + ,table = layui.table + ,$ = layui.$; + + util.event('lay-header-event', { + menuLeft: function(othis){ + layer.msg('展开左侧菜单的操作', {icon: 0}); + } + ,menuRight: function(){ + layer.open({ + type: 1 + ,title: '更多' + ,content: '<div style="padding: 15px;">处理右侧面板的操作</div>' + ,area: ['260px', '100%'] + ,offset: 'rt' + ,anim: 5 + ,shadeClose: true + ,scrollbar: false + }); + } + }); + + var showTips = null; + table.render({ + elem: '#deliver_remind_list' + ,url:'/tpl/ajax_get_order_list' + ,toolbar: false + ,title: '用户数据表' + ,totalRow: false + ,className:'deliver_remind_list_table_class' + ,cols: [[ + {field:'goods_name', title:'商品名称'} + ,{field:'tid', title:'订单号' + ,templet: function(d){ + return '<span data-clipboard-text="'+d.tid+'" title="点击复制" class="admin-table-td-outter admin-table-td-outter-'+d.tid+'">'+ d.tid +' <span class="icon-uniE90E admin-table-td-outter-font admin-table-td-outter-font-'+d.tid+'"></span></span>'; + }} + ,{field:'count_down', title:'售后时间' + ,templet: function(d){ + return '<span>'+d.sale_date+'</span>'; + }} + ,{field:'income', title:'收入(元)'} + ,{field:'order_status', title:'订单状态' + ,templet: function(d){ + if(d.order_status == 1) return '<span class="list_status_grey01">已签收</span>'; + return '<span class="list_status_yellow01">待签收</span>'; + }} + ,{field:'sale_status', title:'售后状态' + ,templet: function(d){ + if(d.sale_status == 1) return '<span class="list_status_red01">退款中</span>'; + if(d.sale_status == 2) return '<span class="list_status_green01">退款成功</span>'; + return '<span class="list_status_grey02">无售后</span>'; + }} + ]] + ,page: true + ,response: { + statusCode: 200 //重新规定成功的状态码为 200,table 组件默认为 0 + } + ,parseData: function(res){ //将原始数据解析成 table 组件所规定的数据 + return { + "code": 200, //解析接口状态 + "msg": res.info, //解析提示文本 + "count": res.data.total, //解析数据长度 + "data": res.data.data //解析数据列表 + }; + }, + done: function(res, curr, count){ + var data = res.data; + for(var i=0; i<data.length; i++){ + + var tid = data[i].tid; + var clipboard = new ClipboardJS('.admin-table-td-outter-'+tid); + clipboard.on('success', function(e) { + layer.msg('复制成功', {time:1500}); + clipboard.destroy(); + e.clearSelection(); + }); + } + } + }); +}); + + +</script> +{/literal} +</body> +</html> diff --git a/view/templates/tpl/sale_monitor.html b/view/templates/tpl/sale_monitor.html new file mode 100644 index 0000000..158df39 --- /dev/null +++ b/view/templates/tpl/sale_monitor.html @@ -0,0 +1,141 @@ + +<!DOCTYPE html> +<html> +<head> + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> + <link href="/images/pdd_icon.png" rel="icon"> + <title>首页</title> + <link rel="stylesheet" href="/css/layui.css"/> + <link rel="stylesheet" href="/css/admin_style.css"/> + <link rel="stylesheet" href="/css/common.css"/> + <script type="text/javascript" src="/js/jquery-1.8.1.min.js"></script> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + {literal} + <style> + </style> + {/literal} +</head> +<body> +<div class="layui-layout layui-layout-admin admin-container-outer deliver_remind_table"> + {include file="include/admin_header.html"} + {include file="include/admin_leftmenu.html"} + <div class="layui-body admin-layui-body layui-anim layui-anim-fadein"> + <div class="layui-row"> + <div class="layui-col-md12 deliver-remind-body-right admin-table-body"> + <div class="admin-table-list-header"> + <div><span>售后监控/</span></div> + <div><span>售后列表</span></div> + <div><span>导出列表</span></div> + </div> + <table class="layui-hide" id="deliver_remind_list" lay-filter="deliver-remind-table"></table> + </div> + </div> + + </div> +</div> +<script src="/js/layui.js"></script> +<script src="/js/clipboard.min.js"></script> +{literal} +<script> +layui.use(['element', 'layer', 'util', 'table'], function(){ + var element = layui.element + ,layer = layui.layer + ,util = layui.util + ,table = layui.table + ,$ = layui.$; + + util.event('lay-header-event', { + menuLeft: function(othis){ + layer.msg('展开左侧菜单的操作', {icon: 0}); + } + ,menuRight: function(){ + layer.open({ + type: 1 + ,title: '更多' + ,content: '<div style="padding: 15px;">处理右侧面板的操作</div>' + ,area: ['260px', '100%'] + ,offset: 'rt' + ,anim: 5 + ,shadeClose: true + ,scrollbar: false + }); + } + }); + + var showTips = null; + table.render({ + elem: '#deliver_remind_list' + ,url:'/tpl/ajax_sale_monitor_list' + ,toolbar: false + ,title: '用户数据表' + ,totalRow: false + ,className:'deliver_remind_list_table_class' + ,cols: [[ + {field:'goods_name', title:'商品名称'} + ,{field:'tid', title:'订单号' + ,templet: function(d){ + return '<span data-clipboard-text="'+d.tid+'" title="点击复制" class="admin-table-td-outter admin-table-td-outter-'+d.tid+'">'+ d.tid +' <span class="icon-uniE90E admin-table-td-outter-font admin-table-td-outter-font-'+d.tid+'"></span></span>'; + }} + ,{field:'count_down', title:'售后时间' + ,templet: function(d){ + return '<span>'+d.sale_date+'</span>'; + }} + ,{field:'income', title:'收入(元)'} + ,{field:'order_status', title:'订单状态' + ,templet: function(d){ + if(d.order_status == 1) return '<span class="list_status_grey01">待发货</span>'; + if(d.order_status == 2) return '<span class="list_status_yellow01">已签收</span>'; + return '<span class="list_status_red01">待签收</span>'; + }} + ,{field:'status', title:'状态' + ,templet: function(d){ + if(d.status == 1) return '<span class="list_status_grey02">退款中</span>'; + if(d.status == 2) return '<span class="list_status_grey02">补寄中</span>'; + if(d.status == 3) return '<span class="list_status_grey02">待补寄</span>'; + if(d.status == 4) return '<span class="list_status_grey02">待签收</span>'; + if(d.status == 5) return '<span class="list_status_grey02">平台…</span>'; + return '<span class="list_status_yellow01">待处理</span>'; + }} + ,{field:'option', title:'操作' + ,templet: function(d){ + return '<span style="color:rgba(61, 127, 255, 1);font-size: 14px;cursor: pointer;">处理</span>'; + }} + ]] + ,page: true + ,response: { + statusCode: 200 //重新规定成功的状态码为 200,table 组件默认为 0 + } + ,parseData: function(res){ //将原始数据解析成 table 组件所规定的数据 + return { + "code": 200, //解析接口状态 + "msg": res.info, //解析提示文本 + "count": res.data.total, //解析数据长度 + "data": res.data.data //解析数据列表 + }; + }, + done: function(res, curr, count){ + var data = res.data; + for(var i=0; i<data.length; i++){ + + var tid = data[i].tid; + var clipboard = new ClipboardJS('.admin-table-td-outter-'+tid); + clipboard.on('success', function(e) { + layer.msg('复制成功', {time:1500}); + clipboard.destroy(); + e.clearSelection(); + }); + } + } + }); +}); + + +</script> +{/literal} +</body> +</html> From c671f0f1440755e2f37429596dd27ef0b95089de Mon Sep 17 00:00:00 2001 From: Jason <1432334894@qq.com> Date: Tue, 2 Aug 2022 19:14:41 +0800 Subject: [PATCH 11/12] =?UTF-8?q?=E5=BA=95=E9=83=A8footer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view/css/admin_style.css | 42 +++++++++++++++++++++++++++++ view/images/menuleft_bottom_line.png | Bin 0 -> 175 bytes view/templates/include/admin_leftmenu.html | 10 +++++++ 3 files changed, 52 insertions(+) create mode 100644 view/images/menuleft_bottom_line.png diff --git a/view/css/admin_style.css b/view/css/admin_style.css index f1d5d6f..b41d99a 100644 --- a/view/css/admin_style.css +++ b/view/css/admin_style.css @@ -711,4 +711,46 @@ body{ } .admin-container-outer .layui-laypage .layui-laypage-curr .layui-laypage-em{ background-color: rgba(24, 144, 255, 1) !important; + } + .admin-menuleft-footer{ + position: absolute; + left: 0px; + bottom: 0px; + width: 200px; + height: 86px; + margin: 0 auto; + box-sizing: border-box; + overflow: hidden; + } + .admin-menuleft-footer img{ + width: 156px; + height: 1px; + display:block; + margin:0 auto; + } + .admin-menuleft-footer div{ + width: 100%; + font-size: 12px; + text-align: center; + } + .admin-menuleft-footer div:nth-child(2){ + height: 15px; + font-family: PingFang-SC-Light; + color: rgba(0,0,0,0.33); + line-height: 15px; + margin-top: 9px; + } + .admin-menuleft-footer div:nth-child(3){ + height: 19px; + font-family: PingFang-SC-Light; + color: rgba(0,0,0,0.33); + line-height: 19px; + margin-top: 2px; + } + .admin-menuleft-footer div:nth-child(4){ + height: 19px; + font-family: PingFangSC-Regular; + color: #3D7FFF; + line-height: 19px; + margin-top: 2px; } \ No newline at end of file diff --git a/view/images/menuleft_bottom_line.png b/view/images/menuleft_bottom_line.png new file mode 100644 index 0000000000000000000000000000000000000000..69becce766671d1f7f628e42d3424968ead21819 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^bAgzVgAGU?X<G9R#3>GPcVbv~PUa<$<B}TTnda-u zpao=eFfg`fGO&P@0I?JhGcYhOU}Rth(u^Rn1x#?+xeJ)#Y>;Y(gU^>+0VzpO7sn6{ r(d3kbgb6H3ZVGa&ixnOE1uFO$T-_O&x430Z0V(!$^>bP0l+XkK?$aLz literal 0 HcmV?d00001 diff --git a/view/templates/include/admin_leftmenu.html b/view/templates/include/admin_leftmenu.html index 4e0801d..f887467 100644 --- a/view/templates/include/admin_leftmenu.html +++ b/view/templates/include/admin_leftmenu.html @@ -1,3 +1,7 @@ +{literal} +<style> +</style> +{/literal} <div class="layui-side layui-bg-black admin-menu-list layui-anim layui-anim-up" style="background-color: #FFFFFF !important;color:#000000 !important;"> <div class="layui-side-scroll admin-menu-layui-side-scroll"> <ul class="layui-nav layui-nav-tree admin-layui-nav-tree" lay-filter="test" lay-bar="disabled"> @@ -49,5 +53,11 @@ </dl> </li> </ul> + <div class="admin-menuleft-footer"> + <img src="/images/menuleft_bottom_line.png" alt=""> + <div>快乐分销v3.0</div> + <div>© Inc.All rights res erved.</div> + <div>鲁ICP备14002313号-1</div> + </div> </div> </div> \ No newline at end of file From da1a65b6c236b98b86db85ddae703af5897da94b Mon Sep 17 00:00:00 2001 From: Jason <1432334894@qq.com> Date: Tue, 2 Aug 2022 19:27:50 +0800 Subject: [PATCH 12/12] =?UTF-8?q?=E6=9C=AA=E5=A4=84=E7=90=86=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E6=9D=A1=E6=95=B0tips?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view/css/admin_style.css | 25 +++++++++++++++++++++++++ view/templates/include/admin_leftmenu.html | 10 ++++++---- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/view/css/admin_style.css b/view/css/admin_style.css index b41d99a..a965e8d 100644 --- a/view/css/admin_style.css +++ b/view/css/admin_style.css @@ -753,4 +753,29 @@ body{ color: #3D7FFF; line-height: 19px; margin-top: 2px; + } + .admin-tip-order-nums{ + display: inline-block; + background-color: rgba(242, 16, 25, 1); + border-radius: 6px 6px 6px 0px; + height: 15px; + line-height: 15px; + width: 30px; + text-align: center; + position: relative; + left: 10px; + box-sizing: border-box; + } + .admin-tip-order-nums span{ + display: inline-block; + height: 12px; + line-height: 12px; + width: 22px; + color: rgba(255, 255, 255, 1); + font-size: 12px; + font-family: DINAlternate-Bold; + text-align: left; + white-space: nowrap; + position: relative; + top: -1px; } \ No newline at end of file diff --git a/view/templates/include/admin_leftmenu.html b/view/templates/include/admin_leftmenu.html index f887467..b1720eb 100644 --- a/view/templates/include/admin_leftmenu.html +++ b/view/templates/include/admin_leftmenu.html @@ -1,7 +1,3 @@ -{literal} -<style> -</style> -{/literal} <div class="layui-side layui-bg-black admin-menu-list layui-anim layui-anim-up" style="background-color: #FFFFFF !important;color:#000000 !important;"> <div class="layui-side-scroll admin-menu-layui-side-scroll"> <ul class="layui-nav layui-nav-tree admin-layui-nav-tree" lay-filter="test" lay-bar="disabled"> @@ -34,6 +30,9 @@ <span class="icon-uniE90A admin-no-select menu-left-icon-img menu-left-icon-img-15"></span> <span class="icon-1 admin-select menu-left-icon-img menu-left-icon-img-15"></span> 发货提醒 + <div class="admin-tip-order-nums" > + <span>99+</span> + </div> </a> </dd> <dd class="{if $menu_page == 'sale_monitor'}layui-this{/if}"> @@ -41,6 +40,9 @@ <span class="icon--6 admin-no-select menu-left-icon-img menu-left-icon-img-16"></span> <span class="icon--6-2 admin-select menu-left-icon-img menu-left-icon-img-16"></span> 售后监控 + <div class="admin-tip-order-nums" > + <span>99+</span> + </div> </a> </dd> <dd class="{if $menu_page == 'order_list'}layui-this{/if}">